/* * 模块名称:UI Page 保护告警(保护告警内容页) * 模块功能:保护告警叶子节点(node 36,父节点「记录查询」)的内容页数据——动态列表, * 每条记录 2 行(偶数行 = 时间戳、奇数行 = 描述),可移选分页;数据经 ui_w_records * 注入 reader 取自 sys_log(/log/alarm.log,容量上限 1024 条,满时删除重建); * 空日志显示单条伪行"无记录";向框架 ui_content_page 提供页面描述符(零 LVGL 对象) * 记录口径(本文件只读显示、不实现写入方;权威表 App/log/README.md §五类记录): * 触发判据 = 元件 asserted 上升沿**且**跳闸投退项 = 0 或该元件无此项(告警型动作); * 写入点 = App/task/protect_task.c 的 s_log_active_edge(); * "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位, * Lead 裁定 2026-10-26)——本页只读 alarm.log 一个文件,不做跨文件混排。 * 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论): * 本页真机实读为空态"无记录"且属实况(告警写入方在保护未标定闭锁内,台架期间 * 零触发,NAND 无 alarm.log);清除页本行两段式空类清除已实机复核幂等;翻页与 * 保持逻辑经同构记录页(操作 / 遥控 / 启动)真记录复核。模拟器侧该文件仍无 * 写入方,像素黄金维持空态"无记录"口径。 * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:DTU 项目组 * 创建日期:2026-10-28 * 修改记录: * v1.0 2026-10-28 DTU 项目组 创建(UI 补齐「记录 5 页」:照 ui_page_runlog.c 同构, * 分页 / 空态 / 按实例读盘缓存全部复用 ui_w_records, * 本文件不重复实现,也不改共享组件) */ /* 头文件包含区 */ #include "ui_page_alarm.h" #include "ui_w_records.h" #include "ui_tokens.h" /* 静态变量定义区 */ /* * 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6 合并先例)。 * 实例 s_rec 携带记录源编号与**本实例自己的**读盘缓存——多页共用组件代码, * 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行(静默错数据)。 */ static ui_w_records_t s_rec = { UI_W_REC_LOG_ALARM }; /* * 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录") * 入口参数:无 * 返 回 值:总行数 uint16_t * 限定条件:uiTask 绘制上下文(经框架回调) */ static uint16_t pg_count(void) { return ui_w_records_count(&s_rec); } /* * 函数功能:逐行取数(转调共享组件;偶数行 = 时间戳、奇数行 = 描述) * 入口参数:row - 全局行下标 uint16_t * name - 名输出缓冲 char * * value - 值输出缓冲(本组件恒写空串) char * * 返 回 值:无 void * 限定条件:uiTask 绘制上下文(经框架回调) */ static void pg_refresh(uint16_t row, char *name, char *value) { ui_w_records_refresh(&s_rec, row, name, value); } /* * 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=alarm 绑定引用): * 动态列表页——每记录 2 行、UI_LIST_ROWS 行/页;band_h=UI_ROW_BAND_H(同 AC/DC 约定: * selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见) */ const content_page_def_t ui_page_alarm_desc = { .id = "alarm", .title = "保护告警", .selectable = 1u, .top_y = UI_LIST_TOP, .pitch = UI_ROW_PITCH, .band_h = UI_ROW_BAND_H, .text_dy = 0, .left_x = UI_LIST_LEFT_X, .right_x = UI_LIST_RIGHT_X, .rows_per_page = UI_LIST_ROWS, .count_cb = pg_count, .refresh = pg_refresh, };