/* * 模块名称:UI Page SelfTest (自检记录内容页) * 模块功能:自检记录叶子节点(node 39)的内容页数据——动态列表,每条记录 2 行 * (偶数行 = 时间戳、奇数行 = 故障描述),可移选分页;数据源 = sys_log API * (/log/selftest.log,开机自检故障,仅故障才写);空日志显示单条伪行"无记录"; * 向框架 ui_content_page 提供页面描述符(零 LVGL 对象) * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:王建锋 * 创建日期:2026-09-14 * 修改记录: * v1.0 2026-09-14 王建锋 创建初始版本(设计见 docs/子系统设计/运行与自检记录设计说明.md §5.4) */ /* 头文件包含区 */ #include #include "ui_page_selftest.h" #include "sys_log.h" /* 静态变量定义区 */ /* 最近读取的记录缓存(偶数行读盘后,奇数行复用;避免同记录重复 I/O) */ static uint8_t s_cache_valid; /* 缓存有效标志(0 = 无缓存) */ static uint32_t s_last_rec; /* 已缓存的记录序号 */ static char s_ts[SYSLOG_TS_LEN + 1u]; static char s_desc[SYSLOG_DESC_MAX + 1u]; /* 函数定义区 */ /* * 函数功能:总行数(动态;每条记录 2 行,空日志 = 单条伪行"无记录") * 入口参数:无 * 返回值:总行数 uint16_t */ static uint16_t st_count_cb(void) { uint32_t n = syslog_count(SYSLOG_SELFTEST); if (n == 0u) { return 1u; /* 空态伪行(页脚"共 1 页",避免"共 0 页") */ } return (uint16_t)(n * 2u); } /* * 函数功能:逐行取数(偶数行 = 时间戳、奇数行 = 故障描述;值列恒空) * 入口参数:row - 全局行下标 uint16_t * name - 名输出缓冲(框架栈缓冲 CP_ROW_BUF_LEN=32,含 NUL) char * * value - 值输出缓冲(同上;本页恒写空串) char * * 限定条件:页面打开中(框架绘制/按键上下文,uiTask) */ static void st_refresh(uint16_t row, char *name, char *value) { uint32_t n = syslog_count(SYSLOG_SELFTEST); value[0] = '\0'; if (n == 0u) { (void)memcpy(name, "无记录", sizeof("无记录")); return; } { uint32_t rec = row / 2u; if (!s_cache_valid || rec != s_last_rec) { if (syslog_get_record(SYSLOG_SELFTEST, rec, s_ts, sizeof(s_ts), s_desc, sizeof(s_desc)) != 0) { name[0] = '\0'; /* 读失败(越界/存储异常):空行防御 */ return; } s_last_rec = rec; s_cache_valid = 1u; } if ((row % 2u) == 0u) { (void)memcpy(name, s_ts, sizeof(s_ts)); } else { (void)memcpy(name, s_desc, sizeof(s_desc)); } } } /* * 页面描述符(外部链接:框架描述符表 s_defs[] 直接引用): * 动态列表页——每记录 2 行、8 行/页 = 4 条/页;band_h=13(同 AC/DC 约定: * selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见); * 时间戳 19 ASCII ≈114px < 屏宽可容 */ const content_page_def_t ui_page_selftest_desc = { .title = "自检记录", .selectable = 1u, .top_y = 24, .pitch = 14, .band_h = 13, .text_dy = 0, .left_x = 7, .right_x = 101, .rows_per_page = 8u, .count_cb = st_count_cb, .refresh = st_refresh, };