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:
+6
-1
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user