#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"

#define LED_PIN     GPIO_NUM_2
#define LEDC_CHANNEL    LEDC_CHANNEL_0
#define LEDC_TIMER      LEDC_TIMER_0
#define LEDC_FREQ_HZ    5000
#define LEDC_TIMER_BIT  LEDC_TIMER_13_BIT

int fade_amount = 3;

void led_fade() {
  /* Timer Configuration  */
  ledc_timer_config_t ledc_timer = {
    .speed_mode = LEDC_HIGH_SPEED_MODE,
    .timer_num = LEDC_TIMER,
    .freq_hz = LEDC_FREQ_HZ,
    .duty_resolution = LEDC_TIMER_BIT,
    .clk_cfg  =  LEDC_APB_CLK 
  };
  ledc_timer_config(&ledc_timer);

  /* Channel Configuration  */
  ledc_channel_config_t ledc_channel = {
    .gpio_num      = LED_PIN,
    .speed_mode    = LEDC_HIGH_SPEED_MODE,
    .channel       = LEDC_CHANNEL,
    .intr_type     = LEDC_INTR_DISABLE,
    .timer_sel     = LEDC_TIMER,
    .duty          = 0,
    .hpoint        = 0,
  };
  ledc_channel_config(&ledc_channel);

  /* Change PWM Duty Cycle Using Software */
  for (int duty_cycle = 0; duty_cycle <= 255; duty_cycle += fade_amount)
  {
    ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, duty_cycle);
    ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
    vTaskDelay(20 / portTICK_PERIOD_MS);
  }
  for (int duty_cycle = 255; duty_cycle >= 0; duty_cycle -= fade_amount)
  {
    ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, duty_cycle);
    ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
    vTaskDelay(20 / portTICK_PERIOD_MS);
  }

}


void app_main() {
  while (1)
  {
    led_fade();
  }
}