#ifndef __WS2812_H__
#define __WS2812_H__

#include "main.h"
#include <stdint.h>

/**
 * @brief  WS2812颜色结构体定义
 */
typedef struct
{
    uint8_t R;  /*!< 红色分量 0-255 */
    uint8_t G;  /*!< 绿色分量 0-255 */
    uint8_t B;  /*!< 蓝色分量 0-255 */
} WS2812_Color_TypeDef;

/**
 * @brief  LED状态指示枚举
 * @note   用于MR16通信状态指示
 */
typedef enum
{
    WS2812_STATUS_IDLE = 0,     /*!< 空闲状态 - LED熄灭 */
    WS2812_STATUS_TX_OK,        /*!< 发送正常 - 绿灯0.5s闪烁 */
    WS2812_STATUS_RX_OK,        /*!< 接收正常 - 绿灯0.5s闪烁 */
    WS2812_STATUS_ERROR,        /*!< 异常状态 - 红灯常亮 */
    WS2812_STATUS_DEBUG,        /*!< 调试模式 - 黄灯0.5s闪烁 */
} WS2812_Status_t;

/**
 * @brief  LED状态控制结构体
 */
typedef struct
{
    WS2812_Status_t status;          /*!< 当前状态 */
    WS2812_Status_t lastStatus;      /*!< 上次状态(用于检测变化) */
    uint8_t blinkState;              /*!< 闪烁状态: 0-灭, 1-亮 */
    uint32_t lastUpdateTick;         /*!< 上次更新时刻(ms) */
    uint32_t lastCommTick;           /*!< 上次通信成功时刻(ms) */
    uint8_t brightness;              /*!< 亮度等级(0-100, 用于降低功耗) */
} WS2812_StatusCtrl_t;

/**
 * @brief  初始化WS2812驱动，分配内存
 * @param  led_num: LED数量
 * @retval 0成功，1失败
 */
uint8_t WS2812_Init(uint16_t led_num);

/**
 * @brief  释放内存，停止DMA
 * @retval None
 */
void WS2812_DeInit(void);

/**
 * @brief  设置单个LED的颜色
 * @param  LedId: LED序号
 * @param  R: 红色分量 0-255
 * @param  G: 绿色分量 0-255
 * @param  B: 蓝色分量 0-255
 * @retval None
 */
void WS2812_SetColor(uint8_t LedId, uint8_t R, uint8_t G, uint8_t B);

/**
 * @brief  设置多个LED的颜色
 * @param  PixelArray: 颜色数组
 *         PixelArray[i][0]: LED的ID
 *         PixelArray[i][1]: R值
 *         PixelArray[i][2]: G值
 *         PixelArray[i][3]: B值
 * @param  ArraySize: 数组大小
 * @retval None
 */
void WS2812_SetColors(uint8_t PixelArray[][4], uint16_t ArraySize);

/**
 * @brief  发送数据到WS2812灯带
 * @note   会自动添加RESET码
 * @retval None
 */
void WS2812_SendArray(void);

/**
 * @brief  清空所有LED（设置为黑色）
 * @retval None
 */
void WS2812_Clear(void);

/**
 * @brief  设置所有LED为同一颜色
 * @param  R: 红色分量 0-255
 * @param  G: 绿色分量 0-255
 * @param  B: 蓝色分量 0-255
 * @retval None
 */
void WS2812_SetAll(uint8_t R, uint8_t G, uint8_t B);

/**
 * @brief  获取当前LED数量
 * @retval LED数量
 */
uint16_t WS2812_GetLedCount(void);

/*----------------------------------------------------------------------------
  状态指示灯功能 (低功耗/低干扰设计)
 *---------------------------------------------------------------------------*/

/**
 * @brief  设置LED状态指示
 * @param  status: LED状态 (WS2812_Status_t枚举)
 * @note   仅设置状态,不立即更新LED,需配合WS2812_StatusTask()使用
 * @retval None
 */
void WS2812_SetStatus(WS2812_Status_t status);

/**
 * @brief  获取当前LED状态
 * @retval 当前状态 (WS2812_Status_t枚举)
 */
WS2812_Status_t WS2812_GetStatus(void);

/**
 * @brief  通信成功通知(更新时间戳)
 * @note   在TX/RX成功时调用,用于超时检测
 * @retval None
 */
void WS2812_NotifyCommSuccess(void);

/**
 * @brief  状态指示灯任务(非阻塞)
 * @param  currentTick: 当前系统tick(ms)
 * @note   在主循环中周期调用,建议10-50ms间隔
 *         自动管理闪烁和超时检测,对射频影响极小
 * @retval None
 */
void WS2812_StatusTask(uint32_t currentTick);

/**
 * @brief  设置LED亮度(降低功耗以减少对射频干扰)
 * @param  brightness: 亮度百分比 (0-100)
 * @note   默认亮度25%,降低功耗对射频的影响
 * @retval None
 */
void WS2812_SetBrightness(uint8_t brightness);

/**
 * @brief  设置通信超时时间
 * @param  timeout_ms: 超时时间(ms), 超时后自动切换为ERROR状态
 * @note   默认1000ms
 * @retval None
 */
void WS2812_SetCommTimeout(uint32_t timeout_ms);

#endif /* __WS2812_H__ */
