#ifndef __WS2812_H__ #define __WS2812_H__ #include "main.h" #include /** * @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__ */