添加任务插槽,未写完

This commit is contained in:
andy
2023-12-10 11:13:41 +08:00
parent 5f29fc2010
commit aeb0e4c206
10 changed files with 249 additions and 21 deletions

View File

@@ -282,3 +282,6 @@
使用定时器来精确控制数据发送的时间间隙,保证和其他小板不冲突
2023.12.7
广播命令根据数据量自动计算发送数据的窗口时间
2023.12.10
添加任务插槽,未写完

View File

@@ -27,6 +27,16 @@
#include "interface/CheckerExt.h"
/*
此文件定义了电子模块与外界软件程序交互的接口
*/
#define PLAN_MAX_TASK 64
#define TASK_PAR_BACK_LEN 10

View File

@@ -377,8 +377,8 @@ void elec_judge(elec_judge_def *e,int task_num,uint8_t *exe_ack,
for(int i=0;i<task_num;i++)
{
// 只判定已执行的任务
task=&e->scheme->task[i];
if(BIT_CHECK(exe_flag,i)){
task=&e->scheme->task[i];
if(task->taskid<e->judge_fun_num){
e->judge_fun_table[task->taskid](e,i,data);
}else if((task->taskid>=CHECKER_MAXID_COUNT)&&

View File

@@ -0,0 +1,130 @@
#include "elec_task_slot.h"
#include "board.h"
#include "stdlib.h"
#include "string.h"
/*
此文件定义动态任务插入的机制
*/
#define ERR_TABLE_SIZE 10
typedef struct _task_node{
task_def task;
struct _task_node *next;
}task_node;
typedef struct{
int node_num;
task_node *head;
task_node *current;
int err_num;
uint8_t err_table[ERR_TABLE_SIZE]
}task_slot_def;
void task_slot_delete(void)
{
task_slot_def *t=app_variable("task_slot",0,0);
if(t){
task_node *n=t->head;
task_node *old=0;
while(n){
old=n;
n=n->next;
free(old);
}
free(t);
}
}
// 初始化
void *task_slot_init(void)
{
task_slot_def *t=app_variable("task_slot",0,0);
if(t==0){
t=calloc(1,sizeof(task_slot_def));
app_variable("task_slot",t,0);
}
return t;
}
// 添加一个任务
int task_slot_add_item(void *context,task_def *item)
{
task_slot_def *t=context;
if(t==0){
return -1;
}
task_node **n=&t->head;
task_node *tail;
tail=calloc(1,sizeof(task_node));
memcpy(tail,item,sizeof(task_node));
while(*n){
n=&(*n)->next;
}
(*n)=tail;
return 0;
}
// 找到下一个slot
task_def *task_slot_next(void *context,uint8_t slot_index)
{
task_slot_def *t=context;
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;
}
}
return 0;
}
int task_slot_add_err(void *context,uint8_t err)
{
task_slot_def *t=context;
if(t==0){
return -1;
}
int index=-1;
for(int i=0;i<ERR_TABLE_SIZE;i++){
if(t->err_table[i]==0){
if(index<0) index=i;
}
if(t->err_table[i]==err){
return;
}
}
if(index>=0){
t->err_table[index]=err;
t->err_num++;
return 0;
}
return -2;
}

View File

@@ -0,0 +1,30 @@
#ifndef elec_task_slot_h__
#define elec_task_slot_h__
#include "board.h"
#pragma pack (1)
typedef struct{
uint8_t slot_index;
uint8_t task_id;
uint8_t par_count;// 参数个数
uint8_t ret_count;// 返回值个数
uint8_t errcode;
uint8_t params[20];
uint8_t rets[20];
}task_def;
#pragma pack ()
void *task_slot_init(void);
int task_slot_add_item(void *context,task_def *item);
task_def *task_slot_next(void *context,uint8_t slot_index);
int task_slot_add_err(void *context,uint8_t err);
#endif

View File

@@ -5,6 +5,7 @@
#include "CheckerExt.h"
#include "basechecker.h"
#include "elec_det.h"
#include "elec_task_slot.h"
@@ -117,7 +118,57 @@ static int calc_skip_num(int index)
}
/*rc{
执行动态插入的任务,
找到此插槽的所有动态任务并依次执行,如未找到则直接返回
par0:要执行的任务插槽
return:无
exe:动态插入的任务执行失败则此任务失败
}*/
void CheckerExt_Slot(void)
{
int index;
uint16_t ret=0;
int self_index=checker_runcfg.task_info.runindex;
if(checker_runcfg.param_count<1){
ret=1;
goto end;
}
index=checker_runcfg.params[0];
task_def *t=0;
void *task_slot=task_slot_init();
if(task_slot==0){
goto end;
}
if(elec_task_env_back()){
ret=2;
goto end;
}
while(t=task_slot_next(task_slot,(uint8_t)index),t){
// t->
}
if(elec_task_env_restore()){
ret=5;
goto end;
}
end:
Checker_MaskResult(ret,self_index);
}
CheckerTask exttaskArray[CHECKER_EXTID_COUNT]={
CheckerExt_CalcErr,
CheckerExt_Repeat,
};

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-12-08 08:46:40"
#define BUILD_DATE "2023-12-09 12:34:57"
#define SOFT_VERSION "2.07"