Files
wandering1 48a8ef0564 feat(UI): 遥测死区与系数 2 页——注入表第四张、三态用脏位、WAIT 与 OK 各出一张黄金
这两页是「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 上下文」已被装配层裁定覆盖)归算法层下一笔。
2026-10-27 05:07:18 +08:00

84 lines
5.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称: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 */