新版布局

This commit is contained in:
xu
2026-10-16 09:06:03 +08:00
parent e5efdea06e
commit 1ec93e42cb
37 changed files with 1785 additions and 977 deletions
+33 -13
View File
@@ -32,17 +32,18 @@ make -j4
**19 条**报文(分类四标准帧 `DIDO/PWM/AI/BMS/MCU` 未实现)。所有报文均为 **29 位扩展帧、
信号一律 Intel(小端)位序**。
串口是字节流,故线上帧统一为 **18 字节**,收发同一格式:
一个 UDP 数据报里可能塞多条帧,故线上帧统一为 **16 字节**,收发同一格式:
| 偏移 | 长度 | 含义 |
| --- | --- | --- |
| 0 | 4 | 帧头 `0x5AA5FF00`(线上字节序 `00 FF A5 5A`,用于在字节流中定位报文起始) |
| 4 | 4 | CAN ID(29 位扩展帧),直接用于分流 |
| 8 | 1 | DLC,固定 `8` |
| 9 | 8 | CAN 数据段 |
| 17 | 1 | 校验和:canId 四字节 + DLC + 数据八字节求和取低 8 位 |
| 0 | 1 | 帧头 `0xAA`(用于在数据报中定位报文起始) |
| 1 | 4 | CAN ID(29 位扩展帧),直接用于分流 |
| 5 | 1 | DLC,固定 `8` |
| 6 | 8 | CAN 数据段 |
| 14 | 1 | 校验和:帧头 + canId 四字节 + DLC + 数据八字节 + 帧尾求和取低 8 位 |
| 15 | 1 | 帧尾 `0xBB` |
收包时逐字节找帧头、校验不过右移一字节继续找,容忍粘包、拆包与杂包。
收包时逐字节找帧头,帧头/帧尾/校验任一不过就右移一字节继续找,容忍粘包、拆包与杂包。
**上行 7 条**(遥控器 → 车端)按协议「报文周期时间」列分三组重发:**50ms** 底盘 / 机械臂1 /
机械臂2 / 急停,**100ms** 洗消指令 / 洗消调试,**1000ms** 气体检测仪。界面上层只更新控制状态,
@@ -77,12 +78,26 @@ make -j4
车速 0~5.00 km/h、发泡倍数 6~12 倍、泡沫比例 0~10%、空压机流量 0~340 L/min、柱塞泵流量
0~24 L/min;调试维护页三泵转速上限各按协议(空压机 3000 / 柱塞泵 1450 / 叶片泵 2000 rpm)。
顶部「通信正常/异常」按收帧判定:连续 **2s** 未收到任何合法帧即判为异常(最慢的下行周期
1000ms)。UDP 端口绑定失败(如 9000 已被占用)时不启动定时器、不崩溃,界面显示「通信异常」。
顶部左区**固定**显示一行通信状态,不再轮播:`CarCommunication::updateCommText()` 按
`All_Comm_FaultCode` 与链路状态渲染进 `Telemetry::commText`,`TitleBar` 只决定配色——
正常为绿字「系统通信正常」,有码时用该码的文案(如「机械臂通信异常」),链路断且无码时为
「通信异常」;异常时整条指示器红色闪烁。
车端 CAN 走 UDP,端口在 `comm/car.cpp` 中以常量固定:本机 **9000** 收、上行命令发往 **127.0.0.1:9001**。
各项子系统故障的明细不在顶部,而是进对应卡片的**「故障」行**(`DataCard::setFaults`):
底盘、洗消、气体检测仪三张卡各一行,**无故障时整行隐藏**,有故障时显示并红色闪烁,
多条按 **1s** 轮流显示。机械臂卡没有这一行——协议里机械臂那四帧只有位置/姿态/关节角,
没有故障信号。洗消卡那一行是「洗消系统 + 泵」;气体检测仪的告警单独一份
(`Telemetry::detectorFaults`),不会再去点亮洗消页底栏的「系统故障」灯。
链路判定:连续 **2s** 未收到任何合法帧即判为异常(最慢的下行周期 1000ms),此时顶部那行
显示不带故障码的「通信异常」。UDP 端口绑定失败(如 9000 已被占用)时不启动定时器、不崩溃,
同样显示「通信异常」。
车端 CAN 走 UDP,地址在 `comm/car.cpp` 中以常量固定:本机绑 **AnyIPv4:9000** 收、上行命令发往
车端 **192.168.1.224:3001**(`kCanTxHost`,改车端 IP 只动这一处)。
遥控器仍走串口:`comm/uart.cpp` 打开 `rc/device`(默认 `/dev/ttyS7`)、`rc/baud`(默认 `115200`)。
`config.ini`(程序目录)中与通信相关的配置还有 `net/selfcheck_fault`(自检故障演示)。
`config.ini`(程序目录)中与通信相关的配置还有 `net/selfcheck_fault`(自检故障演示,作用于
`清水液位` 这一项,默认开)。
参数(车速、柱塞泵流量、发泡倍数、泡沫比例、空压机流量)与密码经 `QSettings` 持久化,上电自动读取。
`tools/can_sender.py` 是车端 CAN 的 UDP 联调工具(给 UI 发反馈时目标端口用 **9000**);
@@ -90,8 +105,13 @@ make -j4
### 已知缺口
- **自检 10 项无对应 CAN 报文**,`sendSelfCheckStart()` 暂由本端跑完序列(见 `onSelfCheckTick`
的 TODO),仅为维持 ④自检 → ⑤系统首页面 流程不中断;拿到真实报文后替换该本地驱动。
- **自检 14 项里 0~9 项无对应 CAN 报文**(通信系统/各分系统通信取自 `All_Comm_FaultCode`,其余为
清水液位),`sendSelfCheckStart()` 暂由本端计时直接判过(见 `onSelfCheckTick` 的 TODO),
仅为维持 ④自检 → ⑤系统首页面 流程不中断;拿到真实报文后替换该本地驱动。
- **自检的球阀 4 项(D1/D2 开启、关闭)是真检查**:`onSelfCheckTick` 会置 `Decontam_DebugCmd`
的调试模式位并写目标阀位(命令帧由 100ms 周期定时器持续重发),再等 `MBV_D1_Sta` /
`MBV_D2_Sta` 反馈与指令一致才算通过;`kValveWaitTicks`(默认 18 拍 ≈ 8s)内未到位、
或车端根本没有反馈(通信异常)都判故障。自检结束后恢复原有的调试模式位。
- **行车/机械臂模式**没有对应的下行信号:协议 12 条反馈里没有该字段,`telemetry.driveMode`
无处可填,故模式只由遥控器报文决定(遥控器离线时保持上次值)。
- **`Vehi_spd` 按协议取 8 位**(bit24、精度 0.01 → 0~2.55 km/h)。协议表里该信号与其后的