sentry_gimbal_hzz/modules/referee/referee_UI.c

495 lines
21 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "referee_UI.h"
#include "string.h"
#include "crc.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "referee.h"
static void UI_Delete(referee_id_t *_id,uint8_t Del_Operate,uint8_t Del_Layer);
static void Line_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t End_x,uint32_t End_y);
static void Rectangle_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t End_x,uint32_t End_y);
static void Circle_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t Graph_Radius);
static void Elliptical_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t end_x,uint32_t end_y);
static void Arc_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_StartAngle,uint32_t Graph_EndAngle,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,
uint32_t end_x,uint32_t end_y);
static void Float_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Digit,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,int32_t Graph_Float);
static void Integer_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,int32_t Graph_Integer);
static void Char_Draw(String_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y);
static void Char_Write(String_Data_t *graph,char* fmt, ...);
static int UI_ReFresh(referee_id_t *_id,int cnt,...);
static int Char_ReFresh(referee_id_t *_id,String_Data_t string_Data);
static void determine_ID(referee_info_t *_referee_info);
static uint8_t UI_Seq; //包序号
void Interactive_init(referee_info_t *_referee_info)
{
determine_ID(_referee_info);
Graph_Data_t graph[5];
Graph_Data_t num[2];
String_Data_t sdata[1];
memset(sdata[0].show_Data, 0, 30); //使用memset方法 syhtodo 数据存在初始化未默认为0的情况
memset(&graph[0], 0, 15);
UI_Delete(&_referee_info->referee_id,UI_Data_Del_ALL,0);
Line_Draw(&graph[0],"s0",UI_Graph_ADD,0,UI_Color_White,3,710,540,1210,540);
Rectangle_Draw(&graph[1],"s1",UI_Graph_ADD,0,UI_Color_Yellow,4,600,200,800,500);
Circle_Draw(&graph[2],"s2",UI_Graph_ADD,0,UI_Color_Green,5,960,540,100);
Elliptical_Draw(&graph[3],"s3",UI_Graph_ADD,0,UI_Color_Orange,3,960,540,100,20);
Arc_Draw(&graph[4],"s4",UI_Graph_ADD,0,UI_Color_Purplish_red,30,160,3,1200,550,50,100);
Float_Draw(&num[0],"s5",UI_Graph_ADD,0,UI_Color_Pink,50,3,5,1050,660,1245545);
Integer_Draw(&num[1],"s6",UI_Graph_ADD,0,UI_Color_Cyan,50,5,1050,460,12345);
UI_ReFresh(&_referee_info->referee_id,7,graph[0],graph[1],graph[2],graph[3],graph[4],num[0],num[1]);
Char_Draw(&sdata[0],"s7",UI_Graph_ADD,0,UI_Color_Green,20,2,620,710);
Char_Write(&sdata[0],"number:%d",123);
Char_ReFresh(&_referee_info->referee_id,sdata[0]);
}
/**
* @brief 判断各种ID选择客户端ID
* @param void
* @retval referee_info
* @attention
*/
static void determine_ID(referee_info_t *_referee_info)
{
//id小于7是红色,大于7是蓝色,0为红色1为蓝色 #define Robot_Red 0 #define Robot_Blue 1
_referee_info->referee_id.Robot_Color = _referee_info->GameRobotState.robot_id >7 ? Robot_Blue : Robot_Red;
_referee_info->referee_id.Robot_ID=_referee_info->GameRobotState.robot_id;
_referee_info->referee_id.Cilent_ID = 0x0100 + _referee_info->referee_id.Robot_ID;//计算客户端ID
_referee_info->referee_id.Receiver_Robot_ID = 0x00; //机器人车间通信时接收者的ID暂时为0
}
/********************************************删除操作*************************************
**参数Del_Operate 对应头文件删除操作
Del_Layer 要删除的层 取值0-9
*****************************************************************************************/
static void UI_Delete(referee_id_t *_id,uint8_t Del_Operate,uint8_t Del_Layer)
{
UI_delete_t UI_delete_data;
uint8_t temp_datalength = UI_Data_LEN_Head + UI_Operate_LEN_Del; //计算交互数据长度
UI_delete_data.FrameHeader.SOF = REFEREE_SOF;
UI_delete_data.FrameHeader.DataLength = temp_datalength;
UI_delete_data.FrameHeader.Seq = UI_Seq;
UI_delete_data.FrameHeader.CRC8 = Get_CRC8_Check_Sum((uint8_t *)&UI_delete_data,LEN_CRC8,0xFF);
UI_delete_data.CmdID = ID_student_interactive;
UI_delete_data.datahead.data_cmd_id = UI_Data_ID_Del;
UI_delete_data.datahead.receiver_ID = _id->Cilent_ID;
UI_delete_data.datahead.sender_ID = _id->Robot_ID;
UI_delete_data.Delete_Operate = Del_Operate; //删除操作
UI_delete_data.Layer = Del_Layer;
UI_delete_data.frametail = Get_CRC16_Check_Sum((uint8_t *)&UI_delete_data,LEN_HEADER+LEN_CMDID+temp_datalength,0xFFFF);
/* syhtodo为什么填入0xFFFF */
RefereeSend((uint8_t *)&UI_delete_data,LEN_HEADER+LEN_CMDID+temp_datalength+LEN_TAIL); //发送
UI_Seq++; //包序号+1
}
/************************************************绘制直线*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Width 图形线宽
Start_x、Start_y 起点xy坐标
End_x、End_y 终点xy坐标
**********************************************************************************************************/
static void Line_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t End_x,uint32_t End_y)
{
int i;
//??????syhtodo
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->operate_tpye = Graph_Operate;
graph->graphic_tpye = UI_Graph_Line;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->end_x = End_x;
graph->end_y = End_y;
}
/************************************************绘制矩形*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Width 图形线宽
Start_x、Start_y 起点xy坐标
End_x、End_y 对角顶点xy坐标
**********************************************************************************************************/
static void Rectangle_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t End_x,uint32_t End_y)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Rectangle;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->end_x = End_x;
graph->end_y = End_y;
}
/************************************************绘制整圆*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Width 图形线宽
Start_x、Start_y 圆心xy坐标
Graph_Radius 圆形半径
**********************************************************************************************************/
static void Circle_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t Graph_Radius)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Circle;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->radius = Graph_Radius;
}
/************************************************绘制椭圆*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Width 图形线宽
Start_x、Start_y 圆心xy坐标
End_x、End_y xy半轴长度
**********************************************************************************************************/
static void Elliptical_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,uint32_t end_x,uint32_t end_y)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Ellipse;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->end_x = end_x;
graph->end_y = end_y;
}
/************************************************绘制圆弧*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_StartAngle,Graph_EndAngle 起始终止角度
Graph_Width 图形线宽
Start_y,Start_y 圆心xy坐标
x_Length,y_Length xy半轴长度
**********************************************************************************************************/
static void Arc_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_StartAngle,uint32_t Graph_EndAngle,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,
uint32_t end_x,uint32_t end_y)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Arc;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->start_angle = Graph_StartAngle;
graph->end_angle = Graph_EndAngle;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->end_x = end_x;
graph->end_y = end_y;
}
/************************************************绘制浮点型数据*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Size 字号
Graph_Digit 小数位数
Graph_Width 图形线宽
Start_x、Start_y 开始坐标
radius=a&0x3FF; a为浮点数乘以1000后的32位整型数
end_x=(a>>10)&0x7FF;
end_y=(a>>21)&0x7FF;
**********************************************************************************************************/
static void Float_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Digit,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,int32_t Graph_Float)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Float;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->start_angle = Graph_Size;
graph->end_angle = Graph_Digit;
graph->radius=Graph_Float&0x3FF;
graph->end_x=(Graph_Float>>10)&0x7FF;
graph->end_y=(Graph_Float>>21)&0x7FF;
}
/************************************************绘制整型数据*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Size 字号
Graph_Width 图形线宽
Start_x、Start_y 开始坐标
radius=a&0x3FF; a为32位整型数
end_x=(a>>10)&0x7FF;
end_y=(a>>21)&0x7FF;
**********************************************************************************************************/
static void Integer_Draw(Graph_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y,int32_t Graph_Integer)
{
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->graphic_name[2-i]=graphname[i];
}
graph->graphic_tpye = UI_Graph_Int;
graph->operate_tpye = Graph_Operate;
graph->layer = Graph_Layer;
graph->color = Graph_Color;
graph->start_angle = Graph_Size;
graph->width = Graph_Width;
graph->start_x = Start_x;
graph->start_y = Start_y;
graph->radius=Graph_Integer&0x3FF;
graph->end_x=(Graph_Integer>>10)&0x7FF;
graph->end_y=(Graph_Integer>>21)&0x7FF;
}
/************************************************绘制字符型数据*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
graphname[3] 图片名称,用于标识更改
Graph_Operate 图片操作,见头文件
Graph_Layer 图层0-9
Graph_Color 图形颜色
Graph_Size 字号
Graph_Width 图形线宽
Start_x、Start_y 开始坐标
**********************************************************************************************************/
static void Char_Draw(String_Data_t *graph,char graphname[3],uint32_t Graph_Operate,uint32_t Graph_Layer,uint32_t Graph_Color,
uint32_t Graph_Size,uint32_t Graph_Width,uint32_t Start_x,uint32_t Start_y)
{
memset(graph->Graph_Control.graphic_name, 0, 3);//syhtodo 是否需要手动清零
int i;
for(i=0;i<3&&graphname[i]!='\0';i++)
{
graph->Graph_Control.graphic_name[2-i]=graphname[i];
}
graph->Graph_Control.graphic_tpye = UI_Graph_Char;
graph->Graph_Control.operate_tpye = Graph_Operate;
graph->Graph_Control.layer = Graph_Layer;
graph->Graph_Control.color = Graph_Color;
graph->Graph_Control.width = Graph_Width;
graph->Graph_Control.start_x = Start_x;
graph->Graph_Control.start_y = Start_y;
graph->Graph_Control.start_angle = Graph_Size;
//syhtodo无关的赋值为0
graph->Graph_Control.radius=0;
graph->Graph_Control.end_x=0;
graph->Graph_Control.end_y=0;
}
/************************************************绘制字符型数据*************************************************
**参数:*graph Graph_Data类型变量指针用于存放图形数据
fmt需要显示的字符串
syhtodo 尚未理解该函数的写法
**********************************************************************************************************/
static void Char_Write(String_Data_t *graph,char* fmt, ...)
{
uint16_t i = 0;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)graph->show_Data, fmt, ap);//使用参数列表发送格式化输出到字符串
va_end(ap);
i = strlen((const char*)graph->show_Data);
graph->Graph_Control.end_angle = i;
}
/* UI推送函数使更改生效
参数: cnt 图形个数
... 图形变量参数
Tips该函数只能推送1257个图形其他数目协议未涉及
*/
static int UI_ReFresh(referee_id_t *_id,int cnt,...)
{
int i;
UI_GraphReFresh_t UI_GraphReFresh_data;
Graph_Data_t graphData;
va_list ap;//创建一个 va_list 类型变量
va_start(ap,cnt);//初始化 va_list 变量为一个参数列表
UI_GraphReFresh_data.FrameHeader.SOF = REFEREE_SOF;
UI_GraphReFresh_data.FrameHeader.DataLength = UI_Data_LEN_Head+cnt*UI_Operate_LEN_PerDraw;
UI_GraphReFresh_data.FrameHeader.Seq = UI_Seq;
UI_GraphReFresh_data.FrameHeader.CRC8 = Get_CRC8_Check_Sum((uint8_t *)&UI_GraphReFresh_data,LEN_CRC8,0xFF);
UI_GraphReFresh_data.CmdID = ID_student_interactive;
switch(cnt)
{
case 1:
UI_GraphReFresh_data.datahead.data_cmd_id=UI_Data_ID_Draw1;
break;
case 2:
UI_GraphReFresh_data.datahead.data_cmd_id=UI_Data_ID_Draw2;
break;
case 5:
UI_GraphReFresh_data.datahead.data_cmd_id=UI_Data_ID_Draw5;
break;
case 7:
UI_GraphReFresh_data.datahead.data_cmd_id=UI_Data_ID_Draw7;
break;
default:
return (-1);
}
UI_GraphReFresh_data.datahead.receiver_ID = _id->Cilent_ID;
UI_GraphReFresh_data.datahead.sender_ID = _id->Robot_ID;
//先发送帧头、命令码、交互数据帧头三部分并计算CRC16校验值
UI_GraphReFresh_data.frametail=Get_CRC16_Check_Sum((uint8_t *)&UI_GraphReFresh_data,LEN_HEADER+LEN_CMDID+UI_Data_LEN_Head,0xFFFF);
RefereeSend((uint8_t *)&UI_GraphReFresh_data,LEN_HEADER+LEN_CMDID+UI_Data_LEN_Head);
for(i=0;i<cnt;i++) //发送交互数据的数据帧并计算CRC16校验值
{
graphData=va_arg(ap,Graph_Data_t);//访问参数列表中的每个项,第二个参数是你要返回的参数的类型,在取值时需要将其强制转化为指定类型的变量
//发送并计算CRC16
RefereeSend((uint8_t *)&graphData,UI_Operate_LEN_PerDraw);
UI_GraphReFresh_data.frametail=Get_CRC16_Check_Sum((uint8_t *)&graphData,UI_Operate_LEN_PerDraw,UI_GraphReFresh_data.frametail);
}
RefereeSend((uint8_t *)&UI_GraphReFresh_data.frametail,LEN_TAIL); //发送CRC16校验值
va_end(ap);//结束可变参数的获取
UI_Seq++; //包序号+1
return 0;
}
/************************************************UI推送字符使更改生效*********************************/
static int Char_ReFresh(referee_id_t *_id,String_Data_t string_Data)
{
UI_CharReFresh_t UI_CharReFresh_data;
uint8_t temp_datalength = UI_Data_LEN_Head + UI_Operate_LEN_DrawChar; //计算交互数据长度
UI_CharReFresh_data.FrameHeader.SOF = REFEREE_SOF;
UI_CharReFresh_data.FrameHeader.DataLength = temp_datalength;
UI_CharReFresh_data.FrameHeader.Seq = UI_Seq;
UI_CharReFresh_data.FrameHeader.CRC8 = Get_CRC8_Check_Sum((uint8_t *)&UI_CharReFresh_data,LEN_CRC8,0xFF);
UI_CharReFresh_data.CmdID = ID_student_interactive;
UI_CharReFresh_data.datahead.data_cmd_id = UI_Data_ID_DrawChar;
UI_CharReFresh_data.datahead.receiver_ID = _id->Cilent_ID;
UI_CharReFresh_data.datahead.sender_ID = _id->Robot_ID;
UI_CharReFresh_data.String_Data = string_Data;
UI_CharReFresh_data.frametail = Get_CRC16_Check_Sum((uint8_t *)&UI_CharReFresh_data,LEN_HEADER+LEN_CMDID+temp_datalength,0xFFFF);
RefereeSend((uint8_t *)&UI_CharReFresh_data,LEN_HEADER+LEN_CMDID+temp_datalength+LEN_TAIL); //发送
UI_Seq++; //包序号+1
return 0;
}