新广播命令测试检测,注码正常,加宽了数据上报的时间片

添加异常代码9,槽任务未执行
This commit is contained in:
ranchuan
2023-12-21 18:45:48 +08:00
parent d709a522ea
commit 6cf5e9e720
12 changed files with 301 additions and 55 deletions

View File

@@ -301,7 +301,7 @@ static void protu_send_ontime(protu_def *p,send_pkt_def *s)
uint32_t tick=p->timer->read(p->timer);
// 根据返回的数据长度计算发送需要的时间,添加1ms的余量
// 根据协议,每个指令从机的返回数据长度等长,所以需要的时间窗口也相等
int wnd_tick=((arr_length(s->t)+15)/16+1);
int wnd_tick=((arr_length(s->t)+12)/13+2);
int delay=tick%(wnd_tick*(p->num));
int gap=p->rank*wnd_tick;
if(delay<=gap){

View File

@@ -52,11 +52,16 @@
typedef struct{
ucport_def u;
rt_timer_t timer;
array_def *data;
}slave_def;
typedef struct{
array_def *data;
}self_def;
static self_def g_self;
static slave_def *slave_creat(void)
{
@@ -70,13 +75,13 @@ static void slave_del(ucport_def *u)
{
slave_def *s=(slave_def *)u;
CHECK_DO(s->timer,rt_timer_delete);
CHECK_DO(s->data,arr_delete);
// CHECK_DO(s->data,arr_delete);
free(u);
}
// 找到自己的数据
static void slave_get_self(slave_def *s)
static void slave_get_self(self_def *s)
{
int len=arr_length(s->data);
int off=0;
@@ -99,7 +104,7 @@ static void slave_get_self(slave_def *s)
// 添加任务
static void slave_adds(slave_def *s)
static void slave_adds(self_def *s)
{
task_def *t=calloc(1,sizeof(task_def));
void *slot=0;
@@ -113,6 +118,7 @@ static void slave_adds(slave_def *s)
t->par_count=arr_get(s->data,2);
t->ret_count=arr_get(s->data,3);
t->errcode=arr_get(s->data,4);
t->exe_flag=0;
t->task_index=arr_get(s->data,5);
memcpy(t->params,arr_data(s->data)+6,t->par_count*2);
task_slot_add_item(slot,t);
@@ -124,53 +130,72 @@ static void slave_adds(slave_def *s)
// 生成返回数据
static array_def *slave_creat_retdata(slave_def *s,array_def *r)
// 如果ret不为0则存在未执行的槽任务
static array_def *slave_creat_retdata(slave_def *s,array_def *r,int *ret)
{
void *slot=task_slot_init();
task_def *t=0;
int err=0;
while(t=task_slot_next_item(slot),t!=0)
{
arr_append(r,t->task_index);
arr_append(r,t->ret_count);
arr_appends(r,t->rets,t->ret_count*2);
if(t->exe_flag==0){
err|=1;
}
if(r){
arr_append(r,t->task_index);
arr_append(r,t->ret_count);
arr_appends(r,t->rets,t->ret_count*2);
}
}
if(ret) *ret=err;
return r;
}
// 重新设置异常代码,异常代码9未执行的槽任务
#define SET_ERRCODE(arr){\
if(slot_exe_flag){\
if(arr_get(arr,0)==0){\
arr_reset(arr,9,0);\
}\
}}
// 执行任务
static int run_task_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
slave_def *s=(slave_def *)u;
self_def *g=&g_self;
int pack_curr=0,pack_all=0,pack_size=0;
array_def *r=0;
array_def *check=0;
uint8_t *d;
uint8_t ret_mode=0;
int slot_exe_flag=0;
pack_all=arr_get(data,0)|(arr_get(data,1)<<8);
pack_curr=arr_get(data,2);
pack_size=arr_get(data,3);
if(pack_curr==0){
// 第一个数据包重置接收
CHECK_DO(s->data,arr_delete);
s->data=arr_creat();
CHECK_DO(g->data,arr_delete);
g->data=arr_creat();
}
if(arr_length(s->data)<pack_all){
if(arr_length(g->data)<pack_all){
d=arr_data(data)+4;
arr_appends(s->data,d,arr_length(data)-4);
}
if(arr_length(s->data)<pack_all){
arr_appends(g->data,d,arr_length(data)-4);
r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
}
else if(arr_length(s->data)==pack_all){
if(arr_length(g->data)==pack_all){
// 延时以保证正常回复到上位机
rt_thread_mdelay(50);
// 接收完成后执行命令
ret_mode=arr_get(s->data,0);
arr_remove(s->data,0,1);
slave_get_self(s);
slave_adds(s);
ret_mode=arr_get(g->data,0);
arr_remove(g->data,0,1);
slave_get_self(g);
slave_adds(g);
if(ret_mode!=3){
check=elec_check_with_scheme(0);
}else{
@@ -178,16 +203,20 @@ static int run_task_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_
}
if(ret_mode==0){
// 模式0只返回检测数据
slave_creat_retdata(s,0,&slot_exe_flag);
SET_ERRCODE(check);
emit tran_reply_signal(u->p,arr_temp(check));
}else if((ret_mode==1)||(ret_mode==3)){
// 模式1返回异常代码和任务插槽数据
r=arr_creat();
arr_append(r,arr_get(check,0));
slave_creat_retdata(s,r);
slave_creat_retdata(s,r,&slot_exe_flag);
SET_ERRCODE(r);
emit tran_reply_signal(u->p,arr_temp(r));
}else if(ret_mode==2){
// 模式2返回检测数据和任务插槽数据
slave_creat_retdata(s,check);
slave_creat_retdata(s,check,&slot_exe_flag);
SET_ERRCODE(check);
emit tran_reply_signal(u->p,arr_temp(check));
}
}