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

//Biblioteca usada para permitir a divisão de tarefas por núcleos.
#include "pico/multicore.h"

//Configuração dos pinos dos LED's para o semáforo.
const uint GREEN_LED_PIN_FOR_CARS = 28;   // LED verde no GPIO 28
const uint YELLOW_LED_PIN  = 27; // LED Amarelo no GPIO 27
const uint RED_LED_PIN = 26;  // LED Vermelho no GPIO 26

//Configuração do pino do LED para pedestres.
const uint GREEN_LED_PIN_FOR_PEDESTRIANS = 22; // LED no GPIO 22

// Configuração do pino para o buzzer
const uint BUZZER_PIN = 21; // Buzzer no GPIO 21

// Configuração do pino para o botão
const uint BUTTON_PIN = 20;  // Button no GPIO 20


// Lógica do semáforo (dividida para um núcleos).
void led_task_for_cars(){

  gpio_init(GREEN_LED_PIN_FOR_CARS); // Inicializando o pino verde
  gpio_init(YELLOW_LED_PIN); // Inicializando o pino amarelo
  gpio_init(RED_LED_PIN); // Inicializando o pino vermelho
  gpio_set_dir(GREEN_LED_PIN_FOR_CARS, GPIO_OUT); // Definindo direção para "saida"
  gpio_set_dir(YELLOW_LED_PIN, GPIO_OUT); // Definindo direção para "saida"
  gpio_set_dir(RED_LED_PIN, GPIO_OUT); // Definindo direção para "saida"
  
  // Loop relacionado a forma como o semaforo vai agir sem o pressionar do botão
  while (true) {

    gpio_put(RED_LED_PIN, 0);
    gpio_put(GREEN_LED_PIN_FOR_CARS, 1);
    sleep_ms(8000);
    gpio_put(GREEN_LED_PIN_FOR_CARS, 0);
    gpio_put(YELLOW_LED_PIN, 1);
    sleep_ms(2000);
    gpio_put(YELLOW_LED_PIN, 0);
    gpio_put(RED_LED_PIN, 1);
    sleep_ms(10000);

  }
}


// Lógica para quando o botão é precionado (dividida para um núcleos).
void button_task_for_pedestrians() {

  gpio_init(GREEN_LED_PIN_FOR_PEDESTRIANS); // Inicializando o pino
  gpio_set_dir(GREEN_LED_PIN_FOR_PEDESTRIANS, GPIO_OUT); // Definindo direção para "saida"

  gpio_init(BUZZER_PIN);
  gpio_set_dir(BUZZER_PIN, GPIO_OUT);

  gpio_init(BUTTON_PIN);
  gpio_set_dir(BUTTON_PIN, GPIO_IN); // Configura o botão como entrada
  gpio_pull_up(BUTTON_PIN); // Mantem o pino em nível lógico alto enquanto não pressionado

  // Variáveis para controlar o estado do botão
  bool button_pressed = false;
  bool previous_button_state = true;

  while (true) {
    // Muda o estado da variavel para o estado atual do botão (0 ou 1)
    bool current_button_state = gpio_get(BUTTON_PIN);

    if (current_button_state != previous_button_state) {
      if (current_button_state == 0) {
        button_pressed = true;
        gpio_put(BUZZER_PIN, 1);
        sleep_ms(15000);
        gpio_put(BUZZER_PIN, 0);
        button_pressed = false;
      }
    }

    previous_button_state = current_button_state;

    if(button_pressed) {

      gpio_put(GREEN_LED_PIN_FOR_PEDESTRIANS, 1);
      sleep_ms(15000);
      gpio_put(GREEN_LED_PIN_FOR_PEDESTRIANS, 0);
      button_pressed = false;

    }
    sleep_ms(500);
  }
}


//Essa é a função principal do projeto. É por ela que o código inicia.
int main() {
  stdio_init_all();

  // Inicializa um dos núcleos, responsável pelo semáforo.
  multicore_launch_core1(led_task_for_cars);

  // Inicializa o núcleo principal.
  button_task_for_pedestrians();

  return 0;
}
$abcdeabcde151015202530fghijfghij