/* * 模块名称:UI Page SelfTest (自检记录内容页) * 模块功能:自检记录叶子节点(node 39)的内容页数据——动态列表,每条记录 2 行 * (偶数行 = 时间戳、奇数行 = 故障描述),可移选分页;数据经 ui_w_records * 注入 reader 取自 sys_log(/log/selftest.log,仅故障才写;本文件不再直接 * include sys_log.h——task-6 分层收紧);空日志显示单条伪行"无记录"; * 向框架 ui_content_page 提供页面描述符(零 LVGL 对象) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:王建锋 * 创建日期:2026-09-14 * 修改记录: * v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4) * v1.1 2026-10-20 王建锋 改用 ui_w_records 共享组件(W6:合并两页重复实现) * v1.2 2026-10-25 王建锋 记录 reader 注入(道B task-6):不再 include sys_log.h, * 数据经组件内注入的 ui_rec_reader_t 取;日志 ID 换 * 不透明编号 UI_W_REC_LOG_SELFTEST(映射在两端绑定处) */ /* 头文件包含区 */ #include #include "ui_page_selftest.h" #include "ui_w_records.h" #include "ui_tokens.h" /* 静态变量定义区 */ /* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */ /* 静态变量定义区:见下方 s_rec */ /* 函数定义区 */ /* * 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录") * 入口参数:无 * 返回值:总行数 uint16_t */ /* * 记录页薄跳板:内容全部走 ui_w_records 共享组件(W6)。 * 实例 s_rec 携带日志 ID 与**本实例自己的**读盘缓存——两页共用组件代码, * 但缓存不得共享,否则切页会命中上一记录号而显示另一页的陈旧行。 */ static ui_w_records_t s_rec = { UI_W_REC_LOG_SELFTEST }; static uint16_t pg_count(void) { return ui_w_records_count(&s_rec); } 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=selftest 绑定引用): * 动态列表页——每记录 2 行、UI_LIST_ROWS 行/页 = 4 条/页;band_h=UI_ROW_BAND_H(同 AC/DC * 约定:selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见); * 时间戳 19 ASCII ≈114px < 屏宽可容 */ const content_page_def_t ui_page_selftest_desc = { .id = "selftest", .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, };