proc.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "proc.h"
  2. #include "includes.h"
  3. #include "lora.h"
  4. msg_rcv_info_t msg_rcv_info;
  5. //接收存储数据初始化
  6. void msg_rcv_info_init(void)
  7. {
  8. memset(&msg_rcv_info,0,sizeof(msg_rcv_info_t));
  9. }
  10. //接收网关命令的返回
  11. 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)
  12. {
  13. uint16_t p_crc;
  14. p_msg->frame_header = 0xfefe;
  15. p_msg->proto_Ver = protver;
  16. p_msg->msg_id = msg_id;
  17. p_msg->first_type = first;
  18. p_msg->second_type = second;
  19. p_msg->msg_len = len+2;//后面加两字节的CRC
  20. p_crc = CRC16_get((uint8_t *)p_msg,p_msg->msg_len+FRAME_HEADER_LEN-2);
  21. p_msg->info[len] = p_crc&0xff;
  22. p_msg->info[len+1] = (p_crc>>8)&0xff;
  23. lora_queue_insert(SYS_LORA_TX,(char *)p_msg, FRAME_HEADER_LEN + len+2);
  24. data_dump("lora send",(uint8_t *)p_msg,FRAME_HEADER_LEN + len+2);
  25. }
  26. //透传上行返回
  27. void transparent_up_ver3_return(uint8_t state, uint8_t *data, uint16_t len)
  28. {
  29. collect_gateway_msg_format_t p_msg;
  30. transparent_up_3_t *p_tax = (transparent_up_3_t *)p_msg.info;
  31. p_tax->first_type = msg_rcv_info.first_device_type;
  32. p_tax->first_sn = msg_rcv_info.first_device_sn;
  33. p_tax->des_type = device_info.device_type;
  34. p_tax->des_sn = device_info.device_sn;
  35. p_tax->tax_no = msg_rcv_info.tax_no;
  36. p_tax->status = state;
  37. if(state == UART_SUCCESS)
  38. {
  39. p_tax->data_len = len;
  40. memcpy(p_tax->data,data,len);
  41. }
  42. else
  43. {
  44. p_tax->data_len = 0;
  45. }
  46. 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);
  47. }
  48. //透传下行处理
  49. void transparent_down_ver3_proc(uint8_t *data, uint16_t len)
  50. {
  51. uint8_t gunstatus;
  52. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  53. transparent_down_3_t *p_tax = (transparent_down_3_t *)p_msg->info;
  54. if(device_type_and_id_cmp_NoBroadcast(p_tax->des_type,p_tax->des_sn))
  55. {
  56. 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);
  57. msg_rcv_info_init();
  58. memcpy((uint8_t *)&msg_rcv_info,data,FRAME_HEADER_LEN);
  59. msg_rcv_info.first_device_type = p_tax->first_type;
  60. msg_rcv_info.first_device_sn = p_tax->first_sn;
  61. msg_rcv_info.tax_no = p_tax->tax_no;
  62. if((p_tax->tax_no!=1) && (p_tax->tax_no!=2) && (p_tax->tax_no!=7))
  63. {
  64. timeout_stop(&lora_comm_info.uart_timeout);//关闭串口超时
  65. transparent_up_ver3_return(TAX_GUN_ERR,NULL,0);
  66. msg_rcv_info_init();
  67. return;
  68. }
  69. if((p_tax->tax_no == 1) || (p_tax->tax_no == 2))//读报税口
  70. {
  71. msg_rcv_info.uart = UART4_ID+p_tax->tax_no-1;
  72. gunstatus = Gun_Signal_Check_all();//抬枪状态,有抬枪不读报税口
  73. if(gunstatus)
  74. {
  75. timeout_stop(&lora_comm_info.uart_timeout);//关闭串口超时
  76. transparent_up_ver3_return(TAX_BUSY,NULL,0);
  77. msg_rcv_info_init();
  78. return;
  79. }
  80. }
  81. else if(p_tax->tax_no == 7)//读显示屏
  82. {
  83. msg_rcv_info.uart = UART_485;
  84. }
  85. //打开串口超时
  86. timeout_setValue(&lora_comm_info.uart_timeout,UART_TIMEOUT_TIMER,1);
  87. if(p_tax->data_len > BUSINESS_DATA_LEN)//透传的数据长度太长
  88. {
  89. printf("uart send data too long\n");
  90. return;
  91. }
  92. uart_msg_send(msg_rcv_info.uart, (char *)p_tax->data,p_tax->data_len);
  93. printf("uart:%d, tax:%d\n",msg_rcv_info.uart+1,msg_rcv_info.tax_no);
  94. data_dump("uart send", (uint8_t *)p_tax->data,p_tax->data_len);
  95. }
  96. }
  97. //版本问询上行返回
  98. void prot_up_ver_return(void)
  99. {
  100. collect_gateway_msg_format_t p_msg;
  101. prot_check_up_t *p_tax = (prot_check_up_t *)p_msg.info;
  102. p_tax->first_type = msg_rcv_info.first_device_type;
  103. p_tax->first_sn = msg_rcv_info.first_device_sn;
  104. p_tax->des_type = device_info.device_type;
  105. p_tax->des_sn = device_info.device_sn;
  106. p_tax->reserve = 0;
  107. p_tax->prover = PROTOCOL_VERSION_3;
  108. 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);
  109. }
  110. //版本问询下行处理
  111. void prot_down_ver_proc(uint8_t *data, uint16_t len)
  112. {
  113. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  114. prot_check_down_t *p_tax = (prot_check_down_t *)p_msg->info;
  115. if(device_type_and_id_cmp_NoBroadcast(p_tax->rcv_type,p_tax->rcv_sn))
  116. {
  117. 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);
  118. msg_rcv_info_init();
  119. memcpy((uint8_t *)&msg_rcv_info,data,FRAME_HEADER_LEN);
  120. msg_rcv_info.first_device_type = p_tax->first_type;
  121. msg_rcv_info.first_device_sn = p_tax->first_sn;
  122. if(device_type_and_id_cmp_NoBroadcast(p_tax->des_type,p_tax->des_sn))//读采集器的
  123. {
  124. prot_up_ver_return();
  125. msg_rcv_info_init();
  126. }
  127. else if(p_tax->des_type == XSP_0904)//读显示屏
  128. {
  129. msg_rcv_info.uart = UART_485;
  130. //打开串口超时
  131. timeout_setValue(&lora_comm_info.uart_timeout,UART_TIMEOUT_TIMER,1);
  132. uart_msg_send(msg_rcv_info.uart, (char *)data,len);
  133. data_dump("xsp send", (uint8_t *)data,len);
  134. }
  135. }
  136. }
  137. //3.0版本系统类处理函数
  138. void lora_system_ver3_handle(uint8_t *data, uint16_t len)
  139. {
  140. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  141. switch(p_msg->second_type)
  142. {
  143. case SECOND_SYSTEM_TRANS_DOWN://透传下行
  144. transparent_down_ver3_proc(data,len);
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. //3.0版本lora处理函数
  151. void coll_rcv_lora_ver3_handle(uint8_t *data, uint16_t len)
  152. {
  153. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  154. switch(p_msg->first_type)
  155. {
  156. case FIRST_SYSTEM_TYPE://系统类
  157. lora_system_ver3_handle(data,len);
  158. break;
  159. default:
  160. break;
  161. }
  162. }
  163. ////////////////////////////////////////////////////////////////
  164. //读协议版本
  165. void coll_rcv_lora_verff_handle(uint8_t *data, uint16_t len)
  166. {
  167. collect_gateway_msg_format_t *p_msg = (collect_gateway_msg_format_t *)data;
  168. switch(p_msg->first_type)
  169. {
  170. case FIRST_SYSTEM_TYPE://系统类
  171. if(p_msg->second_type == SECOND_SYSTEM_PROT_DOWN)//读协议版本
  172. {
  173. prot_down_ver_proc(data,len);
  174. }
  175. break;
  176. }
  177. }