"""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Raspberry Pi Pico Traffic Light (MicroPython)            ┃
┃                                                          ┃
┃ A traffic light sequence using state machine logic.      ┃
┃ It controls the LEDs to simulate a traffic light,        ┃
┃ cycling through red, yellow, green, and a short yellow.  ┃
┃                                                          ┃
┃ Copyright (c) 2023 Anderson Costa                        ┃
┃ GitHub: github.com/arcostasi                             ┃
┃ License: MIT                                             ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
"""

import machine
import utime

# Define the LED pins
led_red = machine.Pin(11, machine.Pin.OUT)
led_yellow = machine.Pin(8, machine.Pin.OUT)
led_green = machine.Pin(5, machine.Pin.OUT)

def handle_red_state():
    led_red.value(1)
    led_yellow.value(0)
    led_green.value(0)

def handle_yellow_state():
    led_red.value(0)
    led_yellow.value(1)
    led_green.value(0)

def handle_green_state():
    led_red.value(0)
    led_yellow.value(0)
    led_green.value(1)

def handle_yellow_state_short():
    led_red.value(0)
    led_yellow.value(1)
    led_green.value(0)

# State handlers list
state_handlers = [
    # (state function, time in milliseconds)
    (handle_red_state,            5000),  # Red LED, on for 5 seconds
    (handle_yellow_state,         3000),  # Yellow LED, on for 3 seconds
    (handle_green_state,          5000),  # Green LED, on for 5 seconds
    (handle_yellow_state_short,   2000)   # Short Yellow LED, on for 2 seconds
]

def traffic_light():
    state = 0

    while True:
        # Get the current state tuple (handler function and sleep time)
        current_handler_and_time = state_handlers[state]
        handler_func = current_handler_and_time[0]
        sleep_duration_ms = current_handler_and_time[1]

        # Execute the handler function and sleep for the specified time
        handler_func()
        utime.sleep_ms(sleep_duration_ms)

        # Update the state index
        state = (state + 1) % len(state_handlers)

# Run the traffic light sequence
traffic_light()
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT