feat(client): RMIC::2026 界面重做、可计算的版本机制与固件版本联动
- 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:
@@ -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"),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user