首页 / knowledge/代码解析/hmi/led
app_led_cfg.h
源文件路径:
hmi/led/app_led_cfg.h所属模块:hmi/led(人机界面 - WS2812 灯带配置层) 代码行数:83
1. 文件职责
本文件是 WS2812 灯带模块的颜色配置头,集中定义"业务状态 → RGB 颜色值"的可读符号:状态色宏(SYS_COLOR_*)、SOC 色宏(SOC_COLOR_*)、三套颜色枚举,以及两个颜色查询函数的声明。
它处在灯带数据流的"取色字典"位置:上层 hmi/led/app_led.c 用 STATUS_LED_COLOR_E/SOC_LED_COLOR_E 两个枚举描述当前该显示什么状态,本文件把状态名与函数原型暴露出去,具体映射实现在 hmi/led/app_led_cfg.c。
它同时是灯带模块的"依赖汇聚点":hmi/led/app_led.h:16 → 本文件 → led_dev.h(编码层)+ chip.h/includes.h(平台类型)+ bms.h/ems.h(数据源),因此任何包含 app_led.h 的模块都会连带看到灯带全部符号。
本文件还对外声明全局变量 sys_current_status_color(hmi/led/app_led_cfg.h:71),这是 hmi/led.c(写入方)与 hmi/led/app_led.c(读取方)之间唯一的状态通道。
2. 关键数据结构与宏
| 名称 | 类型(结构体/枚举/宏/联合体) | 说明 |
|---|---|---|
__APP_LED_CFG_H__ | 宏(防重包含) | 头文件保护宏,hmi/led/app_led_cfg.h:10-11 |
SYS_COLOR_OFF | 宏(0x000000) | 长灯带系统状态——熄灭,hmi/led/app_led_cfg.h:26 |
SYS_COLOR_GREEN | 宏(0x00FF00) | 正常运行绿色,hmi/led/app_led_cfg.h:27 |
SYS_COLOR_RED | 宏(0xFF0000) | 故障红色,hmi/led/app_led_cfg.h:28 |
SYS_COLOR_YELLOW | 宏(0xFFFF00) | 告警黄色(红+绿),hmi/led/app_led_cfg.h:29 |
SOC_COLOR_WHITE | 宏(0xFFFFFF) | SOC 灯带白色(已联网),hmi/led/app_led_cfg.h:32 |
SOC_COLOR_BLUE | 宏(0x0000FF) | SOC 灯带蓝色(未联网),hmi/led/app_led_cfg.h:33 |
led_color_t | 枚举(hmi/led/app_led_cfg.h:37-45) | 通用颜色枚举:LED_COLOR_NONE(0)/RED/BLUE/GREEN/WHITE/LED_COLOR_MAX。全工程无任何使用点,属预留 |
STATUS_LED_COLOR_E | 枚举(hmi/led/app_led_cfg.h:48-54) | 长灯带系统状态色:SYS_STATUS_NOT_RUN_LED_OFF(0,熄灭/未运行)、SYS_STATUS_NORMAL_LED_GREEN(1)、SYS_STATUS_FAULT_LED_RED(2)、SYS_STATUS_WARNING_LED_YELLOW(3)。由 hmi/led.c:654 写入 sys_current_status_color |
SOC_LED_COLOR_E | 枚举(hmi/led/app_led_cfg.h:58-62) | 短灯带颜色:SOC_LED_BLUE(0,未联网)、SOC_LED_WHITE(1,已联网)。取值刻意与 g_stEMSInfo.bIsLogin(0/1)对齐,可强转 |
sys_current_status_color | 全局变量声明(STATUS_LED_COLOR_E,hmi/led/app_led_cfg.h:71) | 定义在 hmi/led/app_led.c:44;写入方 hmi/led.c:654,读取方 hmi/led/app_led.c:89 |
3. 函数清单
本文件只有函数声明,没有任何函数定义。
| 函数名 | 作用域(static/全局) | 说明(一句话) |
|---|---|---|
get_sys_color_status | 全局(声明,hmi/led/app_led_cfg.h:79) | 把 STATUS_LED_COLOR_E 系统状态枚举映射成 24 位 RGB 值,定义于 hmi/led/app_led_cfg.c:47 |
get_soc_color_to_rgb | 全局(声明,hmi/led/app_led_cfg.h:80) | 把 SOC_LED_COLOR_E 联网状态枚举映射成 24 位 RGB 值,定义于 hmi/led/app_led_cfg.c:79 |
4. 核心逻辑解析
本文件是纯声明头,无逻辑。其中的设计约定如下:
- 颜色编码约定:所有颜色为 24 位
0xRRGGBB。但实际驱动时的字节序在hmi/led/led_dev.c:118-135被改写成 WS2812 要求的 GRB 顺序,因此本文件给出的0xRRGGBB是"逻辑颜色",不是灯珠收到的原始字节序。 - 状态→颜色映射表(实际由
hmi/led/app_led_cfg.c:47-97实现):
| 状态枚举 | 输出 RGB | 对应宏 |
|---|---|---|
SYS_STATUS_NOT_RUN_LED_OFF | 0x000000 | SYS_COLOR_OFF |
SYS_STATUS_NORMAL_LED_GREEN | 0x00FF00 | SYS_COLOR_GREEN |
SYS_STATUS_FAULT_LED_RED | 0xFF0000 | SYS_COLOR_RED |
SYS_STATUS_WARNING_LED_YELLOW | 0xFFFF00 | SYS_COLOR_YELLOW |
SOC_LED_WHITE | 0xFFFFFF | 常量字面量(未用 SOC_COLOR_WHITE 宏) |
SOC_LED_BLUE | 0x0000FF | 常量字面量(未用 SOC_COLOR_BLUE 宏) |
| 其他 | 0 | default 分支 |
- 枚举与业务状态的绑定:
SYS_STATUS_*的判定逻辑不在本文件,而在hmi/led.c:628-656(DISPLAY_LCD_RKP_E分支):有故障→SYS_STATUS_FAULT_LED_RED,无故障但 BMS 已连接且未工作→SYS_STATUS_WARNING_LED_YELLOW,逆变器处于cNormalMode/cUPS→SYS_STATUS_NORMAL_LED_GREEN,其余→SYS_STATUS_NOT_RUN_LED_OFF,并做 200 ms 去抖后写入sys_current_status_color。
5. 对外接口
本文件导出(供外部使用)
| 名称 | 类型 | 使用方 |
|---|---|---|
SYS_COLOR_OFF/GREEN/RED/YELLOW | 宏 | 仅 hmi/led/app_led_cfg.c 使用 |
SOC_COLOR_WHITE/BLUE | 宏 | 无使用点(app_led_cfg.c 直接写了字面量) |
led_color_t | 枚举类型 | 无使用点 |
STATUS_LED_COLOR_E | 枚举类型 | hmi/led/app_led.c:44、hmi/led.c:654 |
SOC_LED_COLOR_E | 枚举类型 | hmi/led/app_led.c:47、hmi/led/app_led.c:105 |
sys_current_status_color | 全局变量声明 | 写入:hmi/led.c:654;读取:hmi/led/app_led.c:89 |
get_sys_color_status | 函数声明 | hmi/led/app_led.c:157 |
get_soc_color_to_rgb | 函数声明 | hmi/led/app_led.c:156 |
本文件间接暴露(通过 include 传递)
| 名称 | 来源 | 说明 |
|---|---|---|
WS2812_FLAG_U、RKP_LED_NUM、LED_SOC_NUM、LED_LONG_NUM、LED_BUFFER_SIZE、T0_PULSE/T1_PULSE、g_u16_ws2812_data、g_u_ws2812_flag、ws2812_*() | hmi/led/led_dev.h(hmi/led/app_led_cfg.h:16) | WS2812 编码层全部符号 |
chip.h、includes.h、bms.h、ems.h | 平台/中间件 | 提供 u8/u32 等类型与 STEMSTab,hmi/led/app_led_cfg.h:17-20 |
6. 依赖关系
- 依赖:
led_dev.h(16)、chip.h(17)、includes.h(18)、bms.h(19)、ems.h(20)。bms.h、ems.h在本文件中没有任何符号被使用(本文件不引用 BMS/EMS 类型),是为下游app_led.c转发的。 - 被依赖:
hmi/led/app_led.h:16(进而app_led.c、led_dev.c、hmi/led.c、hmi/key.c、system/board_init/board_init.c、midware/interface/modbus/modbus.c等所有包含led.h/app_led.h的模块)。
7. 备注与风险点
sys_current_status_color的声明位置偏散:它被声明在app_led_cfg.h:71,但语义上属于"系统状态"(由hmi/led.c判定和写入),放在纯颜色配置头里使依赖关系显得绕:hmi/led.c要通过led.h→app_led.h→app_led_cfg.h三级才能拿到它。led_color_t枚举、SOC_COLOR_WHITE/SOC_COLOR_BLUE宏为死代码:定义了但没有任何引用点(app_led_cfg.c里的0xFFFFFF/0x0000FF是字面量,未使用宏),存在两处"同一颜色两个真相"的隐患。get_soc_color_to_rgb()函数名与语义不符:它接收的是SOC_LED_COLOR_E(联网状态),返回的却是联网状态色;SOC 本身只决定点亮颗数(hmi/led/app_led.c:188),不决定颜色。函数名容易误导后续维护。default分支返回 0(全灭):任何未覆盖的枚举值都会静默变成熄灭,而不是保持当前颜色或告警。- 枚举
LED_COLOR_MAX无实际用途;SYS_STATUS_*枚举没有_MAX之类哨兵,hmi/led.c:654的强制类型转换(STATUS_LED_COLOR_E)new_status依赖u8与枚举可互换这一非标准但被 Keil 接受的用法。 - 文件头注释(
hmi/led/app_led_cfg.h:2)写的是File Name: app_led_cfg.h,本文件恰好正确;同目录app_led.h、app_led.c、led_dev.c、led_dev.h的注释头都写着app_led_cfg.h/c,与真实文件名不符。