Files
STM32F4-Base/docs/UI设计/mockups/01_主界面_说明.md
T
wandering1 d64bbdc57f feat(wave): 故障录波数据面、接线与单通道回放页(软件闭环交付)
数据面(App/algo,纯逻辑,双端编译)
- wave_ring:8 路 × 320 点列优先环(1 kHz,预触发 160 + 后触发 160),adcTask
  唯一写者;触发/冻结/封存/冷却四态,冻结持续到落盘回执才解冻,滞留 2 s 自弃
  兜底——下一次真故障无波可录比丢一段更贵
- wave_store:段头编解码 + 拉模式打包游标 + 自带无表位运算 CRC-16/MODBUS(带
  锚点自检)+ 段名与整段长度等式;格式不依赖平台类型宽度
- 段头只存原始码值与封存瞬间生效系数,工程量只当单位标签、不进任何算式
- 三套主机单测(环 113 / 编解码 170 / 触发状态机 110),全部无桩、生产源原样
  纳入;新文件补 stddef 是 ARMCC 与主机差异,主机侧照不出这条分叉
- test/host/wave_read.py 是按 §6.2 的独立第二实现(dump/fft/shape/plot),92 条
  自洽断言;三份合成段互读双校验全过、哈希钉死,格式面双向闭合
- 三套新单测不加专属钩子,由覆盖率总闸全量真跑(沿用既有裁定)

接线(任务层)
- adc_cal:新增生效系数的 32 位定点原值入口(与既有浮点入口共用生效视图),
  段头按最低有效位精确记账,不经浮点回算
- adcTask:每拍压 8 路语义原始码值并推进状态机,封存那一拍同拍交棒封存瞬间事实;
  台架定周期自抓走双层编译门,产品镜像里零存在;串口新增一条 wave: 周期行
- defaultTask:卷空闲后一次心跳整段搬完(try 锁 + 256 字节分片 + 一次完整开档到
  关档),成败都回执;失败先删半成品再计错,段号只在成功时推进;持锁超 50 ms
  补一条告警并记历史峰值(喂狗余量可核)
- Lead 复核补第四道并发陷阱:采集任务优先级高于落盘道,搬段中途它可能正好把滞留
  超时的本段自弃、甚至封出下一段——数据区校验和是对「实际读到的字节」算的,
  半新半旧的段照样自洽,故关档后复检环侧身份判废:删文件、不补账、段号不推进
- Lead 复核抓到触发挂号不是原子操作(旧实现分三个字节写,消费者可在窗口里读到
  上一段的触发源与元件号):已把载荷压进一个字节,越界当场拒且不记任何计数;
  段文件字节布局零改动,三份合成段哈希逐字节不变
- protectTask:保护启动上升沿同点请求录波,一拍一次、元件号取最低位;判据本体
  零改动

人机(160×160 单色屏)
- 菜单树节点 26「手动录波」绑页面 + 记录查询组末新增「录波回放」叶,重跑生成器
  得 43 节点 / 34 叶 / 30 已绑,页面映射 28 → 30
- 回放页一屏一路、触发点前后各一周波共 40 点、每点 3 像素阶梯线(只用水平与
  垂直两种线段——单色屏斜线会被阈值裁掉);零点虚线、触发光标、窗口峰值、
  单位徽标与形状受限徽标;空态与坏段各一句显式文案,绝不用半截波形冒充数据
- ui_data 新增录波注入通道(六件操作表、三态返回);执行侧胶水带段头缓存、
  手动请求后连缓存一起作废、逐点走全仓唯一的码值换算入口
- 模拟器接真实环与编解码合成两段(含坏段与空态旗标),6 张新黄金参考,既有
  60 张逐字节零漂移未用更新模式;字库 218 → 224 字 / 319 字形
- 两份图形配置里图表组件仍为关;零堆分配;页面池水位不变
- 回放读路径的 uiTask 阻塞上界按实码写清:一次渲染 = 段表刷新 + 未缓存段头最坏
  22 次小读;已验段只剩一次开窗读 + 40 点解码;无实测数不编,实测归台架、
  仪器用已在跑的单轮工作耗时探针,不新加埋点

台账与文档
- 内存台账:录波环与落盘/回放静态逐条入册,三档对照 81,536 → 88,296 → 89,936
  字节(62.2% → 68.6%),累计 +8,400;预估 5.9 KB 与实测 +6,760 的差额点名;
  散列文件头注释同步;任务栈表核对后无需抬栈;体积趋势行与同码凭证由权威构建
  重打(0 错误 0 警告,四项体积与上一轮相同——本轮改动只有注释与声明位置)
- 设计说明:§5 补第四条并发陷阱;§6.3 定字段口径(两份独立实现的共同依据);
  §7 回填实测;§9 周期行写实;§10 台架判据改两段式且不比绝对相位;§12 补读路径
  风险行;抬头状态改成「代码面已交付、未做完的只有板级那一轮」
- 卡片:软件闭环一栏列证据;台架三条按用户裁定保持未完成,不做虚假销项
- 口径同步:数据可信、UI 补齐、页面补齐规划、产品需求、采集短板评测、任务规划
  索引与两份 README;陈旧现状句清扫 16 处(带日期戳的历史取数行一律不动)
- 门禁说明:nested-comment 记仓库根探测必须兼容 linked worktree 的 gitdir 文件
  形态(修前该钩子在任务树里恒报环境错、静默不可用);coding-standard 记
  「函数头注释超过 24 行就把函数功能挤出回看窗口」这条机制与本次现场
- 覆盖率基线登记两个新覆盖模块(套件 41 → 44 套);环单测重打后该文件有效行
  227 → 226、覆盖行 226 → 225,比率仍 99.6%,是分母变小不是覆盖率回退

为什么是单一提交:文档链接、双端注册、生成器幂等(菜单与字库)、内存数字与
体积事实源、编号门禁这五道整仓门禁要求代码、页面、菜单树、字库、文档与台账
同处一个提交才自洽,按数据面/接线/人机/台账拆成四笔必然红其中至少四道

编号门禁新增行 14 处命中已按语义改写:魔数常量按字符命名、段名样例改由格式串
生成、频谱表头改 f / 2x / 5x 并加一行图例;改写后自洽断言 92 条仍全过
2026-10-29 19:23:15 +08:00

78 lines
6.3 KiB
Markdown
Raw 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.
# 界面 01:主界面(根页)— 规格说明
> 本文件为设计规格(source of truth):布局参数、字符集核对、待确认问题、映射、LVGL 翻译要点。P1 照参数表翻译代码,P2 出图对照参数表 + 原图。
> 规则:160×160 设备像素 | 1bpp 纯黑白 | SimSun 12px(汉字 12px/字,ASCII 6px/字,行高 13)
> 布局依据:原图 `01_主界面原始图片.png`(628×631 @ 3.925x 缩放)实测 + 模拟器出图目视比对。
---
## 一、布局参数(单位:设备像素)
| 项 | 值 | 说明 |
|---|---|---|
| 顶部装饰 | 开口浅 V,两腿 3px / 水平线 2px | 左尖 (7,7)、底左 (16,17)、底右 (145,17)、右尖 (158,7);底边 y=17,两腿外上翘至 y=7。实现拆 3 段 `lv_line`:两腿加粗(`MENU_DECO_LEG_W`=3)补偿 1bpp 斜线边缘阈值损耗,水平线保持 2px(`MENU_DECO_HORIZ_W`) |
| 状态行 | 左对齐 x=17,顶 y=20 | 行高 13,文案"当前模式 : 无模式"(全角冒号,两侧半角空格) |
| 列表框 | x=0,顶 y=44,宽 99,高 107 | **左对齐**(非通栏),1px 白边框,内 7 行 × 15px(7×15+2 边框=107) |
| 行高 | 15 | 7 行 |
| 行内文字 | 左对齐,左留白 8 | 4 字 = 48px(x 8~56) |
| 箭头 ▶ | x=58(紧跟文字) | 非右对齐;仅第 2~7 行有 |
| 选中行 | 第 1 行整行反色 | 白底黑字,**无箭头**,白色高亮铺满框宽 |
## 二、行内容与状态
| 行 | 文本 | 箭头 | 状态 |
|---|---|---|---|
| 1 | 装置信息 | 无 | **选中**(整行反色:白底黑字) |
| 2 | 实时数据 | ▶(紧跟文字) | 普通(黑底白字) |
| 3 | 参数定值 | ▶(紧跟文字) | 普通 |
| 4 | 三遥设置 | ▶(紧跟文字) | 普通 |
| 5 | 装置维护 | ▶(紧跟文字) | 普通 |
| 6 | 通讯参数 | ▶(紧跟文字) | 普通 |
| 7 | 记录查询 | ▶(紧跟文字) | 普通 |
说明:选中行(第 1 行)无 ▶ 箭头;其余行 ▶ 紧跟在 4 字文本后(非右对齐)。行内文字左对齐、左留白 8px。
## 三、字符集核对(对照当时(2026-09-03)的 ui_font_cn_12:78 汉字 + ASCII 0x20~0x7E;本 mockup 的核对结论只对该时点成立,现值 = 224 汉字/符号 + ASCII,共 319 字形,见 docs/UI设计/UI_中文字体生成与配置.md §7)
- **菜单 7 项**共 22 个唯一汉字:命中 21(装 置 信 息 实 时 数 据 参 定 值 遥 设 维 护 通 讯 记 录 查 询),**新增 1(三)**。
- **状态行**"当前模式 : 无模式":**新增 5(当 前 模 式 无)** + **全角冒号 :(U+FF1A,新增)**;空格为 ASCII(已在字库)。
- **箭头**:**▶(U+25B6,新增符号)**。
→ **确定新增 8 个字形**:三 当 前 模 式 无 : ▶。
写 LVGL 代码前必须重新生成字体,否则新增字在真机显示为空白。流程:代码落库 → `python tools/font_gen/extract_cn.py`(自动从 UI 源码字符串提取)→ `& '.venv\Scripts\python.exe' tools/font_gen/make_font.py`(需 fontTools,见 `UI_中文字体生成与配置.md` §2.1)→ 两端(MCU/模拟器)同时生效。
## 四、待确认问题
> 设计形态(框宽/选中态/装饰形状/冒号)已按原图定形(见第一、二节),不再待确认。以下为**内容/数据**问题,需用户答复。
| # | 问题 | 说明 |
|---|---|---|
| Q1 | 7 个条目 ↔ 子树映射(见第五节表)是否成立? | 其中 3 项疑似重命名(参数定值/三遥设置/通讯参数),需逐项确认 |
| Q2 | "三遥设置"对应现有哪个节点? | 现有 g_menu_tab 有"遥测量"(测量值/遥调系数/遥测系数/双字节/装置遥调);"三遥"是否 = 遥测+遥信+遥控 的新节点? |
| Q3 | "厂家设置 / 版本信息"入口在哪? | 旧菜单中"厂家设置"为独立顶级项(含元件设置/恢复默认/版本显示/版本信息),新 7 项列表未包含——从哪进入? |
| Q4 | "当前模式"指什么、数据从哪来? | 状态行动态值来源(运行/保护/通信模式?);"无模式"为默认?需 App 层供给字符串 |
## 五、条目 → 子树 建议映射(Q1,均待确认;对照现有 g_menu_tab)
| # | 条目 | 现有节点 | 建议映射 |
|---|---|---|---|
| 1 | 装置信息 | 装置信息(一级菜单) | 直接沿用(无变化) |
| 2 | 实时数据 | 实时数据(一级菜单)→ 交流量/直流量/开入量 | 直接沿用(无变化) |
| 3 | 参数定值 | 定值参数(一级菜单)→ 定值/查看 | **重命名** 定值参数 → 参数定值?(待确认) |
| 4 | 三遥设置 | 遥测量(一级菜单)→ 测量值/遥调系数/… | 对应"遥测量"?或新增"三遥"(遥测/遥信/遥控)节点?(Q2) |
| 5 | 装置维护 | 装置维护(一级菜单)→ 时间设置/强制复归/手动录波/自动录波 | 直接沿用(无变化) |
| 6 | 通讯参数 | 通讯设置(一级菜单)→ 通讯参数/网络配置/SNTP设置 | **重命名** 通讯设置 → 通讯参数?或提升 二级菜单"通讯参数"?(待确认) |
| 7 | 记录查询 | 记录查询(一级菜单)→ SOE/事故/操作/告警/… | 直接沿用(无变化) |
注:旧菜单中的"厂家设置"(主界面,含 元件设置/恢复默认/版本显示/版本信息/装置遥调/装置记录)未出现在新 7 项列表中,入口待 Q3 确认。
## 六、LVGL 翻译要点(P1 用)
1. 列表 = 持久容器 `lv_obj`(x=0, y=44, 99×107,1px 边框)+ 7 个行子 `lv_obj`(高 15,绝对定位 `lv_obj_set_pos`,固定布局更可控)
2. 行 = `lv_obj` + `lv_label`(静态文本,左对齐 x=8)+ `lv_label`("▶",x=58,紧跟文字);选中行 = `LV_STATE_CHECKED` 整行反色(白底黑字,高亮铺满框宽)
3. 状态行 = `lv_label`(x=17, y=20,文本由 App 层供给,Q4)
4. 顶部装饰 = 开口浅 V(4 段折线:(7,7)→(16,17)→(145,17)→(158,7)):LVGL 可用 3 条 `lv_obj` 线段拼合(斜线用 `lv_line`),或预渲染 1bpp 位图 `lv_image`(更省对象、更精确)
5. 1bpp 禁区(本设计均未使用):圆角 / 阴影 / 透明度 / 渐变 / 多色
6. 内存:根页 = 1 列表容器 + 7 行 ×(行 obj + 2 label)+ 状态 label + 装饰 ≈ 20+ 个对象,为最高频页面,P1 需核算 16KB LVGL 池占用