键鼠控制(此前 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 一处校正。
86 lines
3.7 KiB
C
86 lines
3.7 KiB
C
/* =============================================================================
|
|
* dr16.c - DT7 遥控器 + 图传键鼠数据解析
|
|
* 输入: usart3 整帧回调(18 字节,100000-8E1,每 14ms 一帧) --> dr16_parse()
|
|
* 输出: dr16 结构体(摇杆 364~1684 中值 1024 / 拨杆 1上2下3中 / 键鼠 /
|
|
* 按键翻转边沿 key_push_*)/ dr16_status / dr16_start_flag
|
|
* 边沿语义(与 legacy 一致): Q/E/Shift/Ctrl 按下瞬间翻转保持;鼠标右键按下瞬间置1
|
|
* dr16_start_flag: 1-未连接 2-收到首帧(robot_cmd 借此触发云台角度复位)
|
|
* 掉线: dr16_offline() = 超过 DR16_OFFLINE_TIME_MS(25ms) 无帧
|
|
* ========================================================================== */
|
|
#include "dr16.h"
|
|
|
|
dr16_t dr16;
|
|
uint8_t dr16_status = 0;
|
|
uint8_t dr16_start_flag = 1;
|
|
uint32_t dr16_last_tick = 0;
|
|
uint32_t dr16_frame_count = 0;
|
|
|
|
void dr16_parse(const uint8_t * data)
|
|
{
|
|
uint8_t last_key_q = dr16.key_q;
|
|
uint8_t last_key_e = dr16.key_e;
|
|
uint8_t last_key_shift = dr16.key_shift;
|
|
uint8_t last_key_ctrl = dr16.key_ctrl;
|
|
uint8_t last_mouse_r = dr16.mouse_key_r;
|
|
|
|
dr16.rc_r_RL = (((uint16_t)data[1] << 8) | data[0]) & 0x07FF; // B[0:10]
|
|
dr16.rc_r_UD = (((uint16_t)data[2] << 5) | (data[1] >> 3)) & 0x07FF; // B[11:21]
|
|
dr16.rc_l_RL = (((uint16_t)data[4] << 10) | (((uint16_t)data[3] << 2) | (data[2] >> 6))) & 0x07FF; // B[22:32]
|
|
dr16.rc_l_UD = (((uint16_t)data[5] << 7) | (data[4] >> 1)) & 0x07FF; // B[33:43]
|
|
|
|
dr16.s2 = (data[5] >> 4) & 0x03; // B[44:45]
|
|
dr16.s1 = (data[5] >> 6) & 0x03; // B[46:47]
|
|
|
|
dr16.mouse_rl = (int16_t)(((uint16_t)data[7] << 8) | data[6]); // B[48:63]
|
|
dr16.mouse_du = (int16_t)(((uint16_t)data[9] << 8) | data[8]); // B[64:79]
|
|
dr16.mouse_wheel = (int16_t)(((uint16_t)data[11] << 8) | data[10]); // B[80:95]
|
|
dr16.mouse_key_l = data[12];
|
|
dr16.mouse_key_r = data[13];
|
|
|
|
dr16.key_w = data[14] & 0x01;
|
|
dr16.key_s = (data[14] >> 1) & 0x01;
|
|
dr16.key_a = (data[14] >> 2) & 0x01;
|
|
dr16.key_d = (data[14] >> 3) & 0x01;
|
|
dr16.key_shift = (data[14] >> 4) & 0x01;
|
|
dr16.key_ctrl = (data[14] >> 5) & 0x01;
|
|
dr16.key_q = (data[14] >> 6) & 0x01;
|
|
dr16.key_e = (data[14] >> 7) & 0x01;
|
|
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) */
|
|
if (last_key_q == 0 && dr16.key_q == 1)
|
|
dr16.key_push_q = !dr16.key_push_q;
|
|
if (last_key_e == 0 && dr16.key_e == 1)
|
|
dr16.key_push_e = !dr16.key_push_e;
|
|
if (last_key_shift == 0 && dr16.key_shift == 1)
|
|
dr16.key_push_shift = !dr16.key_push_shift;
|
|
if (last_key_ctrl == 0 && dr16.key_ctrl == 1)
|
|
dr16.key_push_ctrl = !dr16.key_push_ctrl;
|
|
if (last_mouse_r == 0 && dr16.mouse_key_r == 1)
|
|
dr16.mouse_key_push_r = 1;
|
|
else
|
|
dr16.mouse_key_push_r = 0;
|
|
|
|
dr16_last_tick = HAL_GetTick();
|
|
dr16_status = 1;
|
|
dr16_frame_count++;
|
|
|
|
/* 首次收到数据:置启动标志,触发云台角度复位(与 legacy Remote_StartFlag 语义一致) */
|
|
if (dr16_start_flag == 1)
|
|
dr16_start_flag = 2;
|
|
}
|
|
|
|
uint8_t dr16_offline(void)
|
|
{
|
|
return (dr16_status == 0 || HAL_GetTick() - dr16_last_tick > DR16_OFFLINE_TIME_MS);
|
|
}
|