MR16/User/device/ws2812.h
2025-12-10 20:18:07 +08:00

157 lines
4.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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__ */