#include <zephyr/kernel.h>
#include <zephyr/drivers/pwm.h>
#include <zephyr/logging/log.h>

LOG_MODULE_REGISTER(buzzer_app, LOG_LEVEL_INF);

/* Obtém as propriedades do nó criado no app.overlay */
static const struct pwm_dt_spec buzzer = PWM_DT_SPEC_GET(DT_ALIAS(buzzer_pwm));

int main(void)
{
    LOG_INF("A iniciar sistema de PWM para o Buzzer (4 kHz)");

    if (!pwm_is_ready_dt(&buzzer)) {
        LOG_ERR("Erro: O periférico PWM não está pronto.");
        return 0;
    }

    /* O Zephyr carrega automaticamente o valor de PWM_USEC(250) em nanosegundos (250.000 ns) */
    uint32_t period = buzzer.period;
    
    /* 50% de duty cycle = metade do período */
    uint32_t pulse = period / 2;

    LOG_INF("Período lido: %u ns. Ciclo de trabalho: %u ns.", period, pulse);

    /* Envia a configuração para o hardware. A partir deste momento, o sinal é contínuo */
    int err = pwm_set_dt(&buzzer, period, pulse);
    
    if (err) {
        LOG_ERR("Falha ao configurar o sinal PWM. Erro: %d", err);
        return 0;
    }

    LOG_INF("Sinal ativo no pino P1.04. O processador principal vai entrar em suspensão.");

    /* O periférico de hardware funciona de forma assíncrona. 
     * O loop principal não necessita de intervir. 
     */
    while (1) {
        k_sleep(K_SECONDS(10));
    }

    return 0;
}