157 lines
4.1 KiB
C
157 lines
4.1 KiB
C
#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__ */
|