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:
@@ -136,6 +136,26 @@ void c_comm_master_send(uint8_t keyboard_online, const uint8_t kb[12], uint8_t m
|
||||
c_comm_send_frame(&hcan2, CTOC_SLAVE_ID2, data);
|
||||
}
|
||||
|
||||
/* 0x1B9 云台->底盘:自定义UI 专用量(底盘本地没有,见 referee_ui)
|
||||
* [0..1] pitch(0.01°) [2..3] 左摩擦轮(rpm/100) [4..5] 右摩擦轮(rpm/100)
|
||||
* [6] bit0=小陀螺使能 */
|
||||
void c_comm_master_send_ui(float pitch_deg, float fric_l_rpm, float fric_r_rpm, uint8_t spin_on)
|
||||
{
|
||||
uint8_t data[8] = {0};
|
||||
int16_t p = (int16_t)(pitch_deg * 100.0f);
|
||||
int16_t fl = (int16_t)(fric_l_rpm / 100.0f);
|
||||
int16_t fr = (int16_t)(fric_r_rpm / 100.0f);
|
||||
|
||||
data[0] = (uint8_t)(p & 0xFF);
|
||||
data[1] = (uint8_t)((uint16_t)p >> 8);
|
||||
data[2] = (uint8_t)(fl & 0xFF);
|
||||
data[3] = (uint8_t)((uint16_t)fl >> 8);
|
||||
data[4] = (uint8_t)(fr & 0xFF);
|
||||
data[5] = (uint8_t)((uint16_t)fr >> 8);
|
||||
data[6] = spin_on ? 0x01 : 0;
|
||||
c_comm_send_frame(&hcan2, CTOC_SLAVE_ID4, data);
|
||||
}
|
||||
|
||||
#elif defined(ROBOT_TYPE_CHASSIS)
|
||||
|
||||
/* ============================ 底盘板(从机) ============================ */
|
||||
|
||||
@@ -63,6 +63,11 @@ extern volatile int8_t ctoc_encoder_ccw;
|
||||
/* 底盘板:0x1A9 帧是否新鲜(掉线检测) */
|
||||
extern uint8_t ctoc_att_fresh(void);
|
||||
|
||||
/* ---- 0x1B9 云台->底盘:自定义UI 专用数据 ---------------------------------
|
||||
* 底盘本地没有、但裁判系统自定义UI 需要的量(见 底盘/modules/comms/referee_ui):
|
||||
* pitch 角度与左右摩擦轮转速。接收侧解析见底盘 c_comm.c(c_comm_rx_0x1b9)。 */
|
||||
extern void c_comm_master_send_ui(float pitch_deg, float fric_l_rpm, float fric_r_rpm, uint8_t spin_on);
|
||||
|
||||
/* 注册 CAN 接收回调(can_start() 之后调用) */
|
||||
extern void c_comm_init(void);
|
||||
|
||||
|
||||
@@ -48,6 +48,12 @@ void dr16_parse(const uint8_t * data)
|
||||
dr16.key_alpha1 = (data[14] >> 9) & 0x01;
|
||||
dr16.key_alpha2 = (data[14] >> 10) & 0x01;
|
||||
|
||||
/* 原始按键字节。注意 data[14] 是 uint8_t:上面两条 >>9/>>10 恒为 0
|
||||
* (整型提升后 byte 值 <256,右移 9 位必然为 0),即 alpha 键从未被真正解析。
|
||||
* 官方 16 位 key_code 的高字节在 data[15],这里先原样存下来供诊断/后续解析。 */
|
||||
dr16.key_code_lo = data[14];
|
||||
dr16.key_code_hi = data[15];
|
||||
|
||||
dr16.thumb_wheel = (int16_t)(((uint16_t)data[17] << 8) | data[16]); // B[120:135]
|
||||
|
||||
/* 按键边沿检测(legacy 语义:Q/E/Shift/Ctrl 按下翻转,鼠标右键按下瞬间置 1) */
|
||||
|
||||
@@ -37,6 +37,13 @@ typedef struct
|
||||
uint8_t key_alpha1; // 图传扩展键
|
||||
uint8_t key_alpha2;
|
||||
|
||||
/* 原始按键字节(诊断用,不做位拆分) —— 用来判断"帧里到底有没有键鼠数据":
|
||||
* 官方 dbus.h 的 key_code 是 16 位:bit0..7 = W/S/A/D/Shift/Ctrl/Q/E(=data[14]),
|
||||
* bit8..15 = R/F/G/Z/X/C/V/B(=data[15])。本工程此前只读了 data[14]。
|
||||
* 拨键盘时这两个字节若非 0 说明数据确实到了;全 0 说明帧里就是空的。 */
|
||||
uint8_t key_code_lo; // data[14]
|
||||
uint8_t key_code_hi; // data[15]
|
||||
|
||||
int16_t thumb_wheel; // 遥控器拨轮
|
||||
|
||||
/* 按键边沿检测(legacy 语义) */
|
||||
|
||||
Reference in New Issue
Block a user