EMS 知识库
首页 / knowledge/代码解析/hmi/led

app_led_cfg.c

源文件路径:hmi/led/app_led_cfg.c 所属模块:hmi/led(人机界面 - WS2812 灯带配置层) 代码行数:105

1. 文件职责

本文件是灯带模块的纯查表函数实现,只做一件事:把业务状态枚举翻译成 24 位 RGB 颜色值。它不访问任何硬件、不读写全局变量、不做任何业务判断,是两个无副作用的 switch 查表函数。

它处在灯带数据流的"最后一跳之前"位置:上游由 hmi/led/app_led.c:156-157 的 led_build_full_buffer() 传入 STATUS_LED_COLOR_E(系统状态,来自 sys_current_status_color)和 SOC_LED_COLOR_E(联网状态,来自 g_stEMSInfo.bIsLogin);下游返回值被 apply_brightness() 做亮度缩放后送进 ws2812_set_color_hex() 编码。

本文件被谁驱动:不主动运行,完全由 led_display_task() → led_build_full_buffer() 的调用链驱动,即"事件驱动 + 1 秒兜底刷新"。

它不包含状态机、不含静态缓冲,唯一的行为细节是 default 分支统一返回 0(全灭)。

2. 关键数据结构与宏

本文件不定义任何结构体、枚举或宏,全部使用 hmi/led/app_led_cfg.h 中的定义。

名称类型(结构体/枚举/宏/联合体)说明
STATUS_LED_COLOR_E枚举(hmi/led/app_led_cfg.h:48-54)入参类型 1:0=SYS_STATUS_NOT_RUN_LED_OFF、1=SYS_STATUS_NORMAL_LED_GREEN、2=SYS_STATUS_FAULT_LED_RED、3=SYS_STATUS_WARNING_LED_YELLOW
SOC_LED_COLOR_E枚举(hmi/led/app_led_cfg.h:58-62)入参类型 2:0=SOC_LED_BLUE(未联网)、1=SOC_LED_WHITE(已联网)
SYS_COLOR_OFF宏(0x000000,app_led_cfg.h:26)熄灭色,对应 SYS_STATUS_NOT_RUN_LED_OFF
SYS_COLOR_GREEN宏(0x00FF00,app_led_cfg.h:27)正常绿
SYS_COLOR_RED宏(0xFF0000,app_led_cfg.h:28)故障红
SYS_COLOR_YELLOW宏(0xFFFF00,app_led_cfg.h:29)告警黄
SOC_COLOR_WHITE / SOC_COLOR_BLUE宏(app_led_cfg.h:32-33,值 0xFFFFFF/0x0000FF)定义了但在本文件中未被使用,本文件用的是等值字面量
u32类型别名(includes.h)函数返回类型(24 位有效颜色)

3. 函数清单

函数名作用域(static/全局)说明(一句话)
get_sys_color_status全局(定义 hmi/led/app_led_cfg.c:47)按 STATUS_LED_COLOR_E 返回长灯带颜色:灭/绿/红/黄,未识别值返回 0
get_soc_color_to_rgb全局(定义 hmi/led/app_led_cfg.c:79)按 SOC_LED_COLOR_E 返回短灯带颜色:白(联网)/蓝(未联网),未识别值返回 0

本文件共 2 个函数,已全部列出。文件内无 static 函数、无静态变量。

4. 核心逻辑解析

4.1 get_sys_color_status()(hmi/led/app_led_cfg.c:47-77)

u32 color_value;
switch (color)
{
    case SYS_STATUS_NOT_RUN_LED_OFF:     color_value = SYS_COLOR_OFF;    break; // 0x000000
    case SYS_STATUS_NORMAL_LED_GREEN:    color_value = SYS_COLOR_GREEN;  break; // 0x00FF00
    case SYS_STATUS_FAULT_LED_RED:       color_value = SYS_COLOR_RED;    break; // 0xFF0000
    case SYS_STATUS_WARNING_LED_YELLOW:  color_value = SYS_COLOR_YELLOW; break; // 0xFFFF00
    default:                             color_value = 0;                break;
}
return color_value;

4.2 get_soc_color_to_rgb()(hmi/led/app_led_cfg.c:79-97)

switch (color)
{
    case SOC_LED_WHITE: color_value = 0xFFFFFF; break;  // 白色(已联网)
    case SOC_LED_BLUE:  color_value = 0x0000FF; break;  // 蓝色(未联网)
    default:            color_value = 0;        break;
}
return color_value;

4.3 颜色值的后续处理

本文件返回的 0xRRGGBB 会被下游改变字节序:

  1. hmi/led/app_led.c:60-66 的 apply_brightness() 做逐通道亮度缩放,保持 0xRRGGBB 排列;
  2. hmi/led/led_dev.c:124-128 把 0xRRGGBB 转成 WS2812 要求的 GRB:grb = (g<<16)|(r<<8)|b;
  3. ws2812_set_color_hex() 再把 GRB 的 24 个 bit 逐位编码成一串 CCR 比较值写入 DMA 缓冲。

因此本文件的颜色是"逻辑颜色",最终灯珠上看到的是 GRB 字节序。

4.4 与定时/调度的关系

无。本文件不含任何 OSTime* 调用,也不访问中断、信号量、邮箱。它的执行时机完全取决于 led_display_task() 是否被任务调用(当前没有被调用,见 hmi/led/app_led.c.md 第 7 节)。

5. 对外接口

本文件导出

名称类型使用方
get_sys_color_status全局函数(声明于 hmi/led/app_led_cfg.h:79)hmi/led/app_led.c:157
get_soc_color_to_rgb全局函数(声明于 hmi/led/app_led_cfg.h:80)hmi/led/app_led.c:156

本文件不导出任何全局变量。

本文件调用的外部函数/变量

名称来源
SYS_COLOR_* 宏hmi/led/app_led_cfg.h:26-29
STATUS_LED_COLOR_E、SOC_LED_COLOR_Ehmi/led/app_led_cfg.h:48-62
u32includes.h(经 app_led_cfg.h:18)

本文件不调用任何函数(两个函数体都只有 switch 与赋值),也不读写任何全局变量,是灯带模块中耦合度最低的文件。

6. 依赖关系

依赖(本文件 include):app_led_cfg.h(14)、led_dev.h(15)、ems.h(16)。

led_dev.h 与 ems.h 在本文件正文中没有任何符号被使用(app_led_cfg.h 已经包含了 led_dev.h),属多余 include。

被依赖:

7. 备注与风险点