299 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			299 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #include "tran_for_coder.h"
 | |||
|  | #include "debug.h"
 | |||
|  | #include "mymisc.h"
 | |||
|  | #include "mystdlib.h"
 | |||
|  | #include "board.h"
 | |||
|  | #include "dev_flash.h"
 | |||
|  | #include "tcp.h"
 | |||
|  | #include "prot_uc.h"
 | |||
|  | #include "handle_for_coder.h"
 | |||
|  | #include "handle_for_checker.h"
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // 这个文件解析跟赋码仪相关的命令
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | typedef struct{ | |||
|  |   ucport_def u; | |||
|  |   uint16_t addrs; | |||
|  |   uint8_t uid_password[240]; | |||
|  |   uint8_t ack[10]; | |||
|  |   uint8_t ack_num; | |||
|  |   void (*doexert)(ucport_def *u); | |||
|  | }write_uid_def; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // 注码完成槽函数
 | |||
|  | static void write_uid_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; | |||
|  |   } | |||
|  |   w->ack[addr-1]=ack; | |||
|  |   w->ack_num++; | |||
|  |   if(w->ack_num>=10) | |||
|  |   { | |||
|  |     array_def *a=arr_creat(); | |||
|  |     arr_append(a,0); | |||
|  |     arr_append(a,w->addrs&0xff); | |||
|  |     arr_append(a,w->addrs>>8); | |||
|  |     arr_appends(a,w->ack,10); | |||
|  |     emit tran_send_signal(w->u.p,0x81,arr_temp(a)); | |||
|  |     tran_set_busy(w->u.p,0); | |||
|  |   } | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | static void write_uid_return_ok(void *p) | |||
|  | { | |||
|  |   write_uid_def *u=p; | |||
|  |   array_def *a=arr_creat(); | |||
|  |   arr_append(a,0); | |||
|  |   arr_append(a,u->addrs&0xff); | |||
|  |   arr_append(a,u->addrs>>8); | |||
|  |   arr_append_num(a,10,0); | |||
|  |   emit tran_send_signal(u->u.p,0x81,arr_temp(a)); | |||
|  |   tran_set_busy(u->u.p,0); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | static ucport_def *write_uid(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.doend=write_uid_end; | |||
|  |   u->addrs=arr_get(data,0)|(arr_get(data,1)<<8); | |||
|  |   // 数据固定240字节,如果不检测某通道,则该通道填充占位符
 | |||
|  |   memcpy(u->uid_password,arr_data(data)+2,240); | |||
|  |   // 默认失败
 | |||
|  |   memset(u->ack,1,10); | |||
|  |   tran_set_busy(t,1); | |||
|  |   for(int i=0;i<10;i++) | |||
|  |   { | |||
|  |     if(u->addrs&(1<<i)){ | |||
|  |       port_mcu *mcu=tran_get_portm(u->u.p,i); | |||
|  |       // 这里打开赋码操作
 | |||
|  |       if(mcu){ | |||
|  |         port_start(mcu,code_creat(15,8,&u->uid_password[i*24])); | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  |    | |||
|  |   array_def *a=arr_creat(); | |||
|  |   arr_append(a,0); | |||
|  |   arr_append(a,u->addrs&0xff); | |||
|  |   arr_append(a,u->addrs>>8); | |||
|  |   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_coder,0x01,write_uid) | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | typedef struct{ | |||
|  |   ucport_def u; | |||
|  |   uint16_t addrs; | |||
|  |   uint8_t data[5]; | |||
|  |   uint8_t ack[(4+3)*10]; | |||
|  |   uint8_t ack_num; | |||
|  |   void (*doexert)(ucport_def *u); | |||
|  | }check_def; | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // 检测完成槽函数
 | |||
|  | static void check_end(ucport_def *u,port_mcu *src,void *data,int ack,char *err_str) | |||
|  | { | |||
|  |   check_def *w=(check_def *)u; | |||
|  |   uint8_t addr=port_get_addr(src); | |||
|  |   if(addr<=0||addr>10){ | |||
|  |     DBG_WARN("addr err:%d",addr); | |||
|  |     return; | |||
|  |   } | |||
|  |   uint8_t *ack_d=&w->ack[(addr-1)*7]; | |||
|  |   ack_d[2]=ack; | |||
|  |   // TODO: 还有4字节数据
 | |||
|  |   w->ack_num++; | |||
|  |   if(w->ack_num>=10) | |||
|  |   { | |||
|  |     array_def *a=arr_creat(); | |||
|  |     arr_append(a,0); | |||
|  |     arr_append(a,w->addrs&0xff); | |||
|  |     arr_append(a,w->addrs>>8); | |||
|  |     arr_appends(a,w->ack,(4+3)*10); | |||
|  |     emit tran_send_signal(w->u.p,0x81,arr_temp(a)); | |||
|  |     tran_set_busy(w->u.p,0); | |||
|  |   } | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | static void check_return_ok(void *p) | |||
|  | { | |||
|  |   check_def *u=p; | |||
|  |   array_def *a=arr_creat(); | |||
|  |   arr_append(a,0); | |||
|  |   arr_append(a,u->addrs&0xff); | |||
|  |   arr_append(a,u->addrs>>8); | |||
|  |   // 固定返回7*10个字节,如果不检测某通道,则该通道填充占位符
 | |||
|  |   for(int i=0;i<10;i++){ | |||
|  |     arr_append(a,i+1); | |||
|  |     arr_append(a,u->data[0]); | |||
|  |     arr_append(a,0); | |||
|  |     arr_append_num(a,4,0); | |||
|  |   } | |||
|  |   emit tran_send_signal(u->u.p,0x85,arr_temp(a)); | |||
|  |   tran_set_busy(u->u.p,0); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | static ucport_def *check(tran_def *t, uint8_t cmd,array_def *data) | |||
|  | { | |||
|  |   if(arr_length(data)<7){ | |||
|  |     DBG_WARN("cmd format err."); | |||
|  |     return 0; | |||
|  |   } | |||
|  |   check_def *u=calloc(1,sizeof(check_def)); | |||
|  |   u->u.p=t; | |||
|  |   u->u.doend=check_end; | |||
|  |   u->addrs=arr_get(data,0)|(arr_get(data,1)<<8); | |||
|  |   memcpy(u->data,arr_data(data)+2,5); | |||
|  |   // 默认失败
 | |||
|  |   for(int i=0;i<10;i++) | |||
|  |   { | |||
|  |     u->ack[i*7+0]=i+1; | |||
|  |     u->ack[i*7+1]=u->data[0]; | |||
|  |     u->ack[i*7+2]=1; | |||
|  |   } | |||
|  |   tran_set_busy(t,1); | |||
|  |   for(int i=0;i<10;i++) | |||
|  |   { | |||
|  |     if(u->addrs&(1<<i)){ | |||
|  |       port_mcu *mcu=tran_get_portm(u->u.p,i); | |||
|  |       // 这里打开检测
 | |||
|  |       if(mcu){ | |||
|  |         port_start(mcu,check_creat(check_scheme())); | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  |    | |||
|  |   array_def *a=arr_creat(); | |||
|  |   arr_append(a,0); | |||
|  |   arr_append(a,u->addrs&0xff); | |||
|  |   arr_append(a,u->addrs>>8); | |||
|  |   arr_append(a,u->data[0]); | |||
|  |   emit tran_reply_signal(u->u.p,arr_temp(a)); | |||
|  | 
 | |||
|  |   // test:稍后返回成功
 | |||
|  |   later_execute(check_return_ok,u,500); | |||
|  |    | |||
|  |   return (ucport_def *)u; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | transmit_export(ym_coder,0x05,check) | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | typedef struct{ | |||
|  |   rt_timer_t timer; | |||
|  | }live_keeper_def; | |||
|  | 
 | |||
|  | 
 | |||
|  | static void live_connect(live_keeper_def *t) | |||
|  | { | |||
|  |   rt_tick_t tick=0; | |||
|  |   tick=rt_tick_from_millisecond(1000); | |||
|  |   rt_timer_control(t->timer,RT_TIMER_CTRL_SET_TIME,&tick); | |||
|  |   rt_timer_start(t->timer); | |||
|  | } | |||
|  | static void live_recv(live_keeper_def *t) | |||
|  | { | |||
|  |   rt_tick_t tick=0; | |||
|  |   tick=rt_tick_from_millisecond(5000); | |||
|  |   rt_timer_control(t->timer,RT_TIMER_CTRL_SET_TIME,&tick); | |||
|  |   rt_timer_start(t->timer); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | // cmd=9x8a
 | |||
|  | static void live_send(void *p) | |||
|  | { | |||
|  |   const sys_param_def *par=sys_param(); | |||
|  |   array_def *d=arr_creat(); | |||
|  |   arr_append(d,0); | |||
|  |   arr_append(d,0xff); | |||
|  |   arr_append(d,0x03); | |||
|  |   arr_append(d,par->local_id&0xff); | |||
|  |   arr_append(d,0xff);// 在线的小板
 | |||
|  |   arr_append(d,0x03); | |||
|  |   emit coder_live_send_signal(p,0x8a,arr_temp(d)); | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | static void init_for_tcp(void *t) | |||
|  | { | |||
|  |   void *tcp=app_variable("tcp",0,0); | |||
|  |   void *protu=app_variable("protu",0,0); | |||
|  |   if(tcp&&protu){ | |||
|  |     live_keeper_def *live=calloc(1,sizeof(live_keeper_def)); | |||
|  |     live->timer=rt_timer_create("live_t",live_send,live, | |||
|  |       rt_tick_from_millisecond(1000), | |||
|  |       RT_TIMER_FLAG_PERIODIC|RT_TIMER_FLAG_SOFT_TIMER); | |||
|  |     protu_codec_set(protu,protu_find_codec("ym_coder")); | |||
|  |     connect(tcp,tcp_connect_signal,0,live,live_connect); | |||
|  |     connect(tcp,tcp_recv_signal,0,live,live_recv); | |||
|  |     connect(live,coder_live_send_signal,0,protu,protu_send_call); | |||
|  |   }else{ | |||
|  |     DBG_WARN("can not fond variable \"tcp\" or/and \"protu\""); | |||
|  |   } | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | // 如果本机为赋码仪并且连接类型为tcp
 | |||
|  | // 初始化心跳
 | |||
|  | static int init_live_keeper(void) | |||
|  | { | |||
|  |   const sys_param_def *par=sys_param(); | |||
|  |   if((strcmp(par->device_type,"coder")==0)&&(strcmp(par->host_if,"utcp")==0)) | |||
|  |   { | |||
|  |     app_valid_call("protu",init_for_tcp,0); | |||
|  |   } | |||
|  |   return 0; | |||
|  | } | |||
|  | app_init_export(init_live_keeper); | |||
|  | 
 | |||
|  | 
 |