Files
checker_slave/source/task/tran_for_broadcast.c

203 lines
3.7 KiB
C
Raw Normal View History

#include "tran_for_broadcast.h"
#include "debug.h"
#include "mymisc.h"
#include "mystdlib.h"
#include "board.h"
#include "dev_flash.h"
#include "prot_uc.h"
#include "coder_lib.h"
#include "JQ_PSDGenerate.h"
#include "mystring.h"
#include "coder_judge.h"
#include "JQ_UIDGenerate.h"
#include "transmit.h"
#include "elec_det.h"
#include "crc.h"
#include "dev_backup.h"
#include "elec_task_slot.h"
/*
[0]=[1]=(1)
[2...n]=
[0]=[1]=[2...n]=
[0]=[1]=id[2]=(u16)
[3]=(u16)[4]=[5]=
[6...n]=
[0]=[1]=(u16)
[2...n]=
*/
typedef struct{
ucport_def u;
rt_timer_t timer;
array_def *data;
int pack_all;
int pack_curr;
}slave_def;
static slave_def *slave_creat(void)
{
slave_def *u=calloc(1,sizeof(slave_def));
return u;
}
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);
free(u);
}
// 找到自己的数据
static void slave_get_self(slave_def *s)
{
int len=arr_length(s->data);
int off=0;
int addr,slave_len;
array_def *expat=arr_creat();
uint8_t *d;
while(off<len){
addr=arr_get(s->data,off);
slave_len=arr_get(s->data,off+1);
if(addr==elec_local_addr()){
d=arr_data(s->data)+off+2;
arr_appends(expat,d,slave_len);
break;
}
off+=slave_len+2;
}
arr_delete(s->data);
s->data=expat;
}
// 添加任务
static void slave_adds(slave_def *s)
{
task_def *t=calloc(1,sizeof(task_def));
void *slot=0;
int off=0;
int len=arr_length(s->data);
task_slot_delete();
slot=task_slot_init();
while(off<len){
t->slot_index=arr_get(s->data,0);
t->task_id=arr_get(s->data,1);
t->par_count=arr_get(s->data,2);
t->ret_count=arr_get(s->data,3);
t->errcode=arr_get(s->data,4);
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);
off+=6+t->par_count*2;
}
free(t);
}
// 生成返回数据
static array_def *slave_creat_retdata(slave_def *s,array_def *r)
{
void *slot=task_slot_init();
task_def *t=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);
}
return r;
}
// 执行任务
static int run_task_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
slave_def *s=(slave_def *)u;
int pack_curr=0,pack_all=0;
array_def *r=0;
array_def *check=0;
uint8_t *d;
pack_all=arr_get(data,0);
pack_curr=arr_get(data,1);
s->pack_all=pack_all;
if(pack_curr==1){
// 第一个数据包重置接收
CHECK_DO(s->data,arr_delete);
s->data=arr_creat();
}
if(pack_curr==s->pack_curr+1){
s->pack_curr++;
d=arr_data(data)+2;
arr_appends(s->data,d,arr_length(data)-2);
if(s->pack_curr<s->pack_all){
r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
}else{
// 接收完成后执行命令
r=arr_creat();
slave_get_self(s);
slave_adds(s);
check=elec_check_with_scheme(0);
arr_append(r,arr_get(check,0));
slave_creat_retdata(s,r);
emit tran_reply_signal(u->p,arr_temp(r));
}
}
return 0;
}
static ucport_def *run_task(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=slave_creat();
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=run_task_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x20,run_task)