#include "PWMChannel.hpp"

#include "driver/gpio.h"
#include "driver/ledc.h"



CyanLight::PWMChannel::PWMChannel(uint8_t channel, uint8_t gpio) : channel{(ledc_channel_t)channel} {

  gpio_config_t conf;

  conf.intr_type = GPIO_INTR_DISABLE;
  conf.mode = GPIO_MODE_OUTPUT;
  conf.pin_bit_mask = 1ULL << gpio;
  conf.pull_up_en = GPIO_PULLUP_DISABLE;
  conf.pull_down_en = GPIO_PULLDOWN_DISABLE;

  gpio_config(&conf);
  gpio_set_level((gpio_num_t)gpio, 0);


  ledc_channel_config_t     ledc_channel;
  ledc_channel.channel    = this->channel;
  ledc_channel.duty       = 0;
  ledc_channel.gpio_num   = (gpio_num_t)gpio;
  ledc_channel.speed_mode = LEDC_HIGH_SPEED_MODE;
  ledc_channel.hpoint     = 0;
  ledc_channel.timer_sel  = LEDC_TIMER_0;
  ledc_channel.intr_type  = LEDC_INTR_DISABLE; 


  ledc_channel_config(&ledc_channel);

  setPWM(0);
}

void CyanLight::PWMChannel::setPWM(uint32_t pwm) {
  ledc_set_duty(LEDC_HIGH_SPEED_MODE, this->channel, pwm);
  ledc_update_duty(LEDC_HIGH_SPEED_MODE, this->channel);

  this->pwm = pwm;
}

uint32_t CyanLight::PWMChannel::getPWM() {
  return this->pwm;
}