feat(core): 升级固件至v0.4.1并增加GD32初始化状态监控功能

- 修复GD32 OTA中继全程ring抑制问题:handleIdle起点reset()曾立即解除
  taskEntry设置的suppressRingService(true),导致中继全程worker偷读OTA ACK/WAIT
- 增加reset(bool release_ring_suppress)参数控制ring抑制释放时机
- 新增GD32 APP初始化状态可视化功能(配套GD32 1.5.34+):
  * 通过SPI 0xA3查询模块位图/关键失败位图/复位源
  * /system/status接口新增gd32_init字段提供状态详情
 * 支持故障码数组显示,前端可直接显示中文失败原因
- 添加GD32模块级故障码支持(配套GD32 1.5.36):
  * 解析INIT_STATUS响应中的fault_codes数组
  * 每模块1B故障码,支持CANFD通道号显示
- 电机状态协议升级:STATUS DLC从32字节扩展到48字节,
  二进制协议版本升级到v2,entry大小从76字节变为92字节
- 修复SPI响应类型表,将0xA3加入短响应和APP ISR快速响应类型
This commit is contained in:
小龙虾
2026-09-09 03:23:06 +08:00
parent ebb3dcdf38
commit 5315f91475
9 changed files with 252 additions and 85 deletions
+4 -3
View File
@@ -65,9 +65,10 @@ bool onMotorStateEvent(const uint8_t *payload, size_t len)
slot.rx_count = rdU32Le(&e[4]);
slot.seq = rdU32Le(&e[8]);
memcpy(slot.data, &e[12], MOTOR_STATUS_DLC);
slot.config_rx_count = rdU32Le(&e[44]);
slot.config_seq = rdU32Le(&e[48]);
memcpy(slot.config_data, &e[52], MOTOR_CONFIG_DLC);
/* v0.74: STATUS DLC 48,CONFIG 字段整体后移 16B */
slot.config_rx_count = rdU32Le(&e[60]);
slot.config_seq = rdU32Le(&e[64]);
memcpy(slot.config_data, &e[68], MOTOR_CONFIG_DLC);
offset += MOTOR_ENTRY_SIZE;
}
+11 -8
View File
@@ -6,12 +6,15 @@
*
* payload 格式(每页):
* [0] page, [1] total_pages, [2] entry_count, [3] active_count
* [4..] 每个 entry 76B:
* [4..] 每个 entry 92B (v0.74: STATUS DLC 48):
* [0] node_id, [1] channel, [2] online, [3] dlc,
* [4..7] rx_count (LE), [8..11] seq (LE),
* [12..43] data[32] (原始 STATUS payload)
* [44..47] config_rx_count (LE), [48..51] config_seq (LE),
* [52..75] config_data[24] (原始 CONFIG payload, 目标值回报)
* [12..59] data[48] (原始 STATUS payload, 字节 32~35 = InitStatus)
* [60..63] config_rx_count (LE), [64..67] config_seq (LE),
* [68..91] config_data[24] (原始 CONFIG payload, 目标值回报)
*
* 注意:STATUS DLC 48 与页大小/页数变更(76→92、9→14 页)需 DCU GD32 与
* ESP32 固件成对升级,旧解析方会因长度校验失败拒收(不误解析)。
*
* 同一节点号可能同时挂在多个 CAN 通道(两台电机同号异线),
* 缓存表与 GD32 端一致按 node×channel 双键存储(27 槽)。
@@ -30,18 +33,18 @@ extern "C" {
#define MOTOR_MAX_NODES 9
#define MOTOR_CHANNELS 3
#define MOTOR_MAX_SLOTS (MOTOR_MAX_NODES * MOTOR_CHANNELS)
#define MOTOR_STATUS_DLC 32
#define MOTOR_STATUS_DLC 48
#define MOTOR_CONFIG_DLC 24
#define MOTOR_ENTRY_SIZE 76
#define MOTOR_ENTRY_SIZE 92
#define MOTOR_PAGE_HEADER 4
#define MOTOR_TOTAL_PAGES 9
#define MOTOR_TOTAL_PAGES 14
/** @brief 单电机状态快照。 */
typedef struct {
uint8_t node_id; ///< 1-9, 0=空槽
uint8_t channel; ///< CAN 通道 (0/1/2)
uint8_t online; ///< 1=在线, 0=离线
uint8_t dlc; ///< STATUS 帧 DLC (正常=32)
uint8_t dlc; ///< STATUS 帧 DLC (正常=48)
uint32_t rx_count; ///< 累计收到帧数
uint32_t seq; ///< GD32 侧更新序号
uint8_t data[MOTOR_STATUS_DLC]; ///< 原始 STATUS payload