/* ============================================================================= * 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); } }