48a8ef0564
这两页是「UI补齐」里唯一带**持久化语义**的一档,所以整笔的设计重心不在画面上,而在**页面如何诚实表达 「已受理」与「已落盘」**——这一点由 setpage-scout 在开工前的只读查实钉下来:cfg_file_save() 全仓唯一调用 者是 run_par_store_save(),而 default_task.c:246 **每轮无条件**调它、函数首行 s_dirty==0 就直接返回 ⇒ 落盘动力本来就在 defaultTask,不在 104 会话、也不在事件位。因此本笔走 A2(UI 不当授权写者),不需要 新事件位、不需要新同步口。 页面三态判据 = run_par_dirty_peek():ENTER / WAIT(脏位仍在 = 已受理未落盘)/ OK(脏位归零 = 整档已外科 保存成功)/ 写被拒 = ERR。两条限制写在页面注释里没藏:脏位是**整档全局**的(一趟落 [run_par] 9 键 + [adc_cal] 两段,归零只证明「这一档落盘了」,不证明「我这一项单独落盘」);他人随后再改会重新置脏 ⇒ 沿用 clear/clock 页的结果锁存,把「我这次动作的结果」与「档位此刻的状态」分开。 **为什么黄金必须出两张**(这条是本轮最有价值的防假证据规则):模拟器假件**保留脏位**、全仓唯一的 s_yt_dirty=0 写点是 sim_yt_pump()(setter 只置不清),于是 WAIT 与 OK 各出一帧——两组同键序、唯一差别是 EXTRA 里的 --yt-nopump。若假件同步清脏位,真机的 WAIT 态永远不会被像素回归覆盖,黄金就成了「只钉住最 好看那一帧」。TC-UIDATA-028o 另钉住 ui_data 层零缓存。 形状:新增 ui_data 第四张注入表(八字段整表校验、拒残表),实现落在装配层 App/app/ui_data_feed.c, 页面零 App include(分层方向 + 模拟器不链 run_par 两条老理由都成立);共用视图模型 ui_w_ytview 承载两页。 合法域一律由执行侧出口给(run_par_db_range / RUN_PAR_K_MAX_UV),页面不抄第二真源——系数页 v1 只用粗守 并在注释写明两层守卫互不掩盖,µV/码 ×[0.5,2.0] 那条真带的出口器归 task-43,**没有**在页面里抄常量。 取舍与遗留(如实):系数行 d=0 整 µV(1e9 装不下两位小数,注释写了「要小数改哪、不收紧假上限」);b 覆盖 无口未做;徽标只画系数页;行名因「率」缺字改为 Hz死区(font-charset 机器先抓到的,不是我目测判的)。 实测:@build 0 错误 0 警告(Code=233,900 / RW-data=1,536);ui_data 单测 277/277、run_par 67/67 零回归; 内容页黄金 47 页全过、**存量 40 张逐字节零漂移**(git 里只有 7 张新增);menu_rows / 池水位 / font-charset / bom / mojibake / nested-comment / cppcheck / coding-standard / layer-deps / bsp-err 全 0 新增;编号五项式 refs 8,778 / dec 7,622 / und **1,156**(上限 1,166)/ 比值 86.83%(基线 86.0% 之上)/ 错误差值 0,注释零裸形 字母+数字。generated-fresh 与 registration-check 本地 PASS;新增 6 只源文件按规矩**双端注册同笔**(叶子 + registry 19→21 + uvprojx + CMakeLists),uvprojx 这次属「真的增删源文件」才入库。 移交三条不混进本笔:① 全量 --selftest 现 exit 1 是 task-41 硬闸在模拟器上也拒 reset/clear(既有红,快检档 不受影响),归台架道定夺;② 内容页 40→47 的全仓文档计数改写由 Lead 派;③ run_par_deadband_set 的限定 条件语措辞(「iec104Task 上下文」已被装配层裁定覆盖)归算法层下一笔。
84 lines
5.1 KiB
C
84 lines
5.1 KiB
C
/*
|
||
* 模块名称:UI 遥测整定视图模型(ui_w_ytview)
|
||
* 模块功能:两张遥测整定页(遥测死区 9 行 / 遥测系数 8 行)的**共用视图模型**——
|
||
* 行表现状从 ui_data.h 通道五注入表逐行现取(工程量 + 粗守域 + 量纲 +
|
||
* 显示小数位),换算成 ui_w_setlist 的显示域(工程量 × 10^decimals),
|
||
* 并把"写一行 / 落盘确认 / 越界反显 / 未标定徽标"四件事收在一处,供两张
|
||
* 页面薄跳板(ui_page_deadband / ui_page_calib)共用——两页共用一份状态机
|
||
* 与换算,与 ui_w_setview"行表只有一份,界内界外就不会两套口径"同一条理由
|
||
* 与整定四页(ui_w_setview 的写方向)**故意不同形**,三处差别都写在 .c 的函数头:
|
||
* ① 无工作叠层:死区/系数的真源本身就是 RAM 副本,语义 setter 是执行侧
|
||
* 写入口(写值与置脏同一函数内发生),"编辑即生效、ESC 不回滚"是本档
|
||
* 语义(与定值"攒一批整表封存"不同,取舍见 .c 文件头);
|
||
* ② 保存行不是"投递整表",而是**落盘确认**:值在逐行 ENTER 时已经写进
|
||
* 副本并置脏,保存行按键只锁存"我这次动作的结果"(脏位归零 = 整档已
|
||
* 外科保存成功,判据 = ui_data_yt_pending(),与 104 留痕同一条
|
||
* "先 peek 再算成功",不另发明);
|
||
* ③ 没有 LOCK 态:本档不受定值校验和闭锁管辖;"未标定"(cal_blocked)
|
||
* 只画徽标、不禁编辑——改系数恰恰是走向标定的动作,禁了就是把路堵死
|
||
* 值域诚实性:行 min/max **逐行来自执行侧现给**(合法域唯一出口 run_par_db_range /
|
||
* 粗守上限 RUN_PAR_K_MAX_UV)——本模块不出现任何一个范围数字字面量,
|
||
* 抄一份就是卡片判据要拦的第二真源;µV 真带(执行段裁)没有公开访问器,
|
||
* 本模块**不**补一份假的(task-43 收口前屏上只有粗守这一层,真带拒的值
|
||
* 经 set 返回 -1 → 行反显 + 保存行 ERR,两层守卫互不掩盖)
|
||
* 分层:只依赖 Drivers/BSP/UI 同层(ui_data.h 注入表 + ui_w_setlist/ui_w_editor),
|
||
* 零 App include(layer-deps + 模拟器链接期两条老理由,见 ui_data.h 通道五表注)
|
||
* 适用平台:STM32F407ZGTx / PC 模拟器(共用源码)
|
||
* 作者:DTU 项目组
|
||
* 创建日期:2026-10-27
|
||
* 修改记录:
|
||
* v1.0 2026-10-27 DTU 项目组 创建(道F task-7;判据 docs/任务规划/UI补齐.md
|
||
* §2 第 4 行;Lead 裁定:注入表八口形状、结果锁存、
|
||
* 粗守 + 注释两层守卫、真带访问器归 task-43)
|
||
*/
|
||
#ifndef UI_W_YTVIEW_H
|
||
#define UI_W_YTVIEW_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <stdint.h>
|
||
|
||
#include "ui_w_setlist.h" /* ui_w_setlist_t + lvgl(经 ui_content_page.h) */
|
||
|
||
/*
|
||
* 函数功能:把**死区**视图绑到定值表实例(行表现状逐行现取;两态在内部按
|
||
* ui_content_page_is_editable() 分派——只读不绑 commit/state,无保存行)
|
||
* 入口参数:a_inst - 页面持有的实例(static,一页一份) ui_w_setlist_t *
|
||
* 返回值:无
|
||
* 限定条件:页面 init_cb 内调用(uiTask 上下文,此时本次进入的权限已装载)
|
||
* 函数说明:每次开页都重填行表并清历史结果(st/badmap)——上一次开页的 WAIT/OK
|
||
* 与越界反显都不该带到这一次来(同整定四页"开页清稿"纪律)
|
||
*/
|
||
void ui_w_ytview_attach_db(ui_w_setlist_t *a_inst);
|
||
|
||
/*
|
||
* 函数功能:把**系数**视图绑到定值表实例(形状/分派/清稿与 attach_db 同一条路)
|
||
* 入口参数:a_inst - 页面持有的实例 ui_w_setlist_t *
|
||
* 返回值:无
|
||
* 限定条件:页面 init_cb 内调用
|
||
*/
|
||
void ui_w_ytview_attach_cal(ui_w_setlist_t *a_inst);
|
||
|
||
/*
|
||
* 函数功能:系数页标题右侧画"未标定"徽标(cal_blocked 的屏上表达)
|
||
* 入口参数:a_layer - 绘制层 lv_layer_t *
|
||
* a_clip - 重绘区 const lv_area_t *
|
||
* 返回值:无
|
||
* 限定条件:系数页 draw_cb 内(框架内置区块之后);只在 cal_blocked() 为真时落墨
|
||
* 函数说明:**死区页刻意不调它**——死区数值来自 [run_par] 档、与两点标定无关,
|
||
* 在那页画"未标定"是把不相关的告警挂到不相干的屏上(徽标是断言)。
|
||
* 几何右界取 141:与整定四页徽标同一实测理由(标题带装饰右腿占 x 约
|
||
* 147..158);本标题"遥测系数"4 字到 x 约 104,与徽标左缘仅 1 px 间隙,
|
||
* 会被读成一句"遥测系数未标定"——该读法语义成立(本页说的就是系数、
|
||
* 而系数此刻确实没标定过),像素黄金目检时确认过不再挪
|
||
*/
|
||
void ui_w_ytview_draw_cal_badge(lv_layer_t *a_layer, const lv_area_t *a_clip);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* UI_W_YTVIEW_H */
|