新广播命令测试检测,注码正常,加宽了数据上报的时间片
添加异常代码9,槽任务未执行
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user