#include "main.h"
#include "model_cmd_manage.h"
const static model_cmd_manage_cmd_e cmd_list[MODEL_CMD_MANAGE_LIST_NUM] = {
MODEL_CMD_MANAGE_PAD_INSPECTION_ERR_EVENT,
MODEL_CMD_MANAGE_TEST,
MODEL_CMD_MANAGE_NULL};
void model_cmd_manage_reset_and_init(model_cmd_manage_resend_controller *controller)
{
memset(controller, 0, sizeof(model_cmd_manage_resend_controller));
}
void model_cmd_manage_add_cmd(model_cmd_manage_resend_controller *controller, model_cmd_manage_unit cmd_unit)
{
cmd_unit.enable = MODEL_CMD_MANAGE_ENABLE; // 默认值初始化
cmd_unit.timeNode = g_GlobalReferenceClock;
cmd_unit.running_num = 0;
if (cmd_unit.interval_time == 0)
{
cmd_unit.interval_time = 500;
}
if (cmd_unit.resend_num == 0)
{
cmd_unit.resend_num = 5;
}
int index = 0;
for (index = 0; index < MODEL_CMD_MANAGE_LIST_NUM; index++) // 判断指令合法性
{
if (cmd_unit.cmd_type == cmd_list[index])
{
break;
}
}
if (index == MODEL_CMD_MANAGE_LIST_NUM || cmd_list[index] == MODEL_CMD_MANAGE_NULL)
{
printf("[cmd manage] zhe added cmd type don't existence!!!\r\n");
}
for (index = 0; index < MODEL_CMD_MANAGE_UNIT_NUM; index++) // 相同指令刷新
{
if (cmd_unit.cmd_type == controller->unit_buff[index].cmd_type)
{
memcpy(&controller->unit_buff[index], &cmd_unit, sizeof(model_cmd_manage_unit));
return;
}
}
for (index = 0; index < MODEL_CMD_MANAGE_UNIT_NUM; index++) // 没用相同的找空闲资源占用
{
if (controller->unit_buff[index].enable != MODEL_CMD_MANAGE_ENABLE)
{
break;
}
}
if (index == MODEL_CMD_MANAGE_UNIT_NUM)
{
printf("[cmd control] full!!!\r\n");
return;
}
memcpy(&controller->unit_buff[index], &cmd_unit, sizeof(model_cmd_manage_unit));
}
void model_cmd_manage_add_cmd_1(
model_cmd_manage_resend_controller *controller,
model_cmd_manage_cmd_e type,
char *data, int len,
void (*send)(unsigned char *, unsigned int),
void (*out_time_handle)(void))
{
model_cmd_manage_unit cmd_unit;
memset(&cmd_unit, 0, sizeof(model_cmd_manage_unit));
cmd_unit.enable = MODEL_CMD_MANAGE_ENABLE; // 默认值初始化
cmd_unit.cmd_type = type;
cmd_unit.cmd_len = len;
memcpy(cmd_unit.cmd_data, data, len);
cmd_unit.send = send;
cmd_unit.out_time_handle = out_time_handle;
if (cmd_unit.interval_time == 0)
{
cmd_unit.interval_time = 500;
}
if (cmd_unit.resend_num == 0)
{
cmd_unit.resend_num = 5;
}
cmd_unit.running_num = 0;
cmd_unit.timeNode = g_GlobalReferenceClock;
int index = 0;
for (index = 0; index < MODEL_CMD_MANAGE_LIST_NUM; index++) // 判断指令合法性
{
if (cmd_unit.cmd_type == cmd_list[index])
{
break;
}
}
if (index == MODEL_CMD_MANAGE_LIST_NUM || cmd_list[index] == MODEL_CMD_MANAGE_NULL)
{
printf("[cmd manage] zhe added cmd type don't existence!!!\r\n");
}
for (index = 0; index < MODEL_CMD_MANAGE_UNIT_NUM; index++) // 相同指令刷新
{
if (cmd_unit.cmd_type == controller->unit_buff[index].cmd_type)
{
memcpy(&controller->unit_buff[index], &cmd_unit, sizeof(model_cmd_manage_unit));
return;
}
}
for (index = 0; index < MODEL_CMD_MANAGE_UNIT_NUM; index++) // 没用相同的找空闲资源占用
{
if (controller->unit_buff[index].enable != MODEL_CMD_MANAGE_ENABLE)
{
break;
}
}
if (index == MODEL_CMD_MANAGE_UNIT_NUM)
{
printf("[cmd control] full!!!\r\n");
return;
}
memcpy(&controller->unit_buff[index], &cmd_unit, sizeof(model_cmd_manage_unit));
}
void model_cmd_manage_remove_cmd(model_cmd_manage_resend_controller *controller, model_cmd_manage_cmd_e cmd_type)
{
for (int i = 0; i < MODEL_CMD_MANAGE_UNIT_NUM; i++)
{
if (controller->unit_buff[i].cmd_type == cmd_type)
{
memset(&controller->unit_buff[i], 0, sizeof(model_cmd_manage_unit));
}
}
}
void model_cmd_manage_data_check(model_cmd_manage_resend_controller *controller)
{
for (int i = 0; i < MODEL_CMD_MANAGE_UNIT_NUM; i++)
{
if (controller->unit_buff[i].enable == MODEL_CMD_MANAGE_ENABLE)
{
if ((g_GlobalReferenceClock - controller->unit_buff[i].timeNode) / controller->unit_buff[i].interval_time > controller->unit_buff[i].running_num) // 定时重发
{
controller->unit_buff[i].send(controller->unit_buff[i].cmd_data, controller->unit_buff[i].cmd_len);
controller->unit_buff[i].running_num++;
}
if (controller->unit_buff[i].running_num > controller->unit_buff[i].resend_num) // 超时清除
{
if(controller->unit_buff[i].out_time_handle != NULL)
{
controller->unit_buff[i].out_time_handle();
}
memset(&controller->unit_buff[i], 0, sizeof(model_cmd_manage_unit));
}
}
}
}
void model_cmd_manage_buff_printf(model_cmd_manage_resend_controller *controller)
{
for (int i = 0; i < MODEL_CMD_MANAGE_UNIT_NUM; i++)
{
if (controller->unit_buff[i].enable == MODEL_CMD_MANAGE_ENABLE)
{
printf("[cmd manage]:\r\n");
printf("index:%d\r\n", i);
printf("enable:%x\r\n", controller->unit_buff[i].enable);
printf("cmd_type:%d\r\n", (int)controller->unit_buff[i].cmd_type);
printf("cmd_len:%d\r\n", controller->unit_buff[i].cmd_len);
printf("interval_time:%d\r\n", controller->unit_buff[i].interval_time);
printf("resend_num:%d\r\n", controller->unit_buff[i].resend_num);
printf("running_num:%d\r\n", controller->unit_buff[i].running_num);
printf("timeNode:%d\r\n\r\n", controller->unit_buff[i].timeNode);
}
}
}
model-cmd-manage.zip 指令重发控制器
需积分: 5 173 浏览量
2024-05-21
15:15:51
上传
评论
收藏 2KB ZIP 举报
嵌入式小宁
- 粉丝: 58
- 资源: 45
最新资源
- 海信智能电视刷机数据 LED42K330X3D(0000) 生产用软件数据 务必确认机编一致 强制刷机 整机USB升级程序
- shujudaochuceshi
- learn-ruby.zip
- test111111111111111111
- face-detect.ipynb
- 以下是一些关于ACM(国际大学生程序设计竞赛)、NOI(全国青少年信息学奥林匹克竞赛)以及CSP(全国青少年信息学奥林匹克竞赛提
- 是一些电子设计竞赛(电赛)经验分享,包括备赛策略、项目管理、团队合作和比赛期间的注意事项
- 全能运行库修复工具DirectX Repair v4.1.0.30770
- las格式点云数据使用详解(附VS编译好的LAStools工具)
- KRPano插件一键解密大师1.4.0 (解压密码1234)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈