from machine import Pin
from time import sleep, time

# Configuración de los displays 
displays7seg = {
    'dis7seg1': [33, 25, 26, 27, 14, 12, 13],
    'dis7seg2': [17, 16, 4, 21, 2, 23, 22]
}

for i in range(7):
    displays7seg['dis7seg1'][i] = Pin(displays7seg['dis7seg1'][i], Pin.OUT)
    displays7seg['dis7seg2'][i] = Pin(displays7seg['dis7seg2'][i], Pin.OUT)

# Configuración de los semáforos
semaforo1 = [18, 5, 0]  # Rojo, Amarillo, Verde
semaforo2 = [19, 32, 15]  # Rojo, Amarillo, Verde

for i in range(3):
    semaforo1[i] = Pin(semaforo1[i], Pin.OUT)
    semaforo2[i] = Pin(semaforo2[i], Pin.OUT)

# Configuración del botón
boton = Pin(34, Pin.IN, Pin.PULL_DOWN)  # (presionado = 1, no presionado = 0)

# Números en los displays
numeros = {
    9: [1, 1, 1, 1, 0, 1, 1],
    8: [1, 1, 1, 1, 1, 1, 1],
    7: [1, 1, 1, 0, 0, 0, 0],
    6: [1, 0, 1, 1, 1, 1, 1],
    5: [1, 0, 1, 1, 0, 1, 1],
    4: [0, 1, 1, 0, 0, 1, 1],
    3: [1, 1, 1, 1, 0, 0, 1],
    2: [1, 1, 0, 1, 1, 0, 1],
    1: [0, 1, 1, 0, 0, 0, 0],
    0: [1, 1, 1, 1, 1, 1, 0]
}

# Funciones para displays
def onDisplay(num, display):
    for i in range(7):
        displays7seg[display][i].value(numeros[num][i])

def offDisplay(display):
    for pin in displays7seg[display]:
        pin.value(0)

# Función de conteo regresivo en los displays
def conteoReg(n):
    for i in range(n, -1, -1):
        offDisplay('dis7seg1')
        onDisplay(i // 10, 'dis7seg1')  # Decenas
        offDisplay('dis7seg2')
        onDisplay(i % 10, 'dis7seg2')  # Unidades
        sleep(1)

# Funciones para semáforos
def encenderSemaforo(semaforo, color):  # color: 0=Rojo, 1=Amarillo, 2=Verde
    for i in range(3):
        semaforo[i].value(1 if i == color else 0)

def transicionAmarillo(semaforo):
    encenderSemaforo(semaforo, 1)  # Encender amarillo
    sleep(1)  # Esperar 1 segundo
    semaforo[1].off()  # Apagar amarillo

def apagarSemaforos():
    for i in range(3):
        semaforo1[i].off()
        semaforo2[i].off()

# Principal
while True:
    # Estado inicial: Semáforo 1 en rojo, Semáforo 2 en verde
    encenderSemaforo(semaforo1, 0)
    encenderSemaforo(semaforo2, 2)
    print("Semáforo 2 en verde, esperando pulsador...")

    # Contar pulsaciones del botón
    pulsaciones = 0
    tiempo_espera = 10  # Tiempo total de espera para pulsaciones en segundos
    tiempo_inicial = time()  # Capturar el tiempo de inicio de la espera

    while time() - tiempo_inicial < tiempo_espera:  # Esperar el tiempo definido
        if boton.value() == 1:  # Botón presionado
            while boton.value() == 1:
                sleep(0.1)  # Esperar a que se libere el botón
            pulsaciones += 1
            print(f"Pulsaciones detectadas: {pulsaciones}")

        sleep(0.1)  # Verificar el estado del botón con mayor frecuencia

    # Determinar el tiempo acumulado en función de las pulsaciones
    if pulsaciones <= 3:
        tiempo_acumulado = 20
    elif pulsaciones >= 6:
        tiempo_acumulado = 10
    elif pulsaciones >= 4:
        tiempo_acumulado = 15

    print(f"Tiempo acumulado calculado: {tiempo_acumulado} segundos")

    # Transición: Semáforo 2 verde -> amarillo -> rojo
    transicionAmarillo(semaforo2)
    encenderSemaforo(semaforo2, 0)

    # Transición: Semáforo 1 rojo -> amarillo -> verde
    transicionAmarillo(semaforo1)
    encenderSemaforo(semaforo1, 2)
    print(f"Semáforo 1 en verde por {tiempo_acumulado} segundos")
    conteoReg(tiempo_acumulado)

    # Transición al volver a la posición inicial
    transicionAmarillo(semaforo1)  # Semáforo 1 verde -> amarillo -> rojo
    encenderSemaforo(semaforo1, 0)

    transicionAmarillo(semaforo2)  # Semáforo 2 rojo -> amarillo -> verde
    encenderSemaforo(semaforo2, 2)

    print("Semáforos en posición inicial.")
$abcdeabcde151015202530fghijfghij