soft_water_device.c 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168
  1. #include "soft_water_device.h"
  2. #include "common.h"
  3. #include "string.h"
  4. #include "soft_p_2_c.h"
  5. #include "soft_flow.h"
  6. #include "soft_seed_device.h"
  7. #include "soft_crc.h"
  8. #include "soft_version.h"
  9. #include "soft_flash.h"
  10. #include "soft_tattu.h"
  11. #include "soft_terrain.h"
  12. #include "soft_obstacle.h"
  13. #include "canard.h"
  14. #include "soft_eft.h"
  15. /**
  16. * @file liquid_recieved_hookfuction
  17. * @brief 液位计解析
  18. * @param
  19. * @details
  20. * @author Zhang Sir
  21. **/
  22. liquid liquid_inf;
  23. short liquid_aver_value[20] = {0};
  24. uint8_t liquid_aver_i = 0;
  25. bool liquid_opening = false; //初始化
  26. int liquid_aver_time = 0;
  27. void liquid_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  28. {
  29. Dev.Checklow_Link.connect_status = COMP_NORMAL;
  30. Dev.Checklow_Link.recv_time = HAL_GetTick();
  31. memcpy(&liquid_inf.liquid_percent,&data[0],3);
  32. //俯仰小于8度
  33. if((abs(planep.roll_angle / 100.0f) < 8) && (abs(planep.pitch_angle / 100.0f) < 8) && HAL_GetTick() - liquid_aver_time > 1000)
  34. {
  35. liquid_aver_value[liquid_aver_i] = liquid_inf.liquid_percent;
  36. liquid_aver_i++;
  37. if(liquid_aver_i > 19 )
  38. {
  39. liquid_opening = true;
  40. liquid_aver_i = 0;
  41. }
  42. }
  43. else
  44. {
  45. liquid_aver_time = HAL_GetTick();
  46. }
  47. }
  48. /**
  49. * @file decode_liquid_info
  50. * @brief 解析液位计
  51. * @param
  52. * @details
  53. * @author Zhang Sir
  54. **/
  55. int decode_liquid_info(void)
  56. {
  57. Check_dev_link(&Dev.Checklow_Link,5000,(char *)&liquid_inf.liquid_percent,sizeof(liquid));
  58. if(Dev.Checklow_Link.connect_status == COMP_NORMAL)
  59. {
  60. int liquid_temp = 0;
  61. //上电没滤波直接显示
  62. if(liquid_opening == false)
  63. {
  64. return liquid_inf.liquid_percent;
  65. }
  66. for(uint8_t i = 0; i < 20; i++)
  67. {
  68. liquid_temp += liquid_aver_value[i];
  69. }
  70. return liquid_temp / 20;
  71. }
  72. else
  73. {
  74. return 0;
  75. }
  76. }
  77. /**
  78. * @file Flow_recieved_hookfuction
  79. * @brief 流量计解析
  80. * @param
  81. * @details
  82. * @author Zhang Sir
  83. **/
  84. flow flow_inf;
  85. void Flow_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  86. {
  87. switch (cellCanID)
  88. {
  89. case 0x2012C0:
  90. flow_inf.ch = data[0];
  91. switch (flow_inf.ch)
  92. {
  93. case 1:
  94. memcpy(&flow_inf.ch1.speed,&data[1],5);
  95. if(flow_inf.ch1.last_ml > flow_inf.ch1.ml)
  96. {
  97. flow_inf.ch1.overturn++;
  98. }
  99. flow_inf.ch1.last_ml = flow_inf.ch1.ml;
  100. Dev.Flow_Link1.connect_status = COMP_NORMAL;
  101. Dev.Flow_Link1.recv_time = HAL_GetTick();
  102. break;
  103. case 2:
  104. memcpy(&flow_inf.ch2.speed,&data[1],5);
  105. if(flow_inf.ch2.last_ml > flow_inf.ch2.ml)
  106. {
  107. flow_inf.ch2.overturn++;
  108. }
  109. flow_inf.ch2.last_ml = flow_inf.ch2.ml;
  110. Dev.Flow_Link2.connect_status = COMP_NORMAL;
  111. Dev.Flow_Link2.recv_time = HAL_GetTick();
  112. break;
  113. default:
  114. break;
  115. }
  116. break;
  117. case 0x2812C0:
  118. switch (data[0])
  119. {
  120. case 0xF1:
  121. if(data[1]== 0x01)
  122. flow_inf.ch1.k = data[2] + ((data[3] << 8) & 0xff00);
  123. if(data[4]== 0x02)
  124. flow_inf.ch2.k = data[5] + ((data[6] << 8) & 0xff00);
  125. pmu_set_ack(_MSGID_SET,MSGID_SET_MIMO_FLOW,flow_inf.ch1.k,flow_inf.ch2.k);
  126. flow_inf.ch1.set_k = false;
  127. break;
  128. case 0XF2:
  129. if(data[1]== 0x01)
  130. flow_inf.ch1.k = data[2] + ((data[3] << 8) & 0xff00);
  131. if(data[4]== 0x02)
  132. flow_inf.ch2.k = data[5] + ((data[6] << 8) & 0xff00);
  133. if(flow_inf.ch2.k != 0) //多判断一次,CAN通讯质量不高可能获取不到厂家信息
  134. {
  135. Dev.Flow.facid = FAC_QIFEI_DOU;
  136. }
  137. flow_inf.ch1.get_k = true;
  138. break;
  139. case 0XF3:
  140. flow_inf.ch1.k_multiple = data[1] + ((data[2] << 8) & 0xff00);
  141. flow_inf.ch2.k_multiple = data[1] + ((data[2] << 8) & 0xff00);
  142. break;
  143. case 0XF7:
  144. if(data[1] == 'Q' && data[2] == 'F')
  145. {
  146. Dev.Flow.facid = FAC_QIFEI_SIG;
  147. if(Dev.Flow_Link2.connect_status == COMP_NORMAL)
  148. {
  149. Dev.Flow.facid = FAC_QIFEI_DOU;
  150. }
  151. }
  152. break;
  153. default:
  154. break;
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. }
  161. /**
  162. * @file distributor_recieved_hookfuction
  163. * @brief 解析分电板信息
  164. * @param
  165. * @details
  166. * @author Zhang Sir
  167. **/
  168. void distributor_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  169. {
  170. memcpy(&distributor.arm_sensor1,&data[0],2);
  171. Distributor_Link.connect_status = COMP_NORMAL;
  172. Distributor_Link.recv_time = HAL_GetTick();
  173. }
  174. /**
  175. * @file Can_sendmsg_to_distributor
  176. * @brief 发送信息给分电板
  177. * @param
  178. * @details
  179. * @author Zhang Sir
  180. **/
  181. distributor_info distributor = {.nozzle1 = 1000, .nozzle2 = 1000};
  182. Connect_check Distributor_Link;
  183. void Can_sendmsg_to_distributor(void)
  184. {
  185. if(Distributor_Link.connect_status != COMP_NORMAL)
  186. return;
  187. uint8_t can_buf[8] = {0};
  188. can_buf[0] = distributor.nozzle1 & 0xff;
  189. can_buf[1] = (distributor.nozzle1 >> 8) & 0xff;
  190. can_buf[2] = distributor.nozzle2 & 0xff;
  191. can_buf[3] = (distributor.nozzle2 >> 8) & 0xff;
  192. can_send_msg_normal(can_buf,8,0x81422);
  193. }
  194. /**
  195. * @file can_sendmsg_flow
  196. * @brief 发送信息到流量计
  197. * @param
  198. * @details
  199. * @author Zhang Sir
  200. **/
  201. void can_sendmsg_flow(void)
  202. {
  203. uint8_t can_buf[8] = {0};
  204. //获取厂商ID
  205. if(Dev.Flow_Link1.connect_status == COMP_NORMAL && Dev.Flow.facid == 0xff)
  206. {
  207. can_buf[0] = 0XF7;
  208. can_buf[7] = 0XFE;
  209. can_send_msg_normal(can_buf,8,0x216020);
  210. }
  211. //上电读取流量计K值 和 系数单位
  212. else if(Dev.Flow_Link1.connect_status == COMP_NORMAL && (Dev.Flow.facid == FAC_VK ||
  213. Dev.Flow.facid == FAC_QIFEI_SIG ||Dev.Flow.facid == FAC_QIFEI_DOU) && flow_inf.ch1.get_k == false)
  214. {
  215. can_buf[0] = 0XF2;
  216. can_buf[7] = 0XFE;
  217. can_send_msg_normal(can_buf,8,0x216020);
  218. can_buf[0] = 0XF3;
  219. can_buf[7] = 0XFE;
  220. can_send_msg_normal(can_buf,8,0x216020);
  221. }
  222. else if (Dev.Flow_Link1.connect_status == COMP_NORMAL && (Dev.Flow.facid == FAC_VK ||
  223. Dev.Flow.facid == FAC_QIFEI_SIG ||Dev.Flow.facid == FAC_QIFEI_DOU) &&
  224. flow_inf.ch1.set_k == true)
  225. {
  226. can_buf[0] = 0XF1;
  227. can_buf[1] = 0x1;
  228. can_buf[5] = flow_inf.ch1.cal_k;
  229. can_buf[6] = (flow_inf.ch1.cal_k >> 8) & 0xff; //12做个调换
  230. can_buf[4] = 0x2;
  231. can_buf[2] = flow_inf.ch2.cal_k;
  232. can_buf[3] = (flow_inf.ch2.cal_k >> 8) & 0xff;
  233. can_buf[7] = 0XFE;
  234. can_send_msg_normal(can_buf,8,0x216020);
  235. }
  236. }
  237. /**
  238. * @file HW_CanSetESCInfomation
  239. * @brief HW设置类信息
  240. * @param
  241. * @details
  242. * @author Zhang Sir
  243. **/
  244. bool set_HWesc_ESCid = false;
  245. HWTail SetEscidTail = {0};
  246. uint16_t curNodeID = 1; //当前能接收到的ESC的id
  247. _setESCidInfo setESCidInfo = {.reTxMaxCnt = 5};
  248. void HW_CanSetESCInfomation( void )
  249. {
  250. uint8_t send_can_buf[8] = {0};
  251. uint32_t canID = 0;
  252. if ( set_HWesc_ESCid == true )
  253. {
  254. //超时退出.任何阶段配置失败是否要执行退出配置模式?
  255. if ( setESCidInfo.reTxMaxCnt <= 0 && setESCidInfo.setESCidStep != SETESCID_EXIT )
  256. {
  257. setESCidInfo.setESCidStep = SETESCID_EXIT;
  258. setESCidInfo.reTxMaxCnt = 5;
  259. set_HWesc_ESCid = false;
  260. //继续配置2号水泵
  261. if(setESCidInfo.setESCidNum == 1)
  262. {
  263. setESCidInfo.setESCidNum++;
  264. setESCidInfo.setESCidStep = SETESCID_INIT;
  265. set_HWesc_ESCid = true;
  266. }
  267. else if(setESCidInfo.setESCidNum == 2)
  268. {
  269. //设置成功,发送ACK
  270. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL &&
  271. Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  272. {
  273. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,3,1);
  274. }
  275. else if (Dev.L_pump1_Link.connect_status == COMP_NORMAL)
  276. {
  277. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,1,1);
  278. }
  279. else if (Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  280. {
  281. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,2,1);
  282. }
  283. }
  284. }
  285. // 初始化并清零现场
  286. if ( setESCidInfo.setESCidStep == SETESCID_INIT )
  287. {
  288. setESCidInfo.getSetIDModeRes = false;
  289. setESCidInfo.reTxMaxCnt = 5;
  290. setESCidInfo.getSetIDModeResCnt = 0;
  291. if ( setESCidInfo.setESCidNum > 0 && setESCidInfo.setESCidNum <= 4 )
  292. {
  293. EscMsg[setESCidInfo.setESCidNum].ResSetID = false;
  294. EscMsg[setESCidInfo.setESCidNum].ResSetIDModeExit = false;
  295. setESCidInfo.setESCidStep++;
  296. }
  297. else
  298. {
  299. set_HWesc_ESCid = false;
  300. }
  301. }
  302. // 进入配置模式
  303. else if ( setESCidInfo.setESCidStep == SETESCID_ENTER )
  304. {
  305. if ( setESCidInfo.getSetIDModeRes == false )
  306. {
  307. //广播帧
  308. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  309. ( ( HW_FRAME_MSG_SET_ID_MODE << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  310. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  311. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  312. send_can_buf[0] = HW_SETIDMODE_MODE2;
  313. send_can_buf[1] = HW_SETIDMODE_CONTROL1;
  314. SetEscidTail.HWTailBit.start = 1;
  315. SetEscidTail.HWTailBit.end = 1;
  316. SetEscidTail.HWTailBit.toggle = 0;
  317. send_can_buf[2] = SetEscidTail.HWTailByte;
  318. can_send_msg_normal(send_can_buf,3,canID);
  319. SetEscidTail.HWTailBit.tranid++;
  320. setESCidInfo.reTxMaxCnt--;
  321. }
  322. else
  323. {
  324. setESCidInfo.setESCidStep++;
  325. setESCidInfo.reTxMaxCnt = 5;
  326. setESCidInfo.setEscIDDelayTime = HAL_GetTick();
  327. }
  328. }
  329. //配合油门,发送设置ID指令(要配置ID的通道PWM给1000,其余通道失能PWM输出)
  330. else if ( setESCidInfo.setESCidStep == SETESCID_SET )
  331. {
  332. //配置信息
  333. //EscSet.send_type2_canid[0] = 1;
  334. //EscSet.send_type2_canid[1] = 1;
  335. //setESCidInfo.setESCidNum = 2;
  336. //配置ID属于伪服务帧,不关心DESnode
  337. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  338. ( ( HW_SETID_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  339. ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  340. ( ( curNodeID << HW_CANID_DESNODE_POS ) & HW_CANID_DESNODE_MASK ) |
  341. ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  342. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  343. //等待电调的油门信号失能判定时间300ms,每次配置一个电调
  344. if ( HAL_GetTick() - setESCidInfo.setEscIDDelayTime > 2000 )
  345. {
  346. if ( EscMsg[setESCidInfo.setESCidNum].ResSetID == false )
  347. {
  348. send_can_buf[0] = setESCidInfo.setESCidNum;
  349. send_can_buf[1] = setESCidInfo.setESCidNum;
  350. SetEscidTail.HWTailBit.start = 1;
  351. SetEscidTail.HWTailBit.end = 1;
  352. SetEscidTail.HWTailBit.toggle = 0;
  353. send_can_buf[2] = SetEscidTail.HWTailByte;
  354. can_send_msg_normal(send_can_buf,3,canID);
  355. SetEscidTail.HWTailBit.tranid++;
  356. setESCidInfo.reTxMaxCnt--;
  357. }
  358. else
  359. {
  360. setESCidInfo.setESCidStep++;
  361. setESCidInfo.reTxMaxCnt = 5;
  362. }
  363. }
  364. }
  365. //nodeID配置完成/失败后退出配置模式,广播发送,全部回复
  366. else if ( setESCidInfo.setESCidStep == SETESCID_EXIT )
  367. {
  368. if ( EscMsg[setESCidInfo.setESCidNum].ResSetIDModeExit == false )
  369. {
  370. //广播帧
  371. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  372. ( ( HW_FRAME_MSG_SET_ID_MODE << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  373. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  374. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  375. send_can_buf[0] = HW_SETIDMODE_MODE1;
  376. send_can_buf[1] = HW_SETIDMODE_CONTROL1;
  377. SetEscidTail.HWTailBit.start = 1;
  378. SetEscidTail.HWTailBit.end = 1;
  379. SetEscidTail.HWTailBit.toggle = 0;
  380. send_can_buf[2] = SetEscidTail.HWTailByte;
  381. can_send_msg_normal(send_can_buf,3,canID);
  382. SetEscidTail.HWTailBit.tranid++;
  383. setESCidInfo.reTxMaxCnt--;
  384. }
  385. else
  386. {
  387. //广播模式,总线上有其他同NODEID的ESC时也会收到反馈
  388. set_HWesc_ESCid = false;
  389. setESCidInfo.setESCidStep++;
  390. setESCidInfo.reTxMaxCnt = 5;
  391. //继续配置2号水泵
  392. if(setESCidInfo.setESCidNum == 1)
  393. {
  394. setESCidInfo.setESCidNum++;
  395. setESCidInfo.setESCidStep = SETESCID_INIT;
  396. set_HWesc_ESCid = true;
  397. }
  398. else if(setESCidInfo.setESCidNum == 2)
  399. {
  400. //设置成功,发送ACK
  401. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL &&
  402. Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  403. {
  404. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,3,1);
  405. }
  406. else if (Dev.L_pump1_Link.connect_status == COMP_NORMAL)
  407. {
  408. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,1,1);
  409. }
  410. else if (Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  411. {
  412. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,2,1);
  413. }
  414. }
  415. }
  416. //超时退出
  417. if ( setESCidInfo.reTxMaxCnt <= 0 )
  418. {
  419. set_HWesc_ESCid = false;
  420. //继续配置2号水泵
  421. if(setESCidInfo.setESCidNum == 1)
  422. {
  423. setESCidInfo.setESCidNum++;
  424. setESCidInfo.setESCidStep = SETESCID_INIT;
  425. set_HWesc_ESCid = true;
  426. }
  427. else if(setESCidInfo.setESCidNum == 2)
  428. {
  429. //设置成功,发送ACK
  430. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL &&
  431. Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  432. {
  433. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,3,1);
  434. }
  435. else if (Dev.L_pump1_Link.connect_status == COMP_NORMAL)
  436. {
  437. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,1,1);
  438. }
  439. else if (Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  440. {
  441. pmu_set_ack(_MSGID_SET,MSGID_SET_PUMP_ID,2,1);
  442. }
  443. }
  444. setESCidInfo.setESCidStep = SETESCID_INIT;
  445. setESCidInfo.reTxMaxCnt = 5;
  446. }
  447. }
  448. }
  449. }
  450. /**
  451. * @file uavcan_equipment_power_BatteryInfo_decode
  452. * @brief CAN解析电流传感器
  453. * @param
  454. * @details
  455. * @author Zhang Sir
  456. **/
  457. struct uavcan_equipment_power_BatteryInfo power_BatteryInfo;
  458. uint8_t batteryInfoBuf[UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE] = {0};
  459. void uavcan_equipment_power_BatteryInfo_decode(uint8_t *recv_buf, uint32_t len, uint32_t id)
  460. {
  461. static uint32_t BufIndex = 0;
  462. static bool BufGetS = false;
  463. Dev.Current_Link.connect_status = COMP_NORMAL;
  464. Dev.Current_Link.recv_time = HAL_GetTick();
  465. HWTail revTail = {0};
  466. if ( len > 0 && len <= 8 )
  467. revTail.HWTailByte = recv_buf[len - 1];
  468. if ( revTail.HWTailBit.start == 1 )
  469. {
  470. BufIndex = 0;
  471. BufGetS = true;
  472. }
  473. if ( BufGetS == true && BufIndex + len - 1 <= sizeof( batteryInfoBuf ) )
  474. {
  475. memcpy( &batteryInfoBuf[BufIndex], recv_buf, len - 1 );
  476. BufIndex += ( len - 1 );
  477. }
  478. else
  479. {
  480. BufIndex = 0;
  481. BufGetS = false;
  482. }
  483. if ( BufGetS == true && revTail.HWTailBit.end == 1 )
  484. {
  485. uint16_t sigcrc = crcAddSignature( HW_CRC_INITVALUE, UAVCAN_EQUIPMENT_POWER_BATTERYINFO_SIGNATURE );
  486. uint16_t crc = crcAdd( sigcrc, &batteryInfoBuf[2], BufIndex - 2 );
  487. uint16_t recvCRC = ( batteryInfoBuf[1] << 8 ) + batteryInfoBuf[0];
  488. if ( crc == recvCRC )
  489. {
  490. uint16_t float16_val = 0;
  491. float16_val = batteryInfoBuf[2] + batteryInfoBuf[3]*256;
  492. power_BatteryInfo.temperature = canardConvertFloat16ToNativeFloat(float16_val);
  493. float16_val = batteryInfoBuf[4] + batteryInfoBuf[5]*256;
  494. power_BatteryInfo.voltage = canardConvertFloat16ToNativeFloat(float16_val);
  495. float16_val = batteryInfoBuf[6] + batteryInfoBuf[7]*256;
  496. power_BatteryInfo.current = canardConvertFloat16ToNativeFloat(float16_val);
  497. regist_dev_info(&dev_current,DEVICE_CURRENT,false,NULL,0,NULL,0,NULL,10,"current",8);
  498. }
  499. }
  500. }
  501. /**
  502. * @file HobbywingCanRecvHookFunction
  503. * @brief CAN解析好盈协议
  504. * @param
  505. * @details
  506. * @author Zhang Sir
  507. **/
  508. HWTail rawcmdTail = {0};
  509. HWTail setIDTail = {0};
  510. _EscLinkDevice EscMsg[3];
  511. void HobbywingCanRecvHookFunction(uint32_t id, uint8_t *recv_buf, uint8_t len)
  512. {
  513. //去掉NODEID
  514. uint32_t Can_filte_id = id & 0x1FFFFF00;
  515. if(Can_filte_id == 0x1F4E5200 || Can_filte_id == 0x1F4E5300 || Can_filte_id == 0x1F4E5400||
  516. Can_filte_id == 0x004E2E00 || Can_filte_id == 0x1000D200 || Can_filte_id == 0x004E2D00||
  517. Can_filte_id == 0x18044400 || Can_filte_id ==0x00D21000 ){}
  518. else{return;}
  519. uint16_t TypeID = 0;
  520. uint8_t SerOrMsg = ( id & HW_CANID_SNM_MASK ) >> HW_CANID_SNM_POS;
  521. uint8_t SrcNodeID = ( id & HW_CANID_SRCNODE_MASK ) >> HW_CANID_SRCNODE_POS;
  522. if ( SerOrMsg == HW_TYPE_SER )
  523. TypeID = ( id & HW_CANID_SERID_MASK ) >> HW_CANID_SERID_POS;
  524. else
  525. TypeID = ( id & HW_CANID_MSGID_MASK ) >> HW_CANID_MSGID_POS;
  526. switch ( TypeID )
  527. {
  528. //单独解析HW_FRAME_MSG_SET_ID_MODE的反馈,进入设置时电调的自身节点不确定。不一定在1~8之间。
  529. case HW_FRAME_MSG_SET_ID_MODE:
  530. {
  531. uint8_t _mode = recv_buf[0];
  532. uint8_t _control = recv_buf[1];
  533. //进入配置ID模式
  534. if ( _mode == HW_SETIDMODE_MODE2 && _control == HW_SETIDMODE_CONTROL1 )
  535. {
  536. setESCidInfo.getSetIDModeRes = true;
  537. setESCidInfo.getSetIDModeResCnt++;
  538. }
  539. }
  540. break;
  541. case HW_FRAME_MSG_GET_ESC_ID:
  542. //hw_canesc_link_status = COMP_NORMAL;
  543. break;
  544. case UAVCAN_EQUIPMENT_POWER_BATTERYINFO_ID:
  545. uavcan_equipment_power_BatteryInfo_decode(recv_buf, len, id);
  546. break;
  547. }
  548. _EscLinkDevice *EscPtr = NULL;
  549. if ( SrcNodeID >= 1 && SrcNodeID <= 2 )
  550. {
  551. EscPtr = &EscMsg[SrcNodeID];
  552. }
  553. else if (SrcNodeID == 16 || SrcNodeID == 1)
  554. {
  555. SrcNodeID = 1;
  556. EscPtr = &EscMsg[SrcNodeID];
  557. }
  558. if ( EscPtr != NULL )
  559. {
  560. if(SrcNodeID == 1)
  561. {
  562. Dev.L_pump1_Link.connect_status = COMP_NORMAL;
  563. Dev.L_pump1_Link.recv_time = HAL_GetTick();
  564. Dev.L_pump1.facid = FAC_HW_ESC;
  565. }
  566. else if(SrcNodeID == 2)
  567. {
  568. Dev.L_pump2_Link.connect_status = COMP_NORMAL;
  569. Dev.L_pump2_Link.recv_time = HAL_GetTick();
  570. Dev.L_pump2.facid = FAC_HW_ESC;
  571. }
  572. HWTail revTail = {0};
  573. if ( len > 0 && len <= 8 )
  574. revTail.HWTailByte = recv_buf[len - 1];
  575. switch ( TypeID )
  576. {
  577. //esc自动上报 MSG1 2 3
  578. case HW_MSG1_ID:
  579. EscPtr->motorRPM = ( recv_buf[1] << 8 ) + recv_buf[0];
  580. EscPtr->pwm_value = ( recv_buf[3] << 8 ) + recv_buf[2];
  581. EscPtr->warn_flag = ( recv_buf[5] << 8 ) + recv_buf[4];
  582. break;
  583. case HW_MSG2_ID:
  584. EscPtr->esc_voltage = ( ( recv_buf[1] << 8 ) + recv_buf[0] ) / 10.0f;
  585. EscPtr->esc_current = ( ( recv_buf[3] << 8 ) + recv_buf[2] ) / 10.0f;
  586. EscPtr->esc_temperature = recv_buf[4];
  587. break;
  588. case HW_MSG3_ID:
  589. EscPtr->esc_mosTemp = recv_buf[0];
  590. EscPtr->esc_capTemp = recv_buf[1];
  591. EscPtr->esc_motorTemp = recv_buf[2];
  592. break;
  593. case HW_MSGCONTROL_ID:
  594. EscPtr->MsgCtrOpt = recv_buf[0];
  595. memcpy( &EscPtr->MsgCtrCmd, &recv_buf[1], 4 );
  596. break;
  597. case HW_FRAME_MSG_GET_ESC_ID:
  598. EscPtr->GetESCid = true;
  599. EscPtr->GetEscNodeID = recv_buf[0];
  600. EscPtr->GetEscThrCh = recv_buf[1];
  601. break;
  602. case HW_FRAME_MSG_SET_ID_MODE:
  603. //退出配置ID模式
  604. if ( recv_buf[0] == 0x55 && recv_buf[1] == 0x55 )
  605. EscPtr->ResSetIDModeExit = true;
  606. break;
  607. case HW_SETID_ID:
  608. EscPtr->ResSetID = true;
  609. EscPtr->SetIDNodeID = recv_buf[0];
  610. EscPtr->SetIDThrCh = recv_buf[1];
  611. break;
  612. case HW_SETBAUD_ID:
  613. EscPtr->SetBaud = recv_buf[0];
  614. break;
  615. case HW_SETLED_ID:
  616. EscPtr->SetLEDOpt = recv_buf[0];
  617. EscPtr->SetLEDClr = recv_buf[1];
  618. EscPtr->SetLEDBlk = recv_buf[2];
  619. break;
  620. case HW_SETROTATION_ID:
  621. EscPtr->SetRotDir = recv_buf[0];
  622. break;
  623. case HW_SETGET_FREQ_ID:
  624. EscPtr->SetFreqOpt = recv_buf[0];
  625. EscPtr->SetFreqID = ( recv_buf[2] << 8 ) + recv_buf[1];
  626. EscPtr->SetFreqFreq = recv_buf[3];
  627. break;
  628. case HW_THRSELEXT_ID:
  629. EscPtr->ThrSrc = recv_buf[0];
  630. break;
  631. case HW_SELFTEST_ID:
  632. EscPtr->SelfCheckSta = recv_buf[0];
  633. break;
  634. case HW_ESCINFO_ID:
  635. if ( revTail.HWTailBit.start == 1 )
  636. {
  637. EscPtr->_VerBufIndex = 0;
  638. EscPtr->_VerBufGetS = true;
  639. }
  640. if ( EscPtr->_VerBufGetS == true && EscPtr->_VerBufIndex + len - 1 < sizeof( EscPtr->_VerBuf ) )
  641. {
  642. memcpy( &EscPtr->_VerBuf[EscPtr->_VerBufIndex], recv_buf, len - 1 );
  643. EscPtr->_VerBufIndex += ( len - 1 );
  644. }
  645. else
  646. {
  647. EscPtr->_VerBufIndex = 0;
  648. EscPtr->_VerBufGetS = false;
  649. }
  650. if ( EscPtr->_VerBufGetS == true && revTail.HWTailBit.end == 1 )
  651. {
  652. uint16_t sigcrc = crcAddSignature( HW_CRC_INITVALUE, HW_ESCINFO_SIG );
  653. uint16_t crc = crcAdd( sigcrc, &EscPtr->_VerBuf[2], EscPtr->_VerBufIndex - 2 );
  654. uint16_t recvCRC = ( EscPtr->_VerBuf[1] << 8 ) + EscPtr->_VerBuf[0];
  655. if ( crc == recvCRC )
  656. {
  657. uint8_t ESCinfoOpt = EscPtr->_VerBuf[2];
  658. switch ( ESCinfoOpt )
  659. {
  660. case HW_ESCINFO_OPT00:
  661. EscPtr->GetESCInfoOpt00 = true;
  662. memcpy( EscPtr->LinkSoftVer, &EscPtr->_VerBuf[3], 16 );
  663. memcpy( EscPtr->LinkHardVer, &EscPtr->_VerBuf[19], 16 );
  664. memcpy( EscPtr->LinkDevVer, &EscPtr->_VerBuf[35], 16 );
  665. memcpy( EscPtr->LinkSN, &EscPtr->_VerBuf[51], 8 );
  666. break;
  667. case HW_ESCINFO_OPT01:
  668. EscPtr->GetESCInfoOpt01 = true;
  669. memcpy( EscPtr->DriveSoftVer, &EscPtr->_VerBuf[3], 16 );
  670. memcpy( EscPtr->DriveHardVer, &EscPtr->_VerBuf[19], 16 );
  671. memcpy( EscPtr->DriveDevVer, &EscPtr->_VerBuf[35], 16 );
  672. memcpy( EscPtr->DriveSN, &EscPtr->_VerBuf[51], 8 );
  673. break;
  674. case HW_ESCINFO_OPT02:
  675. EscPtr->GetESCInfoOpt02 = true;
  676. memcpy( EscPtr->HardSN, &EscPtr->_VerBuf[3], 16 );
  677. memcpy( EscPtr->ProtocolVer, &EscPtr->_VerBuf[19], 8 );
  678. break;
  679. default:
  680. break;
  681. }
  682. }
  683. }
  684. break;
  685. //设置回应ESC配置信息
  686. case HW_GETMAJORCONF_ID:
  687. EscPtr->GetMajorConf = true;
  688. EscPtr->MajorConfRot = ( recv_buf[0] >> 7 ) & 0x01; //电机旋转方向(0:顺时针,1:逆时针);
  689. EscPtr->MajorConfThrSrc = ( recv_buf[0] >> 6 ) & 0x01; //油门信号源(0:CAN数字油门,1:PWM油门);
  690. EscPtr->MajorConfThrCh = recv_buf[0] & 0x3F; //定的数字油门通道;
  691. EscPtr->MajorConfLEDBlink = ( recv_buf[1] >> 3 ) & 0x1f; //LED闪烁状态;
  692. EscPtr->MajorConfLEDColor = recv_buf[1] & 0x07; //LED静态灯色RGB;
  693. EscPtr->MajorConfMSG2UPHZ = ( recv_buf[2] >> 4 ) & 0x0f; //MSG2数据帧上报速率;
  694. EscPtr->MajorConfMSG1UPHZ = recv_buf[2] & 0x0f; //MSG1数据帧上报速率;
  695. EscPtr->MajorConfInstAngle = recv_buf[3] + ( recv_buf[4] << 8 ); //定位角度数值
  696. break;
  697. default:
  698. break;
  699. }
  700. }
  701. }
  702. /**
  703. * @file HW_CanGetESCInfomation
  704. * @brief 上电获取好盈版本配置信息
  705. * @param
  706. * @details
  707. * @author Zhang Sir
  708. **/
  709. HWTail GetEscInfoTail = {0};
  710. HWTail GetMInfoTail = {0};
  711. HWTail GetMajorConfTail = {0};
  712. HWTail GetESCidTail = {0};
  713. void HW_CanGetESCInfomation( void )
  714. {
  715. // uint8_t send_can_buf[8] = {0};
  716. // uint16_t desnodeID = 0;
  717. // uint32_t canID = 0;
  718. // if ( Dev.Pump_Link.connect_status == COMP_NORMAL && Dev.Pump.facid == FAC_HW_ESC )
  719. // {
  720. // 获取版本信息
  721. // if (EscMsg[desnodeID].GetESCInfoOpt00 != true )
  722. // {
  723. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  724. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  725. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  726. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  727. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  728. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  729. // send_can_buf[0] = HW_ESCINFO_OPT00;
  730. // GetEscInfoTail.HWTailBit.start = 1;
  731. // GetEscInfoTail.HWTailBit.end = 1;
  732. // GetEscInfoTail.HWTailBit.toggle = 0;
  733. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  734. // can_send_msg_normal(send_can_buf,2,canID);
  735. // GetEscInfoTail.HWTailBit.tranid++;
  736. // }
  737. // else if ( EscMsg[desnodeID].GetESCInfoOpt01 != true )
  738. // {
  739. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  740. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  741. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  742. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  743. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  744. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  745. // send_can_buf[0] = HW_ESCINFO_OPT01;
  746. // GetEscInfoTail.HWTailBit.start = 1;
  747. // GetEscInfoTail.HWTailBit.end = 1;
  748. // GetEscInfoTail.HWTailBit.toggle = 0;
  749. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  750. // can_send_msg_normal(send_can_buf,2,canID);
  751. // GetEscInfoTail.HWTailBit.tranid++;
  752. // }
  753. // else if (EscMsg[desnodeID].GetESCInfoOpt02 != true )
  754. // {
  755. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  756. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  757. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  758. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  759. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  760. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  761. // send_can_buf[0] = HW_ESCINFO_OPT02;
  762. // GetEscInfoTail.HWTailBit.start = 1;
  763. // GetEscInfoTail.HWTailBit.end = 1;
  764. // GetEscInfoTail.HWTailBit.toggle = 0;
  765. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  766. // can_send_msg_normal(send_can_buf,2,canID);
  767. // GetEscInfoTail.HWTailBit.tranid++;
  768. // }
  769. // else if ( EscMsg[desnodeID].GetMajorConf != true )
  770. // {
  771. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  772. // ( ( HW_GETMAJORCONF_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  773. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  774. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  775. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  776. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  777. // send_can_buf[0] = HW_MAJORCONF_OPT0;
  778. // GetMajorConfTail.HWTailBit.start = 1;
  779. // GetMajorConfTail.HWTailBit.end = 1;
  780. // GetMajorConfTail.HWTailBit.toggle = 0;
  781. // send_can_buf[1] = GetMajorConfTail.HWTailByte;
  782. // can_send_msg_normal(send_can_buf,2,canID);
  783. // GetMajorConfTail.HWTailBit.tranid++;
  784. // }
  785. // 获取的反馈ID和VK电池有冲突
  786. // if (EscMsg[desnodeID].GetESCid != true )
  787. // {
  788. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  789. // ( ( HW_FRAME_MSG_GET_ESC_ID << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  790. // ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  791. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  792. // send_can_buf[0] = HW_GETESCID_OPT0;
  793. // GetESCidTail.HWTailBit.start = 1;
  794. // GetESCidTail.HWTailBit.end = 1;
  795. // GetESCidTail.HWTailBit.toggle = 0;
  796. // send_can_buf[1] = GetESCidTail.HWTailByte;
  797. // can_send_msg_normal(send_can_buf,2,canID);
  798. // GetESCidTail.HWTailBit.tranid++;
  799. // }
  800. // }
  801. }
  802. /**
  803. * @file esc_throttle_switch
  804. * @brief 将PWM转换成HW油门
  805. * @param
  806. * @details
  807. * @author Zhang Sir
  808. **/
  809. uint8_t send_thr_buf[8] = {0};
  810. void esc_throttle_switch( int16_t *buf)
  811. {
  812. uint8_t temp_swich_buf[16] = {0};
  813. int16_t escbuf[8] = {0};
  814. for ( short i = 0; i < 4; i++ )
  815. {
  816. escbuf[i] = math_cons_i16( ( buf[i] - 1050 ), 0, 900 ) * 8191.0f / 900;
  817. }
  818. memcpy( temp_swich_buf, escbuf, 8 );
  819. send_thr_buf[0] = temp_swich_buf[0];
  820. send_thr_buf[1] = ( temp_swich_buf[1] << 2 ) | ( ( temp_swich_buf[2] >> 6 ) & 0x03 );
  821. send_thr_buf[2] = ( temp_swich_buf[2] << 2 ) | ( ( temp_swich_buf[3] >> 4 ) & 0x03 );
  822. send_thr_buf[3] = ( temp_swich_buf[3] << 4 ) | ( ( temp_swich_buf[4] >> 4 ) & 0x0f );
  823. send_thr_buf[4] = ( temp_swich_buf[4] << 4 ) | ( ( temp_swich_buf[5] >> 2 ) & 0x0f );
  824. send_thr_buf[5] = ( temp_swich_buf[5] << 6 ) | ( ( temp_swich_buf[6] >> 2 ) & 0x3f );
  825. send_thr_buf[6] = ( temp_swich_buf[6] << 6 ) | ( temp_swich_buf[7] & 0x3f );
  826. }
  827. /**
  828. * @file can_sendmsg_esc
  829. * @brief can发送HW
  830. * @param
  831. * @details
  832. * @author Zhang Sir
  833. **/
  834. void can_sendmsg_esc(void)
  835. {
  836. int16_t pwm_buf[4] = {0};
  837. int canID = ( ( 0x00 << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  838. ( ( HW_RAWCOMMAND_ID << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  839. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  840. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  841. pwm_buf[0] = pmu_pin.pump1;
  842. pwm_buf[1] = pmu_pin.pump2;
  843. pwm_buf[2] = 0;
  844. pwm_buf[3] = 0;
  845. esc_throttle_switch(pwm_buf);
  846. rawcmdTail.HWTailBit.start = 1;
  847. rawcmdTail.HWTailBit.end = 1;
  848. rawcmdTail.HWTailBit.toggle = 0;
  849. send_thr_buf[7] = rawcmdTail.HWTailByte;
  850. can_send_msg_normal(send_thr_buf,8,canID);
  851. rawcmdTail.HWTailBit.tranid++;
  852. }
  853. void Hobbywing_esc_func(void)
  854. {
  855. static uint32_t time_1hz = 0;
  856. if((Dev.L_pump1_Link.connect_status == COMP_NORMAL && Dev.L_pump1.facid== FAC_HW_ESC) ||
  857. (Dev.L_pump2_Link.connect_status == COMP_NORMAL && Dev.L_pump2.facid== FAC_HW_ESC))
  858. {
  859. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  860. {
  861. HW_CanGetESCInfomation();
  862. HW_CanSetESCInfomation();
  863. }
  864. if(set_HWesc_ESCid != true)
  865. {
  866. can_sendmsg_esc();
  867. }
  868. }
  869. }
  870. Z70_tranfer z70_info;
  871. water_dev churn,turntable;
  872. water_dev pump1,pump2;
  873. uint8_t spary_type = 0;
  874. uint8_t nozzle_type = 0;
  875. uint8_t weight_type = 0;
  876. void Get_auger_sowing_mag(uint32_t CanID, uint8_t data[], uint8_t len)
  877. {
  878. if(CanID == EFT_Z80_DEV)
  879. {
  880. memcpy(&z70_info, &data[0], len);
  881. switch (z70_info.dev_type)
  882. {
  883. case Z70_Public:
  884. if(weight_type == WEIGHT_DEFAULT)
  885. weight_type = WEIGHT_TRANFER;
  886. mimo_lackloss.status = data[6];
  887. memcpy(&eft_info.weight,&data[4],2);
  888. Dev.Weight_Link.connect_status = COMP_NORMAL;
  889. Dev.Weight.facid = FAC_EFT;
  890. Dev.Weight_Link.recv_time = HAL_GetTick();
  891. break;
  892. case Z70_Pump1:
  893. if( spary_type == SPARY_DEFAULT )
  894. spary_type = SPARY_TRANSFER;
  895. spary_type = SPARY_TRANSFER;
  896. Lpump1.rpm = z70_info.rpm;
  897. Lpump1.error_status = z70_info.warning;
  898. Dev.L_pump1_Link.connect_status = COMP_NORMAL;
  899. Dev.L_pump1.facid = FAC_EFT;
  900. Dev.L_pump1_Link.recv_time = HAL_GetTick();
  901. break;
  902. case Z70_Pump2:
  903. if( spary_type == SPARY_DEFAULT )
  904. spary_type = SPARY_TRANSFER;
  905. Lpump2.rpm = z70_info.rpm;
  906. Lpump2.error_status = z70_info.warning;
  907. Dev.L_pump2_Link.connect_status = COMP_NORMAL;
  908. Dev.L_pump2.facid = FAC_EFT;
  909. Dev.L_pump2_Link.recv_time = HAL_GetTick();
  910. break;
  911. case Z70_Nozzle1:
  912. if(nozzle_type == NOZZLE_DEFAULT)
  913. nozzle_type = NOZZLE_TRANSFER;
  914. nozzle1.rpm = z70_info.rpm;
  915. nozzle1.error_status = z70_info.warning;
  916. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  917. Dev.Nozzle.facid = FAC_EFT;
  918. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  919. break;
  920. case Z70_Nozzle2:
  921. if(nozzle_type == NOZZLE_DEFAULT)
  922. nozzle_type = NOZZLE_TRANSFER;
  923. nozzle2.rpm = z70_info.rpm;
  924. nozzle2.error_status = z70_info.warning;
  925. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  926. Dev.Nozzle.facid = FAC_EFT;
  927. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  928. break;
  929. case Z70_Nozzle3:
  930. if(nozzle_type == NOZZLE_DEFAULT)
  931. nozzle_type = NOZZLE_TRANSFER;
  932. nozzle3.rpm = z70_info.rpm;
  933. nozzle3.error_status = z70_info.warning;
  934. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  935. Dev.Nozzle.facid = FAC_EFT;
  936. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  937. break;
  938. case Z70_Nozzle4:
  939. if(nozzle_type == NOZZLE_DEFAULT)
  940. nozzle_type = NOZZLE_TRANSFER;
  941. nozzle4.rpm = z70_info.rpm;
  942. nozzle4.error_status = z70_info.warning;
  943. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  944. Dev.Nozzle.facid = FAC_EFT;
  945. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  946. break;
  947. case Z70_Churn:
  948. churn.rpm = z70_info.rpm;
  949. churn.error_status = z70_info.warning;
  950. churn.reserve = (z70_info.reserve1 & 0x01) | ((z70_info.reserve2 & 0x07) << 1);
  951. //churn.reserve += (1<<(z70_info.reserve2 & 0x07));
  952. static uint8_t churn_size = 0;
  953. if(churn_size != (z70_info.reserve3 & 0x07))
  954. {
  955. churn_size = z70_info.reserve3 & 0x07;
  956. Dev_parameter.Packing_auger_size = churn_size;
  957. DM4Dmsg_send_fmu = true;
  958. }
  959. Dev.Seed_Link.connect_status = COMP_NORMAL;
  960. Dev.Seed_Link.recv_time = HAL_GetTick();
  961. Dev.Seed.facid = FAC_CHURN_SEED;
  962. break;
  963. case Z70_Turntable:
  964. turntable.rpm = z70_info.rpm;
  965. turntable.error_status = z70_info.warning;
  966. Dev.Seed_Link.connect_status = COMP_NORMAL;
  967. Dev.Seed_Link.recv_time = HAL_GetTick();
  968. Dev.Seed.facid = FAC_CHURN_SEED;
  969. break;
  970. default:
  971. break;
  972. }
  973. }
  974. else if(CanID == EFT_Z80_DEV_ACK)
  975. {
  976. if(data[0] == 0xe6)
  977. {
  978. pmu_set_ack(_MSGID_SET,MSGID_SET_CHURN_RESET,0,0);
  979. }
  980. else if(data[0] == 0xe7)
  981. {
  982. Dev_parameter.Packing_auger_size = data[1];
  983. DM4Dmsg_send_fmu = true;
  984. }
  985. else if(data[0] == 0xe4)
  986. {
  987. z70weight.info.k1 = data[1] + ((data[2] & 0x3f) << 8);
  988. z70weight.info.k2 = (data[2] >> 6) + (data[3] << 2) + ((data[4] & 0xf) << 10);
  989. z70weight.info.k3 = (data[4] >> 4) + (data[5] << 4) + ((data[6] & 0x3) << 12);
  990. z70weight.info.k4 = (data[6] >> 2) + (data[7] << 6);
  991. weight_init_eft.step.read_k_flag = 0;
  992. }
  993. }
  994. }