添加错误代码
This commit is contained in:
@@ -121,4 +121,9 @@
|
||||
第一次出现下载程序到一半,参数错误重启的情况
|
||||
2023.6.26
|
||||
批检仪完成整个检测流程测试,编写测试脚本,把检测结果保存到csv文件
|
||||
|
||||
2023.6.28
|
||||
修改方案结构体,可以进行错误判断
|
||||
必须按下按键才响应开始检测命令,
|
||||
设备忙时按下按键不会发送请求检测命令
|
||||
电机步数可以配置,默认22000步
|
||||
解决不插网线会导致程序重启的bug
|
||||
|
@@ -74,6 +74,7 @@ typedef struct{
|
||||
int uartbsp;// 串口4的波特率
|
||||
int coder_ret_mode;// 注码指令返回格式
|
||||
int slave_addr_start;// 小板起始地址
|
||||
int moter_max_count;// 电机最大步数
|
||||
}sys_param_def;
|
||||
|
||||
|
||||
@@ -82,6 +83,22 @@ int flash_save_param(sys_param_def *par);
|
||||
const sys_param_def *sys_param(void);
|
||||
|
||||
|
||||
__packed
|
||||
typedef struct{
|
||||
uint32_t max;
|
||||
uint32_t min;
|
||||
uint32_t err;
|
||||
}scheme_range_def;
|
||||
|
||||
|
||||
|
||||
__packed
|
||||
typedef struct
|
||||
{
|
||||
uint32_t item_num;
|
||||
uint32_t err;
|
||||
scheme_range_def range[16];
|
||||
}scheme_task_def;
|
||||
|
||||
// 方案参数
|
||||
__packed
|
||||
@@ -89,12 +106,8 @@ typedef struct{
|
||||
uint8_t slave_data[2048];
|
||||
uint32_t plan_id;
|
||||
uint32_t timeout_m;
|
||||
uint32_t range_num;
|
||||
__packed
|
||||
struct{
|
||||
uint32_t max;
|
||||
uint32_t min;
|
||||
}range[0];
|
||||
uint32_t task_num;
|
||||
scheme_task_def task[0];
|
||||
}scheme_def;
|
||||
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
|
||||
#define BUILD_DATE "2023-06-26 10:46:21"
|
||||
#define BUILD_DATE "2023-06-28 18:04:06"
|
||||
#define SOFT_VERSION "0.01"
|
||||
|
||||
|
||||
|
@@ -102,17 +102,24 @@ commend_export(test,test,"cmd test")
|
||||
static int scheme_info(list_def *argv)
|
||||
{
|
||||
const scheme_def *s=check_scheme();
|
||||
const scheme_task_def *t;
|
||||
if(s->plan_id==0xffffffff){
|
||||
cmd_print("scheme is empty.");
|
||||
return -1;
|
||||
}
|
||||
cmd_print("plan id: %d",s->plan_id);
|
||||
cmd_print("timeout_m: %d",s->timeout_m);
|
||||
cmd_print("range num: %d",s->range_num);
|
||||
for(int i=0;i<s->range_num;i++)
|
||||
cmd_print("task num: %d",s->task_num);
|
||||
for(int i=0;i<s->task_num;i++)
|
||||
{
|
||||
cmd_print(" max:%5d, min:%5d %s",s->range[i].max,s->range[i].min,
|
||||
s->range[i].max<s->range[i].min?"err":"ok");
|
||||
t=&s->task[i];
|
||||
cmd_print(" task:%02d err:%02x",i,t->err);
|
||||
for(int j=0;j<t->item_num;j++)
|
||||
{
|
||||
cmd_print(" max:%5d, min:%5d err:%02x %s",t->range[j].max,t->range[j].min,
|
||||
t->err,
|
||||
t->range[j].max<t->range[j].min?"err":"ok");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -228,6 +235,7 @@ static void print_sys_param(const sys_param_def *par)
|
||||
cmd_print("uart bsp: %d",par->uartbsp);
|
||||
cmd_print("coder ret mode: %d",par->coder_ret_mode);
|
||||
cmd_print("slave_addr_start: %d",par->slave_addr_start);
|
||||
cmd_print("moter_max_count: %d",par->moter_max_count);
|
||||
}
|
||||
|
||||
|
||||
@@ -265,6 +273,7 @@ static void print_sys_help(void)
|
||||
cmd_print("set uartbsp 115200");
|
||||
cmd_print("set codermode 1/0");
|
||||
cmd_print("set slave_addr_start 1/0");
|
||||
cmd_print("set moter_max_count 0~30000");
|
||||
cmd_print("set save");
|
||||
}
|
||||
|
||||
@@ -387,6 +396,12 @@ static int sys_set(list_def *argv)
|
||||
spar->slave_addr_start=str_atoi(str);
|
||||
cmd_print("slave addr start: %d",spar->slave_addr_start);
|
||||
}
|
||||
else if(strcmp(list_get_str(argv,1),"moter_max_count")==0)
|
||||
{
|
||||
char *str=list_get_str(argv,2);
|
||||
spar->moter_max_count=str_atoi(str);
|
||||
cmd_print("moter_max_count: %d",spar->moter_max_count);
|
||||
}
|
||||
else{
|
||||
cmd_print("unknown cmd for sysset.");
|
||||
print_sys_help();
|
||||
|
@@ -188,7 +188,7 @@ void *realloc(void *p,size_t size)
|
||||
|
||||
|
||||
|
||||
#define MEM_TEMP_PTR_NUM 400
|
||||
#define MEM_TEMP_PTR_NUM 800
|
||||
typedef void (*del_fun_def)(void *t);
|
||||
|
||||
typedef struct{
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include "prot_uc.h"
|
||||
#include "key.h"
|
||||
#include "mystdlib.h"
|
||||
#include "transmit.h"
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +17,9 @@
|
||||
typedef struct{
|
||||
int inited;
|
||||
int run;
|
||||
int input;
|
||||
int input_lock;
|
||||
void *tran;
|
||||
}self_def;
|
||||
|
||||
|
||||
@@ -26,36 +30,37 @@ static void request_check(void *p);
|
||||
static void key_thread(void *arg)
|
||||
{
|
||||
self_def *s=arg;
|
||||
gpioin_def *in1,*in2,*in3,*in4;
|
||||
int input=0,input_lock=1;
|
||||
gpioin_def *in1;
|
||||
in1=dev_get("gpioin1");
|
||||
in2=dev_get("gpioin2");
|
||||
in3=dev_get("gpioin3");
|
||||
in4=dev_get("gpioin4");
|
||||
in1->init(in1);
|
||||
in2->init(in2);
|
||||
in3->init(in3);
|
||||
in4->init(in4);
|
||||
|
||||
s->input=0;
|
||||
s->input_lock=1;
|
||||
|
||||
while (s->run)
|
||||
{
|
||||
rt_thread_mdelay(20);
|
||||
//input=(in1->state(in1))|(in2->state(in2)<<1)|(in3->state(in3)<<2)|(in4->state(in4)<<3);
|
||||
input=(in1->state(in1));
|
||||
if(input!=input_lock)
|
||||
s->input=(in1->state(in1));
|
||||
if(s->input!=s->input_lock)
|
||||
{
|
||||
DBG_LOG("key=%08X",input);
|
||||
input_lock=input;
|
||||
if((input&1)==0)
|
||||
DBG_LOG("key=%08X",s->input);
|
||||
s->input_lock=s->input;
|
||||
if((s->input&1)==0)
|
||||
{
|
||||
request_check(s);
|
||||
// 主机交互存在且非忙的时候才发送请求
|
||||
if(s->tran&&(tran_get_busy(s->tran)==0))
|
||||
request_check(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 获取实时按键状态,1按下
|
||||
int key_pressed(void)
|
||||
{
|
||||
self_def *s=&g_self;
|
||||
return !s->input;
|
||||
}
|
||||
|
||||
|
||||
// cmd=0x37
|
||||
@@ -81,7 +86,11 @@ static void init_later(void *t)
|
||||
DBG_WARN("can not fond variable \"protu\"");
|
||||
}
|
||||
}
|
||||
|
||||
static void init_tran(void *t)
|
||||
{
|
||||
self_def *s=t;
|
||||
s->tran=app_variable("tran",0,0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -95,6 +104,7 @@ static int init_thread(void)
|
||||
rt_thread_t rt_t=rt_thread_create("key_t",key_thread,s,1024,15,20);
|
||||
rt_thread_startup(rt_t);
|
||||
app_valid_call("protu",init_later,s);
|
||||
app_valid_call("tran",init_tran,s);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@ signal key_send_signal(void *obj,uint8_t cmd,array_def *data);
|
||||
|
||||
|
||||
|
||||
int key_pressed(void);
|
||||
|
||||
|
||||
|
||||
|
@@ -64,10 +64,11 @@ static void log_thread(void *arg)
|
||||
else
|
||||
{
|
||||
DBG_LOG("udp:err=%d",err);
|
||||
//netconn_close(conn);
|
||||
//netconn_delete(conn);
|
||||
rt_thread_mdelay(1000);
|
||||
}
|
||||
}
|
||||
netconn_close(conn);
|
||||
netconn_delete(conn);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -96,7 +96,7 @@ void moter_down(void (*fun)(void *t),void *t)
|
||||
s->fun_in_end=fun;
|
||||
s->t=t;
|
||||
}
|
||||
moter_start(0,MOTER_MAX_COUNT-s->count);
|
||||
moter_start(0,s->max_count-s->count);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ص<EFBFBD>
|
||||
@@ -177,8 +177,13 @@ int init_moter(void)
|
||||
pwm->set_irq_fun(pwm,end_irq,s);
|
||||
s->pwm=pwm;
|
||||
s->stat=INITING;
|
||||
s->count=MOTER_MAX_COUNT;
|
||||
s->max_count=MOTER_MAX_COUNT;
|
||||
if((par->moter_max_count>25000)||(par->moter_max_count<1000))
|
||||
{
|
||||
s->max_count=MOTER_MAX_COUNT;
|
||||
}else{
|
||||
s->max_count=par->moter_max_count;
|
||||
}
|
||||
s->count=s->max_count;
|
||||
s->event=rt_event_create("moter_e",RT_IPC_FLAG_FIFO);
|
||||
s->inited=1;
|
||||
s->run=1;
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#include "compiler_info.h"
|
||||
#include "dev_backup.h"
|
||||
#include "moter.h"
|
||||
|
||||
#include "key.h"
|
||||
|
||||
|
||||
|
||||
@@ -25,24 +25,43 @@ typedef struct{
|
||||
}check_def;
|
||||
|
||||
|
||||
|
||||
// 计算方案有多少个范围参数
|
||||
static int calc_range_num(void)
|
||||
{
|
||||
const scheme_def *s=check_scheme();
|
||||
const scheme_task_def *t;
|
||||
int index=0;
|
||||
for(int i=0;i<s->task_num;i++)
|
||||
{
|
||||
t=&s->task[i];
|
||||
index+=t->item_num;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
// 判断检测数据是否超限,返回填充的字节个数
|
||||
static int in_range(const uint8_t *src_data,uint8_t *range)
|
||||
{
|
||||
const scheme_def *s=check_scheme();
|
||||
const scheme_task_def *t;
|
||||
int temp;
|
||||
for(int i=0;i<s->range_num;i++)
|
||||
int index=0;
|
||||
for(int i=0;i<s->task_num;i++)
|
||||
{
|
||||
temp=src_data[i*2]|(src_data[i*2+1]<<8);
|
||||
if(temp>=s->range[i].min&&temp<=s->range[i].max){
|
||||
range[i/8]&=~(1<<(i%8));
|
||||
}else{
|
||||
range[i/8]|=(1<<(i%8));
|
||||
t=&s->task[i];
|
||||
for(int j=0;j<t->item_num;j++)
|
||||
{
|
||||
temp=src_data[index*2]|(src_data[index*2+1]<<8);
|
||||
if(temp>=t->range[j].min&&temp<=t->range[j].max){
|
||||
range[index/8]&=~(1<<(index%8));
|
||||
}else{
|
||||
range[index/8]|=(1<<(index%8));
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
DBG_LOG("range_num=%d, ",s->range_num);
|
||||
return (s->range_num+7)/8;
|
||||
DBG_LOG("range_num=%d, ",index);
|
||||
return (index+7)/8;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +87,7 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s
|
||||
// 返回参数校验,跳过8字节的流程执行位
|
||||
ack_d+=in_range(arr_data(data)+8+8,ack_d);
|
||||
// 复制返回参数,跳过8字节的流程执行位
|
||||
memcpy(ack_d,arr_data(data)+8+8,check_scheme()->range_num*2);
|
||||
memcpy(ack_d,arr_data(data)+8+8,calc_range_num()*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -131,7 +150,7 @@ static void check_when_moter_down(void *t)
|
||||
|
||||
static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int return_size=(check_scheme()->range_num*2+8+(check_scheme()->range_num+7)/8);
|
||||
int return_size=(calc_range_num()*2+8+(calc_range_num()+7)/8);
|
||||
check_def *u=calloc(1,sizeof(check_def)+return_size*20);
|
||||
u->ret_skip=return_size;
|
||||
u->ack_size=return_size*20;
|
||||
@@ -140,10 +159,15 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
|
||||
u->u.dolater=check_dolater;
|
||||
u->u.doend=check_end;
|
||||
DBG_LOG("check: skip=%d",u->ret_skip);
|
||||
tran_set_busy(t,1);
|
||||
moter_down(check_when_moter_down,u);
|
||||
array_def *a=arr_creat();
|
||||
arr_append(a,0);
|
||||
if(key_pressed())
|
||||
{
|
||||
tran_set_busy(t,1);
|
||||
moter_down(check_when_moter_down,u);
|
||||
arr_append(a,TRAN_ERR_NONE);
|
||||
}else{
|
||||
arr_append(a,TRAN_ERR_STEP);
|
||||
}
|
||||
emit tran_reply_signal(u->u.p,arr_temp(a));
|
||||
|
||||
return (ucport_def *)u;
|
||||
|
@@ -17,6 +17,13 @@
|
||||
|
||||
|
||||
|
||||
typedef struct{
|
||||
int step;// 检测注码顺序
|
||||
}self_def;
|
||||
|
||||
static self_def g_self;
|
||||
|
||||
|
||||
// 从机地址偏移
|
||||
static inline int slave_addr_off(void)
|
||||
{
|
||||
@@ -85,6 +92,7 @@ static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *e
|
||||
}
|
||||
emit tran_send_signal(w->u.p,0x82,arr_temp(a));
|
||||
tran_set_busy(w->u.p,0);
|
||||
g_self.step=0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,6 +113,7 @@ static void write_uid_return_ok(void *p)
|
||||
}
|
||||
emit tran_send_signal(u->u.p,0x82,arr_temp(a));
|
||||
tran_set_busy(u->u.p,0);
|
||||
g_self.step=0;
|
||||
}
|
||||
|
||||
|
||||
@@ -120,6 +129,7 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
|
||||
DBG_WARN("cmd format err.");
|
||||
return 0;
|
||||
}
|
||||
int ret=0;
|
||||
write_uid_def *u=calloc(1,sizeof(write_uid_def));
|
||||
u->u.p=t;
|
||||
u->u.del=write_del;
|
||||
@@ -135,10 +145,10 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
|
||||
memcpy(u->item[i].shell_code,d_off+i*14+1,13);
|
||||
DBG_LOG("slave:%d, shell=%s",i,u->item[i].shell_code);
|
||||
// 生成uid码
|
||||
coder_shell_to_uid(u->year,u->item[i].shell_code,u->item[i].uid_code);
|
||||
ret|=coder_shell_to_uid(u->year,u->item[i].shell_code,u->item[i].uid_code);
|
||||
DBG_LOG("slave:%d, uid=%s",i,u->item[i].uid_code);
|
||||
// 生成存储码
|
||||
coder_uid_to_save(u->item[i].uid_code,u->item[i].uid_pw_hex);
|
||||
ret|=coder_uid_to_save(u->item[i].uid_code,u->item[i].uid_pw_hex);
|
||||
// 生成密码
|
||||
GetPasswordByUidCode((uint8_t *)u->item[i].uid_code,&u->item[i].uid_pw_hex[8]);
|
||||
d_=u->item[i].uid_pw_hex;
|
||||
@@ -155,6 +165,8 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
|
||||
u->ack[i*39+0]=i+slave_addr_off();
|
||||
u->ack[i*39+1]=1;
|
||||
}
|
||||
|
||||
|
||||
tran_set_busy(t,1);
|
||||
for(int i=0;i<10;i++)
|
||||
{
|
||||
@@ -169,7 +181,14 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
|
||||
|
||||
array_def *a=arr_creat();
|
||||
arr_append(a,u->addrs_num);
|
||||
arr_append(a,0);
|
||||
if(g_self.step==1){
|
||||
if(ret==0)
|
||||
arr_append(a,TRAN_ERR_NONE);
|
||||
else
|
||||
arr_append(a,TRAN_ERR_PARAM);
|
||||
}else{
|
||||
arr_append(a,TRAN_ERR_STEP);
|
||||
}
|
||||
emit tran_reply_signal(u->u.p,arr_temp(a));
|
||||
|
||||
// test:稍后返回成功
|
||||
@@ -236,6 +255,45 @@ transmit_export(ym_checker,0x03,write_uid2)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 判断检测数据错误码
|
||||
// 返回 errcode,1=param/0=execute,taskindex,paramindex
|
||||
static uint32_t in_range_err(const uint8_t *src_data,const uint8_t *errbit)
|
||||
{
|
||||
const scheme_def *s=check_scheme();
|
||||
const scheme_task_def *t;
|
||||
int temp;
|
||||
int index=0;
|
||||
uint32_t ret=0;
|
||||
for(int i=0;i<s->task_num;i++)
|
||||
{
|
||||
t=&s->task[i];
|
||||
if((errbit[i/8]&(1<<(i%8)))!=0)
|
||||
{
|
||||
ret=(t->err&0xff)|(i<<16);
|
||||
return ret;
|
||||
}
|
||||
for(int j=0;j<t->item_num;j++)
|
||||
{
|
||||
temp=src_data[index*2]|(src_data[index*2+1]<<8);
|
||||
if(temp>=t->range[j].min&&temp<=t->range[j].max){
|
||||
// 正常
|
||||
}else{
|
||||
ret=(t->range[j].err&0xff)|(1<<8)|(i<<16)|(j<<24);
|
||||
return ret;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct{
|
||||
ucport_def u;
|
||||
uint8_t addrs_num;
|
||||
@@ -258,10 +316,16 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s
|
||||
}
|
||||
addr-=1;
|
||||
|
||||
uint32_t errcode=0;
|
||||
uint8_t *ack_d=&w->ack[(addr)*6];
|
||||
ack_d[0]=addr+slave_addr_off();
|
||||
ack_d[1]=ack;
|
||||
// TODO: 还有4字节数据
|
||||
errcode=in_range_err(arr_data(data)+8+8,arr_data(data));
|
||||
ack_d[2]=errcode&0xff;
|
||||
ack_d[3]=(errcode>>8)&0xff;
|
||||
ack_d[4]=(errcode>>16)&0xff;
|
||||
ack_d[5]=(errcode>>24)&0xff;
|
||||
|
||||
w->ack_num++;
|
||||
if(w->ack_num>=10)
|
||||
@@ -272,6 +336,7 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s
|
||||
arr_appends(a,w->ack,(6)*10);
|
||||
emit tran_send_signal(w->u.p,0x81,arr_temp(a));
|
||||
tran_set_busy(w->u.p,0);
|
||||
g_self.step=1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,6 +357,7 @@ static void check_return_ok(void *p)
|
||||
}
|
||||
emit tran_send_signal(u->u.p,0x81,arr_temp(a));
|
||||
tran_set_busy(u->u.p,0);
|
||||
g_self.step=1;
|
||||
}
|
||||
|
||||
|
||||
@@ -335,7 +401,7 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
|
||||
array_def *a=arr_creat();
|
||||
arr_append(a,u->addrs_num);
|
||||
arr_append(a,u->type);
|
||||
arr_append(a,0);
|
||||
arr_append(a,TRAN_ERR_NONE);
|
||||
emit tran_reply_signal(u->u.p,arr_temp(a));
|
||||
|
||||
// test:稍后返回成功
|
||||
|
@@ -116,6 +116,9 @@ void tran_recv_slot(tran_def *t,const char *codec_name,uint8_t cmd,array_def *da
|
||||
DBG_LOG("tran init");
|
||||
if(tran_get_busy(tr)){
|
||||
DBG_WARN("ucport is busy.");
|
||||
array_def *d=arr_creat();
|
||||
arr_append(d,TRAN_ERR_BUSY);
|
||||
emit tran_send_signal(tr,cmd,arr_temp(d));
|
||||
return;
|
||||
}
|
||||
CHECK_DO(tr->u,tr->u->del);
|
||||
|
@@ -5,6 +5,18 @@
|
||||
#include "handle.h"
|
||||
#include "signal.h"
|
||||
|
||||
|
||||
|
||||
// 错误码定义
|
||||
#define TRAN_ERR_NONE 0x00
|
||||
#define TRAN_ERR_BUSY 0x01
|
||||
#define TRAN_ERR_PARAM 0x02
|
||||
#define TRAN_ERR_STEP 0x03
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
struct _tran_def;
|
||||
typedef struct _tran_def tran_def;
|
||||
|
||||
|
Reference in New Issue
Block a user