#ifndef REFEREE_H #define REFEREE_H #include #include /* 裁判系统协议解析(0x0201 机器人状态 / 0x0202 实时功率 / 0x0304 自定义控制器) * CRC 校验与字段偏移和 legacy RefereeSystem 模块保持一致 */ typedef struct { uint8_t robot_id; // 机器人 ID(无裁判系统时为 0,4 号步兵为 4/104) uint8_t shooter_power_on; // 发射机构上电状态(0x0201) uint16_t chassis_power_limit; // 底盘功率上限(W) float chassis_power; // 底盘实时功率(W) float buffer_energy; // 底盘缓冲能量(J) uint8_t link_status; // 收到过有效帧置 1,掉线检测配合 last_update_tick uint32_t last_update_tick; } referee_data_t; extern referee_data_t referee; /* 流式解析一个字节(中断上下文调用;把串口收到的每个字节依次喂进来) */ extern void referee_parse_byte(uint8_t byte); /* 批量喂入(usart 整帧回调里循环调用 referee_parse_byte 即可,此函数为便捷封装) */ extern void referee_parse_bytes(const uint8_t * data, uint16_t len); /* 0x0304(自定义控制器)数据回调,在中断上下文执行 */ typedef void (*referee_keyboard_hook_f)(const uint8_t data[12]); extern void referee_set_keyboard_hook(referee_keyboard_hook_f hook); /* ---- 发送(机器人 -> 裁判系统/选手端) ------------------------------------- * 用于自定义UI(0x0301 机器人交互数据)。data_length 取 payload 字节数(不含 cmd_id, * 与解析器一致);CRC8 覆盖前 4 字节,CRC16 覆盖除末 2 字节外全部(低字节先)。 * 内部静态缓冲 + USART6 TX DMA,立即返回,勿高频调用(链路 115200)。 */ extern void referee_send_frame(uint16_t cmd_id, const uint8_t * data, uint16_t len); #endif