#include "indicator_led.h" #define LED_NUM 12 // LED灯珠个数 rt_thread_t led_blink_thread = RT_NULL; // 灯处于特定颜色还是闪烁状态 uint8_t LED_Blink_Staue[LED_NUM] = {0}; // 灯闪烁颜色缓存 RGBColor_TypeDef LED_Blink_Color[LED_NUM] = {0}; const RGBColor_TypeDef LED_OFF = {0, 0, 0}; const RGBColor_TypeDef LED_ON = {255, 255, 255}; /** * @brief 设置特定LED的颜色或开关 * @param LedId LED的序号(0~LED_NUM-1) * @param Color 颜色/开关 LED_RED,LED_BLUE,LED_OFF,LED_ON(白色)…… */ void LED_Set(uint16_t LedId, RGBColor_TypeDef Color) { LED_Blink_Staue[LedId] = 0; Set_LEDColor(LedId, Color); RGB_Reflash(); } /** * @brief 设置连续多个特定LED的颜色或开关 * @param LedId LED的序号(0~LED_NUM-1) * @param Color 颜色/开关 LED_RED,LED_BLUE,LED_OFF,LED_ON(白色)…… */ void LED_SetMore(uint16_t LedId_begin, uint16_t LedId_end, RGBColor_TypeDef Color) { for (int LedId = LedId_begin; LedId <=LedId_end ; LedId++) { Set_LEDColor(LedId, LED_Blink_Color[LedId]); } RGB_Reflash(); } /** * @brief 设置特定LED的闪烁 * @param LedId LED的序号(0~LED_NUM-1) * @param Color 颜色 LED_RED,LED_BLUE…… */ void LED_Blink(uint16_t LedId, RGBColor_TypeDef Color) { LED_Blink_Staue[LedId] = 1; LED_Blink_Color[LedId] = Color; } /** * @brief 设置连续多个特定LED的闪烁 * @param LedId LED的序号(0~LED_NUM-1) * @param Color 颜色 LED_RED,LED_BLUE…… */ void LED_BlinkMore(uint16_t LedId_begin, uint16_t LedId_end, RGBColor_TypeDef Color) { for (int LedId = LedId_begin; LedId <=LedId_end ; LedId++) { LED_Blink_Staue[LedId] = 1; LED_Blink_Color[LedId] = Color; } } /** * @brief 每0.5s判断各盏灯是否要翻转 */ void led_blink_entry(void *parameter) { uint8_t LED_Blink_ON = 1; while (1) { for (int LedId = 0; LedId < LED_NUM; LedId++) { if (LED_Blink_Staue[LedId]) { if (LED_Blink_ON) { Set_LEDColor(LedId, LED_Blink_Color[LedId]); } else { Set_LEDColor(LedId, LED_OFF); } } } LED_Blink_ON = !LED_Blink_ON; RGB_Reflash(); rt_thread_mdelay(500); } } int led_init(void) { led_blink_thread = rt_thread_create("led blink control thread", led_blink_entry, RT_NULL, 1024, 20, 20); if (led_blink_thread == RT_NULL) { rt_kprintf("led blink control thread creat failed!\n"); return 0; } rt_thread_mdelay(200); // avoid multi-thread on LED matrix transmit. rt_thread_startup(led_blink_thread); }