From 162044889fe9f821ed83df5e30bb414578b1cff8 Mon Sep 17 00:00:00 2001 From: kidneygood <2979564623@qq.com> Date: Fri, 6 Jan 2023 22:54:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=8D=8F=E8=AE=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/referee/referee.c | 8 +- modules/referee/referee.h | 175 +----------------------- modules/referee/referee_UI.c | 95 +++++++++++++ modules/referee/referee_UI.h | 0 modules/referee/referee_communication.h | 92 +++++++++++++ modules/referee/referee_def.h | 83 +++++++++++ 6 files changed, 276 insertions(+), 177 deletions(-) create mode 100644 modules/referee/referee_UI.h create mode 100644 modules/referee/referee_communication.h create mode 100644 modules/referee/referee_def.h diff --git a/modules/referee/referee.c b/modules/referee/referee.c index f59c2bb..8cb685e 100644 --- a/modules/referee/referee.c +++ b/modules/referee/referee.c @@ -11,8 +11,8 @@ static USARTInstance *referee_usart_instance; /**************裁判系统数据******************/ static referee_info_t referee_info; -static uint8_t Judge_Self_ID; // 当前机器人的ID -static uint16_t Judge_SelfClient_ID; // 发送者机器人对应的客户端ID +// static uint8_t Judge_Self_ID; // 当前机器人的ID +// static uint16_t Judge_SelfClient_ID; // 发送者机器人对应的客户端ID /** * @brief 读取裁判数据,中断中读取保证速度 @@ -23,9 +23,7 @@ static uint16_t Judge_SelfClient_ID; // 发送者机器人对应的客户端ID static void JudgeReadData(uint8_t *ReadFromUsart) { uint16_t judge_length; // 统计一帧数据长度 - // referee_info.CmdID = 0; //数据命令码解析 - // 空数据包,则不作任何处理 - if (ReadFromUsart == NULL) + if (ReadFromUsart == NULL) // 空数据包,则不作任何处理 return; // 写入帧头数据(5-byte),用于判断是否开始存储裁判数据 diff --git a/modules/referee/referee.h b/modules/referee/referee.h index b2238c9..810db85 100644 --- a/modules/referee/referee.h +++ b/modules/referee/referee.h @@ -14,6 +14,7 @@ #include "bsp_usart.h" #include "usart.h" +#include "referee_def.h" #define FALSE 0 #define TRUE 1 @@ -30,72 +31,6 @@ #pragma pack(1) -/***************裁判系统数据接收********************/ - -typedef enum -{ - FRAME_HEADER = 0, - CMD_ID = 5, - DATA = 7, -} JudgeFrameOffset; - -// 5字节帧头,偏移位置 -typedef enum -{ - SOF = 0, // 起始位 - DATA_LENGTH = 1, // 帧内数据长度,根据这个来获取数据长度 - SEQ = 3, // 包序号 - CRC8 = 4 // CRC8 - -} FrameHeaderOffset; - -// 命令码ID,用来判断接收的是什么数据 -typedef enum -{ - ID_game_state = 0x0001, // 比赛状态数据 - ID_game_result = 0x0002, // 比赛结果数据 - ID_game_robot_survivors = 0x0003, // 比赛机器人血量数据 - ID_event_data = 0x0101, // 场地事件数据 - ID_supply_projectile_action = 0x0102, // 场地补给站动作标识数据 - ID_supply_projectile_booking = 0x0103, // 场地补给站预约子弹数据 - ID_game_robot_state = 0x0201, // 机器人状态数据 - ID_power_heat_data = 0x0202, // 实时功率热量数据 - ID_game_robot_pos = 0x0203, // 机器人位置数据 - ID_buff_musk = 0x0204, // 机器人增益数据 - ID_aerial_robot_energy = 0x0205, // 空中机器人能量状态数据 - ID_robot_hurt = 0x0206, // 伤害状态数据 - ID_shoot_data = 0x0207, // 实时射击数据 - -} CmdID; - -// 命令码数据段长,根据官方协议来定义长度 -typedef enum -{ - LEN_game_state = 3, // 0x0001 - LEN_game_result = 1, // 0x0002 - LEN_game_robot_HP = 2, // 0x0003 - LEN_event_data = 4, // 0x0101 - LEN_supply_projectile_action = 4, // 0x0102 - // LEN_game_robot_state = 15, // 0x0201 - LEN_game_robot_state = 27, // 0x0201 - LEN_power_heat_data = 14, // 0x0202 - LEN_game_robot_pos = 16, // 0x0203 - LEN_buff_musk = 1, // 0x0204 - LEN_aerial_robot_energy = 1, // 0x0205 - LEN_robot_hurt = 1, // 0x0206 - LEN_shoot_data = 7, // 0x0207 -} JudgeDataLength; - -/* 自定义帧头 */ -typedef struct -{ - uint8_t SOF; - uint16_t DataLength; - uint8_t Seq; - uint8_t CRC8; - -} xFrameHeader; - /* ID: 0x0001 Byte: 3 比赛状态数据 */ typedef struct { @@ -216,108 +151,6 @@ typedef struct float bullet_speed; } ext_shoot_data_t; -/***************裁判系统数据********************/ -/* - - 交互数据,包括一个统一的数据段头结构, - 包含了内容 ID,发送者以及接受者的 ID 和内容数据段, - 整个交互数据的包总共长最大为 128 个字节, - 减去 frame_header,cmd_id,frame_tail 以及数据段头结构的 6 个字节, - 故而发送的内容数据段最大为 113。 - 整个交互数据 0x0301 的包上行频率为 10Hz。 - - 机器人 ID: - 1,英雄(红); - 2,工程(红); - 3/4/5,步兵(红); - 6,空中(红); - 7,哨兵(红); - 11,英雄(蓝); - 12,工程(蓝); - 13/14/15,步兵(蓝); - 16,空中(蓝); - 17,哨兵(蓝)。 - 客户端 ID: - 0x0101 为英雄操作手客户端( 红) ; - 0x0102 ,工程操作手客户端 ((红 ); - 0x0103/0x0104/0x0105,步兵操作手客户端(红); - 0x0106,空中操作手客户端((红); - 0x0111,英雄操作手客户端(蓝); - 0x0112,工程操作手客户端(蓝); - 0x0113/0x0114/0x0115,操作手客户端步兵(蓝); - 0x0116,空中操作手客户端(蓝)。 -*/ -/* 交互数据接收信息:0x0301 */ -typedef struct -{ - uint16_t data_cmd_id; - uint16_t send_ID; - uint16_t receiver_ID; -} ext_student_interactive_header_data_t; - -/* - 客户端 客户端自定义数据:cmd_id:0x0301。内容 ID:0xD180 - 发送频率:上限 10Hz - 1. 客户端 客户端自定义数据:cmd_id:0x0301。内容 ID:0xD180。发送频率:上限 10Hz - 字节偏移量 大小 说明 备注 - 0 2 数据的内容 ID 0xD180 - 2 2 送者的 ID 需要校验发送者机器人的 ID 正确性 - 4 2 客户端的 ID 只能为发送者机器人对应的客户端 - 6 4 自定义浮点数据 1 - 10 4 自定义浮点数据 2 - 14 4 自定义浮点数据 3 - 18 1 自定义 8 位数据 4 - -*/ -typedef struct -{ - float data1; - float data2; - float data3; - uint8_t masks; -} client_custom_data_t; - -/* - 学生机器人间通信 cmd_id 0x0301,内容 ID:0x0200~0x02FF - 交互数据 机器人间通信:0x0301。 - 发送频率:上限 10Hz - - 字节偏移量 大小 说明 备注 - 0 2 数据的内容 ID 0x0200~0x02FF - 可以在以上 ID 段选取,具体 ID 含义由参赛队自定义 - - 2 2 发送者的 ID 需要校验发送者的 ID 正确性, - 4 2 接收者的 ID 需要校验接收者的 ID 正确性, - 例如不能发送到敌对机器人的ID - 6 n 数据段 n 需要小于 113 - -*/ -typedef struct -{ - uint8_t data[10]; // 数据段,n需要小于113 -} robot_interactive_data_t; - -// 发送给客户端的信息 -// 帧头 命令码 数据段头结构 数据段 帧尾 -typedef struct -{ - xFrameHeader txFrameHeader; // 帧头 - uint16_t CmdID; // 命令码 - ext_student_interactive_header_data_t dataFrameHeader; // 数据段头结构 - client_custom_data_t clientData; // 数据段 - uint16_t FrameTail; // 帧尾 -} ext_SendClientData_t; - -// 机器人交互信息 -typedef struct -{ - xFrameHeader txFrameHeader; // 帧头 - uint16_t CmdID; // 命令码 - ext_student_interactive_header_data_t dataFrameHeader; // 数据段头结构 - robot_interactive_data_t interactData; // 数据段 - uint16_t FrameTail; // 帧尾 -} ext_CommunatianData_t; - // 裁判系统接收数据整合进一个结构体 typedef struct { @@ -336,8 +169,8 @@ typedef struct ext_robot_hurt_t RobotHurt; // 0x0206 ext_shoot_data_t ShootData; // 0x0207 - ext_SendClientData_t ShowData; // 客户端信息 - ext_CommunatianData_t CommuData; // 队友通信信息 + // ext_SendClientData_t ShowData; // 客户端信息 + // ext_CommunatianData_t CommuData; // 队友通信信息 } referee_info_t; @@ -352,6 +185,4 @@ typedef struct referee_info_t* RefereeInit(UART_HandleTypeDef *referee_usart_handle); - - #endif // !REFEREE_H diff --git a/modules/referee/referee_UI.c b/modules/referee/referee_UI.c index e69de29..2b4d68f 100644 --- a/modules/referee/referee_UI.c +++ b/modules/referee/referee_UI.c @@ -0,0 +1,95 @@ +// /** +// * @brief 上传自定义数据 +// * @param void +// * @retval void +// * @attention 数据打包,打包完成后通过串口发送到裁判系统 +// */ +// #define send_max_len 200 +// unsigned char CliendTxBuffer[send_max_len]; +// void JUDGE_Show_Data(void) +// { +// static u8 datalength,i; +// uint8_t judge_led = 0xff;//初始化led为全绿 +// static uint8_t auto_led_time = 0; +// static uint8_t buff_led_time = 0; + +// determine_ID();//判断发送者ID和其对应的客户端ID + +// ShowData.txFrameHeader.SOF = 0xA5; +// ShowData.txFrameHeader.DataLength = sizeof(ext_student_interactive_header_data_t) + sizeof(client_custom_data_t); +// ShowData.txFrameHeader.Seq = 0; +// memcpy(CliendTxBuffer, &ShowData.txFrameHeader, sizeof(xFrameHeader));//写入帧头数据 +// Append_CRC8_Check_Sum(CliendTxBuffer, sizeof(xFrameHeader));//写入帧头CRC8校验码 + +// ShowData.CmdID = 0x0301; + +// ShowData.dataFrameHeader.data_cmd_id = 0xD180;//发给客户端的cmd,官方固定 +// //ID已经是自动读取的了 +// ShowData.dataFrameHeader.send_ID = Judge_Self_ID;//发送者的ID +// ShowData.dataFrameHeader.receiver_ID = Judge_SelfClient_ID;//客户端的ID,只能为发送者机器人对应的客户端 + +// /*- 自定义内容 -*/ +// ShowData.clientData.data1 = (float)Capvoltage_Percent();//电容剩余电量 +// ShowData.clientData.data2 = (float)Base_Angle_Measure();//吊射角度测 +// ShowData.clientData.data3 = GIMBAL_PITCH_Judge_Angle();//云台抬头角度 +// ShowData.clientData.masks = judge_led;//0~5位0红灯,1绿灯 + +// //打包写入数据段 +// memcpy( +// CliendTxBuffer + 5, +// (uint8_t*)&ShowData.CmdID, +// (sizeof(ShowData.CmdID)+ sizeof(ShowData.dataFrameHeader)+ sizeof(ShowData.clientData)) +// ); + +// Append_CRC16_Check_Sum(CliendTxBuffer,sizeof(ShowData));//写入数据段CRC16校验码 + +// datalength = sizeof(ShowData); +// for(i = 0;i < datalength;i++) +// { +// USART_SendData(UART5,(uint16_t)CliendTxBuffer[i]); +// while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET); +// } +// } + + + + +// /** +// * @brief 判断自己红蓝方 +// * @param void +// * @retval RED BLUE +// * @attention 数据打包,打包完成后通过串口发送到裁判系统 +// */ +// bool Color; +// bool is_red_or_blue(void) +// { +// Judge_Self_ID = GameRobotStat.robot_id;//读取当前机器人ID + +// if(GameRobotStat.robot_id > 10) +// { +// return BLUE; +// } +// else +// { +// return RED; +// } +// } + +// /** +// * @brief 判断自身ID,选择客户端ID +// * @param void +// * @retval RED BLUE +// * @attention 数据打包,打包完成后通过串口发送到裁判系统 +// */ +// void determine_ID(void) +// { +// Color = is_red_or_blue(); +// if(Color == BLUE) +// { +// Judge_SelfClient_ID = 0x0110 + (Judge_Self_ID-10);//计算客户端ID +// } +// else if(Color == RED) +// { +// Judge_SelfClient_ID = 0x0100 + Judge_Self_ID;//计算客户端ID +// } +// } \ No newline at end of file diff --git a/modules/referee/referee_UI.h b/modules/referee/referee_UI.h new file mode 100644 index 0000000..e69de29 diff --git a/modules/referee/referee_communication.h b/modules/referee/referee_communication.h new file mode 100644 index 0000000..b3b4f5a --- /dev/null +++ b/modules/referee/referee_communication.h @@ -0,0 +1,92 @@ +/** + * @file referee_communication.h + * @author kidneygood (you@domain.com) + * @version 0.1 + * @date 2022-12-02 + * + * @copyright Copyright (c) HNU YueLu EC 2022 all rights reserved + * + */ + +#ifndef REFEREE_COMMUNICATION_H +#define REFEREE_COMMUNICATION_H + +#include "stdint.h" +#include "referee_def.h" +#pragma pack(1) + + +//暂时放在这里 +/***************交互数据********************/ +/* + 0x0301 机器人间交互数据,发送方触发发送,上限 10Hz + 己方机器人间通信与UI绘制共用同一个cmd_id + 根据数据段内容ID的不同区分 +*/ +/* 交互数据接收信息:0x0301 */ +typedef struct +{ + uint16_t data_cmd_id; + uint16_t send_ID; + uint16_t receiver_ID; +} ext_student_interactive_header_data_t; + +/* + 客户端 客户端自定义数据:cmd_id:0x0301。内容 ID:0xD180 + 发送频率:上限 10Hz + 1. 客户端 客户端自定义数据:cmd_id:0x0301。内容 ID:0xD180。发送频率:上限 10Hz + 字节偏移量 大小 说明 备注 + 0 2 数据的内容 ID 0xD180 + 2 2 送者的 ID 需要校验发送者机器人的 ID 正确性 + 4 2 客户端的 ID 只能为发送者机器人对应的客户端 + 6 4 自定义浮点数据 1 + 10 4 自定义浮点数据 2 + 14 4 自定义浮点数据 3 + 18 1 自定义 8 位数据 4 + +*/ +typedef struct +{ + float data1; + float data2; + float data3; + uint8_t masks; +} client_custom_data_t; + +/* + 学生机器人间通信 cmd_id 0x0301,内容 ID:0x0200~0x02FF + 交互数据 机器人间通信:0x0301。 + 发送频率:上限 10Hz +*/ +typedef struct +{ + uint8_t data[10]; // 数据段,n需要小于113 +} robot_interactive_data_t; + +// 发送给客户端的信息 +//交互数据包括一个统一的数据段头结构。数据段包含了内容 ID,发送者以及接收者的 ID 和内容数据段, +// 整个交互数据的包总共长最大为 128 个字节,减去 frame_header,cmd_id 和 frame_tail 共 9 个字节以及 +// 数据段头结构的 6 个字节,故而发送的内容数据段最大为 113。 +// 帧头 命令码 数据段头结构 数据段 帧尾 +typedef struct +{ + xFrameHeader txFrameHeader; // 帧头 + uint16_t CmdID; // 命令码 + ext_student_interactive_header_data_t dataFrameHeader; // 数据段头结构 + client_custom_data_t clientData; // 数据段 + uint16_t FrameTail; // 帧尾 +} ext_SendClientData_t; + +// 机器人交互信息 +typedef struct +{ + xFrameHeader txFrameHeader; // 帧头 + uint16_t CmdID; // 命令码 + ext_student_interactive_header_data_t dataFrameHeader; // 数据段头结构 + robot_interactive_data_t interactData; // 数据段 + uint16_t FrameTail; // 帧尾 +} ext_CommunatianData_t; + +#pragma pack() + +#endif \ No newline at end of file diff --git a/modules/referee/referee_def.h b/modules/referee/referee_def.h new file mode 100644 index 0000000..24c3e30 --- /dev/null +++ b/modules/referee/referee_def.h @@ -0,0 +1,83 @@ +/** + * @file referee_def.h + * @author kidneygood (you@domain.com) + * @version 0.1 + * @date 2022-12-02 + * + * @copyright Copyright (c) HNU YueLu EC 2022 all rights reserved + * + */ + +#ifndef REFEREE_DEF_H +#define REFEREE_DEF_H + +#include "stdint.h" + +#pragma pack(1) + +// 枚举类型,代替#define声明 +typedef enum +{ + FRAME_HEADER = 0, + CMD_ID = 5, + DATA = 7, +} JudgeFrameOffset; + +// 帧头偏移,枚举 +typedef enum +{ + SOF = 0, // 起始位 + DATA_LENGTH = 1, // 帧内数据长度,根据这个来获取数据长度 + SEQ = 3, // 包序号 + CRC8 = 4 // CRC8 +} FrameHeaderOffset; + +/* 自定义帧头 */ +typedef struct +{ + uint8_t SOF; + uint16_t DataLength; + uint8_t Seq; + uint8_t CRC8; +} xFrameHeader; + +// 命令码ID,用来判断接收的是什么数据 +typedef enum +{ + ID_game_state = 0x0001, // 比赛状态数据 + ID_game_result = 0x0002, // 比赛结果数据 + ID_game_robot_survivors = 0x0003, // 比赛机器人血量数据 + ID_event_data = 0x0101, // 场地事件数据 + ID_supply_projectile_action = 0x0102, // 场地补给站动作标识数据 + ID_supply_projectile_booking = 0x0103, // 场地补给站预约子弹数据 + ID_game_robot_state = 0x0201, // 机器人状态数据 + ID_power_heat_data = 0x0202, // 实时功率热量数据 + ID_game_robot_pos = 0x0203, // 机器人位置数据 + ID_buff_musk = 0x0204, // 机器人增益数据 + ID_aerial_robot_energy = 0x0205, // 空中机器人能量状态数据 + ID_robot_hurt = 0x0206, // 伤害状态数据 + ID_shoot_data = 0x0207, // 实时射击数据 + +} CmdID; + +// 命令码数据段长,根据官方协议来定义长度 +typedef enum +{ + LEN_game_state = 3, // 0x0001 + LEN_game_result = 1, // 0x0002 + LEN_game_robot_HP = 2, // 0x0003 + LEN_event_data = 4, // 0x0101 + LEN_supply_projectile_action = 4, // 0x0102 + LEN_game_robot_state = 27, // 0x0201 + LEN_power_heat_data = 14, // 0x0202 + LEN_game_robot_pos = 16, // 0x0203 + LEN_buff_musk = 1, // 0x0204 + LEN_aerial_robot_energy = 1, // 0x0205 + LEN_robot_hurt = 1, // 0x0206 + LEN_shoot_data = 7, // 0x0207 +} JudgeDataLength; + +#pragma pack() + +#endif +