/* Includes ----------------------------------------------------------------- */
#include "bsp/led.h"
#include "bsp/bsp.h"
#include <tim.h>

/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */
static uint32_t led_stats; // 使用位掩码记录每个通道的状态

/* Private function  -------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */

int8_t BSP_LED_Set(BSP_LED_Channel_t ch, BSP_LED_Status_t s, float duty_cycle) {
  if (duty_cycle > 1.0f) return BSP_ERR;

  uint32_t tim_ch;
  uint16_t pulse = (uint16_t)(duty_cycle * (float)UINT16_MAX); // 直接使用占空比

  // 根据通道选择对应的定时器通道
  switch (ch) {
    case BSP_LED_RED:
      tim_ch = TIM_CHANNEL_1;
      break;

    case BSP_LED_GREEN:
      tim_ch = TIM_CHANNEL_2;
      break;

    case BSP_LED_BLUE:
      tim_ch = TIM_CHANNEL_3;
      break;

    default:
      return BSP_ERR; // 无效通道
  }

  // 设置 PWM 占空比
  __HAL_TIM_SET_COMPARE(&htim3, tim_ch, pulse);

  // 根据状态切换 LED
  switch (s) {
    case BSP_LED_ON:
      HAL_TIM_PWM_Start(&htim3, tim_ch);
      led_stats |= (1 << ch); // 设置对应通道的状态位
      break;

    case BSP_LED_OFF:
      HAL_TIM_PWM_Stop(&htim3, tim_ch);
      led_stats &= ~(1 << ch); // 清除对应通道的状态位
      break;

    case BSP_LED_TAGGLE:
      if (led_stats & (1 << ch)) { // 如果当前通道已开启
        HAL_TIM_PWM_Stop(&htim3, tim_ch);
        led_stats &= ~(1 << ch); // 清除对应通道的状态位
      } else { // 如果当前通道已关闭
        HAL_TIM_PWM_Start(&htim3, tim_ch);
        led_stats |= (1 << ch); // 设置对应通道的状态位
      }
      break;

    default:
      return BSP_ERR; // 无效状态
  }

  return BSP_OK;
}