feat(ui): 新增裁判系统自定义UI(0x0301)并打通键鼠→底盘链路
键鼠控制(此前 WASD 无反应): - 云台 robot_cmd_task:0x0304 与 USART3 帧内键鼠合并为共享视图 keyboard_merged(0x0304 优先); 键鼠模式由帧内键鼠动作进入,动云台左摇杆退出 - c_comm_task/c_comm:键鼠在控时底盘摇杆由 WASD+鼠标合成,改读共享视图(此前只认 0x0304) - dr16/调试输出:新增帧内键鼠原始字节诊断(key_lo/key_hi/mouse_*/s1/frames) 自定义UI(底盘板经裁判系统 USART6 绘制到选手端): - 新增 底盘/modules/comms/referee_ui.c|h:15 字节图形组包(带编译期断言), v5 卡片式 HUD = 俯仰梯(pitch) + 罗盘刻度带(底盘朝向) + 预估底盘功率 + 超级电容 + 摩擦轮 L/R 转速 + 小陀螺状态,yaw 在刻度带右侧;5Hz 刷新,约 50 图元/8 包 - referee.c 新增 referee_send_frame()(cmd 0x0301 机器人交互数据,CRC8+CRC16,USART6 TX DMA) - 新增 CToC 0x1B9:云台把 pitch 与摩擦轮转速带给底盘(底盘本地没有这两个量) - 版式避开官方保留区:顶部比分条/左下小地图/右下战车模块/中部两块官方保留 验证:云台 Code=99540 RO=1764 RW=420 ZI=62572;底盘 Code=99452 RO=1928 RW=416 ZI=62584;均 0 错误 0 警告。 未做实机验证(当前无板/无图传);UI 协议常量(UI_RECEIVER_ID/UI_SEND_HZ)与版式坐标集中在 referee_ui.h 宏区,便于按协议 PDF 一处校正。
This commit is contained in:
@@ -216,3 +216,48 @@ void referee_parse_bytes(const uint8_t * data, uint16_t len)
|
||||
while (len--)
|
||||
referee_parse_byte(*data++);
|
||||
}
|
||||
|
||||
/* ============================================================================
|
||||
* 发送:裁判系统帧(机器人 -> 裁判系统 -> 选手端)
|
||||
* 帧: A5 | data_length(2,LE,=payload 字节数,不含 cmd_id) | seq | CRC8
|
||||
* | cmd_id(2,LE) | data | CRC16(2,LE,低字节先)
|
||||
* CRC8 覆盖前 4 字节;CRC16 覆盖除末 2 字节外全部。
|
||||
* 自定义UI 走 cmd 0x0301(payload 首 6 字节为 data_cmd_id/sender_ID/receiver_ID)。
|
||||
* USART6 TX DMA:静态缓冲,发送期间不得被覆盖;UI 刷新率 5Hz 远低于链路能力。
|
||||
* ==========================================================================*/
|
||||
#include "bsp_usart.h"
|
||||
|
||||
static uint8_t ref_tx_seq = 0;
|
||||
|
||||
void referee_send_frame(uint16_t cmd_id, const uint8_t * data, uint16_t len)
|
||||
{
|
||||
static uint8_t frame[REF_FRAME_MAX_LEN];
|
||||
uint16_t i = 0;
|
||||
|
||||
if (len > (uint16_t)(REF_FRAME_MAX_LEN - 9) || data == NULL)
|
||||
return;
|
||||
|
||||
frame[i++] = 0xA5;
|
||||
frame[i++] = (uint8_t)(len & 0xFF);
|
||||
frame[i++] = (uint8_t)(len >> 8);
|
||||
frame[i++] = ref_tx_seq++;
|
||||
|
||||
uint8_t crc8 = 0xFF;
|
||||
for (uint16_t k = 0; k < 4; k++)
|
||||
crc8 = crc8_update(crc8, frame[k]);
|
||||
frame[i++] = crc8;
|
||||
|
||||
frame[i++] = (uint8_t)(cmd_id & 0xFF);
|
||||
frame[i++] = (uint8_t)(cmd_id >> 8);
|
||||
|
||||
for (uint16_t k = 0; k < len; k++)
|
||||
frame[i++] = data[k];
|
||||
|
||||
uint16_t crc16 = 0xFFFF;
|
||||
for (uint16_t k = 0; k < i; k++)
|
||||
crc16 = crc16_update(crc16, frame[k]);
|
||||
frame[i++] = (uint8_t)(crc16 & 0xFF);
|
||||
frame[i++] = (uint8_t)(crc16 >> 8);
|
||||
|
||||
usart6_tx_dma_enable(frame, i);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user