键鼠控制(此前 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 一处校正。
85 lines
3.7 KiB
C
85 lines
3.7 KiB
C
/* =============================================================================
|
|
* c_comm_task.c - 板间通讯周期发送(2ms)
|
|
* 云台板: c_comm_master_send() 转发摇杆/控制状态(键鼠在线时用合成量)
|
|
* 底盘板: c_comm_slave_send() 回传发射机构上电状态
|
|
* 接收方向在中断内由 c_comm 模块的回调完成,本任务只负责发送节拍
|
|
* ========================================================================== */
|
|
#include "app_tasks.h"
|
|
#include "cmsis_os.h"
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include "c_comm.h"
|
|
#include "robot_typedef.h"
|
|
#include "robot_param.h"
|
|
#if defined(ROBOT_TYPE_GIMBAL)
|
|
#include "robot_cmd_task.h"
|
|
#include "gimbal.h"
|
|
#include "attitude.h"
|
|
#elif defined(ROBOT_TYPE_CHASSIS)
|
|
#include "chassis.h"
|
|
#endif
|
|
|
|
/* c_comm_task(2ms):板间通讯周期发送
|
|
* 云台板:向底盘转发摇杆与控制状态(键鼠在线时用合成量替代摇杆)
|
|
* 底盘板:向云台回传发射机构上电状态 */
|
|
|
|
void c_comm_task(void const * argument)
|
|
{
|
|
TickType_t last_wake = xTaskGetTickCount();
|
|
|
|
while (!app_ready)
|
|
osDelay(2);
|
|
|
|
for (;;)
|
|
{
|
|
#if defined(ROBOT_TYPE_GIMBAL)
|
|
/* 键鼠来源已由 robot_cmd_task 合并(0x0304 优先,否则 USART3 帧内键鼠)。
|
|
* 直接用共享视图,保证"云台怎么控、底盘就怎么收"——否则 WASD 合成的
|
|
* 底盘摇杆会因为这里只认 0x0304 而被整段跳过(客户端键鼠走帧内时平移失效)。 */
|
|
uint8_t kb_online = keyboard_merged_online;
|
|
uint8_t kb[12];
|
|
kb[0] = (uint8_t)(keyboard_merged.mouse_rl & 0xFF);
|
|
kb[1] = (uint8_t)((uint16_t)keyboard_merged.mouse_rl >> 8);
|
|
kb[2] = (uint8_t)(keyboard_merged.mouse_du & 0xFF);
|
|
kb[3] = (uint8_t)((uint16_t)keyboard_merged.mouse_du >> 8);
|
|
kb[4] = (uint8_t)(keyboard_merged.mouse_wheel & 0xFF);
|
|
kb[5] = (uint8_t)((uint16_t)keyboard_merged.mouse_wheel >> 8);
|
|
kb[6] = keyboard_merged.mouse_key_l;
|
|
kb[7] = keyboard_merged.mouse_key_r;
|
|
kb[8] = (uint8_t)(keyboard_merged.key_w | (keyboard_merged.key_s << 1) |
|
|
(keyboard_merged.key_a << 2) | (keyboard_merged.key_d << 3) |
|
|
(keyboard_merged.key_shift << 4) | (keyboard_merged.key_ctrl << 5) |
|
|
(keyboard_merged.key_q << 6) | (keyboard_merged.key_e << 7));
|
|
kb[9] = (uint8_t)(keyboard_merged.key_alpha1 | (keyboard_merged.key_alpha2 << 1));
|
|
kb[10] = 0;
|
|
kb[11] = 0;
|
|
|
|
c_comm_master_send(kb_online, kb, gimbal_motor_offline(),
|
|
cmd_robot.spin_flag); // 故障位+小陀螺使能位
|
|
|
|
/* 0x1B9 自定义UI 专用量:底盘本地没有 pitch 与摩擦轮转速,
|
|
* 由云台随板间通讯带给它(见 底盘/modules/comms/referee_ui.c)。
|
|
* pitch 取云台 pitch 环反馈 -att_deg_roll;摩擦轮转速取电机反馈 rpm。 */
|
|
c_comm_master_send_ui(-att_deg_roll,
|
|
(float)motor_friction_l.fdb.rotor_speed,
|
|
(float)motor_friction_r.fdb.rotor_speed,
|
|
cmd_robot.spin_flag);
|
|
|
|
/* 0x1A9 姿态帧:跟随符号自动综合的数据源
|
|
* flags:bit0=att_ready bit1=tick增向CCW bit2=bit1有效 */
|
|
{
|
|
const int8_t enc = gimbal_encoder_ccw();
|
|
uint8_t flags = att_ready;
|
|
if (enc > 0) flags |= 0x02;
|
|
if (enc != 0) flags |= 0x04;
|
|
c_comm_master_send_attitude(att_deg_yaw, flags);
|
|
}
|
|
#elif defined(ROBOT_TYPE_CHASSIS)
|
|
c_comm_slave_send(chassis_motor_offline()); // 携带底盘电机故障位
|
|
#endif
|
|
|
|
monitor_heartbeat(HB_CCOMM);
|
|
vTaskDelayUntil(&last_wake, pdMS_TO_TICKS(2));
|
|
}
|
|
}
|