Files
checker_gen1/source/task/handle_for_coder.c
2023-06-13 18:10:21 +08:00

165 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "handle.h"
#include "mystdlib.h"
#include "board.h"
#include "debug.h"
#include "transmit.h"
#include "commend.h"
#include "mystring.h"
// 这个文件实现与赋码仪相关的操作
typedef struct{
handle_def h;
uint8_t uid_size;
uint8_t pw_size;
uint8_t data[24];
}code_def;
static void code_start(handle_def *h)
{
code_def *c=(code_def *)h;
port_set_busy(h->p,1);
array_def *a=arr_creat();
arr_append(a,c->uid_size);
arr_append(a,c->pw_size);
arr_append(a,0);
arr_appends(a,c->data,c->uid_size+c->pw_size);
list_def *l=list_creat_int();
int cmds[]={0x17};
list_appends(l,cmds,1);
l=list_temp(l);
emit port_send_signal(h->p,port_get_addr(h->p),0x17,l,arr_temp(a),60,5);
}
static void code_dolater(handle_def *h,uint8_t src,uint8_t cmd,array_def *data,char *err_str)
{
if(port_get_busy(h->p)==0) return;
if(cmd==0x17)
{
if(arr_get(data,0)==0)
{
DBG_LOG("slave:%d, code start",port_get_addr(h->p));
list_def *l=list_creat_int();
int cmds[]={0x18};
list_appends(l,cmds,1);
l=list_temp(l);
emit port_send_signal(h->p,port_get_addr(h->p),0x18,l,arr_temp(arr_creat()),60,h->interval/60);
}
else
{
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,-1,"start failed");
}
}else if(cmd==0x18)
{
port_set_busy(h->p,0);
port_timer_stop(h->p);
// 注码比较特殊0x55表示成功
if(arr_get(data,0)==0x55)
{
DBG_LOG("slave:%d, success",port_get_addr(h->p));
emit port_end_signal(h->p,h->p,0,0,"ok");
}
else{
DBG_LOG("slave:%d, code failed.%s",port_get_addr(h->p),str_temp(arr_string(data)));
emit port_end_signal(h->p,h->p,0,-1,"code failed");
}
}
}
static void code_timeout(handle_def *h)
{
// 从机没有指定数目时从这里返回
port_timer_stop(h->p);
port_set_busy(h->p,0);
DBG_WARN("slave:%d,%s timeout.",port_get_addr(h->p), h->name);
emit port_end_signal(h->p,h->p,0,-1,"timeout");
}
// uid_size+pw_size不应大于24
handle_def *code_creat(int uid_size,int pw_size,uint8_t *data)
{
code_def *c=calloc(1,sizeof(code_def));
param_check(c);
if(uid_size+pw_size>24)
{
free(c);
return 0;
}
c->uid_size=uid_size;
c->pw_size=pw_size;
memcpy(c->data,data,c->uid_size+c->pw_size);
handle_def *h=(handle_def *)c;
h->static_=0;// 动态内存这项设置为0
h->start=code_start;
h->dolater=code_dolater;
h->del=(void (*)(handle_def *))free;
h->timeout=code_timeout;
h->interval=10000;
h->name="code";
return h;
}
static int code(list_def *argv)
{
tran_def *tran=app_variable("tran",0,0);
if(tran==0){
DBG_WARN("can not fond variable \"tran\"");
return -1;
}
if(list_length(argv)<3){
cmd_print("param num too less.");
return -1;
}
list_def *addrs=str_atod_list(list_get_str(argv,1),',');
array_def *data=arr_temp(arr_creat());
list_def *dat=str_atod_list(list_get_str(argv,2),',');
for(int i=0;i<list_length(dat);i++){
arr_append(data,list_get_int(dat,i));
}
for(int i=0;i<list_length(addrs);i++)
{
int addr=list_get_int(addrs,i);
port_mcu *mcu=tran_get_portm(tran,addr-1);
if(mcu){
port_start(mcu,code_creat(8,4,arr_data(data)));
}
}
cmd_print("start write uid,addr=%s",str_temp(list_string(addrs)));
if(arr_length(data)>0){
cmd_print("data=%s",str_temp(arr_string(data)));
}
return 0;
}
commend_export(code,code,"write uidcode to slave,uid_len=10,pw_len=4")