From a64db43fe4f49558d152abf6318655d91d3e4a2f Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 27 Oct 2026 13:59:59 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E4=BB=BB=E5=8A=A1=E8=A7=84=E5=88=92):=20?= =?UTF-8?q?=E9=80=9A=E8=AE=AF=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=94=80=E9=A1=B9?= =?UTF-8?q?=E4=B8=8E=E5=8F=B6=E6=95=B0=E5=8F=A3=E5=BE=84=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=EF=BC=8822=20=E7=BB=91=20/=2011=20=E6=9C=AA=E7=BB=91=20/=20?= =?UTF-8?q?=E5=BE=85=E5=81=9A=206=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按「完成即销」删 UI补齐 §2 顺序 1 整行并重编号、删依赖 bullet、开篇改为从记录 5 页开始; §1 计数按生成器自身 parse_tree 实测(nodes=42 leaves=33 bound=22 unbound=11),分类表 7 改 6 并补闭合式(6 + 5 = 11);README 开篇剩余三项改两项、§1 表同步。 两条比数字更该留下的口径: · §3 数据源表里通讯设置那行**保留并改写**,不整行删——「改后重启即生效」的真机判据与配置段 数键数上限核对**确实未做**,完成即销销的是已完成,不是已落地一半。 · naive 计数从 22 纠正到 23(文件头示例行也算一次)。旧文档那个 22 恰好等于新的 bound 真值, 不改就等于教人用错算法却碰巧对上,比错更糟。 --- docs/任务规划/README.md | 15 +++++++-------- docs/任务规划/UI补齐.md | 31 ++++++++++++++----------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/docs/任务规划/README.md b/docs/任务规划/README.md index e5be9327..4e448764 100644 --- a/docs/任务规划/README.md +++ b/docs/任务规划/README.md @@ -1,6 +1,6 @@ # 任务规划 -> **现在只做 UI 补齐。剩余三项按表序单道推进:通讯设置 → 记录 5 页 → 运行报告。** +> **现在只做 UI 补齐。剩余两项按表序单道推进:记录 5 页 → 运行报告(通讯设置已入库)。** > 详细任务与验收见 `UI补齐.md`;UI 完成后的第一项是 net 层跨上下文收口。 ## 怎么用这份规划 @@ -32,16 +32,15 @@ ## 1. 当前执行:UI 补齐 -菜单树共 33 叶(节点行合计 42):按行内 `#page=` 实测**已绑 21 叶、未绑 12 叶**(2026-10-27 复核, -判定规则与重跑命令见 `docs/任务规划/UI补齐.md` §1「叶数判定与复核」)。未绑里 **7 叶纳入当前执行** -(通讯设置 1 + 记录 5 + 运行报告 1),另外 5 叶因缺少开入硬件、录波模块或 SNTP 产品定义而不做。 -装置维护 3 页与遥测死区/系数 2 页已于 2026-10-27 落地入库。唯一执行清单见 `UI补齐.md`。 +菜单树共 33 叶(节点行合计 42):按行内 `#page=` 实测**已绑 22 叶、未绑 11 叶**(2026-10-27 复核, +判定规则与重跑命令见 `docs/任务规划/UI补齐.md` §1「叶数判定与复核」)。未绑里 **6 叶纳入当前执行** +(记录 5 + 运行报告 1),另外 5 叶因缺少开入硬件、录波模块或 SNTP 产品定义而不做。 +装置维护 3 页、遥测死区与系数 2 页、通讯设置页已于 2026-10-27 陆续落地入库。唯一执行清单见 `UI补齐.md`。 | 顺序 | 要做的事 | 交付结果 | |---|---|---| -| 1 | 通讯设置 | `[comm]` 段与端口真源已在库,还差页面与「重启生效」真机判据 | -| 2 | 记录 5 页 | 事故、操作、保护告警、保护启动、遥控记录有写入方并可查看 | -| 3 | 运行报告 | 上电次数、运行时长、复位原因、104 统计 | +| 1 | 记录 5 页 | 事故、操作、保护告警、保护启动、遥控记录有写入方并可查看 | +| 2 | 运行报告 | 上电次数、运行时长、复位原因、104 统计 | **执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物; 不要同时开多条 UI 页面分支。上板验证可累积成一批,但保存、重启、主站读回等判据不能删除。 diff --git a/docs/任务规划/UI补齐.md b/docs/任务规划/UI补齐.md index ddd71e2f..015219a3 100644 --- a/docs/任务规划/UI补齐.md +++ b/docs/任务规划/UI补齐.md @@ -1,24 +1,24 @@ # 当前任务:UI 补齐 -> **从第 1 项「通讯设置」开始,按表序单道串行推进。** +> **从第 1 项「记录 5 页」开始,按表序单道串行推进。**(通讯设置页已于 2026-10-27 入库) > 本文件是当前唯一执行清单;全项目顺序见 `docs/任务规划/README.md` §2。 ## 1. 目标与范围 -菜单树共 **33 叶**(节点行合计 42,缩进即层级):按行内 `#page=` 实测**已绑 21 叶、未绑 12 叶**, -页面映射表 `UI_PAGE_MAP_COUNT` = 21(与已绑叶数一致)。未绑 12 叶 = 下方第 1~3 项的 **7 叶** -+ §5 明确不做的 **5 叶**(遥信 3 / 手动录波 1 / SNTP 1),与分类表逐项对得上。 +菜单树共 **33 叶**(节点行合计 42,缩进即层级):按行内 `#page=` 实测**已绑 22 叶、未绑 11 叶**, +页面映射表 `UI_PAGE_MAP_COUNT` = 22(与已绑叶数一致)。未绑 11 叶 = 下方第 1~2 项的 **6 叶** ++ §5 明确不做的 **5 叶**(遥信 3 / 手动录波 1 / SNTP 1),与分类表逐项对得上(6 + 5 = 11)。 | 分类 | 数量 | 当前怎么处理 | |---|---:|---| -| 需补配置或写入方 | 7 | 当前执行:通讯设置 1 + 记录 5 + 运行报告 1(即下方第 1~3 项) | +| 需补配置或写入方 | 6 | 当前执行:记录 5 + 运行报告 1(即下方第 1~2 项) | | 无开入硬件 | 3 | 不做:遥信类型、遥信防抖、双点遥信 | | 缺独立模块或产品定义 | 2 | 不做:手动录波、SNTP 设置 | 现有基础:`ui_w_editor` / `ui_w_setlist` / `ui_page_action` 已就绪;`ui_data` 已扩到**四通道** (rt / par / info + 遥测死区与系数用的第四张注入表);像素黄金用例与字符集门禁已存在,内容页黄金 -现有 **47 页**(菜单 8 状态另计)。**装置维护 3 页与遥测死区/系数 2 页已把这套基础接上了真实消费者, -剩余三项继续用它,不另发明一套机制。** +现有 **53 页**(菜单 8 状态另计)。**装置维护 3 页与遥测死区/系数 2 页已把这套基础接上了真实消费者, +剩余两项继续用它,不另发明一套机制。** 逐页形态见 `docs/UI设计/页面补齐规划.md`;数据契约见 `docs/UI设计/UI_数据供给设计说明.md`。本文件只维护执行顺序和完成判据。 @@ -28,7 +28,7 @@ 1. **节点行** = `ui_menu_tree.txt` 里非空、非 `#` 开头的行(当前 **42** 行,含根「主界面」)。 2. **缩进即层级**(每级 2 空格;Tab 会被 `gen_menu.py` 直接拒绝):某节点行之后再没有更深缩进的行 = **叶** (当前 **33** 叶);有更深缩进后继者 = 菜单节点(当前 **9** 个)。等价于生成物口径 `ui_menu_tab_has_children(node) == false`。 -3. **绑定**:叶行行尾带 ` #page=` = 已绑(当前 **21** 叶);不带的 = 未绑(当前 **12** 叶)。 +3. **绑定**:叶行行尾带 ` #page=` = 已绑(当前 **22** 叶);不带的 = 未绑(当前 **11** 叶)。 复核命令(复用生成器自己的解析器 `tools/menu_gen/gen_menu.py` 的 `parse_tree`,不另写一套计数逻辑,免得与生成物脱钩): @@ -36,11 +36,10 @@ & '.venv\Scripts\python.exe' -c "import io,sys; sys.path.insert(0,'tools/menu_gen'); import gen_menu as g; n,_=g.parse_tree(io.open('ui_menu_tree.txt',encoding='utf-8').read()); leaf=[i for i,x in enumerate(n) if all(y[0]!=i for y in n)]; b=sum(1 for i in leaf if n[i][4]); print('nodes=%d leaves=%d bound=%d unbound=%d' % (len(n),len(leaf),b,len(leaf)-b))" ``` -输出 `nodes=42 leaves=33 bound=21 unbound=12`;交叉核对生成物:`ui_menu_tab.h` 的 `UI_MENU_TAB_COUNT` = 42(节点行数)、 -`ui_page_registry.h` 的 `UI_PAGE_MAP_COUNT` = 21(已绑叶数)——一对 42、一对 21,与上面逐项对得上。 +输出 `nodes=42 leaves=33 bound=22 unbound=11`;交叉核对生成物:`ui_menu_tab.h` 的 `UI_MENU_TAB_COUNT` = 42(节点行数)、 +`ui_page_registry.h` 的 `UI_PAGE_MAP_COUNT` = 22(已绑叶数)——一对 42、一对 22,与上面逐项对得上。 -三个已踩过的错算法:**把 42 个节点行当叶子**(多算 9 个菜单节点,得出「未绑 21」);**`grep -c '#page='` 得 22** -(文件头注释第 5 行有 `#page=<模块名>` 示例字样,必须先剔注释行);**按叶子名去重得 29**(`参数`/`定值`/ +三个已踩过的错算法:**把 42 个节点行当叶子**(多算 9 个菜单节点,得出「未绑 21」);**`grep -c '#page='` 得 23**(比已绑多 1:文件头注释第 5 行有 `#page=<模块名>` 示例字样,必须先剔注释行);**按叶子名去重得 29**(`参数`/`定值`/ `控制字`/`软压板` 在「整定」「查看」下各一份,4 对同名不能合并)。 --- @@ -51,14 +50,12 @@ | 顺序 | 任务 | 完成判据 | 主要写范围 | 状态 | |---|---|---|---|---| -| **1** | **通讯设置** | 配置层已落地(`[comm]` 段与端口真源在 `App/protocol/iec104/iec104_comm.{c,h}`,服务端口不再抄 `IEC104_SERV_PORT` 字面量);**还缺页面**与「改后重启即生效」的真机判据、配置段数与键数上限核对(主站地址白名单不做,见 §5) | `App/protocol/iec104/`、`Drivers/BSP/UI/` | 配置层已落地,页面未开始 | -| **2** | **记录 5 页** | 事故、操作、保护告警、保护启动、遥控各有一个写入点和记录类型;可翻最近 20 条;空记录明确显示“无记录”;共用 reader | `App/log/`、`Drivers/BSP/UI/` | 未开始 | -| **3** | **运行报告** | 四个数的现成度已查实,判据按此写死:复位原因**解析有但 RCC 标志读后即清** ⇒ 需开机快照驻留;上电次数**无现成计数器** ⇒ 正源建议 SD2506 用户 SRAM(电池保持、零 NAND 磨损,文案写「自 RTC 电池周期起」,**禁写终身次数**);运行时长**用户裁定 2026-10-27 = 只报本次开机以来**(直接用现成 `uptime_s`,**不引** RTC 用户 SRAM 存秒数,UI 该栏必须**明写「本次开机以来」**免被误读为累计值);104 统计现有量全是控制量 ⇒ 需新增只读计数与 getter。落点 `App/util/boot_stats.{c,h}`(双端注册同笔),104 计数就近留 `iec104_serv.c` 不并进 | `App/util/`、`App/protocol/iec104/`、`Drivers/BSP/UI/` | 未开始(时长口径已定,其余三项待做) | +| **1** | **记录 5 页** | 事故、操作、保护告警、保护启动、遥控各有一个写入点和记录类型;可翻最近 20 条;空记录明确显示“无记录”;共用 reader | `App/log/`、`Drivers/BSP/UI/` | 未开始 | +| **2** | **运行报告** | 四个数的现成度已查实,判据按此写死:复位原因**解析有但 RCC 标志读后即清** ⇒ 需开机快照驻留;上电次数**无现成计数器** ⇒ 正源建议 SD2506 用户 SRAM(电池保持、零 NAND 磨损,文案写「自 RTC 电池周期起」,**禁写终身次数**);运行时长**用户裁定 2026-10-27 = 只报本次开机以来**(直接用现成 `uptime_s`,**不引** RTC 用户 SRAM 存秒数,UI 该栏必须**明写「本次开机以来」**免被误读为累计值);104 统计现有量全是控制量 ⇒ 需新增只读计数与 getter。落点 `App/util/boot_stats.{c,h}`(双端注册同笔),104 计数就近留 `iec104_serv.c` 不并进 | `App/util/`、`App/protocol/iec104/`、`Drivers/BSP/UI/` | 未开始(时长口径已定,其余三项待做) | ### 依赖关系 - 各项虽可独立开发,但当前仍按表序单道执行(菜单树、页面注册表与字库都是生成物)。 -- 通讯设置可先完成配置层再接页面,但最终必须作为一整项验收。 - 记录 5 页与运行报告先补真实写入方或计数器,再做页面;不允许用静态演示数据充数。 - 历史教训(已完成的装置维护 3 页留下的口径,后续项沿用):**执行类页面不得做成「点了个按钮但没效果」**——清除记录必须按 `syslog_clear_state()` 出真反馈;遥测死区/系数两页的三态用 `run_par_dirty_peek()` 区分「已受理」与「已落盘」,且黄金必须出 WAIT 与 OK 两张(假件保留脏位、只由 @@ -70,7 +67,7 @@ | 页面 | 现有数据源 | 还缺什么 | |---|---|---| -| 通讯设置 | 网口配置保存范式可复用;`[comm]` 段与端口真源已在库 | 页面与「重启生效」真机判据、段数键数上限核对 | +| 通讯设置 | 页面与六态黄金已随 `728d6067` 入库;`[comm]` 段与端口真源在 `App/protocol/iec104/iec104_comm.{c,h}` | 「改后重启即生效」真机判据、配置段数与键数上限核对(台架窗口统一补做并留证) | | 记录 5 页 | SOE、自检、运行记录已有 reader 先例 | 五类写入方与记录类型 | | 运行报告 | `uptime_s`(本次开机内)、复位原因解析(标志读后即清) | 上电次数正源、复位原因开机快照、104 只读计数(**跨开机累计不做**,用户已裁定只报本次开机) |