与上位机测试通过

This commit is contained in:
ranchuan
2023-06-14 18:05:04 +08:00
parent 2396796578
commit 2e705692b7
19 changed files with 82 additions and 117 deletions

View File

@@ -90,4 +90,11 @@
注码指令自动回读结果
2023.6.13
适配3码互转算法
2023.6.14
与上位机联测检测和赋码指令通过
串口在任何情况下都可以运行命令行
需求:
赋码无论成功失败都返回3码数据
流水号相同的命令直接返回上次的返回结果
命令不存在,命令参数错误,设备忙,返回错误码
波特率、命令返回格式、小板起始地址可配置

View File

@@ -71,9 +71,9 @@ static int coder_calc_year(const char *year,const char shell_year,char *uid_year
// 此时year-1来保证与uid码上的相同
if(year[3]!=shell_year)
y--;
uid_year[1]=y%100/10+'0';
uid_year[0]=y%10+'0';
if(uid_year[0]==shell_year)
uid_year[0]=y%100/10+'0';
uid_year[1]=y%10+'0';
if(uid_year[1]==shell_year)
return 0;
else
return -1;
@@ -131,7 +131,7 @@ int coder_uid_to_save(const char *uid_code,uint8_t *save_code)
save_code[3]=ymd&0xff;
feature=uid_code[10]*10000;
feature+=coder_strint_to_byte(&uid_code[11],3)*100;
feature+=coder_strint_to_byte(&uid_code[13],2);
feature+=coder_strint_to_byte(&uid_code[14],2);
save_code[4]=feature>>16;
save_code[5]=feature>>8;
save_code[6]=feature&0xff;

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-06-13 17:34:13"
#define BUILD_DATE "2023-06-14 15:49:07"

View File

@@ -42,6 +42,7 @@ int main()
app_init();
protu_def *protu=app_variable("protu",0,0);
protu_def *protu2=app_variable("protu2",0,0);
tran_def *tran=app_variable("tran",0,0);
void *cmd=app_variable("cmd",0,0);
void *udp=app_variable("udp",0,0);
@@ -52,8 +53,8 @@ int main()
connect(udp,udp_recv_signal,0,cmd,cmd_recv_slot);
connect(cmd,cmd_reply_signal,0,udp,udp_reply_call);
connect(protu,protu_recv_signal,0,cmd,cmd_recv_slot);
connect(cmd,cmd_reply_signal,0,protu,protu_send_call);
connect(protu2,protu_recv_signal,0,cmd,cmd_recv_slot);
connect(cmd,cmd_reply_signal,0,protu2,protu_send_call);
//DBG_LOG("询预压");
//DBG_LOG("我知道");

View File

@@ -8,7 +8,8 @@ import prebuild as time
# 定义app和boot文件路径(没有尾缀)
APP_FILE_SRC = "./Objects/app/checker_gen1_app"
BOOT_FILE_SRC = "./Objects/app/checker_gen1_boot"
APP_FILE_DST = "./Objects/checker_gen1_app"
# APP_FILE_DST = "./Objects/checker_gen1_app"
APP_FILE_DST = "./python/file/checker_gen1_app"
BOOT_FILE_DST = "./Objects/checker_gen1_boot"

View File

@@ -77,4 +77,3 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f

View File

@@ -250,9 +250,8 @@ static inline int str_is_empty_char(char c)
* 判断字符串是否是可打印,是返回1,不是返回0
*
*/
int str_is_print_str(const char *str)
int str_is_print_str(const char *str,int len)
{
int len=str_len(str);
for(int i=0;i<len;i++)
{
// 既不是空白字符也不是可打印字符

View File

@@ -20,7 +20,7 @@ list_def *str_split(const char *s,char c);/*temp_ptr*/
list_def *str_atod_list(const char *s, char c);/*temp_ptr*/
char *str_simplified(const char *str);/*temp_ptr*/
char *str_duplicate(char *p);
int str_is_print_str(const char *str);
int str_is_print_str(const char *str,int len);

View File

@@ -41,7 +41,7 @@ static commend_def *cmd_find(char *name)
void cmd_recv_slot(void *obj,uint8_t cmd,array_def *data,char *err_str)
void cmd_recv_slot(void *obj,const char *coder,uint8_t cmd,array_def *data,char *err_str)
{
self_def *s=&g_self;
commend_def *commd;

View File

@@ -41,7 +41,7 @@ int cmd_print(const char *fmt,...);
signal cmd_reply_signal(void *obj,uint8_t cmd,array_def *data);
void cmd_recv_slot(void *obj,uint8_t cmd,array_def *data,char *err_str);
void cmd_recv_slot(void *obj,const char *codec_name,uint8_t cmd,array_def *data,char *err_str);

View File

@@ -151,7 +151,7 @@ static int code(list_def *argv)
}
commend_export(code,code,"write uidcode to slave,uid_len=10,pw_len=4")
commend_export(code,code,"write uidcode to slave,uid_len=8,pw_len=4")

View File

@@ -154,13 +154,14 @@ signal_export(coder2_live_send_signal);
void tran_send_signal(tran_def *p,uint8_t cmd,array_def *data)
{
uint32_t param[2];
param[0]=(uint32_t)cmd;
void tran_send_signal(tran_def *p,uint8_t cmd,array_def *data)
{
uint32_t param[2];
param[0]=(uint32_t)cmd;
param[1]=(uint32_t)data;
_signal_emit(p,tran_send_signal,param,2);
}
signal_export(tran_send_signal);

View File

@@ -201,6 +201,16 @@ static int protu_init(void)
const sys_param_def *par=sys_param();
protu_def *protu=protu_creat(dev_get(par->host_if));
app_variable("protu",protu,0);
// 如果通信接口不是用的串口,则增加一个串口的通信
if(strcmp(par->host_if,"uart4")==0)
{
app_variable("protu2",protu,0);
}else
{
protu_def *protu2=protu_creat(dev_get("uart4"));
app_variable("protu2",protu2,0);
}
return 0;
}
app_init_export(protu_init)
@@ -237,7 +247,7 @@ protu_def *protu_creat(uart_def *uart)
int protu_send(protu_def *p,array_def *data)
{
//DBG_LOG("send:%s",str_temp(arr_string(data)));
DBG_LOG("send:%s",str_temp(arr_string(data)));
return p->uart->write(p->uart,arr_data(data),arr_length(data));
}
@@ -297,13 +307,14 @@ array_def *protu_decode_str(protu_def *p,array_def *data)
DBG_LOG("decode for command");
str_set(p->str_err,"ok");
p->cmd=0;
arr_append(data,0);
if(str_is_print_str((const char *)arr_data(data))==1)
if(str_is_print_str((const char *)arr_data(data),arr_length(data))==1)
{
arr_append(data,0);
arr_appends_from(r,data);
}else{
DBG_WARN("data not a string");
str_set(p->str_err,"not string");
//arr_remove(data,arr_length(data)-1,1);
}
return r;
}
@@ -320,6 +331,7 @@ array_def *protu_encode_str(protu_def *p,array_def *data)
}
protuc_codec_export(string,protu_decode_str,protu_encode_str);

View File

@@ -48,15 +48,9 @@ static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *e
w->ack_num++;
d[0]=addr-1;
d[1]=ack;
if(ack==0)
{
memcpy(&d[2],w->item[addr-1].shell_code,13);
memcpy(&d[2+13],w->item[addr-1].uid_code,16);
memcpy(&d[2+13+16],w->item[addr-1].password,8);
}else{
// 失败的数据全部填充'0'
memset(&d[2],'0',37);
}
memcpy(&d[2],w->item[addr-1].shell_code,13);
memcpy(&d[2+13],w->item[addr-1].uid_code,16);
memcpy(&d[2+13+16],w->item[addr-1].password,8);
if(w->ack_num>=10)
{
array_def *a=arr_creat();
@@ -95,7 +89,7 @@ static void write_del(ucport_def *u)
static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
{
if(arr_length(data)<242){
if(arr_length(data)<140+4+1){
DBG_WARN("cmd format err.");
return 0;
}
@@ -105,16 +99,25 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
u->u.doend=write_uid_end;
u->addrs_num=arr_get(data,0);
memcpy(u->year,arr_data(data)+1,4);
DBG_LOG("coder, year=%s",u->year);
// 数据固定140字节如果不检测某通道则该通道填充占位符
uint8_t *d_off=arr_data(data)+4+1;
uint8_t *d_;
for(int i=0;i<10;i++)
{
memcpy(u->item[i].shell_code,arr_data(data)+1+i*14,14);
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);
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);
// 生成密码
GetPasswordByUidCode((uint8_t *)u->item[i].uid_code,&u->item[i].uid_pw_hex[8]);
d_=u->item[i].uid_pw_hex;
DBG_LOG("slave:%d, uid_pw=%02X %02X %02X %02X %02X %02X %02X %02X "
"%02X %02X %02X %02X ",i,d_[0],d_[1],d_[2],d_[3],d_[4],d_[5],d_[6],d_[7],
d_[8],d_[9],d_[10],d_[11]);
// 生成密码字符串
sprintf(u->item[i].password,"%02X%02X%02X%02X",u->item[i].uid_pw_hex[8],
u->item[i].uid_pw_hex[9],u->item[i].uid_pw_hex[10],u->item[i].uid_pw_hex[11]);
@@ -191,56 +194,11 @@ static void write_uid2_end(ucport_def *u,port_mcu *src,void *data,int ack,char *
static ucport_def *write_uid2(tran_def *t, uint8_t cmd,array_def *data)
{
if(arr_length(data)<242){
DBG_WARN("cmd format err.");
return 0;
}
write_uid_def *u=calloc(1,sizeof(write_uid_def));
u->u.p=t;
u->u.del=write_del;
u->u.doend=write_uid2_end;
u->addrs_num=arr_get(data,0);
memcpy(u->year,arr_data(data)+1,4);
// 数据固定140字节如果不检测某通道则该通道填充占位符
for(int i=0;i<10;i++)
write_uid_def *u=(write_uid_def *)write_uid(t,cmd,data);
if(u)
{
memcpy(u->item[i].shell_code,arr_data(data)+1+i*14,14);
// 生成uid码
coder_shell_to_uid(u->year,u->item[i].shell_code,u->item[i].uid_code);
// 生成存储码
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]);
// 生成密码字符串
sprintf(u->item[i].password,"%02X%02X%02X%02X",u->item[i].uid_pw_hex[8],
u->item[i].uid_pw_hex[9],u->item[i].uid_pw_hex[10],u->item[i].uid_pw_hex[11]);
u->u.doend=write_uid2_end;
}
// 默认失败
for(int i=0;i<10;i++)
{
u->ack[i*39+0]=i;
u->ack[i*39+1]=1;
}
tran_set_busy(t,1);
for(int i=0;i<10;i++)
{
if(1){
port_mcu *mcu=tran_get_portm(u->u.p,i);
// 这里打开赋码操作
if(mcu){
port_start(mcu,code_creat(8,4,u->item[i].uid_pw_hex));
}
}
}
array_def *a=arr_creat();
arr_append(a,u->addrs_num);
arr_append(a,0);
emit tran_reply_signal(u->u.p,arr_temp(a));
// test:稍后返回成功
//later_execute(write_uid_return_ok,u,500);
return (ucport_def *)u;
}

View File

@@ -46,7 +46,7 @@ static void udp_thread(void *arg)
arr_appends(arr,data,len);
arr_append(arr,0);
// 字符数据命令字为0
emit udp_recv_signal(s,0,arr_temp(arr),"ok");
emit udp_recv_signal(s,"string",0,arr_temp(arr),"ok");
} while (netbuf_next(s->buf) >= 0);
netbuf_delete(s->buf);
}

View File

@@ -9,7 +9,7 @@
signal udp_recv_signal(void *obj,uint8_t cmd,array_def *data,char *err_str);
signal udp_recv_signal(void *obj,const char *codec_name,uint8_t cmd,array_def *data,char *err_str);
void udp_reply_call(void *obj,uint8_t cmd,array_def *data);