soft_hd_water_pump.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. #include "soft_hd_water_pump.h"
  2. #include "soft_water_device.h"
  3. #include "common.h"
  4. #include "string.h"
  5. #include "soft_p_2_c.h"
  6. #include "soft_flow.h"
  7. #include "soft_seed_device.h"
  8. #include "soft_crc.h"
  9. #include "soft_version.h"
  10. // 惠达采用小端存储
  11. HWTail PumpControlTail = {0};
  12. HWTail NozzleControlTail = {0};
  13. HDpump HD_pump = {0};
  14. HDMsg *_HDMsg = NULL;
  15. HDnozzle NozzleMsg[5] = {0};
  16. _nozzle_id Nozzle_id[4] = {0};
  17. // 设置喷头id标志位
  18. bool SetNozzleId = false;
  19. // 识别喷头标志位
  20. bool IdentifyNozzle = false;
  21. // 设置喷头id
  22. uint8_t SetNozzleIdNum = 4;
  23. // 设置喷头设备id
  24. uint32_t SetDevId = 1399067365;
  25. // uint16_t curNodeID = 0;
  26. // 超时时间
  27. uint32_t overtime = 0;
  28. void HuiDaCanRecvHookFunction(uint32_t id, uint8_t *recv_buf, uint8_t len)
  29. {
  30. uint16_t TypeID = 0;
  31. uint8_t SrcNodeID = (id & HD_CANID_SRCNODE_MASK) >> HD_CANID_SRCNODE_POS;
  32. if (SrcNodeID == HD_CANID_PUMP_ID)
  33. {
  34. }
  35. else if (SrcNodeID >= HD_CANID_NOZZLE_0_ID && SrcNodeID <= HD_CANID_NOZZLE_4_ID)
  36. {
  37. }
  38. else
  39. {
  40. return;
  41. }
  42. TypeID = recv_buf[0];
  43. switch (SrcNodeID)
  44. {
  45. case HD_CANID_PUMP_ID:
  46. _HDMsg = &HD_pump.MultiMsg;
  47. Dev.Pump_Link.connect_status = COMP_NORMAL;
  48. Dev.Pump_Link.recv_time = HAL_GetTick();
  49. Dev.Pump.facid = FAC_HD_PUMP;
  50. // 多帧消息处理
  51. // 多帧发送需要二次打包
  52. // 判断接收的消息类型
  53. switch (_HDMsg->Msg_id)
  54. {
  55. // 非多帧消息
  56. case none:
  57. break;
  58. case PSL:
  59. HD_frame_process(_HDMsg, recv_buf, len);
  60. if (_HDMsg->finish == true)
  61. {
  62. memcpy(&HD_pump.pump1_pwm, &_HDMsg->buffer[3], 2);
  63. little_to_big_16(&HD_pump.pump1_pwm);
  64. memcpy(&HD_pump.pump2_pwm, &_HDMsg->buffer[5], 2);
  65. little_to_big_16(&HD_pump.pump2_pwm);
  66. memcpy(&HD_pump.pump1_speed, &_HDMsg->buffer[7], 2);
  67. little_to_big_16(&HD_pump.pump1_speed);
  68. memcpy(&HD_pump.pump2_speed, &_HDMsg->buffer[9], 2);
  69. little_to_big_16(&HD_pump.pump2_speed);
  70. uint16_t fault_code = 0;
  71. memcpy(&fault_code, &_HDMsg->buffer[11], 2);
  72. little_to_big_16(&fault_code);
  73. memcpy(&HD_pump.pump1_fault_code, &fault_code, 2);
  74. fault_code = 0;
  75. memcpy(&fault_code, &_HDMsg->buffer[13], 2);
  76. little_to_big_16(&fault_code);
  77. memcpy(&HD_pump.pump2_fault_code, &fault_code, 2);
  78. memcpy(&HD_pump.pump1_vol, &_HDMsg->buffer[15], 2);
  79. little_to_big_16(&HD_pump.pump1_vol);
  80. memcpy(&HD_pump.pump2_vol, &_HDMsg->buffer[17], 2);
  81. little_to_big_16(&HD_pump.pump2_vol);
  82. HD_pump.pump1_current = _HDMsg->buffer[19];
  83. HD_pump.pump2_current = _HDMsg->buffer[20];
  84. HD_pump.pump1_temp = _HDMsg->buffer[21];
  85. HD_pump.pump2_temp = _HDMsg->buffer[22];
  86. memcpy(&HD_pump.MCU_status, &_HDMsg->buffer[23], 1);
  87. _HDMsg->finish = false;
  88. _HDMsg->Msg_id = none;
  89. }
  90. // 处理完毕跳过单帧消息处理,防止重复处理错误
  91. goto next;
  92. // break;
  93. }
  94. switch (TypeID)
  95. {
  96. case HD_HIGH_FREQ_REPORT_ID:
  97. memcpy(&HD_pump.flow1, &recv_buf[1], 2);
  98. little_to_big_16(&HD_pump.flow1);
  99. memcpy(&HD_pump.flow2, &recv_buf[3], 2);
  100. little_to_big_16(&HD_pump.flow2);
  101. memcpy(&HD_pump.pump1_status, &recv_buf[5], 1);
  102. memcpy(&HD_pump.pump2_status, &recv_buf[6], 1);
  103. break;
  104. case HD_LOW_FREQ_REPORT_ID:
  105. memcpy(&_HDMsg->length, &recv_buf[1], 2);
  106. little_to_big_16(&_HDMsg->length);
  107. // 如果接收的消息长度正确
  108. if (_HDMsg->length == PSL_LEN)
  109. {
  110. _HDMsg->rxindex = 0;
  111. _HDMsg->LastTail.HWTailByte = recv_buf[7];
  112. memcpy(&_HDMsg->buffer, recv_buf, 7);
  113. _HDMsg->rxindex += 7;
  114. _HDMsg->Msg_id = PSL;
  115. }
  116. else
  117. {
  118. _HDMsg->rxindex = 0;
  119. _HDMsg->Msg_id = none;
  120. }
  121. break;
  122. case HD_FLOWMETER_PULSE_ID:
  123. memcpy(&HD_pump.flowmeter1_pulse_interval, &recv_buf[1], 2);
  124. little_to_big_16(&HD_pump.flowmeter1_pulse_interval);
  125. memcpy(&HD_pump.flowmeter2_pulse_interval, &recv_buf[3], 2);
  126. little_to_big_16(&HD_pump.flowmeter2_pulse_interval);
  127. break;
  128. case HD_HEART_ID:
  129. memcpy(&HD_pump.devID, &recv_buf[1], 4);
  130. little_to_big_32(&HD_pump.devID);
  131. break;
  132. }
  133. break;
  134. case HD_CANID_NOZZLE_0_ID ... HD_CANID_NOZZLE_4_ID:
  135. {
  136. HDnozzle *HD_nozzle = NULL;
  137. HD_nozzle = &NozzleMsg[SrcNodeID - HD_CANID_NOZZLE_0_ID];
  138. _HDMsg = &HD_nozzle->MultiMsg;
  139. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  140. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  141. Dev.Nozzle.facid = FAC_HD_NOZZLE;
  142. HD_nozzle->deviceLink = COMP_NORMAL;
  143. HD_nozzle->linkTime = HAL_GetTick();
  144. HD_nozzle->nodeId = SrcNodeID;
  145. // 多帧消息处理
  146. // 多帧发送需要二次打包
  147. // 判断接收的消息类型
  148. switch (_HDMsg->Msg_id)
  149. {
  150. // 非多帧消息
  151. case none:
  152. {
  153. break;
  154. }
  155. case SSL:
  156. {
  157. HD_frame_process(_HDMsg, recv_buf, len);
  158. if (_HDMsg->finish == true)
  159. {
  160. uint16_t _fault_code = 0;
  161. memcpy(&_fault_code, &_HDMsg->buffer[3], 2);
  162. little_to_big_16(&_fault_code);
  163. memcpy(&HD_nozzle->fault_code, &_fault_code, 2);
  164. memcpy(&HD_nozzle->nozzle_vol, &_HDMsg->buffer[5], 2);
  165. little_to_big_16(&HD_nozzle->nozzle_vol);
  166. memcpy(&HD_nozzle->nozzle_current, &_HDMsg->buffer[7], 1);
  167. memcpy(&HD_nozzle->solenoid_valve_current, &_HDMsg->buffer[8], 1);
  168. memcpy(&HD_nozzle->nozzle_temp, &_HDMsg->buffer[9], 1);
  169. memcpy(&HD_nozzle->motor_power, &_HDMsg->buffer[10], 2);
  170. little_to_big_16(&HD_nozzle->motor_power);
  171. memcpy(&HD_nozzle->over_current_num, &_HDMsg->buffer[12], 2);
  172. little_to_big_16(&HD_nozzle->over_current_num);
  173. memcpy(&HD_nozzle->hard_over_current_num, &_HDMsg->buffer[14], 2);
  174. little_to_big_16(&HD_nozzle->hard_over_current_num);
  175. memcpy(&HD_nozzle->blockage_frequency, &_HDMsg->buffer[15], 1);
  176. _HDMsg->finish = false;
  177. _HDMsg->Msg_id = none;
  178. }
  179. // 跳过单帧消息处理,防止重复处理错误
  180. goto next;
  181. // break;
  182. }
  183. }
  184. switch (TypeID)
  185. {
  186. case HD_NOZZLE_HIGH_FREQ_ID:
  187. {
  188. memcpy(&HD_nozzle->speed, &recv_buf[1], 2);
  189. little_to_big_16(&HD_nozzle->speed);
  190. memcpy(&HD_nozzle->solenoid_valve_status, &recv_buf[3], 1);
  191. memcpy(&HD_nozzle->speed_command, &recv_buf[4], 2);
  192. little_to_big_16(&HD_nozzle->speed_command);
  193. memcpy(&HD_nozzle->nozzle_status, &recv_buf[6], 1);
  194. break;
  195. }
  196. case HD_NOZZLE_LOW_FREQ_ID:
  197. {
  198. memcpy(&_HDMsg->length, &recv_buf[1], 2);
  199. little_to_big_16(&_HDMsg->length);
  200. // 如果接收的消息长度正确
  201. if (_HDMsg->length == SSL_LEN)
  202. {
  203. _HDMsg->rxindex = 0;
  204. _HDMsg->LastTail.HWTailByte = recv_buf[7];
  205. memcpy(&_HDMsg->buffer, recv_buf, 7);
  206. _HDMsg->rxindex += 7;
  207. _HDMsg->Msg_id = SSL;
  208. }
  209. else
  210. {
  211. _HDMsg->rxindex = 0;
  212. _HDMsg->Msg_id = none;
  213. }
  214. break;
  215. }
  216. case HD_HEART_ID:
  217. {
  218. memcpy(&HD_nozzle->devID, &recv_buf[1], 4);
  219. little_to_big_32(&HD_nozzle->devID);
  220. // 添加设备id
  221. add_devId(SrcNodeID, HD_nozzle->devID);
  222. if (SetNozzleId == true && HD_nozzle->devID == SetDevId)
  223. {
  224. if (SrcNodeID == SetNozzleIdNum + HD_CANID_NOZZLE_0_ID)
  225. {
  226. SetNozzleId = false;
  227. }
  228. else
  229. overtime = millis();
  230. }
  231. break;
  232. }
  233. case HD_IDENTIFY_ID:
  234. {
  235. if (recv_buf[1] == 0 && IdentifyNozzle == true)
  236. {
  237. uint32_t dev_id;
  238. memcpy(&dev_id, &recv_buf[2], 4);
  239. little_to_big_32(&dev_id);
  240. if (dev_id == SetDevId)
  241. IdentifyNozzle = false;
  242. else
  243. overtime = millis();
  244. }
  245. else
  246. overtime = millis();
  247. break;
  248. }
  249. }
  250. }
  251. break;
  252. }
  253. next:;
  254. }
  255. void HD_pump_func(void)
  256. {
  257. // test
  258. // static uint32_t time_1hz = 0;
  259. if (Dev.Pump_Link.connect_status == COMP_NORMAL && Dev.Pump.facid == FAC_HD_PUMP)
  260. {
  261. /*
  262. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  263. {
  264. HW_CanGetESCInfomation();
  265. HW_CanSetESCInfomation();
  266. }
  267. */
  268. HD_can_sendmsg(HD_WATER_PUMP_CONTROL_ID, NULL);
  269. // HD_can_sendmsg( 1300 , 1300);
  270. }
  271. if (Dev.Nozzle_Link.connect_status == COMP_NORMAL && Dev.Nozzle.facid == FAC_HD_NOZZLE)
  272. {
  273. /*
  274. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  275. {
  276. HW_CanGetESCInfomation();
  277. HW_CanSetESCInfomation();
  278. }
  279. */
  280. if (IdentifyNozzle == true)
  281. {
  282. /*
  283. if (millis() - overtime > 5000)
  284. {
  285. IdentifyNozzle = false;
  286. }*/
  287. for (uint8_t i = 0; i < 4; i++)
  288. {
  289. if (Nozzle_id[i].devID == SetDevId)
  290. {
  291. HD_can_sendmsg(HD_IDENTIFY_ID, &Nozzle_id[i]);
  292. }
  293. }
  294. }
  295. else if (SetNozzleId == true)
  296. {
  297. /*
  298. if (millis() - overtime > 5000)
  299. {
  300. IdentifyNozzle = false;
  301. }*/
  302. for (uint8_t i = 0; i < 4; i++)
  303. {
  304. if (Nozzle_id[i].devID == SetDevId)
  305. {
  306. HD_can_sendmsg(HD_SET_NOZZLE_ID, &Nozzle_id[i]);
  307. }
  308. }
  309. }
  310. else
  311. HD_can_sendmsg(HD_NOZZLE_CONTROL_ID, NULL);
  312. // HD_can_sendmsg( 1300 , 1300);
  313. }
  314. }
  315. void HD_can_sendmsg(uint8_t msg_id, _nozzle_id *Nozzle_id)
  316. {
  317. uint32_t canID;
  318. uint32_t _dev_ID;
  319. uint8_t can_buf[8] = {0};
  320. switch (msg_id)
  321. {
  322. case HD_WATER_PUMP_CONTROL_ID:
  323. {
  324. canID = ((HD_PRI_HIGHEST << HD_CANID_PRI_POS) & HD_CANID_PRI_MASK) |
  325. ((HD_TYPE_SER << HD_CANID_SNM_POS) & HD_CANID_SNM_MASK) |
  326. ((HD_TYPE_REQ << HD_CANID_RNR_POS) & HD_CANID_RNR_MASK) |
  327. ((HD_CANID_REV_23 << HD_CANID_REV_23_POS) & HD_CANID_REV_23_MASK) |
  328. ((HD_CANID_SERID << HD_CANID_SERID_POS) & HD_CANID_SERID_MASK) |
  329. ((HD_CANID_PUMP_ID << HD_CANID_DESNODE_POS) & HD_CANID_DESNODE_MASK) |
  330. ((FMU_NODE_ID_HD << HD_CANID_SRCNODE_POS) & HD_CANID_SRCNODE_MASK);
  331. can_buf[0] = HD_WATER_PUMP_CONTROL_ID;
  332. uint16_t _pwm1 = (uint16_t)pmu_pin.pump1;
  333. uint16_t _pwm2 = (uint16_t)pmu_pin.pump2;
  334. if (_pwm1 > 1800)
  335. _pwm1 = 1800;
  336. if (_pwm2 > 1800)
  337. _pwm2 = 1800;
  338. little_to_big_16(&_pwm1);
  339. little_to_big_16(&_pwm2);
  340. memcpy(&can_buf[1], &_pwm1, 2);
  341. memcpy(&can_buf[3], &_pwm2, 2);
  342. PumpControlTail.HWTailBit.start = 1;
  343. PumpControlTail.HWTailBit.end = 1;
  344. PumpControlTail.HWTailBit.toggle = 1;
  345. can_buf[5] = PumpControlTail.HWTailByte;
  346. can_send_msg_normal(can_buf, 6, canID);
  347. PumpControlTail.HWTailBit.tranid++;
  348. break;
  349. }
  350. case HD_NOZZLE_CONTROL_ID:
  351. {
  352. uint16_t rpm = 0;
  353. uint8_t open;
  354. for (uint8_t i = 1; i <= 4; i++)
  355. {
  356. switch (i)
  357. {
  358. case 1:
  359. rpm = pmu_pin.nozz1_fm;
  360. break;
  361. case 2:
  362. rpm = pmu_pin.nozz2_zp;
  363. break;
  364. case 3:
  365. rpm = pmu_pin.nozz3;
  366. break;
  367. case 4:
  368. rpm = pmu_pin.nozz4;
  369. break;
  370. default:
  371. break;
  372. }
  373. canID = ((HD_PRI_HIGHEST << HD_CANID_PRI_POS) & HD_CANID_PRI_MASK) |
  374. ((HD_TYPE_SER << HD_CANID_SNM_POS) & HD_CANID_SNM_MASK) |
  375. ((HD_TYPE_REQ << HD_CANID_RNR_POS) & HD_CANID_RNR_MASK) |
  376. ((HD_CANID_REV_23 << HD_CANID_REV_23_POS) & HD_CANID_REV_23_MASK) |
  377. ((HD_CANID_SERID << HD_CANID_SERID_POS) & HD_CANID_SERID_MASK) |
  378. (((HD_CANID_NOZZLE_0_ID + i) << HD_CANID_DESNODE_POS) & HD_CANID_DESNODE_MASK) |
  379. ((FMU_NODE_ID_HD << HD_CANID_SRCNODE_POS) & HD_CANID_SRCNODE_MASK);
  380. open = 1;
  381. if (rpm <= 1020)
  382. {
  383. rpm = 0;
  384. open = 0;
  385. }
  386. else if (rpm >= 2000)
  387. rpm = 14000;
  388. else
  389. rpm = (rpm - 1020) * ((14000 - 2000) / (2000 - 1000));
  390. can_buf[0] = HD_NOZZLE_CONTROL_ID;
  391. // rpm = 14000;
  392. little_to_big_16(&rpm);
  393. memcpy(&can_buf[1], &rpm, 2);
  394. memcpy(&can_buf[3], &open, 1);
  395. PumpControlTail.HWTailBit.start = 1;
  396. PumpControlTail.HWTailBit.end = 1;
  397. PumpControlTail.HWTailBit.toggle = 1;
  398. can_buf[4] = PumpControlTail.HWTailByte;
  399. can_send_msg_normal(can_buf, 5, canID);
  400. PumpControlTail.HWTailBit.tranid++;
  401. }
  402. break;
  403. }
  404. case HD_IDENTIFY_ID:
  405. {
  406. if (Nozzle_id == NULL)
  407. return;
  408. canID = ((HD_PRI_HIGHEST << HD_CANID_PRI_POS) & HD_CANID_PRI_MASK) |
  409. ((HD_TYPE_SER << HD_CANID_SNM_POS) & HD_CANID_SNM_MASK) |
  410. ((HD_TYPE_REQ << HD_CANID_RNR_POS) & HD_CANID_RNR_MASK) |
  411. ((HD_CANID_REV_23 << HD_CANID_REV_23_POS) & HD_CANID_REV_23_MASK) |
  412. ((HD_CANID_SERID << HD_CANID_SERID_POS) & HD_CANID_SERID_MASK) |
  413. ((Nozzle_id->nodeId << HD_CANID_DESNODE_POS) & HD_CANID_DESNODE_MASK) |
  414. ((FMU_NODE_ID_HD << HD_CANID_SRCNODE_POS) & HD_CANID_SRCNODE_MASK);
  415. can_buf[0] = HD_IDENTIFY_ID;
  416. // rpm = 14000;
  417. _dev_ID = SetDevId;
  418. little_to_big_32(&_dev_ID);
  419. memcpy(&can_buf[1], &_dev_ID, 4);
  420. can_buf[5] = 0x00;
  421. can_buf[6] = 0x00;
  422. PumpControlTail.HWTailBit.start = 1;
  423. PumpControlTail.HWTailBit.end = 1;
  424. PumpControlTail.HWTailBit.toggle = 1;
  425. can_buf[7] = PumpControlTail.HWTailByte;
  426. can_send_msg_normal(can_buf, 8, canID);
  427. PumpControlTail.HWTailBit.tranid++;
  428. break;
  429. }
  430. case HD_SET_NOZZLE_ID:
  431. {
  432. if (Nozzle_id == NULL)
  433. return;
  434. canID = ((HD_PRI_HIGHEST << HD_CANID_PRI_POS) & HD_CANID_PRI_MASK) |
  435. ((HD_TYPE_SER << HD_CANID_SNM_POS) & HD_CANID_SNM_MASK) |
  436. ((HD_TYPE_REQ << HD_CANID_RNR_POS) & HD_CANID_RNR_MASK) |
  437. ((HD_CANID_REV_23 << HD_CANID_REV_23_POS) & HD_CANID_REV_23_MASK) |
  438. ((HD_CANID_SERID << HD_CANID_SERID_POS) & HD_CANID_SERID_MASK) |
  439. ((Nozzle_id->nodeId << HD_CANID_DESNODE_POS) & HD_CANID_DESNODE_MASK) |
  440. ((FMU_NODE_ID_HD << HD_CANID_SRCNODE_POS) & HD_CANID_SRCNODE_MASK);
  441. can_buf[0] = HD_SET_NOZZLE_ID;
  442. _dev_ID = SetDevId;
  443. little_to_big_32(&_dev_ID);
  444. memcpy(&can_buf[1], &_dev_ID, 4);
  445. can_buf[5] = SetNozzleIdNum + HD_CANID_NOZZLE_0_ID;
  446. can_buf[6] = 0;
  447. PumpControlTail.HWTailBit.start = 1;
  448. PumpControlTail.HWTailBit.end = 1;
  449. PumpControlTail.HWTailBit.toggle = 1;
  450. can_buf[7] = PumpControlTail.HWTailByte;
  451. can_send_msg_normal(can_buf, 8, canID);
  452. PumpControlTail.HWTailBit.tranid++;
  453. break;
  454. }
  455. default:
  456. break;
  457. }
  458. }
  459. // 多帧消息处理
  460. void HD_frame_process(HDMsg *_HDMsg, uint8_t *recv_buf, uint32_t len)
  461. {
  462. _HDMsg->Tail.HWTailByte = recv_buf[len - 1];
  463. // 如果收帧连续,数据进入buffer
  464. if (_HDMsg->Tail.HWTailBit.toggle != _HDMsg->LastTail.HWTailBit.toggle)
  465. {
  466. memcpy(&_HDMsg->buffer[_HDMsg->rxindex], recv_buf, (len - 1));
  467. _HDMsg->LastTail.HWTailByte = _HDMsg->Tail.HWTailByte;
  468. _HDMsg->rxindex = _HDMsg->rxindex + len - 1;
  469. }
  470. // 如果是最后一帧
  471. if (_HDMsg->Tail.HWTailBit.end == 1 && _HDMsg->rxindex == _HDMsg->length + length_len + msg_id_len + crc_len)
  472. {
  473. memcpy(&_HDMsg->crc, &_HDMsg->buffer[_HDMsg->rxindex - 2], 2);
  474. little_to_big_16(&_HDMsg->crc);
  475. // 校验
  476. if (_HDMsg->crc == crcAdd(0xFFFF, _HDMsg->buffer, _HDMsg->rxindex - 2))
  477. {
  478. _HDMsg->finish = true;
  479. }
  480. else
  481. _HDMsg->crc_wrong++;
  482. // 无论是否校验通过,都重置
  483. _HDMsg->Msg_id = none;
  484. _HDMsg->rxindex = 0;
  485. }
  486. // 超出字节重置
  487. else if (_HDMsg->rxindex >= (_HDMsg->length + length_len + msg_id_len + crc_len))
  488. {
  489. _HDMsg->rxindex = 0;
  490. _HDMsg->Msg_id = none;
  491. _HDMsg->len_wrong++;
  492. }
  493. }
  494. // 添加设备id到Nozzle_id数组
  495. void add_devId(uint8_t SrcId, uint32_t devId)
  496. {
  497. uint8_t p = 0;
  498. for (uint8_t i = 0; i < 4; i++)
  499. {
  500. // 超时视为断开连接,清除设备id
  501. if (Nozzle_id[i].devID != 0 && millis() - Nozzle_id[i].linkTime >= 2000)
  502. Nozzle_id[i].devID = 0;
  503. }
  504. for (uint8_t i = 0; i < 4; i++)
  505. {
  506. // 如果设备id已经存在,更新时间
  507. if (Nozzle_id[i].devID == devId)
  508. {
  509. Nozzle_id[i].linkTime = millis();
  510. Nozzle_id[i].nodeId = SrcId;
  511. return;
  512. }
  513. // 空位,记录
  514. else if (Nozzle_id[i].devID == 0)
  515. {
  516. p = i;
  517. }
  518. }
  519. // 当前id与之前的id都不相同,添加
  520. // 如果数组已满,不添加
  521. if (p < 4)
  522. {
  523. Nozzle_id[p].devID = devId;
  524. Nozzle_id[p].nodeId = SrcId;
  525. Nozzle_id[p].linkTime = millis();
  526. }
  527. }
  528. void little_to_big_32(uint32_t *value)
  529. {
  530. if (value == NULL)
  531. {
  532. return;
  533. }
  534. uint32_t _value = *value;
  535. _value = ((_value & 0xFF) << 24) |
  536. ((_value & 0xFF00) << 8) |
  537. ((_value >> 8) & 0xFF00) |
  538. ((_value >> 24) & 0xFF);
  539. *value = _value;
  540. }
  541. void little_to_big_16(uint16_t *value)
  542. {
  543. if (value == NULL)
  544. {
  545. return;
  546. }
  547. uint16_t _value = *value;
  548. _value = ((_value & 0xFF) << 8) |
  549. ((_value >> 8) & 0xFF);
  550. *value = _value;
  551. }
  552. uint32_t millis()
  553. {
  554. return HAL_GetTick();
  555. }