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
+6 -1
View File
@@ -198,7 +198,12 @@ fn main() -> Result<()> {
let sender_id = udp::local_sender_id();
let mut sender = UdpSender::new(sender_id)?;
info!("ESP32 camera is live on {ip}");
info!(
"RMIC::2026 firmware {} (build {}) on {ip}, wire protocol {}",
udp::FIRMWARE_VERSION,
env!("RMIC_BUILD"),
protocol::PROTOCOL_VERSION
);
info!("clients will find it by broadcast; no configuration needed on this side");
let mut last_report = Instant::now();
+25
View File
@@ -46,6 +46,24 @@ const SEND_BUFFER_SIZE: usize = protocol::HEADER_LEN + protocol::MAX_FRAGMENT_PA
///
/// 比客户端的订阅间隔宽松:客户端的存在由板子的推流直接体现,而"有谁在线"这条
/// 信息需要快速到达新上线的客户端。
/// 编译进去的固件版本,形如 `"0.2.0"`。
///
/// 由 `build.rs` 从仓库根的 `version.json` 注入——那个文件由 `scripts/version.mjs`
/// 从 git 历史算出来。手工写死一个常量的话,第一次忘记同步就会让界面上的版本和
/// 实际烧进去的固件分叉,而且不会有任何东西报错。
pub const FIRMWARE_VERSION: &str = env!("RMIC_VERSION");
/// 打包的语义化版本:`major << 16 | minor << 8 | patch`。
fn firmware_version_packed() -> u32 {
// build.rs 保证这是十进制数字;解析不出来只可能是有人手改了它的输出。
env!("RMIC_VERSION_PACKED").parse().unwrap_or(0)
}
/// 自增构建号(git 提交数)。
fn firmware_build() -> u16 {
env!("RMIC_BUILD").parse().unwrap_or(0)
}
const HELLO_INTERVAL_MS: i64 = 2_000;
/// 同时向多少个客户端推流。
@@ -314,7 +332,14 @@ impl UdpSender {
pub fn broadcast_hello(&mut self) {
let hello = protocol::Hello {
sender_id: self.sender_id,
// 旧的两字节字段:老客户端还在读它。取值仍是 1("第一代图传板"),
// 新客户端一律看下面的 version / build / protocol。
firmware: 1,
version: firmware_version_packed(),
build: firmware_build(),
// 板子自报的协议版本。客户端据此判断"这块板子我能不能看懂",
// 不匹配时能说出原因,而不是只表现为没有画面。
protocol: protocol::PROTOCOL_VERSION,
};
let buf = hello.encode(protocol::MsgType::Hello);