#include "proc.h" #include "includes.h" #include "lora.h" msg_rcv_info_t msg_rcv_info; //接收存储数据初始化 void msg_rcv_info_init(void) { memset(&msg_rcv_info,0,sizeof(msg_rcv_info_t)); } //接收网关命令的返回 void gateway_msg_return_ver(collect_gateway_msg_format_t *p_msg, uint8_t protver, uint32_t msg_id, uint8_t first, uint16_t second, uint16_t len) { uint16_t p_crc; p_msg->frame_header = 0xfefe; p_msg->proto_Ver = protver; p_msg->msg_id = msg_id; p_msg->first_type = first; p_msg->second_type = second; p_msg->msg_len = len+2;//后面加两字节的CRC p_crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2); p_msg->info[len] = p_crc&0xff; p_msg->info[len+1] = (p_crc>>8)&0xff; lora_queue_insert(SYS_LORA_TX,(char *)p_msg, FRAME_HEADER_LEN + len+2); data_dump("lora send",(uint8_t *)p_msg,FRAME_HEADER_LEN + len+2); } //透传上行返回 void transparent_up_ver3_return(uint8_t state, uint8_t *data, uint16_t len) { collect_gateway_msg_format_t p_msg; transparent_up_3_t *p_tax = (transparent_up_3_t *)p_msg.info; p_tax->first_type = msg_rcv_info.first_device_type; p_tax->first_sn = msg_rcv_info.first_device_sn; p_tax->des_type = device_info.device_type; p_tax->des_sn = device_info.device_sn; p_tax->tax_no = msg_rcv_info.tax_no; p_tax->status = state; if(state == UART_SUCCESS) { p_tax->data_len = len; memcpy(p_tax->data,data,len); } else { p_tax->data_len = 0; } gateway_msg_return_ver(&p_msg,msg_rcv_info.proto_Ver,msg_rcv_info.msg_id,msg_rcv_info.first_type,SECOND_SYSTEM_TRANS_UP,TRANSP_UP_HEADER_LEN+p_tax->data_len); } //透传下行处理 void transparent_down_ver3_proc(uint8_t *data, uint16_t len) { uint8_t gunstatus; collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; transparent_down_3_t *p_tax = (transparent_down_3_t *)p_msg->info; if(device_type_and_id_cmp_NoBroadcast(p_tax->des_type,p_tax->des_sn)) { printf("first:%02x,second:%04x, des_type:%04x,des_sn:%u\n",p_msg->first_type,p_msg->second_type,p_tax->des_type,p_tax->des_sn); msg_rcv_info_init(); memcpy((uint8_t *)&msg_rcv_info,data,FRAME_HEADER_LEN); msg_rcv_info.first_device_type = p_tax->first_type; msg_rcv_info.first_device_sn = p_tax->first_sn; msg_rcv_info.tax_no = p_tax->tax_no; if((p_tax->tax_no!=1) && (p_tax->tax_no!=2) && (p_tax->tax_no!=7)) { timeout_stop(&lora_comm_info.uart_timeout);//关闭串口超时 transparent_up_ver3_return(TAX_GUN_ERR,NULL,0); msg_rcv_info_init(); return; } if((p_tax->tax_no == 1) || (p_tax->tax_no == 2))//读报税口 { msg_rcv_info.uart = UART4_ID+p_tax->tax_no-1; gunstatus = Gun_Signal_Check_all();//抬枪状态,有抬枪不读报税口 if(gunstatus) { timeout_stop(&lora_comm_info.uart_timeout);//关闭串口超时 transparent_up_ver3_return(TAX_BUSY,NULL,0); msg_rcv_info_init(); return; } } else if(p_tax->tax_no == 7)//读显示屏 { msg_rcv_info.uart = UART_485; } //打开串口超时 timeout_setValue(&lora_comm_info.uart_timeout,UART_TIMEOUT_TIMER,1); if(p_tax->data_len > BUSINESS_DATA_LEN)//透传的数据长度太长 { printf("uart send data too long\n"); return; } uart_msg_send(msg_rcv_info.uart, (char *)p_tax->data,p_tax->data_len); printf("uart:%d, tax:%d\n",msg_rcv_info.uart+1,msg_rcv_info.tax_no); data_dump("uart send", (uint8_t *)p_tax->data,p_tax->data_len); } } //版本问询上行返回 void prot_up_ver_return(void) { collect_gateway_msg_format_t p_msg; prot_check_up_t *p_tax = (prot_check_up_t *)p_msg.info; p_tax->first_type = msg_rcv_info.first_device_type; p_tax->first_sn = msg_rcv_info.first_device_sn; p_tax->des_type = device_info.device_type; p_tax->des_sn = device_info.device_sn; p_tax->reserve = 0; p_tax->prover = PROTOCOL_VERSION_3; gateway_msg_return_ver(&p_msg,msg_rcv_info.proto_Ver,msg_rcv_info.msg_id,msg_rcv_info.first_type,SECOND_SYSTEM_PROT_UP,PROT_UP_HEADER_LEN); } //版本问询下行处理 void prot_down_ver_proc(uint8_t *data, uint16_t len) { collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; prot_check_down_t *p_tax = (prot_check_down_t *)p_msg->info; if(device_type_and_id_cmp_NoBroadcast(p_tax->rcv_type,p_tax->rcv_sn)) { printf("first:%02x,second:%04x, des_type:%04x,des_sn:%u\n",p_msg->first_type,p_msg->second_type,p_tax->des_type,p_tax->des_sn); msg_rcv_info_init(); memcpy((uint8_t *)&msg_rcv_info,data,FRAME_HEADER_LEN); msg_rcv_info.first_device_type = p_tax->first_type; msg_rcv_info.first_device_sn = p_tax->first_sn; if(device_type_and_id_cmp_NoBroadcast(p_tax->des_type,p_tax->des_sn))//读采集器的 { prot_up_ver_return(); msg_rcv_info_init(); } else if(p_tax->des_type == XSP_0904)//读显示屏 { msg_rcv_info.uart = UART_485; //打开串口超时 timeout_setValue(&lora_comm_info.uart_timeout,UART_TIMEOUT_TIMER,1); uart_msg_send(msg_rcv_info.uart, (char *)data,len); data_dump("xsp send", (uint8_t *)data,len); } } } //3.0版本系统类处理函数 void lora_system_ver3_handle(uint8_t *data, uint16_t len) { collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; switch(p_msg->second_type) { case SECOND_SYSTEM_TRANS_DOWN://透传下行 transparent_down_ver3_proc(data,len); break; default: break; } } //3.0版本lora处理函数 void coll_rcv_lora_ver3_handle(uint8_t *data, uint16_t len) { collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; switch(p_msg->first_type) { case FIRST_SYSTEM_TYPE://系统类 lora_system_ver3_handle(data,len); break; default: break; } } //////////////////////////////////////////////////////////////// //读协议版本 void coll_rcv_lora_verff_handle(uint8_t *data, uint16_t len) { collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data; switch(p_msg->first_type) { case FIRST_SYSTEM_TYPE://系统类 if(p_msg->second_type == SECOND_SYSTEM_PROT_DOWN)//读协议版本 { prot_down_ver_proc(data,len); } break; } }