Files
Simba-OmniInfantry/底盘/Application/Task/Src/referee_task.c
T
lyf 267a659242 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 一处校正。
2026-10-16 04:24:32 +08:00

70 lines
2.6 KiB
C

/* =============================================================================
* referee_task.c - 裁判系统链路监测
* 解析在 USART6 空闲中断完成(referee_parse_bytes 流式喂入),
* 本任务仅做 100ms 周期的链路超时监测与心跳上报
* ========================================================================== */
#include "app_tasks.h"
#include "cmsis_os.h"
#include "bsp_usart.h"
#include "referee.h"
#include "referee_ui.h"
#include "c_comm.h"
#include "attitude.h"
#include "robot_param.h"
/* referee_task:裁判系统链路监测
* 解析在接收中断完成(referee_parse_bytes),本任务仅做超时监测与心跳 */
void referee_frame_callback(const uint8_t * frame, uint16_t len)
{
referee_parse_bytes(frame, len);
}
void referee_task(void const * argument)
{
while (!app_ready)
osDelay(2);
for (;;)
{
/* 链路超时置断线 */
if (referee.link_status &&
HAL_GetTick() - referee.last_update_tick > DEVICE_OFFLINE_TIME_MS * 10)
referee.link_status = 0;
/* ---- 自定义UI:机器人 -> 裁判系统 -> 选手端 ------------------------
* 本任务 100ms 一轮,内部按 UI_SEND_HZ 分频(5Hz:约 40 图形/帧,
* 115200 链路上约 3.8KB/s)。数据来源:
* 底盘本地 = att_deg_yaw(朝向) + referee(功率/电容)
* 云台 CToC = pitch + 摩擦轮 L/R 转速(0x1B9) + 云台 yaw(0x1A9) + 陀螺位(0x189)
* ------------------------------------------------------------------ */
{
static uint8_t ui_div = 0;
if (++ui_div >= (uint8_t)(10 / UI_SEND_HZ))
{
ui_div = 0;
ui_data_t ui;
ui.pitch_deg = ctoc_ui_pitch_deg;
ui.yaw_deg = ctoc_gimbal_yaw;
ui.hdg_deg = att_deg_yaw;
ui.pwr_w = referee.chassis_power;
ui.pwr_limit_w = (float)referee.chassis_power_limit;
ui.buf_j = referee.buffer_energy;
ui.cap_pct = (uint8_t)(referee.buffer_energy >= 60.0f
? 100
: (referee.buffer_energy * 100.0f / 60.0f));
ui.fric_l_rpm = ctoc_ui_fric_l_rpm;
ui.fric_r_rpm = ctoc_ui_fric_r_rpm;
ui.spin_on = ctoc_remote.spin_flag;
ui.ref_online = referee.link_status;
referee_ui_update(&ui);
}
}
monitor_heartbeat(HB_REFEREE);
osDelay(100);
}
}