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 上下文」已被装配层裁定覆盖)归算法层下一笔。
This commit is contained in:
@@ -879,3 +879,150 @@ int ui_data_clock_format(const ui_data_clock_t *p_in, char *a_buf, uint32_t a_le
|
||||
*p = '\0';
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ── 通道五:遥测整定注入(死区 / 系数)──────────────────────────────────── */
|
||||
|
||||
/*
|
||||
* 注入的遥测整定执行侧函数表(NULL = 未注入)。
|
||||
* 与 s_maint 同一条生命周期约定:注入方(App/app/ui_data_feed.c 与
|
||||
* simulator/main.c)给的都文件级 static const 表,本层只存指针不拷内容;
|
||||
* 撤销窗口只在宿主测试里存在。
|
||||
*
|
||||
* ⚠ 本层**不持有任何遥测整定的值**:九条死区与八路系数的真源在
|
||||
* App/algo/run_par.c 与 App/algo/adc_cal.c,落盘动力在 defaultTask 的每轮
|
||||
* 无条件 run_par_store_save()(首行 if (s_dirty == 0u) return 0;,道F task-7
|
||||
* 查实结论:落盘链不靠 104 会话、也不靠事件位)。本层若自己存一份,就正是
|
||||
* 卡片判据"不新增第二份真源"要拦的那件事。页面能问的只有两样:现状(*_row)
|
||||
* 与"我这次动作落没落"(pending)。
|
||||
*/
|
||||
static const ui_data_yt_ops_t *s_yt;
|
||||
|
||||
/*
|
||||
* 函数功能:注入遥测整定执行侧函数表(启动期一次)
|
||||
* 入口参数:ops - 函数表;八个成员指针都不得为 NULL;NULL = 撤销注入
|
||||
* 返回值:0 - 已注入(或已撤销);-1 - ops 非空但某成员为 NULL(存量不动) int
|
||||
* 限定条件:uiTask 启动期,先于 ui_menu_init();本层无锁,与快照层同一并发前提
|
||||
* 函数说明:整表校验的理由与 ui_data_maint_bind() 逐字相同——半途接错一条会让
|
||||
* 页面在"按下才崩"的位置崩,装配期就拒掉残表才是省事。残表被拒后**存量
|
||||
* 不动**(TC-UIDATA-027 钉住这条:好表在用时被残表覆盖会静默把已通的口
|
||||
* 打断)
|
||||
*/
|
||||
int ui_data_yt_bind(const ui_data_yt_ops_t *a_ops) {
|
||||
if (a_ops == NULL) {
|
||||
s_yt = NULL; /* 撤销注入:页面随即按"整定能力不可用"渲染 */
|
||||
return 0;
|
||||
}
|
||||
if ((a_ops->db_n == NULL) || (a_ops->db_row == NULL) ||
|
||||
(a_ops->db_set == NULL) || (a_ops->cal_n == NULL) ||
|
||||
(a_ops->cal_row == NULL) || (a_ops->cal_k_set == NULL) ||
|
||||
(a_ops->cal_blocked == NULL) || (a_ops->pending == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
s_yt = a_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:死区点数
|
||||
* 返回值:点数;未注入返回 0(页面据此渲染空表,而不是拿编译期常量当"真源说
|
||||
* 有几行"——行数归执行侧,见 ui_data.h 通道五表注) uint8_t
|
||||
* 限定条件:页面绘制路径可直调(一次函数指针转发,零 I/O、零锁)
|
||||
*/
|
||||
uint8_t ui_data_yt_db_n(void) {
|
||||
if (s_yt == NULL) {
|
||||
return 0u;
|
||||
}
|
||||
return s_yt->db_n();
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:读第 idx 行死区现状(工程量 + 粗守域 + 量纲 + 显示小数位)
|
||||
* 入口参数:idx - 0..8(0..7 = 电气语义通道序,8 = 频率) uint8_t
|
||||
* a_out - 行现状 ui_data_yt_row_t *
|
||||
* 返回值:0 - 已写出;-1 - 未注入 / 参数空 / 执行侧无此行(页面这行退化显示,
|
||||
* 不猜、不拿上一行数值顶替) int
|
||||
* 限定条件:页面绘制与按键链内(uiTask)
|
||||
* 函数说明:出参在本层不预清——执行侧契约是"返 0 才整份写",页面返非 0 时
|
||||
* 不得读该结构,这条口径由 TC-UIDATA-028 钉
|
||||
*/
|
||||
int ui_data_yt_db_row(uint8_t a_idx, ui_data_yt_row_t *a_out) {
|
||||
if ((s_yt == NULL) || (a_out == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
return s_yt->db_row(a_idx, a_out);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:写第 idx 行死区(工程量)——两页唯一的死区写出口
|
||||
* 返回值:0 - 副本已写且已置脏;-1 - 未注入或执行侧拒(副本未动、不置脏) int
|
||||
* 限定条件:uiTask 按键链内(编辑提交)
|
||||
* 函数说明:未注入与执行侧拒绝**同码返回**是刻意的:两条腿屏上都是"值没变 +
|
||||
* 保存行 ERR",页面不需要、也不该分辨"是没接上还是被拒"——那是装配期
|
||||
* 故障与工况故障的区分,归日志不归屏幕
|
||||
*/
|
||||
int ui_data_yt_db_set(uint8_t a_idx, float a_eng) {
|
||||
if (s_yt == NULL) {
|
||||
return -1;
|
||||
}
|
||||
return s_yt->db_set(a_idx, a_eng);
|
||||
}
|
||||
|
||||
/* 函数功能:系数覆盖点数;未注入返回 0(理由同 ui_data_yt_db_n) uint8_t */
|
||||
uint8_t ui_data_yt_cal_n(void) {
|
||||
if (s_yt == NULL) {
|
||||
return 0u;
|
||||
}
|
||||
return s_yt->cal_n();
|
||||
}
|
||||
|
||||
/* 函数功能:读第 idx 路系数现状;返回值与不猜口径同 ui_data_yt_db_row int */
|
||||
int ui_data_yt_cal_row(uint8_t a_idx, ui_data_yt_row_t *a_out) {
|
||||
if ((s_yt == NULL) || (a_out == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
return s_yt->cal_row(a_idx, a_out);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:写第 idx 路系数 k(µV/码)——两页唯一的系数写出口
|
||||
* 返回值:0 - 已写并置脏;-1 - 未注入或拒(副本未动、不置脏) int
|
||||
* 限定条件:uiTask 按键链内
|
||||
* 函数说明:粗守(上限 RUN_PAR_K_MAX_UV)与真带(执行段 ×[0.5,2.0])两层守卫
|
||||
* **互不掩盖**:屏上输入框只能挡误写,真带裁在 adc_cal;本层不加第三层
|
||||
*/
|
||||
int ui_data_yt_cal_k_set(uint8_t a_idx, float a_uv) {
|
||||
if (s_yt == NULL) {
|
||||
return -1;
|
||||
}
|
||||
return s_yt->cal_k_set(a_idx, a_uv);
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:未标定闭锁徽标源
|
||||
* 返回值:1 - 闭锁中;0 - 正常**或未注入** uint8_t
|
||||
* 限定条件:页面绘制路径可直调
|
||||
* 函数说明:未注入按 0 是"宁可不画"而不是"报个徽标保平安"——徽标是断言,
|
||||
* 没有真源时的断言就是假断言;此时页面上写值本来也全被拒(写口返 -1),
|
||||
* 信息不缺这条
|
||||
*/
|
||||
uint8_t ui_data_yt_cal_blocked(void) {
|
||||
if (s_yt == NULL) {
|
||||
return 0u;
|
||||
}
|
||||
return s_yt->cal_blocked();
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:整档落盘脏位探查(保存行三态的唯一判据源)
|
||||
* 返回值:1 - 有已整定未落盘改动;0 - 干净或未注入 uint8_t
|
||||
* 限定条件:页面绘制路径可直调(每帧一次转发,零 I/O)
|
||||
* 函数说明:本层**不加任何边沿记忆**——"我这次动作的结果"要锁存是页面的事
|
||||
* (脏位整档全局、他人再改会重新置脏,两条口径见 ui_data.h pending
|
||||
* 成员注);在这里做锁存会把两页的状态耦合成一份
|
||||
*/
|
||||
uint8_t ui_data_yt_pending(void) {
|
||||
if (s_yt == NULL) {
|
||||
return 0u;
|
||||
}
|
||||
return s_yt->pending();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user