from sys import argv, stdout
import RPi.GPIO as GPIO
from time import sleep, time

# Nombre de pines de entrada (INPUT)
sensor_de_entrada = 11
sensor_de_salida = 13
color_rojo = 29
color_verde = 37

# Nombre de variables globales
deteccto_entrada = False
tiempo_inicial_entrada = None
tiempo_final_entrada = None

detecto_salida = False
tiempo_inicial_salida = None
tiempo_final_salida = None

HIGH = 1
LOW = 0

# Configuracion de pines
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

GPIO.setup(sensor_de_entrada, GPIO.IN)
GPIO.setup(sensor_de_salida, GPIO.IN)

GPIO.setup(color_verde, GPIO.OUT)
GPIO.setup(color_rojo, GPIO.OUT )

GPIO.output(color_verde, LOW)
GPIO.output(color_rojo, HIGH)

#Funciones
def calcular_tiempo_transcurrido(tiempo_final, tiempo_inicial):
    return tiempo_final - tiempo_inicial

def validar_deteccion(tiempo_transcurrido):
    if(tiempo_transcurrido < 0.5):
        return False
    if(tiempo_transcurrido > 0.5):
        return True

def ingreso_una_persona():
    print(-1)
    stdout.flush()

def salio_una_persona():
    print(1)
    stdout.flush()

def cambiar_color_led():
    global HIGH
    global LOW
    GPIO.output(color_verde, HIGH)
    GPIO.output(color_rojo, LOW)
    sleep(2)
    GPIO.output(color_verde, LOW)
    GPIO.output(color_rojo, HIGH)

def deteccion_de_entrada(numero_pin):
    global deteccto_entrada
    global tiempo_inicial_entrada
    global tiempo_final_entrada
    if not GPIO.input(sensor_de_entrada) and deteccto_entrada == False:
        deteccto_entrada = True
        tiempo_inicial_entrada = time()
    if GPIO.input(sensor_de_entrada) and deteccto_entrada == True:
        deteccto_entrada = False
        tiempo_final_entrada = time()
        tiempo_transcurrido = calcular_tiempo_transcurrido(tiempo_final_entrada, tiempo_inicial_entrada)
        es_valido = validar_deteccion(tiempo_transcurrido)
        if es_valido:
            ingreso_una_persona()
            
def deteccion_de_salida(pin):
    global detecto_salida
    global tiempo_inicial_salida
    global tiempo_final_salida
    if not GPIO.input(sensor_de_salida) and detecto_salida == False:
        detecto_salida = True
        tiempo_inicial_salida = time()
    if GPIO.input(sensor_de_salida) and detecto_salida == True:
        detecto_salida = False
        tiempo_final_salida = time()
        tiempo_transcurrido = calcular_tiempo_transcurrido(tiempo_final_salida, tiempo_inicial_salida)
        es_valido = validar_deteccion(tiempo_transcurrido)
        if es_valido:
            salio_una_persona()
            cambiar_color_led()


#Ejecucion del codigo
if __name__ == "__main__":
    GPIO.add_event_detect(sensor_de_entrada, GPIO.BOTH, callback=deteccion_de_entrada)
    GPIO.add_event_detect(sensor_de_salida, GPIO.BOTH, callback=deteccion_de_salida)
    while True:
        GPIO.event_detected(sensor_de_entrada)
        GPIO.event_detected(sensor_de_salida)