| @@ -20,15 +20,49 @@ | ||||
|  | ||||
|  | ||||
|  | ||||
| #define PORT_NUM    2 | ||||
|  | ||||
|  | ||||
| typedef struct _tran_def{ | ||||
|   ucport_def *u; | ||||
|   port_mcu *port[PORT_NUM]; | ||||
|   uint32_t slave_online;// 对应位为1则从机在线 | ||||
|   int is_busy; | ||||
| }tran_def; | ||||
|  | ||||
|  | ||||
|  | ||||
| // 打印从机状态 | ||||
| static void tran_print_slave_stat(void *t) | ||||
| { | ||||
|   list_def *l=list_creat_int(); | ||||
|   uint32_t a=tran_get_slave_online(t); | ||||
|   for(int i=0;i<PORT_NUM;i++) | ||||
|   { | ||||
|     if(a&(1<<i)){ | ||||
|       list_append_int(l,i+1); | ||||
|     } | ||||
|   } | ||||
|   DBG_LOG("slave online stat:%s",str_temp(list_string(l))); | ||||
|   //DBG_LOG("slave online stat:%08x",a); | ||||
|   list_delete(l); | ||||
| } | ||||
|  | ||||
|  | ||||
| // 扫描从机 | ||||
| static void tran_scan_slave(void *t) | ||||
| { | ||||
|   for(int i=0;i<PORT_NUM;i++) | ||||
|   { | ||||
|     // 只给在线设备升级方案 | ||||
|     port_mcu *mcu=tran_get_portm(t,i); | ||||
|     if(mcu&&(tran_get_slave_online(t)&(1<<i))){ | ||||
|       // f9用于获取运行状态,失败则设备不在线 | ||||
|       port_start(mcu,usercmd_creat(0xf9,arr_temp(arr_creat()))); | ||||
|     } | ||||
|   } | ||||
|   later_execute(tran_print_slave_stat,t,5500); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -37,18 +71,27 @@ static int tran_init(void) | ||||
| { | ||||
|   sig_thread t=thread_creat(10); | ||||
|   tran_def *tran= tran_creat(t); | ||||
|   tran->slave_online=0xfffff; | ||||
|   app_variable("tran",tran,0); | ||||
|   later_execute(tran_scan_slave,tran,500); | ||||
|   return 0; | ||||
| } | ||||
| app_init_export(tran_init); | ||||
|  | ||||
|  | ||||
| void tran_end_slot(tran_def *obj,void *src,void *data,int ack,char *err_str); | ||||
| void tran_end_slot(tran_def *obj,port_mcu *src,void *data,int ack,char *err_str); | ||||
|  | ||||
| tran_def *tran_creat(sig_thread t) | ||||
| { | ||||
|   tran_def *tr=calloc(1,sizeof(tran_def)); | ||||
|   param_check(tr); | ||||
|   port_init(); | ||||
|   for(int i=0;i<PORT_NUM;i++) | ||||
|   { | ||||
|     tr->port[i]=port_creat(i+1,t); | ||||
|     // 连接操作结束信号 | ||||
|     connect(tr->port[i],port_end_signal,0,tr,tran_end_slot); | ||||
|   } | ||||
|   return tr; | ||||
| } | ||||
|  | ||||
| @@ -90,16 +133,33 @@ void tran_recv_slot(tran_def *t,const char *codec_name,uint8_t cmd,array_def *da | ||||
|   } | ||||
| } | ||||
|  | ||||
| void tran_set_slave_online(tran_def *t,uint8_t addr,int stat) | ||||
| { | ||||
|   param_check(t); | ||||
|   uint32_t a=0; | ||||
|   a=1<<(addr-1); | ||||
|   if(stat) | ||||
|     t->slave_online|=a; | ||||
|   else{ | ||||
|     t->slave_online&=(~a); | ||||
|     //DBG_LOG("a=%08x",a); | ||||
|   } | ||||
| } | ||||
| uint32_t tran_get_slave_online(tran_def *t) | ||||
| { | ||||
|   param_check(t); | ||||
|   return t->slave_online; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void tran_end_slot(tran_def *obj,void *src,void *data,int ack,char *err_str) | ||||
| void tran_end_slot(tran_def *obj,port_mcu *src,void *data,int ack,char *err_str) | ||||
| { | ||||
|   //DBG_LOG("tran end slot"); | ||||
|   param_check(obj); | ||||
|   if(strcmp(err_str,"timeout")==0) | ||||
|   { | ||||
|     tran_set_slave_online(obj,port_get_addr(src),0); | ||||
|   }else{ | ||||
|     tran_set_slave_online(obj,port_get_addr(src),1); | ||||
|   } | ||||
|   if((obj->u)&&obj->u->doend) | ||||
|     obj->u->doend(obj->u,src,data,ack,err_str); | ||||
| @@ -115,7 +175,13 @@ int tran_get_busy(tran_def *t) | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| // 获取指定通道 | ||||
| port_mcu *tran_get_portm(tran_def *t,int index) | ||||
| { | ||||
|   if(index<0||index>=PORT_NUM) | ||||
|     return 0; | ||||
|   return t->port[index]; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -308,6 +374,13 @@ static void when_scheme_done(ucport_def *u) | ||||
|   DBG_LOG("memused:%d",mem_perused()); | ||||
|   rt_thread_mdelay(100); | ||||
|   DBG_LOG("memused:%d",mem_perused()); | ||||
|   for(int i=0;i<PORT_NUM;i++) | ||||
|   { | ||||
|     // 只给在线设备升级方案 | ||||
|     port_mcu *mcu=tran_get_portm(tran,i); | ||||
|     if(mcu&&(tran_get_slave_online(tran)&(1<<i))) | ||||
|       port_start(mcu,updata_scheme_creat(check_scheme()->slave_data,2048)); | ||||
|   } | ||||
| } | ||||
| static ucport_def *tran_scheme(tran_def *t, uint8_t cmd,array_def *data) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 andy
					andy