diff --git a/source/ReadMe.txt b/source/ReadMe.txt index baac543..03ba2bc 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -293,3 +293,9 @@ 解决ew写配置错误的bug,升级ew程序不更改配置区 2023.12.16 解决ew充末电流异常的bug,解决ew快速配置2比对数据错误的bug +2023.12.18 + 添加写三码验三码任务,实现0x20任务,完成任务插槽机制 + 添加文件 tran_for_broadcast.c + + + diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c index 1dbaf0a..f5f1430 100644 --- a/source/elec_det/elec_det.c +++ b/source/elec_det/elec_det.c @@ -411,14 +411,13 @@ static int elec_code_load_param(array_def *uid_psw) } // 检测 准备参数 -CheckerTask elec_get_task_fun(CheckerTask *tasks_fun_table[],uint8_t chip_type,uint8_t taskid); int elec_check_load_task_param(uint8_t task_index) { self_def *s=&g_self; uint8_t taskid; CheckerTask_Info_st *task_par; taskid=s->taskid_table[task_index]; - s->task_fun=elec_get_task_fun(s->tasks_fun_table,s->chip_type,taskid); + s->task_fun=elec_get_task_fun(taskid); task_par= s->task_info_array[task_index]; memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st)); memset(checker_runcfg.params,0,20); @@ -490,9 +489,12 @@ int elec_task_env_restore(void) // 根据任务id获取检测函数 -CheckerTask elec_get_task_fun(CheckerTask *tasks_fun_table[],uint8_t chip_type,uint8_t taskid) +CheckerTask elec_get_task_fun(uint8_t taskid) { + self_def *s=&g_self; CheckerTask task_fun=0; + CheckerTask **tasks_fun_table=s->tasks_fun_table; + uint8_t chip_type=s->chip_type; if(taskid=CHECKER_MAXID_COUNT)&& @@ -500,6 +502,7 @@ CheckerTask elec_get_task_fun(CheckerTask *tasks_fun_table[],uint8_t chip_type,u { task_fun=exttaskArray[taskid-CHECKER_MAXID_COUNT]; } + s->task_fun=task_fun; return task_fun; } @@ -520,9 +523,22 @@ void elec_exe_task(void) if(checker_runcfg.excue_rtv==0) break; } + char *str=malloc(200); + int str_len=0; + for(int i=0;itask_index, - s->task_par->taskid,checker_runcfg.excue_rtv,checker_runcfg.rtv_index); + if(checker_runcfg.rtv_count>0){ + DBG_LOG("task_index:%d,taskid:%d,ret=%d,rtv_index=%d.",s->task_index, + s->task_par->taskid,checker_runcfg.excue_rtv,checker_runcfg.rtv_index); + DBG_LOG("rets:%s\n",str); + }else{ + DBG_LOG("task_index:%d,taskid:%d,ret=%d,rtv_index=%d.\n",s->task_index, + s->task_par->taskid,checker_runcfg.excue_rtv,checker_runcfg.rtv_index); + } + free(str); } diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h index 6672c62..731cdec 100644 --- a/source/elec_det/elec_det.h +++ b/source/elec_det/elec_det.h @@ -4,7 +4,7 @@ #include "stdint.h" #include "bytearray.h" - +#include "interface/basechecker.h" int elec_init(void); @@ -48,6 +48,8 @@ int elec_task_env_back(void); int elec_task_env_restore(void); +CheckerTask elec_get_task_fun(uint8_t taskid); + #endif diff --git a/source/elec_det/elec_judge.c b/source/elec_det/elec_judge.c index 0938286..4856b66 100644 --- a/source/elec_det/elec_judge.c +++ b/source/elec_det/elec_judge.c @@ -6,6 +6,7 @@ #include "mystring.h" #include "elec_judge.h" #include "interface/CheckerExt.h" +#include "elec_task_slot.h" // 通用异常判定逻辑 @@ -354,6 +355,19 @@ int elec_report_err(elec_judge_def *e) } +static void elec_add_slot_err(elec_judge_def *e) +{ + void *slot=task_slot_init(); + int len=0; + uint8_t *table=0; + len=task_slot_err_table(slot,&table); + for(int i=0;iitem_num*2; } + + elec_add_slot_err(e); + DBG_LOG("err_table:%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", e->err_list[0],e->err_list[1],e->err_list[2],e->err_list[3],e->err_list[4], e->err_list[5],e->err_list[6],e->err_list[7],e->err_list[8],e->err_list[9] diff --git a/source/elec_det/elec_task_slot.c b/source/elec_det/elec_task_slot.c index e67dcb2..405ce16 100644 --- a/source/elec_det/elec_task_slot.c +++ b/source/elec_det/elec_task_slot.c @@ -57,6 +57,7 @@ void *task_slot_init(void) t=calloc(1,sizeof(task_slot_def)); app_variable("task_slot",t,0); } + t->current=t->head; return t; } @@ -90,18 +91,35 @@ task_def *task_slot_next(void *context,uint8_t slot_index) if(t==0){ return 0; } - task_node *n; - while(t->current){ - n=t->current; - t->current=n->next; - if(n->task.slot_index==slot_index){ - return &n->task; + task_def *n; + while(n=task_slot_next_item(t),n!=0){ + if(n->slot_index==slot_index){ + return n; } } return 0; } +// 找到下一个 +task_def *task_slot_next_item(void *context) +{ + task_slot_def *t=context; + if(t==0){ + return 0; + } + task_node *n=0; + if(t->current){ + n=t->current; + t->current=n->next; + return &n->task; + } + return 0; +} + + + + int task_slot_add_err(void *context,uint8_t err) { task_slot_def *t=context; @@ -127,4 +145,16 @@ int task_slot_add_err(void *context,uint8_t err) +// 获取异常代码表 +int task_slot_err_table(void *context,uint8_t **table) +{ + task_slot_def *t=context; + if(t==0){ + return 0; + } + if(table) *table=t->err_table; + return t->err_num; +} + + diff --git a/source/elec_det/elec_task_slot.h b/source/elec_det/elec_task_slot.h index 7836c0b..c4c26f0 100644 --- a/source/elec_det/elec_task_slot.h +++ b/source/elec_det/elec_task_slot.h @@ -11,6 +11,7 @@ typedef struct{ uint8_t par_count;// 参数个数 uint8_t ret_count;// 返回值个数 uint8_t errcode; + uint8_t task_index; uint8_t params[20]; uint8_t rets[20]; }task_def; @@ -18,12 +19,17 @@ typedef struct{ void *task_slot_init(void); +void task_slot_delete(void); + int task_slot_add_item(void *context,task_def *item); task_def *task_slot_next(void *context,uint8_t slot_index); +task_def *task_slot_next_item(void *context); + int task_slot_add_err(void *context,uint8_t err); +int task_slot_err_table(void *context,uint8_t **table); #endif diff --git a/source/elec_det/interface/CheckerExt.c b/source/elec_det/interface/CheckerExt.c index 0e1a2d4..7baf2f6 100644 --- a/source/elec_det/interface/CheckerExt.c +++ b/source/elec_det/interface/CheckerExt.c @@ -119,6 +119,26 @@ static int calc_skip_num(int index) +/*rc{ +设置UID和密码到小板内存,三码绑定函数使用此数据 +输入参数[0]=uid长度,[1]=pwd长度,[uid][pwd] +}*/ +void CheckerExt_SetUID(void) +{ + uint8_t pwd_len=0,uid_len=0; + uint8_t *uid_psw=(uint8_t *)checker_runcfg.params; + uint8_t ret=0; + uid_len = uid_psw[0]; + pwd_len = uid_psw[1]; + if(uid_len==0||pwd_len==0){ + ret=1; + } + checker_runcfg.uid_len=uid_len; + checker_runcfg.pwd_len=pwd_len; + memcpy(checker_runcfg.writeuid,uid_psw+2,uid_len); + memcpy(checker_runcfg.writepwd,uid_psw+2+uid_len,pwd_len); + Checker_MaskResult(ret,checker_runcfg.task_info.runindex); +} /*rc{ @@ -132,9 +152,11 @@ void CheckerExt_Slot(void) { int index; uint16_t ret=0; + uint16_t exe_ret=0; int self_index=checker_runcfg.task_info.runindex; task_def *t=0; void *task_slot=0; + CheckerTask fun=0; if(checker_runcfg.param_count<1){ ret=1; goto end; @@ -149,12 +171,37 @@ void CheckerExt_Slot(void) goto end; } while(t=task_slot_next(task_slot,(uint8_t)index),t){ - // t-> + memset(&checker_runcfg.task_info,0,sizeof(CheckerTask_Info_st)); + memset(checker_runcfg.params,0,20); + checker_runcfg.param_count = 0;//参数个数 + checker_runcfg.rtv_count = 0;//返回值个数 + checker_runcfg.excue_rtv = 0; + checker_runcfg.task_info.retry_time = 0; + + checker_runcfg.task_info.runindex=self_index; + checker_runcfg.param_count = t->par_count; + checker_runcfg.rtv_count = t->ret_count; + memcpy(checker_runcfg.params,t->params,checker_runcfg.param_count*2); + fun=elec_get_task_fun(t->task_id); + checker_runcfg.excue_rtv=1; + if(fun){ + fun(); + checker_runcfg.rtv_index-=checker_runcfg.rtv_count; + } + exe_ret|=checker_runcfg.excue_rtv; + memcpy(t->rets,&checker_runcfg.Test_Rtv[checker_runcfg.rtv_index],checker_runcfg.rtv_count*2); + memset(&checker_runcfg.Test_Rtv[checker_runcfg.rtv_index],0,checker_runcfg.rtv_count*2); + if(checker_runcfg.excue_rtv){ + task_slot_add_err(task_slot,t->errcode); + } } if(elec_task_env_restore()){ - ret=5; + ret=3; goto end; } + if(exe_ret){ + ret=4; + } end: Checker_MaskResult(ret,self_index); } diff --git a/source/elec_det/interface/CheckerExt.h b/source/elec_det/interface/CheckerExt.h index 65c41ff..a5b68ba 100644 --- a/source/elec_det/interface/CheckerExt.h +++ b/source/elec_det/interface/CheckerExt.h @@ -19,7 +19,9 @@ void CheckerExt_CalcErr(void); void CheckerExt_Repeat(void); +void CheckerExt_SetUID(void); +void CheckerExt_Slot(void); diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c index 7b2ffdb..fdbe4bd 100644 --- a/source/elec_det/interface/EWChecker.c +++ b/source/elec_det/interface/EWChecker.c @@ -353,7 +353,7 @@ void EW_Test_VerifyThreedCode(void) } if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(1,checker_runcfg.task_info.runindex); return; } EW_ReadMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1); @@ -367,7 +367,7 @@ void EW_Test_VerifyThreedCode(void) } if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(2,checker_runcfg.task_info.runindex); return; } @@ -383,7 +383,7 @@ void EW_Test_VerifyThreedCode(void) } if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(3,checker_runcfg.task_info.runindex); return; } EW_ReadMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1); @@ -397,7 +397,7 @@ void EW_Test_VerifyThreedCode(void) } if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(4,checker_runcfg.task_info.runindex); return; } @@ -409,30 +409,34 @@ void EW_Test_VerifyThreedCode(void) } if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(5,checker_runcfg.task_info.runindex); return; } //验证PWD memcpy(EW_RunBuf,EW_Test_PWD,checker_runcfg.pwd_len); + delay_ms(200); uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len); if(uc_rtv > 0) { - Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); + Checker_MaskResult(6,checker_runcfg.task_info.runindex); return; } //读状态 + delay_ms(200); uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas); - if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0) +// if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0) + if(uc_rtv > 0 || state.State_st.pswd_flag == 0) { - Checker_MaskResult(1,checker_runcfg.task_info.runindex); + Checker_MaskResult(7,checker_runcfg.task_info.runindex); return; } - Checker_MaskResult(1,checker_runcfg.task_info.runindex); + Checker_MaskResult(0,checker_runcfg.task_info.runindex); } /* @brief 自检 @param 自检模式 +@param1 自检时间ms @rtv 自检模式0x08的回读数据 */ void EW_Test_CheckSelf() @@ -441,8 +445,9 @@ void EW_Test_CheckSelf() uint32_t ul_temp; uint8_t uc_mode = checker_runcfg.params[0]; uc_rtv = EW_ChecSelf(checker_runcfg.netid,uc_mode,(uint8_t*)&ul_temp); + delay_ms(checker_runcfg.params[1]); Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); - + Checker_SetRtv((uint16_t*)ul_temp,checker_runcfg.rtv_count); } /* @@ -702,9 +707,9 @@ void EW_Test_EnBoom(void) } /* @brief 起爆 -@param0 采样超时 -@param1 起爆电流AD -@param2 延迟采样 +@param0 采样超时 0.01ms +@param1 起爆电流AD +@param2 延迟采样ms */ void EW_Test_Boom() @@ -814,6 +819,147 @@ void EW_Test_PowerOFF(void) + + + + +/* +@brief 写三码数据 +*/ +void EW_Test_WriteUID(void) +{ + uint8_t uc_rtv = 0; + if(JQXT_Test_IsNeedBind() == 0) + { + Checker_MaskResult(0,checker_runcfg.task_info.runindex); + return; + } + + memcpy(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len); + EW_RunBuf[checker_runcfg.uid_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len); + uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1); + delay_os_ms(50); + uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1); + delay_os_ms(50); + memcpy(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len); + EW_RunBuf[checker_runcfg.pwd_len] = CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len); + uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1); + delay_os_ms(50); + uc_rtv |= EW_WriteMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1); + + Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex); +} + +/* +@breif 验证写入的三码数据 +*/ +void EW_Test_VerifyUID(void) +{ + uint8_t uc_rtv = 0; + System_State_un state; + //读UID MTP + memset(EW_RunBuf,0,sizeof(EW_RunBuf)); + EW_ReadMTP(checker_runcfg.netid,0x00,EW_RunBuf,checker_runcfg.uid_len+1); + if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len)) + { + uc_rtv = 1; + } + if(0 != memcmp(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len)) + { + uc_rtv = 1; + } + if(uc_rtv > 0) + { + Checker_MaskResult(1,checker_runcfg.task_info.runindex); + return; + } + memset(EW_RunBuf,0,sizeof(EW_RunBuf)); + EW_ReadMTP(checker_runcfg.netid,0x20,EW_RunBuf,checker_runcfg.uid_len+1); + if(EW_RunBuf[checker_runcfg.uid_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.uid_len)) + { + uc_rtv = 1; + } + if(0 != memcmp(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len)) + { + uc_rtv = 1; + } + if(uc_rtv > 0) + { + Checker_MaskResult(2,checker_runcfg.task_info.runindex); + return; + } + + //读PWD MTP + memset(EW_RunBuf,0,sizeof(EW_RunBuf)); + EW_ReadMTP(checker_runcfg.netid,0x04,EW_RunBuf,checker_runcfg.pwd_len+1); + if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len)) + { + uc_rtv = 1; + } + if(0 != memcmp(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len)) + { + uc_rtv = 1; + } + if(uc_rtv > 0) + { + Checker_MaskResult(3,checker_runcfg.task_info.runindex); + return; + } + memset(EW_RunBuf,0,sizeof(EW_RunBuf)); + EW_ReadMTP(checker_runcfg.netid,0x24,EW_RunBuf,checker_runcfg.pwd_len+1); + if(EW_RunBuf[checker_runcfg.pwd_len] != CheckCRC_8(EW_RunBuf,checker_runcfg.pwd_len)) + { + uc_rtv = 1; + } + if(0 != memcmp(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len)) + { + uc_rtv = 1; + } + if(uc_rtv > 0) + { + Checker_MaskResult(4,checker_runcfg.task_info.runindex); + return; + } + + //读UID + memset(EW_RunBuf,0,sizeof(EW_RunBuf)); + uc_rtv = EW_ReadUID(checker_runcfg.netid,EW_RunBuf,checker_runcfg.uid_len); + if(0 != memcmp(EW_RunBuf,checker_runcfg.writeuid,checker_runcfg.uid_len)) + { + uc_rtv = 1; + } + if(uc_rtv > 0) + { + Checker_MaskResult(5,checker_runcfg.task_info.runindex); + return; + } + //验证PWD + memcpy(EW_RunBuf,checker_runcfg.writepwd,checker_runcfg.pwd_len); + delay_ms(200); + uc_rtv = EW_VerfyPWD(checker_runcfg.netid,EW_RunBuf,checker_runcfg.pwd_len); + if(uc_rtv > 0) + { + Checker_MaskResult(6,checker_runcfg.task_info.runindex); + return; + } + //读状态 + delay_ms(200); + uc_rtv = EW_ReadState(checker_runcfg.netid,(uint8_t*)state.datas); +// if(uc_rtv > 0 || state.State_st.erprom_error >0 || state.State_st.pswd_flag == 0) + if(uc_rtv > 0 || state.State_st.pswd_flag == 0) + { + Checker_MaskResult(7,checker_runcfg.task_info.runindex); + return; + } + Checker_MaskResult(0,checker_runcfg.task_info.runindex); +} + + + + + + + void EW_Empty(void) { Checker_RunCfg_st *cfg=&checker_runcfg; @@ -863,6 +1009,10 @@ EW_Updata, //27 升级 EW_Test_ChgEnergy, //28 充能统计 CheckerExt_CalcErr, //29 计算异常 CheckerExt_Repeat, //30 重新执行一次指定任务 +EW_Test_WriteUID, //31 写入三码数据 +EW_Test_VerifyUID, //32 验证三码数据 +CheckerExt_SetUID, //33 配置三码数据到小板 +CheckerExt_Slot, //34 任务插槽 (void*)0 //数组结束 }; diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index 33c9efc..8d4fccf 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-12-13 13:46:48" +#define BUILD_DATE "2023-12-18 18:02:16" #define SOFT_VERSION "2.08" diff --git a/source/task/mod_signals.c b/source/task/mod_signals.c index c582cdf..f8bbca4 100644 --- a/source/task/mod_signals.c +++ b/source/task/mod_signals.c @@ -4,6 +4,7 @@ #include "prot_mcu.h" #include "prot_uc.h" #include "transmit.h" +#include "tran_for_broadcast.h" #include "tran_for_coder2ch.h" #include "tran_for_slave.h" diff --git a/source/task/tran_for_broadcast.c b/source/task/tran_for_broadcast.c new file mode 100644 index 0000000..7e6d804 --- /dev/null +++ b/source/task/tran_for_broadcast.c @@ -0,0 +1,202 @@ +#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(offdata,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(offslot_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_currpack_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) + + + + + + + + + + + + + + + + + diff --git a/source/task/tran_for_broadcast.h b/source/task/tran_for_broadcast.h new file mode 100644 index 0000000..ed792de --- /dev/null +++ b/source/task/tran_for_broadcast.h @@ -0,0 +1,18 @@ + +#ifndef tran_for_broadcast_h__ +#define tran_for_broadcast_h__ + + + + + + + + + + + +#endif + + +