#include "pico/stdlib.h"
#include <stdio.h>

#define LED_VERDE_CARROS 9
#define LED_AMARELO 5
#define LED_VERMELHO 1
#define LED_VERDE_PEDESTRES 28
#define BUZZER 17
#define BOTAO 21

void inicializar_gpio() {
    gpio_init(LED_VERDE_CARROS);
    gpio_init(LED_AMARELO);
    gpio_init(LED_VERMELHO);
    gpio_init(LED_VERDE_PEDESTRES);
    gpio_init(BUZZER);
    gpio_init(BOTAO);

    gpio_set_dir(LED_VERDE_CARROS, GPIO_OUT);
    gpio_set_dir(LED_AMARELO, GPIO_OUT);
    gpio_set_dir(LED_VERMELHO, GPIO_OUT);
    gpio_set_dir(LED_VERDE_PEDESTRES, GPIO_OUT);
    gpio_set_dir(BUZZER, GPIO_OUT);
    gpio_set_dir(BOTAO, GPIO_IN);
    gpio_pull_up(BOTAO);  // Ativar pull-up interno no botão
}

void acender_led(uint led_pin) {
    gpio_put(led_pin, 1);
}

void apagar_led(uint led_pin) {
    gpio_put(led_pin, 0);
}

void buzzer_intermitente(uint tempo_ms) {
    for (uint i = 0; i < tempo_ms / 200; i++) {
        gpio_put(BUZZER, 1);
        sleep_ms(100);
        gpio_put(BUZZER, 0);
        sleep_ms(100);
    }
}

// Função para aguardar com verificação do botão
void esperar_com_verificacao(uint tempo_total_ms) {
    for (uint t = 0; t < tempo_total_ms; t += 100) {
        if (!gpio_get(BOTAO)) {  // Se o botão for pressionado
            return;
        }
        sleep_ms(100);
    }
}

void ciclo_semaforo_carros() {
    acender_led(LED_VERDE_CARROS);
    apagar_led(LED_AMARELO);
    apagar_led(LED_VERMELHO);
    esperar_com_verificacao(8000);

    apagar_led(LED_VERDE_CARROS);
    acender_led(LED_AMARELO);
    esperar_com_verificacao(2000);

    apagar_led(LED_AMARELO);
    acender_led(LED_VERMELHO);
    esperar_com_verificacao(10000);
}

void travessia_pedestres() {
    // Fase 1: Aciona o LED amarelo por 5 segundos
    acender_led(LED_AMARELO);
    apagar_led(LED_VERDE_CARROS);
    apagar_led(LED_VERMELHO);
    sleep_ms(5000);

    // Fase 2: Aciona o LED vermelho para os carros e o LED verde para pedestres por 15 segundos
    apagar_led(LED_AMARELO);
    acender_led(LED_VERMELHO);
    acender_led(LED_VERDE_PEDESTRES);
    buzzer_intermitente(15000);  // Ativa o buzzer intermitente durante esse período

    // Fase 3: Volta ao ciclo normal, apagando o verde de pedestres
    apagar_led(LED_VERDE_PEDESTRES);
    apagar_led(LED_VERMELHO);
}

int main() {
    inicializar_gpio();

    while (true) {
        if (!gpio_get(BOTAO)) {  // Verifica se o botão foi pressionado
            printf("Botão pressionado\n");
            travessia_pedestres();
        } else {
            ciclo_semaforo_carros();
        }
    }

    return 0;
}