#ifndef __DRV_RGB_PWM_H__
#define __DRV_RGB_PWM_H__

#include "rtthread.h"
#include "drivers/rt_drv_pwm.h"


#ifdef RGB_ENABLE

#define RGB_DRV_PWM_PERIOD              (1600)  /**< PWM周期，单位：纳秒 */
#define RGB_DRV_PWM_PULSE_PERIOD        (800)   /**< PWM脉冲宽度，单位：纳秒 */

#define RGB_DRV_REG_HIGH                (18)    /**< 高电平占空比 */
#define RGB_DRV_REG_LOW                 (7)     /**< 低电平占空比 */    
#define RGB_DRV_REG_END                 (50)    /**< 结束/重置占空比 */  

// #if defined(RGB_CIRCLE_ENABLE) && defined(RGB_STRIP_ENABLE)
// #define RGB_DRV_PWM_LED_COUNT           ((RGB_CIRCLE_RGB_NUM) > (RGB_STRIP_RGB_NUM) ? (RGB_CIRCLE_RGB_NUM) : (RGB_STRIP_RGB_NUM))
// #elif defined(RGB_CIRCLE_ENABLE)
// #define RGB_DRV_PWM_LED_COUNT           (RGB_CIRCLE_RGB_NUM)
// #elif defined(RGB_STRIP_ENABLE)
// #define RGB_DRV_PWM_LED_COUNT           (RGB_STRIP_RGB_NUM)
// #else
#define RGB_DRV_PWM_LED_COUNT           (20)
// #endif

#define RGB_DRV_PWM_COLOR_BITS          (24)    /**< 每颗RGB灯的颜色深度 */
#define RGB_DRV_PWM_REST_LEN            (300)   /**< 每颗RGB灯的复位时间（微秒） */
#define RGB_DRV_PWM_STOP_LEN            (50)    /**< 每颗RGB灯的停止时间（微秒） */   

#define RGB_DRV_PWM_COLOR_LEN           (RGB_DRV_PWM_COLOR_BITS * RGB_DRV_PWM_LED_COUNT)
#define RGB_DRV_PWM_ARRAY_LEN           (RGB_DRV_PWM_REST_LEN + RGB_DRV_PWM_COLOR_LEN + RGB_DRV_PWM_STOP_LEN)


/*
 * @brief RGB PWM驱动结构体
 */
struct rgb_pwm_drv {
    struct rt_device dev;                       /**< 设备基类 */
    char *dev_name;                             /**< 设备名称 */    
    struct rt_device_pwm *pwm_dev;              /**< PWM设备句柄 */
    uint8_t channel;                            /**< PWM通道 */
    uint16_t max_count;                         /**< 最大支持的LED数量 */
    uint16_t array[RGB_DRV_PWM_ARRAY_LEN];      /**< PWM占空比数组 */
    rt_mutex_t mutex;                           /**< 线程安全互斥锁 */
};

/**
 * @brief RGB PWM配置结构体
 */  
struct rgb_pwm_config {
    rt_uint32_t *array;                         /**< RGB颜色数组（ARGB格式） */      
    rt_uint16_t count;                          /**< LED数量 */
};

/**
 * @brief Set RGB颜色数组到PWM占空比数组
 * @param[in] drv RGB PWM驱动实例
 * @param[in] array RGB颜色数组，每个元素为32位ARGB格式
 * @param[in] count 数组中颜色的数量
 * @return rt_err_t 错误码，RT_EOK表示成功，-RT_ERROR表示失败
 */
static rt_err_t rgb_pwm_set_color(struct rgb_pwm_drv *drv, uint32_t *array, uint16_t count);

/**
 * @brief Write PWM占空比数组到RGB PWM设备
 * @param[in] drv RGB PWM驱动实例
 * @param[in] rgb RGB PWM配置结构体，包含颜色数组和数量
 * @return rt_err_t 错误码，RT_EOK表示成功，-RT_ERROR表示失败
 */
static rt_err_t rgb_pwm_write(struct rgb_pwm_drv *drv, struct rgb_pwm_config *rgb);

/**
 * @brief Control RGB PWM设备
 * @param[in] dev RGB PWM设备指针
 * @param[in] cmd 控制命令，如PWM_CMD_ENABLE、PWM_CMD_DISABLE等
 * @param[in] arg 控制参数，如配置结构体指针
 * @return rt_err_t 错误码，RT_EOK表示成功，-RT_ERROR表示失败
 */
static rt_err_t rgb_pwm_control(rt_device_t dev, int cmd, void *arg);

#endif  /* RGB_ENABLE */

#endif  /* __DRV_RGB_PWM_H__ */


