#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
// Definições dos pinos dos LEDs
const uint LED_RED = 13;
const uint LED_BLUE = 12;
const uint LED_GREEN = 11;
// Frequências do PWM
const uint32_t FREQ_RED = 1000;
const uint32_t FREQ_BLUE = 10000;
// Inicializa o duty cycle
const uint16_t INITIAL_DUTY_CYCLE = 5;
uint16_t duty_cycle_red = INITIAL_DUTY_CYCLE;
uint16_t duty_cycle_blue = INITIAL_DUTY_CYCLE;
void setup_pwm(uint gpio, uint32_t freq, uint16_t duty_cycle) {
    gpio_set_function(gpio, GPIO_FUNC_PWM);
    uint slice_num = pwm_gpio_to_slice_num(gpio);
    uint32_t clock = 125 * 1000 * 1000; // Clock base do PWM é 125 MHz
    uint32_t wrap = clock / freq - 1;
    pwm_set_wrap(slice_num, wrap);
    pwm_set_gpio_level(gpio, wrap * duty_cycle / 100);
    pwm_set_enabled(slice_num, true);
}
bool repeating_timer_callback(struct repeating_timer *t) {
    duty_cycle_red = (duty_cycle_red + 5) % 105;
    duty_cycle_blue = (duty_cycle_blue + 5) % 105;
    uint slice_num_red = pwm_gpio_to_slice_num(LED_RED);
    uint slice_num_blue = pwm_gpio_to_slice_num(LED_BLUE);
    pwm_set_gpio_level(LED_RED, pwm_hw->slice[slice_num_red].top * duty_cycle_red / 100);
    pwm_set_gpio_level(LED_BLUE, pwm_hw->slice[slice_num_blue].top * duty_cycle_blue / 100);
    return true;
}
int main() {
    stdio_init_all();
    setup_pwm(LED_RED, FREQ_RED, duty_cycle_red);
    setup_pwm(LED_BLUE, FREQ_BLUE, duty_cycle_blue);
    gpio_init(LED_GREEN);
    gpio_set_dir(LED_GREEN, GPIO_OUT);
    gpio_put(LED_GREEN, 0); // Mantém o LED verde inativo
    struct repeating_timer timer;
    add_repeating_timer_ms(2000, repeating_timer_callback, NULL, &timer);
    // Loop infinito
    while (true) {
        tight_loop_contents();
    }
}