Files
checker_slave/source/task/tran_for_coder.c

129 lines
2.3 KiB
C

#include "tran_for_coder.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 "PSDGenerate.h"
#include "mystring.h"
#include "coder_judge.h"
#include "JQ_UIDGenerate.h"
#include "transmit.h"
#include "elec_judge.h"
#include "elec_task_slot.h"
#include "elec_det.h"
typedef struct{
ucport_def u;
char uid_code[20];
uint8_t save_code[12];
uint8_t psw[10];
char psw_ascii[10];
}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;
free(u);
}
// 赋码仪 注码使用xt算法
static int code_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
slave_def *s=(slave_def *)u;
uint8_t *d=arr_data(data);
if(d[0]!=1){
// 只支持1个通道
return 1;
}
if(check_shell_code((const char *)&d[6])==0){
// 管壳码无效
return 2;
}
if(coder_shell_to_uid((const char *)&d[1],(const char *)&d[6],s->uid_code)!=0){
// uid校验失败
return 3;
}
{
array_def *r=arr_creat();
arr_append(r,1);
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
}
coder_uid_to_save(s->uid_code,s->save_code);
GetPasswordByUidCode((const uint8_t *)s->uid_code,s->psw);
sprintf(s->psw_ascii,"%02X%02X%02X%02X",
s->psw[0],s->psw[1],s->psw[2],s->psw[3]);
array_def *uid_psw=arr_creat();
arr_append(uid_psw,8);
arr_append(uid_psw,4);
arr_append(uid_psw,1);
arr_appends(uid_psw,s->save_code,8);
arr_appends(uid_psw,s->psw,4);
array_def *r=elec_check_with_scheme(uid_psw);
arr_delete(uid_psw);
if(r){
array_def *ret=arr_creat();
arr_append(ret,1);
arr_append(ret,1);
arr_append(ret,arr_get(r,0));
arr_appends(ret,&d[6],13);
arr_appends(ret,s->uid_code,16);
arr_appends(ret,s->psw_ascii,8);
emit tran_send_signal(u->p,0x82,arr_temp(ret));
}
return 0;
}
static ucport_def *code(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=code_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_checker,0x02,code)