feat(client): RMIC::2026 界面重做、可计算的版本机制与固件版本联动
构建客户端 / 检查(类型 + 单元测试) (push) Canceled after 0s
构建客户端 / Linux x64(deb + AppImage) (push) Canceled after 0s
构建客户端 / Windows x64(NSIS 安装包) (push) Canceled after 0s
构建客户端 / macOS 通用(.app + .dmg) (push) Canceled after 0s

- feat(client): 界面换成墨黑蓝底 + 单支红的矩形语言,切角全部去掉,仅装甲条保留平行四边形
- feat(client): 自托管 HarmonyOS Sans SC 与 JetBrains Mono,中文与拉丁数字逐字回退
- feat(client): 新增启动序列、首启门、用户端 HUD、裁判端控制台、设置抽屉与固件维护页
- feat(client): 裁判端中缝与下方控制台可拖,鼠标落在哪一路下方就看哪一路
- feat(client): 设置抽屉常驻实时预览,与画面共用同一份准星绘制代码
- feat(client): 动效改用 Material 3 的缓动曲线与时长,逐条替换掉自造的贝塞尔
- feat(version): 版本号与 CHANGELOG 由 scripts/version.mjs 从 git 历史算出,不再手写
- feat(firmware): Hello 报文携带语义化版本、构建号与自报协议号,负载向后兼容
- feat(client): 固件版本显示在绑定列表与裁判端每一格;协议不匹配时给出具体原因
- feat(firmware): 固件包版本与客户端同源,都从 version.json 读
- fix(client): getCurrentWindow() 在没有 Tauri 注入时同步抛异常,浏览器预览整棵树被卸载
- fix(client): 启动序列的淡出 effect 清掉了自己刚设的 setTimeout,界面永远停在启动页
- fix(client): 设置抽屉左侧导航的锚点没挂到 section 上,且用错了坐标系
- fix(protocol): Hello 改用宽松帧头解析,让协议不匹配的板子能被解释而不是静默消失
- fix(build): Windows 上 bindgen 加载不了 libclang 的同目录依赖,构建脚本补上搜索路径
- fix(build): esp-idf-sys 在长路径下拒绝构建,固件构建改用短的目标目录
- build(client): 队标图标,含光学尺寸分级与手工拼的多尺寸 ICO
- build(ci): 守门 job 增加版本一致性检查,产物名改为 rmic-2026-*
- docs: 补充界面语言、版本机制与协议通告布局的说明
This commit is contained in:
2026-10-19 02:40:08 +08:00
parent cc6b82d7ec
commit 896b21fe44
332 changed files with 16729 additions and 2765 deletions
+33
View File
@@ -87,6 +87,39 @@ cd protocol && cargo test
**`version` 不匹配就拒收**,而不是按错误布局继续解析——后者会表现为随机崩溃或画面
错乱,比拒绝连接难查得多。
## 通告里的版本信息
`Hello` / `Heartbeat` 的负载是**向后兼容的一截**,现在 10 字节:
```text
相对 HEADER_LEN 的偏移
0 2 6 8 10
+-----+-----+-----+-----+
| fw | ver | bld |proto| fw: u16 旧字段(老客户端还读它)
+-----+-----+-----+-----+ ver: u32 major<<16|minor<<8|patch
bld: u16 构建号(git 提交数)
proto: u16 板子编译进去的线路协议
```
三个决定:
- **旧的 2 字节 `fw` 保留不动**。老客户端只读它,多余的字节不看,所以一次固件更新
不会把还在用旧客户端的机器踢下线。
- **新客户端接受只有 2 字节的老固件**:版本与构建号回到 0("未知"),协议号退回帧头里
的那个。界面显示"版本未知",而不是一个看起来像真值的 `0.0.0`。
- **通告用宽松的帧头解析,视频帧不用**。见下一条。
### 为什么通告允许协议不匹配
严格解析会把 `version != PROTOCOL_VERSION` 的数据报全部丢掉。对视频帧这是对的——按错的
布局去解读一段 JPEG 只会得到垃圾。但对**通告**,那意味着一块烧了别的协议版本的板子在
客户端看来根本不存在,现场看到的现象只有"没有画面"。
所以 `Hello::decode` 走 `decode_header_lenient`:魔数、长度、字段照常校验,只是不看版本。
读出 `proto` 之后,客户端就能直接说"板子是协议 2,客户端是协议 1,画面会被丢弃,请重新
烧录",而不是让人去猜。
这不削弱边界:视频、订阅、装甲板上报仍然走严格解析。
## 为什么视频走 UDP 而不是 TCP
实测(VGA 640x480,传感器产出 22 fps):