feat(motor_state): 支持多通道电机状态管理并添加推送周期动态调节功能

- 实现 node×channel 双键槽位管理,支持同一节点号在不同CAN通道独立缓存
- 扩展电机状态表容量从9个槽位到27个槽位(9节点×3通道)
- 添加SPI命令子命令0xFE用于动态设置0xC5推送周期(50-5000ms)
- 增加运行时可调推送周期功能,默认250ms,支持50ms-5s范围调节
- 更新CAN通道配置,启用CH1和CH2通道支持
- 版本号更新至1.5.4
This commit is contained in:
cbb
2026-07-30 02:11:49 +08:00
parent 46ef19d882
commit e06f5eb9a9
8 changed files with 107 additions and 34 deletions
@@ -9,8 +9,8 @@
* - 总开关:sys/config.h 中 CONFIG_MOTOR_STATE_ENABLE
*
* payload 格式 (每页):
* [0] page 页号 (0/1)
* [1] total_pages 总页数 (2)
* [0] page 页号 (0..kMotorTotalPages-1)
* [1] total_pages 总页数 (6,27 槽 = 9 node × 3 ch)
* [2] entry_count 本页有效电机数
* [3] active_count 全局在线电机数
* [4..] 每个 entry 44B:
@@ -47,6 +47,18 @@ public:
void handle(AppSpiCommand &bus, const SpiCommandContext &ctx) override
{
/* 子命令:payload[0]=0xFE 且 len>=3 → 设置 0xC5 推送周期(payload[1..2]=毫秒 LE)。
* 有效页号仅 0..kMotorTotalPages-1,0xFE 作子操作码不冲突。回 ACK 携实际应用毫秒 LE。 */
if (ctx.payload_len >= 3U && ctx.payload[0] == kMotorSubCmdSetPeriod) {
const uint16_t ms = static_cast<uint16_t>(ctx.payload[1] | (ctx.payload[2] << 8));
const uint16_t applied = MotorState::setPushPeriodMs(ms);
uint8_t ack[2] = { static_cast<uint8_t>(applied & 0xFFU),
static_cast<uint8_t>((applied >> 8) & 0xFFU) };
bus.buildResponse(ctx.tx_buf, ctx.tx_buf_size, ctx.tx_len,
SpiDefs::kRspAck, ack, sizeof(ack));
return;
}
/* 请求 payload[0] = page (可选, 默认 0) */
const uint8_t page = (ctx.payload_len >= 1U) ? ctx.payload[0] : 0U;