#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"

#define VERDE 2
#define AMARELO 3
#define VERMELHO 4
#define SINAL 5
#define BOTAO 7
#define BUZZER_PIN 6

#define BUZZER_FREQUENCY 100

void pwm_init_buzzer(uint pin) {
  gpio_set_function(pin, GPIO_FUNC_PWM);
  uint slice_num = pwm_gpio_to_slice_num(pin);
  pwm_config config = pwm_get_default_config();
  pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (100 * 4096));
  pwm_init(slice_num, &config, true);
  pwm_set_gpio_level(pin, 0);
}

void beep(uint pin, uint duration_ms) {
  uint slice_num = pwm_gpio_to_slice_num(pin);
  pwm_set_gpio_level(pin, 2048);
  sleep_ms(duration_ms);
  pwm_set_gpio_level(pin, 0);
  sleep_ms(100);
}

void alternar_leds(int verde, int amarelo, int vermelho, int sinal) {
  gpio_put(VERDE, verde);
  gpio_put(AMARELO, amarelo);
  gpio_put(VERMELHO, vermelho);
  gpio_put(SINAL, sinal);
}

bool botao_pressionado() {
  bool estado_botao = gpio_get(BOTAO) == 1; // Só funciona alterando o valor por algum motivo
  return estado_botao;
}

int main() {
  gpio_init(BOTAO);
  gpio_set_dir(BOTAO, GPIO_IN);
  gpio_pull_up(BOTAO);

  gpio_init(VERDE);
  gpio_set_dir(VERDE, GPIO_OUT);

  gpio_init(AMARELO);
  gpio_set_dir(AMARELO, GPIO_OUT);

  gpio_init(VERMELHO);
  gpio_set_dir(VERMELHO, GPIO_OUT);

  gpio_init(SINAL);
  gpio_set_dir(SINAL, GPIO_OUT);

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

  pwm_init_buzzer(BUZZER_PIN);

  while (true) {
    if (botao_pressionado()) {
      alternar_leds(0, 1, 0, 0);
      sleep_ms(5000);

      for (int i = 0; i < (15000 / 500); i++) {
        alternar_leds(0, 0, 1, 1);
        beep(BUZZER_PIN, 500);
        sleep_ms(500);
      }

      alternar_leds(0, 0, 0, 0);
    }

    alternar_leds(1, 0, 0, 0);
    sleep_ms(8000);

    alternar_leds(0, 1, 0, 0);
    sleep_ms(2000);

    alternar_leds(0, 0, 1, 0);
    sleep_ms(10000);
  }

  return 0;
}
$abcdeabcde151015202530fghijfghij