hdf.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #include "hdf.h"
  2. void TOUCHUAN_UART_NUM(uint8_t* pTx) ;
  3. void Get_ZN_hdf_data(void) ;
  4. HDF_Inf hdf_inf[SENSOR_DEEP];
  5. Tank_Inf tank_inf;
  6. uint16_t Uart_len_TouChuan= 0;
  7. uint8_t Get_DFState(uint8_t Cang_Num) //查询仓底阀状态
  8. {
  9. HDF_Inf* phdf = hdf_inf;
  10. return !phdf[Cang_Num].HDF_OFData[0];
  11. }
  12. GPIO_PinState Get_Pin(int Pin_No)
  13. {
  14. GPIO_PinState Pin_sts;
  15. switch (Pin_No)
  16. {
  17. case 0:
  18. Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14);
  19. break;
  20. case 1:
  21. Pin_sts = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
  22. break;
  23. case 2:
  24. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6);
  25. break;
  26. case 3:
  27. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7);
  28. break;
  29. case 4:
  30. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
  31. break;
  32. case 5:
  33. Pin_sts = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);
  34. break;
  35. case 6:
  36. Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);
  37. break;
  38. case 7:
  39. Pin_sts = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
  40. break;
  41. default:
  42. break;
  43. }
  44. return Pin_sts;
  45. }
  46. /**
  47. ***************************************
  48. * mcu的IO口采集的一种连续性滤波式的认可机制
  49. * 原理为: 某一代号的管脚的输入电平,连续几次
  50. * 检查都是相同值,才认可检查
  51. * 输入:pinNo, 管脚代号,范围0-7
  52. * 输入:pstatus,存放查询当前的管脚输入值
  53. * 返回: 0-不认可,1-认可
  54. ***************************************
  55. */
  56. int DoPinIoHitSame(uint8_t pinNo, uint8_t *pstatus)
  57. {
  58. uint8_t status = 0;
  59. static struct pin_same {
  60. GPIO_PinState status;
  61. uint16_t same_count;
  62. }pin_cache[8];
  63. if(pinNo > 7) return 0;
  64. status = Get_Pin(pinNo);
  65. *pstatus = status;
  66. if(pin_cache[pinNo].status == status) {
  67. pin_cache[pinNo].same_count++;
  68. if(pin_cache[pinNo].same_count >= cang_inf.pinIOHitSameParam){
  69. pin_cache[pinNo].same_count = 0;
  70. return 1;
  71. }
  72. }else {
  73. pin_cache[pinNo].status = status;
  74. pin_cache[pinNo].same_count = 0;
  75. }
  76. return 0;
  77. }
  78. void DF_State(uint8_t Cang_Num) //查询仓底阀状态
  79. {
  80. Cang_Inf* pcang = &cang_inf;
  81. XYF_Inf* pxyf = xyf_inf;
  82. RKG_Inf* prkg = rkg_inf;
  83. HDF_Inf* phdf = hdf_inf;
  84. uint8_t i = 0,j = 0,HDF_MAX = 3,PinNo;
  85. uint8_t status = 0, hit = 0;
  86. if(pcang->HDF_Type == 0) //底阀监测器
  87. {
  88. if(i < HDF_BUF_DEP)
  89. {
  90. PinNo = 0;
  91. if (pcang->XYF_Type == 2)
  92. //if (pcang->XYF_Type == 0) // 是二合一, 用IO 模拟有油无油状态 for showtable
  93. {
  94. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  95. {
  96. HDF_MAX += pcang->XYF_Num[j];
  97. }
  98. for (j = 0; j < HDF_MAX; ++j)
  99. {
  100. hit = DoPinIoHitSame(PinNo++, &status);
  101. if(hit){
  102. pxyf[j + 1].XYF_State2 = status==0?1:0;
  103. }
  104. }
  105. }
  106. if (pcang->RKG_Type == 2)
  107. {
  108. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  109. {
  110. HDF_MAX += pcang->RKG_Num[j];
  111. }
  112. for (j = 0; j < HDF_MAX; ++j)
  113. {
  114. hit = DoPinIoHitSame(PinNo++, &status);
  115. if(hit){
  116. prkg[1 + j].RKDG_State = status;
  117. }
  118. }
  119. }
  120. for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
  121. {
  122. HDF_MAX += pcang->HDF_Num[j];
  123. }
  124. for (j = 0; j < HDF_MAX; ++j)
  125. {
  126. hit = DoPinIoHitSame(PinNo++, &status);
  127. if(hit){
  128. phdf[1 + j].HDF_OFData[i] = status;
  129. }
  130. }
  131. i++;
  132. }
  133. if(i >= HDF_BUF_DEP)
  134. i = 0;
  135. }
  136. else if(pcang->HDF_Type == 1) //其他底阀监测
  137. {
  138. phdf[1].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14);
  139. phdf[2].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
  140. phdf[3].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6);
  141. phdf[4].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_7);
  142. phdf[5].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
  143. phdf[6].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);
  144. phdf[7].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8);
  145. phdf[8].HDF_OFData[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
  146. /* for(j = 1;j <= HDF_MAX;j++) //SLM HDF_MAX
  147. {
  148. if(phdf[j].HDF_ErrorCnt > phdf->HDF_StateKeepNum)
  149. phdf[j].HDF_Error = 1;
  150. }*/
  151. }
  152. #if 0
  153. // 门磁 & 人脸授权
  154. hit = DoPinIoHitSame(6, &status);
  155. if(hit){
  156. tank_inf.Door_Status = status==0?1:0;
  157. }
  158. hit = DoPinIoHitSame(7, &status);
  159. if(hit){
  160. tank_inf.Facial_Auth = status==0?1:0;
  161. }
  162. #endif
  163. }
  164. void Get_ZN_hdf_data(void)
  165. {
  166. uint8_t receive_error = 0;
  167. // uint16_t ModbusCRC = 0;
  168. // Cang_Inf* pcang = &cang_inf;
  169. HDF_Inf* phdf = hdf_inf;
  170. phdf[USART1_RX_BUF002[0]-0x20].RTData_Num = 1;
  171. if(USART3_RX_BUF002[0]==0x21||USART3_RX_BUF002[0]==0x22)
  172. {
  173. if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性
  174. {
  175. receive_error = 1;
  176. }
  177. /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC
  178. {
  179. receive_error = 0;
  180. }*/
  181. if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回
  182. {
  183. phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0;
  184. phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1;
  185. // if(pcang->HDF_Type == 1)
  186. // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据
  187. phdf[USART3_RX_BUF002[0]-0x20].HDF_OFData[0] = USART3_RX_BUF002[3] ;
  188. // phdf[USART3_RX_BUF002[0]-0x20].HDF_OFState = USART3_RX_BUF002[4] ;
  189. __NOP();
  190. }
  191. else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0))
  192. {
  193. USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ;
  194. }
  195. }
  196. else if(USART3_RX_BUF002[0]==0x23||USART3_RX_BUF002[0]==0x24)
  197. {
  198. if(USART3_RX_BUF002[1]!=0x03&&USART3_RX_BUF002[1]!=0x06) //校验读写属性
  199. {
  200. receive_error = 1;
  201. }
  202. /* else if(ModbusCRC != LIB_CRC_MODBUS(USART3_RX_BUF002,6)) //校验CRC
  203. {
  204. receive_error = 0;
  205. }*/
  206. if((USART3_RX_BUF002[1] == 0x03)&&(receive_error == 0)) //读取数据返回
  207. {
  208. phdf[USART3_RX_BUF002[0]-0x20].HDF_ErrorCnt = 0;
  209. phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1;
  210. // if(pcang->HDF_Type == 1)
  211. // phdf[USART3_RX_BUF002[0]-0x20].RTData_Num = 1; //海底阀开关数据
  212. phdf[USART3_RX_BUF002[0]-0x22].HDF_Data[1] = 1;//USART3_RX_BUF002[3] ;
  213. phdf[USART3_RX_BUF002[0]-0x22].HDF_OFState1 = 1;//USART3_RX_BUF002[4] ;
  214. __NOP();
  215. }
  216. else if((USART3_RX_BUF002[1] == 0x06)&&(receive_error == 0))
  217. {
  218. USART3_RX_BUF002[3] = USART3_RX_BUF002[3] ;
  219. }
  220. }
  221. }
  222. void TOUCHUAN_UART_NUM(uint8_t* pTx)
  223. {
  224. KZQ_Inf* pkzq = &kzq_inf;
  225. int retry;
  226. // Cang_Inf* pcang = &cang_inf;
  227. // uint8_t i = 0;
  228. // uint16_t ModBusCRC = 0;
  229. // uint8_t receive_error = 0;
  230. // uint16_t ModbusCRC = 0;
  231. // HDF_Inf* phdf = hdf_inf;
  232. uint16_t Uart_num = 0;
  233. Uart_num=USART2_RX_BUF002[18];
  234. Uart_num = Uart_num << 8;
  235. Uart_num |= USART2_RX_BUF002[19];
  236. if(Uart_num == 1)
  237. {//if(Uart_num == 0x0001)
  238. if(pkzq->USE_XYF == 0)
  239. {//if(pkzq->USE_XYF == 0)
  240. if(pkzq->data_buf[7] == 0x06)
  241. {//if(pkzq->data_buf[7] == 0x06)
  242. pkzq->USE_XYF = 1;
  243. Uart_len_TouChuan=USART2_RX_BUF002[20];
  244. Uart_len_TouChuan = Uart_len_TouChuan << 8;
  245. Uart_len_TouChuan |= USART2_RX_BUF002[21];
  246. memcpy(XYF_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan);
  247. //osDelay(50);
  248. for(retry=0;retry<300;++retry)
  249. {
  250. if(flagU3Rx && (pkzq->USE_XYF==0))
  251. break;
  252. osDelay(1);
  253. }
  254. if(flagU3Rx)
  255. {
  256. pTx[20] = (data_lengthU3>>8)&0xff;
  257. pTx[21] = data_lengthU3&0xff;
  258. memcpy(pTx+22,USART3_RX_BUF002,data_lengthU3);
  259. flagU1Rx=0;
  260. }
  261. else
  262. {
  263. pTx[20] = 0;
  264. pTx[21] = 0;
  265. }
  266. }//if(pkzq->data_buf[7] == 0x06)
  267. }//if(pkzq->USE_XYF == 0)
  268. }//if(Uart_num == 0x0001)
  269. if(Uart_num == 0)
  270. {//if(Uart_num == 0x0001)
  271. if(pkzq->USE_RKG == 0)
  272. {//if(pkzq->USE_XYF == 0)
  273. if(pkzq->data_buf[7] == 0x06)
  274. {//if(pkzq->data_buf[7] == 0x06)
  275. pkzq->USE_RKG = 1;
  276. Uart_len_TouChuan=USART2_RX_BUF002[20];
  277. Uart_len_TouChuan = Uart_len_TouChuan << 8;
  278. Uart_len_TouChuan |= USART2_RX_BUF002[21];
  279. memcpy(RKG_TxBuf,&USART2_RX_BUF002[22],Uart_len_TouChuan);
  280. //osDelay(50);
  281. for(retry=0;retry<300;++retry)
  282. {
  283. if(flagU1Rx && (pkzq->USE_RKG == 0))
  284. break;
  285. osDelay(1);
  286. }
  287. if(flagU1Rx)
  288. {
  289. pTx[20] = (data_lengthU1>>8)&0xff;
  290. pTx[21] = data_lengthU1&0xff;
  291. memcpy(pTx+22,USART1_RX_BUF002,data_lengthU1);
  292. flagU1Rx=0;
  293. }
  294. else
  295. {
  296. pTx[20] = 0;
  297. pTx[21] = 0;
  298. }
  299. }//if(pkzq->data_buf[7] == 0x06)
  300. }//if(pkzq->USE_XYF == 0)
  301. }//if(Uart_num == 0x0001)
  302. }