| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #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;
- }
- }
|