/* * 模块名称:UI Page wave_manual (手动录波内容页) * 模块功能:装置维护 → 手动录波 叶子(node 26,#P 受密码保护)的内容页—— * 复用 ui_page_action 共享确认链(一次确认 → 二次确认 → 执行回报): * 执行只做一件事——经录波注入表投一次「手动触发」请求,受理即回报 * 「已请求录波」;采点、冻结、落盘全在 ring/store/落盘道,本页不 * 等待也不查询结果(录波从触发到成段最快也要一秒后,页面上做同步 * 等待等于把 uiTask 绘制定律「零 I/O」当场破掉); * 只读进入(查看密码)整页拒执行并显式 LOCK——与强制复归同一条 * 「触发是操作不是查看」的权限判据(docs/任务规划/UI补齐.md §2 * 维护组的既有口径,本页不自造第二种); * 本文件零 App include、零存储触点(分层方向由注入表守住)。 * 适用平台:STM32F407ZGTx / PC 模拟器(两端共用) * 作者:DTU 项目组 * 创建日期:2026-10-29 * 修改记录: * v1.0 2026-10-29 DTU 项目组 创建(故障录波道 UI 侧;触发入口形态 = * docs/子系统设计/故障录波设计说明.md §8.3; * 冷却/忽略的屏上反馈:拒收即 ERR,ring 侧 * 「冷却中丢弃并计数」不在页面上细分原因—— * 用户要的原因区分在回放页看段号) */ /* 头文件包含区 */ #include "ui_page_wave_manual.h" #include "ui_content_page.h" #include "ui_data.h" #include "ui_page_action.h" /* 私有宏定义区 */ /* (无——文案词全部是 Flash 字面量,见下面静态配置) */ /* 私有函数声明区(静态初始化器要引用下面函数的地址,故先声明) */ static bool wv_ok(void); /* 静态变量定义区 */ /* * 本页操作页实例(配置全为 Flash 字面量与函数地址;运行态两字节由组件写)。 * 字段顺序 = ui_page_action_t 声明序(ARMCC v5 = C99 要求指定顺序一致)。 * 观测行留空(label 与 cb 成对给 NULL,组件允许):录波段数要扫卷才能知道, * 而组件 watch_cb 的契约是「绘制路径零 I/O 直调」——不为一个观测数破坏 * 绘制定律,段数的事交给回放页(它本来就要读段)。 */ static ui_page_action_t s_act = { "确认手动录波?", /* prompt:问句用字全在既有子集(确认/手动录波 均来自 菜单与强制复归页现词,'?' 为 ASCII) */ "已请求录波", /* done_text:回报「请求已受理」,不谎称「已存成段」—— 受理到落盘之间还隔着冻结窗与卷写,页面无权代言 */ wv_ok, /* ok_cb */ 1u, /* need_modify:只读进入一律拒执行(触发是操作) */ NULL, /* watch_label(观测行不给,理由见上方块注释) */ NULL, /* watch_cb */ 0u, /* stage(运行态初值) */ 0u /* err (运行态初值) */ }; /* 函数定义区 */ /* * 函数功能:执行投递——向录波环形缓冲投一次手动触发请求 * 入口参数:无 * 返回值:true = 已受理(组件转成功回报);false = 拒收(组件显示 ERR) bool * 限定条件:由 ui_page_action_key 在第二次 ENTER 时调用(uiTask 上下文) * 函数说明:ring 的 request 本身是「任意上下文可调的一次性请求」,非阻塞、 * 不等待采点;注入未绑(装配缺件)同样返非零 → 屏上显 ERR, * 比「按了像成功其实什么都没发生」诚实(强制复归页同款纪律)。 * 不补操作记录:录波不是五类审计记录之一(触发证据在段文件头里, * 落盘道已带 trig_src/t0/frame_seq),页面上再投一条 = 两处两个真源。 */ static bool wv_ok(void) { return (ui_data_wave_manual_req() == 0) ? true : false; } /* * 函数功能:开页复位确认链(框架 init_cb) * 入口参数:无 * 返回值:无 * 限定条件:框架开页链内调用 * 函数说明:复位由组件做(stage/err 是它的运行态),本页不重复清一遍 */ static void pg_init(void) { ui_page_action_init(&s_act); } /* * 函数功能:自绘(框架 draw_cb;四行居中全由组件画) * 入口参数:a_layer / a_clip - 契约见 ui_content_page.h * 返回值:无 * 限定条件:框架绘制链末尾调用 */ static void pg_draw(lv_layer_t *a_layer, const lv_area_t *a_clip) { ui_page_action_draw(&s_act, a_layer, a_clip); } /* * 函数功能:按键转发(框架 key_cb) * 入口参数:a_key - LVGL 键值 lv_key_t * 返回值:true = 本页已消费;false = 交回框架 bool * 限定条件:框架按键链内 * 函数说明:确认链的判定全在组件里(含只读拒执行),本页只如实透传返回值 */ static bool pg_key(lv_key_t a_key) { return (ui_page_action_key(&s_act, a_key) != 0u); } /* * 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=wave_manual 绑定引用) * 操作页形态(强制复归页同款):无浅 V、无页脚、无行列表; * edit_capable=1 是「能不能改」的那半,另半(本次进入授予的权限)由 * ui_content_page_is_editable() 给;key_intercept=0:LEFT 不拦截,关页 = 取消 */ const content_page_def_t ui_page_wave_manual_desc = { .id = "wave_manual", .title = "手动录波", .hide_deco = 1u, .hide_footer = 1u, .selectable = 0u, .key_intercept = 0u, .edit_capable = 1u, .init_cb = pg_init, .draw_cb = pg_draw, .key_cb = pg_key, };