from machine import Pin
from time import sleep, ticks_ms,ticks_diff

def init_mode(traffic):
    # init state light is OUT
    rood_a.value(0)
    oranje_a.value(0)
    groen_a.value(0)
    rood_b.value(0)
    oranje_b.value(0)
    groen_b.value(0)
    if traffic:
        zone_start = 0
        rood_a.value(1) # init state light is ON
        rood_b.value(1) # init state light is ON
    else:
        zone_start = 0
        oranje_a.value(1) # init state light is ON
        oranje_b.value(1) # init state light is ON
    return zone_start
    
if __name__ == '__main__':
    SINGLE_SPEED = 1
    DOUBLE_SPEED = 2
    DENDER_VALUE = 0.4

    # ESP32 IN & OUT
    rood_a = Pin(21, Pin.OUT)   # traffic light A
    oranje_a = Pin(19, Pin.OUT)
    groen_a = Pin(18, Pin.OUT)
    rood_b = Pin(25, Pin.OUT)   # traffic light B
    oranje_b = Pin(26, Pin.OUT)
    groen_b = Pin(27, Pin.OUT)
    led_blauw = Pin(2, Pin.OUT)
    druk_mode = Pin(34, Pin.IN, Pin.PULL_DOWN)     # press for toggle modes normal - alarm(blink) 
    druk_speed = Pin(35, Pin.IN, Pin.PULL_DOWN)     # press for toggle normal - double 

    druk_mode_now = 0
    druk_speed_now = 0
    druk_mode_prev = 0
    druk_speed_prev = 0
    info_flag = True
    time_stamp = ticks_ms()

    traffic_mode = True
    speed_mode = SINGLE_SPEED

    intervals = [2000, 5000, 2000, 2000, 5000, 2000]
    blink_interval = 1000

    zone = init_mode(traffic_mode)
    # init_speed(speed_mode)

    while True:
        # display info banner and blue ESP32 LED for double speed
        if info_flag:
            text_traffic = "NORMAL" if traffic_mode else "ALARM "
            if traffic_mode:
                text_speed = "DOUBLE" if speed_mode == 2 else "NORMAL"
            else:
                text_speed = "N/A"
            print("Traffic =", text_traffic,"Speed =", text_speed)

            led_blauw.value(1) if speed_mode == 2 else led_blauw.value(0)
        info_flag = False

        # check button to toggle traffic_mode
        druk_mode_now = druk_mode.value()
        if druk_mode_now != druk_mode_prev:
            druk_mode_prev = druk_mode_now
            if druk_mode_now:
                traffic_mode = not traffic_mode
                info_flag = True
                zone = init_mode(traffic_mode)
            sleep(DENDER_VALUE)

        if traffic_mode:
            # check button to toggle speed_mode (only in NORMAL traffic mode)
            druk_speed_now = druk_speed.value()
            if druk_speed_now != druk_speed_prev:
                druk_speed_prev = druk_speed_now
                if druk_speed_now:
                    speed_mode = 1 if speed_mode ==2 else 2
                    info_flag = True
                sleep(DENDER_VALUE)

        # 2 types of traffic lights cycles
        time_now = ticks_ms()
        if traffic_mode:    # NORMAL traffic mode
            if zone == 0:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    rood_a.value(0)
                    groen_a.value(1)
                    zone += 1
                    time_stamp = time_now
            elif zone == 1:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    groen_a.value(0)
                    oranje_a.value(1)
                    zone += 1
                    time_stamp = time_now
            elif zone == 2:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    oranje_a.value(0)
                    rood_a.value(1)
                    zone += 1
                    time_stamp = time_now
            elif zone == 3:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    rood_b.value(0)
                    groen_b.value(1)
                    zone += 1
                    time_stamp = time_now
            elif zone == 4:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    groen_b.value(0)
                    oranje_b.value(1)
                    zone += 1
                    time_stamp = time_now
            elif zone == 5:
                if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
                    oranje_b.value(0)
                    rood_b.value(1)
                    zone = 0
                    time_stamp = time_now
        else:   # ALARM traffic mode (blinking orange lights)
            if zone == 0:
                if ticks_diff(time_now, time_stamp) >= blink_interval:
                    oranje_a.value(0)
                    oranje_b.value(0)
                    zone += 1
                    time_stamp = time_now
            elif zone == 1:
                if ticks_diff(time_now, time_stamp) >= blink_interval:
                    oranje_a.value(1)
                    oranje_b.value(1)
                    zone = 0
                    time_stamp = time_now
$abcdeabcde151015202530354045505560fghijfghij