| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |  | #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)); | 
					
						
							| 
									
										
										
										
											2023-06-13 18:10:21 +08:00
										 |  |  |  |       emit port_end_signal(h->p,h->p,0,-1,"start failed"); | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  |   }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))); | 
					
						
							| 
									
										
										
										
											2023-06-20 17:58:45 +08:00
										 |  |  |  |       emit port_end_signal(h->p,h->p,0,arr_get(data,0),"code failed"); | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 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; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 18:05:04 +08:00
										 |  |  |  | commend_export(code,code,"write uidcode to slave,uid_len=8,pw_len=4") | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 |