#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,arr_get(data,0),"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;i0){ cmd_print("data=%s",str_temp(arr_string(data))); } return 0; } commend_export(code,code,"write uidcode to slave,uid_len=8,pw_len=4")