适配3码互转算法

This commit is contained in:
ranchuan
2023-06-13 18:10:21 +08:00
parent 077c27f2bb
commit 2396796578
14 changed files with 2114 additions and 1250 deletions

View File

@@ -55,7 +55,7 @@ static void code_dolater(handle_def *h,uint8_t src,uint8_t cmd,array_def *data,c
port_set_busy(h->p,0);
port_timer_stop(h->p);
DBG_LOG("slave:%d, start failed",port_get_addr(h->p));
emit port_end_signal(h->p,h->p,0,0,"start failed");
emit port_end_signal(h->p,h->p,0,-1,"start failed");
}
}else if(cmd==0x18)
{

View File

@@ -8,18 +8,27 @@
#include "prot_uc.h"
#include "handle_for_coder.h"
#include "handle_for_checker.h"
#include "coder_lib.h"
#include "PSDGenerate.h"
// 这个文件解析跟赋码仪相关的命令
typedef struct{
ucport_def u;
uint8_t addrs_num;
char year[10];
char uid[10][20];
uint8_t ack[380];
struct{
char shell_code[20];
char uid_code[20];
char password[10];
uint8_t uid_pw_hex[15];
}item[10];
uint8_t ack[390];
uint8_t ack_num;
void (*doexert)(ucport_def *u);
}write_uid_def;
@@ -35,14 +44,25 @@ static void write_uid_end(ucport_def *u,port_mcu *src,void *data,int ack,char *e
DBG_WARN("addr err:%d",addr);
return;
}
w->ack[addr-1]=ack;
uint8_t *d=&w->ack[(addr-1)*39];
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);
}
if(w->ack_num>=10)
{
array_def *a=arr_creat();
arr_append(a,w->addrs_num);
arr_appends(a,w->ack,380);
emit tran_send_signal(w->u.p,0x81,arr_temp(a));
arr_appends(a,w->ack,390);
emit tran_send_signal(w->u.p,0x82,arr_temp(a));
tran_set_busy(w->u.p,0);
}
}
@@ -60,9 +80,9 @@ static void write_uid_return_ok(void *p)
{
arr_append(a,i);
arr_append(a,0);
arr_append_num(a,36,0);
arr_append_num(a,37,'0');
}
emit tran_send_signal(u->u.p,0x81,arr_temp(a));
emit tran_send_signal(u->u.p,0x82,arr_temp(a));
tran_set_busy(u->u.p,0);
}
@@ -88,13 +108,22 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
// 数据固定140字节如果不检测某通道则该通道填充占位符
for(int i=0;i<10;i++)
{
memcpy(u->uid[i],arr_data(data)+1+i*14,14);
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]);
}
// 默认失败
for(int i=0;i<10;i++)
{
u->ack[i*38+0]=i;
u->ack[i*38+1]=1;
u->ack[i*39+0]=i;
u->ack[i*39+1]=1;
}
tran_set_busy(t,1);
for(int i=0;i<10;i++)
@@ -103,7 +132,7 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
port_mcu *mcu=tran_get_portm(u->u.p,i);
// 这里打开赋码操作
if(mcu){
//port_start(mcu,code_creat(15,8,&u->uid[i]));
port_start(mcu,code_creat(8,4,u->item[i].uid_pw_hex));
}
}
}
@@ -114,7 +143,7 @@ static ucport_def *write_uid(tran_def *t, uint8_t cmd,array_def *data)
emit tran_reply_signal(u->u.p,arr_temp(a));
// test:稍后返回成功
later_execute(write_uid_return_ok,u,500);
//later_execute(write_uid_return_ok,u,500);
return (ucport_def *)u;
}
@@ -124,6 +153,101 @@ transmit_export(ym_checker,0x02,write_uid)
// 复检完成
static void write_uid2_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str)
{
write_uid_def *w=(write_uid_def *)u;
uint8_t addr=port_get_addr(src);
if(addr<=0||addr>10){
DBG_WARN("addr err:%d",addr);
return;
}
uint8_t *d=&w->ack[(addr-1)*39];
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);
}
if(w->ack_num>=10)
{
array_def *a=arr_creat();
arr_append(a,w->addrs_num);
for(int i=0;i<10;i++)
{
uint8_t *d=&w->ack[i*39];
arr_appends(a,d,2);
}
emit tran_send_signal(w->u.p,0x83,arr_temp(a));
tran_set_busy(w->u.p,0);
}
}
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++)
{
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]);
}
// 默认失败
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;
}
// 复检,与注码动作相同,但返回值不同
transmit_export(ym_checker,0x03,write_uid2)
@@ -152,8 +276,10 @@ static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_s
return;
}
uint8_t *ack_d=&w->ack[(addr-1)*6];
ack_d[0]=addr-1;
ack_d[1]=ack;
// TODO: 还有4字节数据
w->ack_num++;
if(w->ack_num>=10)
{
@@ -216,9 +342,9 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
if(1){
port_mcu *mcu=tran_get_portm(u->u.p,i);
// 这里打开检测
// if(mcu){
// port_start(mcu,check_creat(check_scheme()));
// }
if(mcu){
port_start(mcu,check_creat(check_scheme()));
}
}
}
@@ -229,7 +355,7 @@ static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data)
emit tran_reply_signal(u->u.p,arr_temp(a));
// test:稍后返回成功
later_execute(check_return_ok,u,500);
//later_execute(check_return_ok,u,500);
return (ucport_def *)u;
}