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
+69
View File
@@ -0,0 +1,69 @@
//! 编译期嵌入的构建信息。
//!
//! # 为什么读仓库根的那个文件
//!
//! `version.json` 由 `scripts/version.mjs` 从 git 历史算出来,是版本号的唯一来源。
//! 这里用 `include_str!` 把仓库根的那一份**嵌进二进制**:
//!
//! - 不依赖运行时的文件(装到别人机器上也能读到);
//! - `include_str!` 会让 cargo 把它登记成依赖,所以它一变,这个 crate 就会重编——
//! 不需要再手写 `cargo:rerun-if-changed`。
//!
//! 二进制里的版本号因此一定与它编译时的那棵源码树一致,不会出现"装包写着 0.1.0、
//! 其实是两周后的代码"。
use serde_json::Value;
/// 仓库根 `version.json` 的原文。
const RAW: &str = include_str!("../../../version.json");
/// 一份构建的全部身份信息。
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BuildInfo {
pub major: u16,
pub minor: u16,
pub patch: u16,
/// git 提交数,单调递增。
pub build: u16,
/// 线路协议版本。
pub protocol: u16,
}
impl BuildInfo {
/// 打包成 `major << 16 | minor << 8 | patch`,与协议里的 `Hello.version` 同一套编码。
pub fn packed(&self) -> u32 {
((self.major as u32) << 16) | (((self.minor as u32) & 0xff) << 8) | ((self.patch as u32) & 0xff)
}
pub fn version_text(&self) -> String {
format!("{}.{}.{}", self.major, self.minor, self.patch)
}
}
/// 解析失败时退回全 0——那会让界面显示"版本未知",比编不过或者编出一个假版本好。
pub fn build_info() -> BuildInfo {
let Ok(json) = serde_json::from_str::<Value>(RAW) else {
return BuildInfo {
major: 0,
minor: 0,
patch: 0,
build: 0,
protocol: 0,
};
};
let field = |name: &str| -> u16 {
json.get(name)
.and_then(Value::as_u64)
.unwrap_or(0)
.min(u16::MAX as u64) as u16
};
BuildInfo {
major: field("major"),
minor: field("minor"),
patch: field("patch"),
build: field("build"),
protocol: field("protocol"),
}
}