3a2f9b21fb
SNTP 客户端已随 #73/PR #77 上线合入(merge 2b848c4a),用户裁定
8888 对时任务退出历史舞台(gitea:77 线程原话,跟踪 Issue #78)。
生产侧(App/sync/time_sync.c v2.0,任务入口名不变,freertos.c 零改动):
- 删除 :8888 监听、TIME 包重组、sys_clock 写入、OPER 落痕、
net_drop_conn 队头自救整条链(TIME_SYNC_PORT 宏随退役删除)
- 任务体收敛为:就绪屏障(100ms 分片、osFlagsNoClear)→
200ms 校时节拍 task_wd_beat → time_sntp_run(net_get_generation())
→ 分片延时;喂狗节奏(TASK_WD_TIMESYNC=5,required_mask)不变
- 时钟写入口自此 = SNTP / UI 手工 / 104 C_CS,双写竞态(后写者赢)
随之消失(墙钟说明 §15 退役公告、§16 现势口径)
工具与测试:
- 删除 test/host/time_sync_server.py(对时源)与 e02_probe.py
(队头阻塞探针,载体随监听退役;判据脚本 v5_log_gap_report.py
保留供旧日志解读)
- time_sync 主机单测重写 v2.0:33 断言覆盖分片延时 / 屏障 /
SNTP 节拍与网络代次当轮交接 / 未出网守门;stub 的
net_socket.h 裁剪至 net_get_generation 作编译期绊线
- 覆盖率基线 --update-baseline 收口(time_sync.c 101→20 行为刻意
缩减,全仓 48/48 套绿)
文档与图:墙钟说明 §15 改退役公告(教训保留:CH395F FIN 丢未读
缓冲)、§16 单一网络来源;产品需求 FR-TIME-2 退役注记、§6.3 重写;
架构总览 / 软件架构规格 / 网络配置 / 网络自愈 §9.3 / BSD 指南 /
看门狗说明心跳与白名单行 / 实机测试指南 / 部署环境 / 继保规划 /
UI补齐时基口径 / 页面补齐规划 SNTP 页行 / 任务规划 README 叶数与
暂缓项行(SNTP 叶已绑、UI_PAGE_MAP_COUNT=31 口径)等约 30 处现势
口径同步;arch / net_stack 两图生成器与 SVG 同笔重跑。
台账:ram_baseline --update + check_mem_numbers --write + 体积凭证
(Code 254,648→253,428,−1,220 B)。静态链复测发现 timeSyncTask
1,904 B / iec104Task 1,600 B 低于 ISR 硬线:master 2b848c4a 同判据
timeSyncTask 即 2,056 B(本 PR 只减不增,−152 B 旧任务自身帧),
双 FAIL 为 #74/#77 后既有债;抬栈属 Ask-first 未擅自执行,登记簿
新增「静态链硬线双 FAIL」待台架复采,复测快照入 docs/内存管理/data。
验证:keil-build 0 错 0 警;time_sync/sntp 主机单测绿;
ci_local 全绿;doc-links --all 0。
80 lines
3.9 KiB
C
80 lines
3.9 KiB
C
/*
|
||
* 模块名称:UI Page 操作记录(操作记录内容页)
|
||
* 模块功能:操作记录叶子节点(node 35,父节点「记录查询」)的内容页数据——动态列表,
|
||
* 每条记录 2 行(偶数行 = 时间戳、奇数行 = 描述),可移选分页;数据经 ui_w_records
|
||
* 注入 reader 取自 sys_log(/log/oper.log,容量上限 512 条,满时删除重建);
|
||
* 空日志显示单条伪行"无记录";向框架 ui_content_page 提供页面描述符(零 LVGL 对象)
|
||
* 记录口径(本文件只读显示、不实现写入方;权威表 App/log/README.md §五类记录):
|
||
* 触发判据 = 人工/远端操作留痕:定值保存、强制复归、对时(SNTP 与 104)、清除记录;
|
||
* 写入点 = App/task/default_task.c(定值保存)、App/protocol/iec104/iec104_pts.c(复归与整定写入)、App/task/iec104_serv.c 与 App/sync/time_sntp.c(对时)、App/log/sys_log_mcu.c(清除记录留痕,OPER 自身除外);
|
||
* "记录类型 = 日志 ID 本身"(一类记录一个文件,记录体内没有类型字段位,
|
||
* Lead 裁定 2026-10-26)——本页只读 oper.log 一个文件,不做跨文件混排。
|
||
* 台架待补(不在本批,已登记 docs/任务规划/登记簿.md):真 NAND 上真实记录的翻页读取、
|
||
* 掉电后记录保持、清除记录后本页归零这三件事都要上板复核;模拟器侧该文件
|
||
* 没有写入方,像素黄金只能验空态"无记录"。
|
||
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
|
||
* 作者:DTU 项目组
|
||
* 创建日期:2026-10-28
|
||
* 修改记录:
|
||
* v1.0 2026-10-28 DTU 项目组 创建(UI 补齐「记录 5 页」:照 ui_page_runlog.c 同构,
|
||
* 分页 / 空态 / 按实例读盘缓存全部复用 ui_w_records,
|
||
* 本文件不重复实现,也不改共享组件)
|
||
*/
|
||
|
||
/* 头文件包含区 */
|
||
#include "ui_page_oper.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_OPER };
|
||
|
||
/*
|
||
* 函数功能:总行数(动态;每条记录 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=oper 绑定引用):
|
||
* 动态列表页——每记录 2 行、UI_LIST_ROWS 行/页;band_h=UI_ROW_BAND_H(同 AC/DC 约定:
|
||
* selectable 页选中行黑字必须配白带,band_h=0 会致选中行不可见)
|
||
*/
|
||
const content_page_def_t ui_page_oper_desc = {
|
||
.id = "oper",
|
||
.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,
|
||
};
|