416e92f109
台架轮(2026-11-06,实机 192.168.31.100 生产固件,boot 187–193, ST-LINK + RemoDispBus 7003 按键注入/抓帧 + FTP 取证,全程持 bench 锁): - 判据1 真记录翻页与保持:oper 73 条 19 页 / yk 34 条 9 页 / start 2 条 1 页实机翻页连续,页数与盘上条数交叉吻合;跨 188–193 六次重启 (IWDG/NRST/系统复位,RAM 每次全清)YK/START/WDEV md5 逐字节不变, RUN/SOE/OPER/SELFTEST 纯追加、旧记录区零改写。 - 判据2 清除记录后对应页归零:oper 73→0、start 2→0、yk 34→0(页显 「无记录」+ NAND 对应文件消失);告警行空类清除幂等;RUN/SOE/ SELFTEST 清除前后逐字节一致(逐行独立清除证实);OPER 由后续写入 自动重建且恰含三条清类留痕、清 oper 自身不留痕(留痕契约证实)。 - 判据3 上电一次 boot_count +1:187→193 六连号无跳变,电池域 SRAM 保持+回写正常;本机无市电开关,以系统复位代理完整上电(覆盖 SRAM 存储语义),真·拔电 POR 计数差额留人工一眼补验。 - 判据4 拔 RTC 电池落 RESTARTED:台架不可验(用户裁定 2026-11-05), 销项不挂账;seq_state 四态判定归主机单测 test/host/boot_stats/ 覆盖。 - 判据5 IWDG 复位落「独立看门狗」:SWD 热插拔现场收窄看门狗窗口 (PR=0/RLR=2,窗口 ≈0.37ms ≪ 100ms 喂狗节拍)触发真实计数器溢出 → rst_cause=独立看门狗;咬后 wd_platform_start 自愈回 PR=4/RLR=1249。 调试停机(DBGMCU_APB1_FZ 实读 0)与 NRST 硬脉冲两条不咬路径的 归因已记台架台账(Issue #53 评论)。 - 判据6 主站接入一次 conn_up +1:75s 静默窗(前后帧逐字节相同)后 单次 STARTDT 连接恰好 +1,发送帧数 +1、接收字节 +6B 交叉印证。 销项:六页文件头「台架待补」段改为「台架复核已完成」(模拟器口径 保留);模拟器差距清单 §2.3 开机账本行更新复核口径;登记簿 §7 「UI 六页真机判据」行删除(工单授权),交叉引用同步(任务规划 README、产品需求 FR-SOE-3)。清除动作是判据 2 本体,清前全量 NAND 记录已备份(PC 侧),留证于 Issue #53 台架轮评论。 门禁:check_doc_links --all 213 文档过;主机侧单测 48 runner 4257 断言全过;ARMCC 全量构建 0 Error 0 Warning (Code=254820 RO=30896 RW=2072 ZI=150104);ui-golden 菜单 8 状态 + 内容页 74 张黄金参考一致(本机按部署文档第 3 步补装 SDL2 SDK)。 附带:内存数字两文档随 .map 同步——RAM 台账受管区 3 行 + RAM 使用分析快照 3 行(mem-budget / mem-numbers 门禁随本票 Drivers/BSP staged 触发的 HEAD 既有漂移修正:#73/#79 合入后未跑 --write;285,716 B 与体积凭证一致,全部 PASS/参考,无红线变动)。 体积凭证指纹陈旧同为 HEAD 既有(488f6fb 起),本票纯注释/文档 不动体积面,不越权刷新。
82 lines
4.0 KiB
C
82 lines
4.0 KiB
C
/*
|
||
* 模块名称:UI Page 保护启动(保护启动内容页)
|
||
* 模块功能:保护启动叶子节点(node 37,父节点「记录查询」)的内容页数据——动态列表,
|
||
* 每条记录 2 行(偶数行 = 时间戳、奇数行 = 描述),可移选分页;数据经 ui_w_records
|
||
* 注入 reader 取自 sys_log(/log/start.log,容量上限 1024 条,满时删除重建);
|
||
* 空日志显示单条伪行"无记录";向框架 ui_content_page 提供页面描述符(零 LVGL 对象)
|
||
* 记录口径(本文件只读显示、不实现写入方;权威表 App/log/README.md §五类记录):
|
||
* 触发判据 = 元件 picked 上升沿(越限电平,早于或等于动作);
|
||
* 写入点 = App/task/protect_task.c 的 s_log_active_edge();
|
||
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
|
||
* Lead 裁定 2026-10-26)——本页只读 start.log 一个文件,不做跨文件混排。
|
||
* 台架复核已完成(2026-11-06,Issue #53 台架轮、实机 boot 188–193,证据贴 Issue #53 评论):
|
||
* 真 NAND 真实记录的翻页读取、复位(RAM 全清)后从 NAND 原样重读、清除记录后
|
||
* 本页归零(2 条 → 无记录、START.LOG 从盘上消失)三件事均已上板复核;真·拔
|
||
* 市电本机不可控,保持性以 RAM 全清 + 全链重启代理(POR 计数差额人工一眼可补)。
|
||
* 模拟器侧该文件仍无写入方,像素黄金维持空态"无记录"口径。
|
||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||
* 作者:DTU 项目组
|
||
* 创建日期:2026-10-28
|
||
* 修改记录:
|
||
* v1.0 2026-10-28 DTU 项目组 创建(UI 补齐「记录 5 页」:照 ui_page_runlog.c 同构,
|
||
* 分页 / 空态 / 按实例读盘缓存全部复用 ui_w_records,
|
||
* 本文件不重复实现,也不改共享组件)
|
||
*/
|
||
|
||
/* 头文件包含区 */
|
||
#include "ui_page_start.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_START };
|
||
|
||
/*
|
||
* 函数功能:总行数(动态;每条记录 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=start 绑定引用):
|
||
* 动态列表页——每记录 2 行、UI_LIST_ROWS 行/页;band_h=UI_ROW_BAND_H(同 AC/DC 约定:
|
||
* selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见)
|
||
*/
|
||
const content_page_def_t ui_page_start_desc = {
|
||
.id = "start",
|
||
.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,
|
||
};
|