/* * 模块名称:屏板状态灯位映射(业务状态 → LED 位掩码) * 模块功能:sb_led_map_eval()——状态快照进、32 位 LED 掩码出。位定义与理由全在 * sb_led_map.h(映射表唯一出处),本文件只做折算。 * 适用平台:平台无关(纯标准 C) * 作者:王建锋 * 创建日期:2026-10-29 * 修改记录: * 2026-10-29 王建锋 创建初始版本(批 3 的 3-1) */ #include /* NULL:纯逻辑不经 main.h,NULL 要自己带来 */ #include "sb_led_map.h" /* NULL 输入归一用的全零快照(static const:不占 RAM,语义就是"什么都没发生") */ static const sb_led_in_t s_in_zero = { 0UL, 0UL, 0UL, 0U, { 0U, 0U, 0U } }; /* * 函数功能:把状态快照折算成屏板 LED 32 位掩码(契约见 sb_led_map.h) * 入口参数:p_in - 状态快照,允许 NULL(= 全零输入,只跑心跳) * now_ms - 毫秒时基(只用于运行灯相位) * 返回值:32 位 LED 掩码(bit i = 灯 ID i;本函数不触碰 bit0 与 ID 6~19) * 限定条件:任意上下文,纯函数 * 函数说明:心跳相位取 (now_ms / SB_LED_BLINK_HALF_MS) 的奇偶——用**除法取奇偶** * 而不是"与上次比差值再翻转",因为后者要把相位存成静态量,纯函数就没了 * (单测要能不开机就验完整个闪烁序列)。回绕只截短一个半周期,无害。 */ uint32_t sb_led_map_eval(const sb_led_in_t *p_in, uint32_t now_ms) { const sb_led_in_t *q = (p_in != NULL) ? p_in : &s_in_zero; uint32_t mask = 0UL; /* ID 1 运行心跳:偶数个 500 ms 段 = 亮 */ if (((now_ms / SB_LED_BLINK_HALF_MS) & 1UL) == 0UL) { mask |= SB_LED_BIT_RUN; } if (q->prot_active != 0UL) { mask |= SB_LED_BIT_ALARM; } if (q->iec104_run != 0U) { mask |= SB_LED_BIT_COMM; } if (q->adc_flags != 0UL) { mask |= SB_LED_BIT_ADC_FAULT; } if (q->prot_pick != 0UL) { mask |= SB_LED_BIT_PICKUP; } return mask; }