import machine 
import neopixel
import time

# Configuración para la matriz Neopixel 8x8
PIN = 2  # Pin donde está conectado el Neopixel 
MATRIX_WIDTH = 8
MATRIX_HEIGHT = 8
NUM_PIXELS = MATRIX_WIDTH * MATRIX_HEIGHT

# Inicializa la matriz Neopixel
np = neopixel.NeoPixel(machine.Pin(PIN), NUM_PIXELS)

# Configuración de botones
button_1 = machine.Pin(18, machine.Pin.IN, machine.Pin.PULL_UP) 
button_2 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) 
button_3 = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP) 
button_4 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_UP) 

# Estado del botón 1
button_1_state = 0  # 0 = apagado (negro), 1 = operable (púrpura)

# Función para apagar la matriz (negro)
def clear_matrix():
    for i in range(NUM_PIXELS):
        np[i] = (0, 0, 0)
    np.write()

# Función para llenar la matriz de un color
def fill_matrix(color):
    for i in range(NUM_PIXELS):
        np[i] = color
    np.write()

# Función para alternar entre negro (apagado) y púrpura (operable) con el botón 1
def handle_button_1():
    global button_1_state
    if button_1_state == 0:
        fill_matrix((0, 0, 0))  # Negro (apagado)
        button_1_state = 1
    else:
        fill_matrix((128, 0, 128))  # Púrpura (operable)
        button_1_state = 0

# Función para mostrar una flecha hacia arriba en la matriz (rojo)
def arrow_up():
    clear_matrix()
    # Coordenadas de la flecha hacia arriba (rojo)
    arrow_up_coords = [
        4,   # Pico de la flecha
        11,  # Pico de la flecha
        12,  # Pico de la flecha
        13,  # Pico de la flecha
        20,  # Cuerpo de la flecha
        28   # Cuerpo de la flecha
    ]
    for i in arrow_up_coords:
        np[i] = (255, 0, 0)  # Color rojo
    np.write()

# Función para mostrar una flecha hacia abajo en la matriz (verde)
def arrow_down():
    clear_matrix()
    # Coordenadas de la flecha hacia abajo (verde)
    arrow_down_coords = [
        36,  # Pico de la flecha
        27,  # Pico de la flecha
        20,  # Cuerpo de la flecha
        12   # Cuerpo de la flecha
    ]
    for i in arrow_down_coords:
        np[i] = (0, 255, 0)  # Color verde
    np.write()

# Función para manejar el botón 2 (flecha hacia arriba)
def handle_button_2():
    arrow_up()
    time.sleep(8)  # Espera 8 segundos
    clear_matrix()

# Función para manejar el botón 3 (flecha hacia abajo)
def handle_button_3():
    arrow_down()
    time.sleep(8)  # Espera 8 segundos
    clear_matrix()

# Función para manejar el botón 4 (sin obstáculos)
def handle_button_4():
    fill_matrix((255, 255, 0))  # Amarillo (sin obstáculos)
    time.sleep(1)
    clear_matrix()

# Bucle principal
while True:
    if not button_1.value():  # Si se presiona el botón 1
        handle_button_1()
        time.sleep(0.3)  # Anti-rebote
    
    if not button_2.value():  # Si se presiona el botón 2
        handle_button_2()
        time.sleep(0.3)  # Anti-rebote

    if not button_3.value():  # Si se presiona el botón 3
        handle_button_3()
        time.sleep(0.3)  # Anti-rebote

    if not button_4.value():  # Si se presiona el botón 4
        handle_button_4()
        time.sleep(0.3)  # Anti-rebote

    time.sleep(0.1)