soft_water.c 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818
  1. #include "soft_water.h"
  2. #include "soft_device.h"
  3. #include "usart_data_handle.h"
  4. #include "string.h"
  5. #include "common.h"
  6. #include "stdlib.h"
  7. #include "soft_can.h"
  8. #include "soft_version.h"
  9. #include "soft_crc.h"
  10. #include "soft_update.h"
  11. #include "soft_seed_weight.h"
  12. #include "config.h"
  13. #include "main_task.h"
  14. /**
  15. * @file liquid_recieved_hookfuction
  16. * @brief 液位计解析
  17. * @param
  18. * @details
  19. * @author Zhang Sir
  20. **/
  21. liquid liquid_inf;
  22. short liquid_aver_value[20] = {0};
  23. uint8_t liquid_aver_i = 0;
  24. bool liquid_opening = false; //初始化
  25. int liquid_aver_time = 0;
  26. void liquid_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  27. {
  28. Dev.Checklow_Link.connect_status = COMP_NORMAL;
  29. Dev.Checklow_Link.recv_time = HAL_GetTick();
  30. memcpy(&liquid_inf.liquid_percent,&data[0],3);
  31. //俯仰小于8度
  32. if((abs(planep.roll_angle / 100.0f) < 8) && (abs(planep.pitch_angle / 100.0f) < 8) && HAL_GetTick() - liquid_aver_time > 1000)
  33. {
  34. liquid_aver_value[liquid_aver_i] = liquid_inf.liquid_percent;
  35. liquid_aver_i++;
  36. if(liquid_aver_i > 19 )
  37. {
  38. liquid_opening = true;
  39. liquid_aver_i = 0;
  40. }
  41. }
  42. else
  43. {
  44. liquid_aver_time = HAL_GetTick();
  45. }
  46. }
  47. void Eft_Dev_Ack_recieved_hookfuction(uint32_t CanID, uint8_t data[], uint8_t len)
  48. {
  49. switch (CanID)
  50. {
  51. case Pump1 - 1:
  52. switch (data[0])
  53. {
  54. case 0xF4:
  55. // if( dev_pump1.regist.sn == false)
  56. // regist_dev_info(&dev_pump1,PUMP1,false,(char *)data[1], ,NULL,0,NULL,0,"pump1",5);
  57. break;
  58. case 0xF5:
  59. break;
  60. case 0xF6:
  61. break;
  62. default:
  63. break;
  64. }
  65. break;
  66. case Pump2 - 1:
  67. switch (data[0])
  68. {
  69. case 0xF4:
  70. // if( dev_pump2.regist.sn == false)
  71. // regist_dev_info(&dev_pump1,PUMP2,false,(char *)data[1], ,NULL,0,NULL,0,"pump2",5);
  72. break;
  73. case 0xF5:
  74. break;
  75. case 0xF6:
  76. break;
  77. default:
  78. break;
  79. }
  80. break;
  81. case Nozzle1 - 1:
  82. switch (data[0])
  83. {
  84. case 0xF4:
  85. // if( dev_nozzle1.regist.sn == false)
  86. // regist_dev_info(&dev_nozzle1,NOZZLE1,false,(char *)data[1], ,NULL,0,NULL,0,"nozzle1",8);
  87. break;
  88. case 0xF5:
  89. break;
  90. case 0xF6:
  91. break;
  92. default:
  93. break;
  94. }
  95. break;
  96. case Nozzle2 - 1:
  97. switch (data[0])
  98. {
  99. case 0xF4:
  100. // if( dev_nozzle2.regist.sn == false)
  101. // regist_dev_info(&dev_nozzle2,NOZZLE2,false,(char *)data[1], ,NULL,0,NULL,0,"nozzle2",8);
  102. break;
  103. case 0xF5:
  104. break;
  105. case 0xF6:
  106. break;
  107. default:
  108. break;
  109. }
  110. break;
  111. case Nozzle3 - 1:
  112. switch (data[0])
  113. {
  114. case 0xF4:
  115. // if( dev_nozzle3.regist.sn == false)
  116. // regist_dev_info(&dev_nozzle3,NOZZLE3,false,(char *)data[1], ,NULL,0,NULL,0,"nozzle3",8);
  117. break;
  118. case 0xF5:
  119. break;
  120. case 0xF6:
  121. break;
  122. default:
  123. break;
  124. }
  125. break;
  126. case Nozzle4 - 1:
  127. switch (data[0])
  128. {
  129. case 0xF4:
  130. // if( dev_nozzle4.regist.sn == false)
  131. // regist_dev_info(&dev_nozzle4,NOZZLE4,false,(char *)data[1], ,NULL,0,NULL,0,"nozzle4",8);
  132. break;
  133. case 0xF5:
  134. break;
  135. case 0xF6:
  136. break;
  137. default:
  138. break;
  139. }
  140. break;
  141. default:
  142. break;
  143. }
  144. }
  145. /**
  146. * @file Eft_Pump_Nozzle_recieved_hookfuction
  147. * @brief eft水泵 离心喷头
  148. * @param none
  149. * @details
  150. * @author Zhang Sir
  151. **/
  152. water_dev pump1,pump2;
  153. water_dev pump2;
  154. water_dev nozzle1,nozzle2,nozzle3,nozzle4,churn,turntable;
  155. void Eft_Pump_Nozzle_recieved_hookfuction(uint32_t CanID, uint8_t data[], uint8_t len)
  156. {
  157. switch (CanID)
  158. {
  159. case 0x9527:
  160. pump1.rpm = data[0] + data[1] *256;
  161. pump2.rpm = data[2] + data[3] *256;
  162. Dev.Pump_Link.connect_status = COMP_NORMAL;
  163. Dev.Pump.facid = FAC_EFT;
  164. Dev.Pump_Link.recv_time = HAL_GetTick();
  165. break;
  166. case Pump1:
  167. memcpy(&pump1,&data[0],sizeof(water_dev));
  168. Dev.Eft_CanDev_Link[0].connect_status = COMP_NORMAL;
  169. Dev.L_pump1_Link.connect_status = COMP_NORMAL;
  170. Dev.L_pump1.facid = FAC_EFT;
  171. Dev.L_pump1_Link.recv_time = HAL_GetTick();
  172. if(set_eftdev_canid_flag == true)
  173. set_eftdev_canid_status = set_eftdev_canid_status | 1;
  174. break;
  175. case Pump2:
  176. memcpy(&pump2,&data[0],sizeof(water_dev));
  177. Dev.Eft_CanDev_Link[1].connect_status = COMP_NORMAL;
  178. Dev.L_pump2_Link.connect_status = COMP_NORMAL;
  179. Dev.L_pump2.facid = FAC_EFT;
  180. Dev.L_pump2_Link.recv_time = HAL_GetTick();
  181. if(set_eftdev_canid_flag == true)
  182. set_eftdev_canid_status = set_eftdev_canid_status | (1 << 1);
  183. break;
  184. case Nozzle1:
  185. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  186. Dev.Nozzle.facid = FAC_EFT;
  187. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  188. memcpy(&nozzle1,&data[0],sizeof(water_dev));
  189. Dev.Eft_CanDev_Link[2].connect_status = COMP_NORMAL;
  190. Dev.Eft_CanDev_Link[2].recv_time = HAL_GetTick();
  191. if(set_eftdev_canid_flag == true)
  192. set_eftdev_canid_status = set_eftdev_canid_status | (1 << 4);
  193. break;
  194. case Nozzle2:
  195. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  196. Dev.Nozzle.facid = FAC_EFT;
  197. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  198. memcpy(&nozzle2,&data[0],sizeof(water_dev));
  199. Dev.Eft_CanDev_Link[3].connect_status = COMP_NORMAL;
  200. Dev.Eft_CanDev_Link[3].recv_time = HAL_GetTick();
  201. if(set_eftdev_canid_flag == true)
  202. set_eftdev_canid_status = set_eftdev_canid_status | (1 << 5);
  203. break;
  204. case Nozzle3:
  205. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  206. Dev.Nozzle.facid = FAC_EFT;
  207. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  208. memcpy(&nozzle3,&data[0],sizeof(water_dev));
  209. Dev.Eft_CanDev_Link[4].connect_status = COMP_NORMAL;
  210. Dev.Eft_CanDev_Link[4].recv_time = HAL_GetTick();
  211. if(set_eftdev_canid_flag == true)
  212. set_eftdev_canid_status = set_eftdev_canid_status | (1 << 6);
  213. break;
  214. case Nozzle4:
  215. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  216. Dev.Nozzle.facid = FAC_EFT;
  217. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  218. Dev.Eft_CanDev_Link[5].connect_status = COMP_NORMAL;
  219. Dev.Eft_CanDev_Link[5].recv_time = HAL_GetTick();
  220. memcpy(&nozzle4,&data[0],sizeof(water_dev));
  221. if(set_eftdev_canid_flag == true)
  222. set_eftdev_canid_status = set_eftdev_canid_status | (1 << 7);
  223. break;
  224. //升级与版本信息回馈
  225. case Pump1 + 1:
  226. if(eft_update.update_flag == true)
  227. eft_dev_update_wait_ereseflash(data);
  228. break;
  229. case Pump1 + 2:
  230. if(data[5] == 0xF1 && data[6] == 0xF3)
  231. {
  232. switch (data[0])
  233. {
  234. case 0XF4:
  235. if(data[5] == 0xF1 && data[6] == 0xF3)
  236. {
  237. for(uint8_t i = 0;i < 3;i++)
  238. {
  239. dev_pump1.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  240. dev_pump1.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  241. }
  242. dev_pump1.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  243. dev_pump1.sn[7] = (data[7] & 0xf )+ '0';
  244. regist_dev_info(&dev_pump1,DEVICE_LPUMP1,false,dev_pump1.sn,8,NULL,0,NULL,0,"eftpump1",9);
  245. }
  246. break;
  247. case 0XF5:
  248. for (uint8_t i = 1; i < 5; i++)
  249. {
  250. if(data[i] < 10)
  251. {
  252. dev_pump1.soft_serial[2 * (i - 1)] = '0';
  253. Int2String(data[i],&dev_pump1.soft_serial[2 * (i - 1) + 1],1);
  254. }
  255. else
  256. {
  257. Int2String(data[i],&dev_pump1.soft_serial[ (i - 1) * 2],2);
  258. }
  259. }
  260. regist_dev_info(&dev_pump1,DEVICE_LPUMP1,false,NULL,0,dev_pump1.soft_serial,8,NULL,0,"eftpump1",9);
  261. break;
  262. case 0XF6:
  263. Dev.Pump.runtime1 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  264. p1_runing_time = true;
  265. break;
  266. default:
  267. break;
  268. }
  269. }
  270. break;
  271. case Pump2 + 1:
  272. if(eft_update.update_flag == true)
  273. eft_dev_update_wait_ereseflash(data);
  274. break;
  275. case Pump2 + 2:
  276. if(data[5] == 0xF1 && data[6] == 0xF3)
  277. {
  278. switch (data[0])
  279. {
  280. case 0XF4:
  281. if(data[5] == 0xF1 && data[6] == 0xF3)
  282. {
  283. for(uint8_t i = 0;i < 3;i++)
  284. {
  285. dev_pump2.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  286. dev_pump2.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  287. }
  288. dev_pump2.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  289. dev_pump2.sn[7] = (data[7] & 0xf )+ '0';
  290. regist_dev_info(&dev_pump2,DEVICE_LPUMP2,false,dev_pump2.sn,8,NULL,0,NULL,0,"eftpump2",9);
  291. }
  292. break;
  293. case 0XF5:
  294. for (uint8_t i = 1; i < 5; i++)
  295. {
  296. if(data[i] < 10)
  297. {
  298. dev_pump2.soft_serial[2 * (i - 1)] = '0';
  299. Int2String(data[i],&dev_pump2.soft_serial[2 * (i - 1) + 1],1);
  300. }
  301. else
  302. {
  303. Int2String(data[i],&dev_pump2.soft_serial[ (i - 1) * 2],2);
  304. }
  305. }
  306. regist_dev_info(&dev_pump2,DEVICE_LPUMP2,false,NULL,0,dev_pump2.soft_serial,8,NULL,0,"eftpump2",9);
  307. break;
  308. case 0XF6:
  309. Dev.Pump.runtime2 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  310. p2_runing_time = true;
  311. break;
  312. default:
  313. break;
  314. }
  315. }
  316. break;
  317. case Nozzle1 + 1:
  318. if(eft_update.update_flag == true)
  319. eft_dev_update_wait_ereseflash(data);
  320. break;
  321. case Nozzle1 + 2:
  322. if(data[5] == 0xF1 && data[6] == 0xF3)
  323. {
  324. switch (data[0])
  325. {
  326. case 0XF4:
  327. for(uint8_t i = 0;i < 3;i++)
  328. {
  329. dev_nozzle1.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  330. dev_nozzle1.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  331. }
  332. dev_nozzle1.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  333. dev_nozzle1.sn[7] = (data[7] & 0xf )+ '0';
  334. regist_dev_info(&dev_nozzle1,DEVICE_NOZZLE1,false,dev_nozzle1.sn,8,NULL,0,NULL,0,"eftnozzle1",11);
  335. break;
  336. case 0XF5:
  337. for (uint8_t i = 1; i < 5; i++)
  338. {
  339. if(data[i] < 10)
  340. {
  341. dev_nozzle1.soft_serial[2 * (i - 1)] = '0';
  342. Int2String(data[i],&dev_nozzle1.soft_serial[2 * (i - 1) + 1],1);
  343. }
  344. else
  345. {
  346. Int2String(data[i],&dev_nozzle1.soft_serial[ (i - 1) * 2],2);
  347. }
  348. }
  349. regist_dev_info(&dev_nozzle1,DEVICE_NOZZLE1,false,NULL,0,dev_nozzle1.soft_serial,8,NULL,0,"eftnozzle1",11);
  350. break;
  351. case 0XF6:
  352. Dev.Nozzle.runtime1 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  353. n1_runing_time = true;
  354. break;
  355. default:
  356. break;
  357. }
  358. }
  359. break;
  360. case Nozzle2 + 1:
  361. if(eft_update.update_flag == true)
  362. eft_dev_update_wait_ereseflash(data);
  363. break;
  364. case Nozzle2 + 2:
  365. if(data[5] == 0xF1 && data[6] == 0xF3)
  366. {
  367. switch (data[0])
  368. {
  369. case 0XF4:
  370. if(data[5] == 0xF1 && data[6] == 0xF3)
  371. {
  372. for(uint8_t i = 0;i < 3;i++)
  373. {
  374. dev_nozzle2.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  375. dev_nozzle2.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  376. }
  377. dev_nozzle2.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  378. dev_nozzle2.sn[7] = (data[7] & 0xf )+ '0';
  379. regist_dev_info(&dev_nozzle2,DEVICE_NOZZLE2,false,dev_nozzle2.sn,8,NULL,0,NULL,0,"eftnozzle2",11);
  380. }
  381. break;
  382. case 0XF5:
  383. for (uint8_t i = 1; i < 5; i++)
  384. {
  385. if(data[i] < 10)
  386. {
  387. dev_nozzle2.soft_serial[2 * (i - 1)] = '0';
  388. Int2String(data[i],&dev_nozzle2.soft_serial[2 * (i - 1) + 1],1);
  389. }
  390. else
  391. {
  392. Int2String(data[i],&dev_nozzle2.soft_serial[ (i - 1) * 2],2);
  393. }
  394. }
  395. regist_dev_info(&dev_nozzle2,DEVICE_NOZZLE2,false,NULL,0,dev_nozzle2.soft_serial,8,NULL,0,"eftnozzle2",11);
  396. break;
  397. case 0XF6:
  398. Dev.Nozzle.runtime2 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  399. n2_runing_time = true;
  400. break;
  401. default:
  402. break;
  403. }
  404. }
  405. break;
  406. case Nozzle3 + 1:
  407. if(eft_update.update_flag == true)
  408. eft_dev_update_wait_ereseflash(data);
  409. break;
  410. case Nozzle3 + 2:
  411. if(data[5] == 0xF1 && data[6] == 0xF3)
  412. {
  413. switch (data[0])
  414. {
  415. case 0XF4:
  416. for(uint8_t i = 0;i < 3;i++)
  417. {
  418. dev_nozzle3.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  419. dev_nozzle3.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  420. }
  421. dev_nozzle3.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  422. dev_nozzle3.sn[7] = (data[7] & 0xf )+ '0';
  423. regist_dev_info(&dev_nozzle3,DEVICE_NOZZLE3,false,dev_nozzle3.sn,8,NULL,0,NULL,0,"eftnozzle3",11);
  424. break;
  425. case 0XF5:
  426. for (uint8_t i = 1; i < 5; i++)
  427. {
  428. if(data[i] < 10)
  429. {
  430. dev_nozzle3.soft_serial[2 * (i - 1)] = '0';
  431. Int2String(data[i],&dev_nozzle3.soft_serial[2 * (i - 1) + 1],1);
  432. }
  433. else
  434. {
  435. Int2String(data[i],&dev_nozzle3.soft_serial[ (i - 1) * 2],2);
  436. }
  437. }
  438. regist_dev_info(&dev_nozzle3,DEVICE_NOZZLE3,false,NULL,0,dev_nozzle3.soft_serial,8,NULL,0,"eftnozzle3",11);
  439. break;
  440. case 0XF6:
  441. Dev.Nozzle.runtime3 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  442. n3_runing_time = true;
  443. break;
  444. default:
  445. break;
  446. }
  447. }
  448. break;
  449. case Nozzle4 + 1:
  450. if(eft_update.update_flag == true)
  451. eft_dev_update_wait_ereseflash(data);
  452. break;
  453. case Nozzle4 + 2:
  454. if(data[5] == 0xF1 && data[6] == 0xF3 )
  455. {
  456. switch (data[0])
  457. {
  458. case 0XF4:
  459. for(uint8_t i = 0;i < 3;i++)
  460. {
  461. dev_nozzle4.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  462. dev_nozzle4.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  463. }
  464. dev_nozzle4.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  465. dev_nozzle4.sn[7] = (data[7] & 0xf )+ '0';
  466. regist_dev_info(&dev_nozzle4,DEVICE_NOZZLE4,false,dev_nozzle4.sn,8,NULL,0,NULL,0,"eftnozzle4",11);
  467. break;
  468. case 0XF5:
  469. for (uint8_t i = 1; i < 5; i++)
  470. {
  471. if(data[i] < 10)
  472. {
  473. dev_nozzle4.soft_serial[2 * (i - 1)] = '0';
  474. Int2String(data[i],&dev_nozzle4.soft_serial[2 * (i - 1) + 1],1);
  475. }
  476. else
  477. {
  478. Int2String(data[i],&dev_nozzle4.soft_serial[ (i - 1) * 2],2);
  479. }
  480. }
  481. regist_dev_info(&dev_nozzle4,DEVICE_NOZZLE4,false,NULL,0,dev_nozzle4.soft_serial,8,NULL,0,"eftnozzle4",11);
  482. break;
  483. case 0XF6:
  484. Dev.Nozzle.runtime4 = (data[1] + (data[2] + data[3] * 256) * 60) / 10;
  485. n4_runing_time = true;
  486. break;
  487. default:
  488. break;
  489. }
  490. }
  491. break;
  492. case Spread:
  493. break;
  494. default:
  495. break;
  496. }
  497. }
  498. /**
  499. * @file Z70_Pump_Nozzle_recieved_hookfuction
  500. * @brief Z70转接板
  501. * @param
  502. * @details
  503. * @author Zhang Sir
  504. **/
  505. Z70_tranfer z70_info;
  506. weight70_dev z70weight;
  507. uint16_t LiftingWeight_warning = 0;
  508. void Z70_Pump_Nozzle_recieved_hookfuction(uint32_t CanID, uint8_t data[], uint8_t len)
  509. {
  510. //70吊运板称重
  511. if(CanID == CAN_EFT70_WEIGHT)
  512. {
  513. if(drone_type != Drone_Z70)
  514. drone_type = Drone_Z70;
  515. Z70_LiftingWeight_exist = true;
  516. fplate.weight = (data[0] + data[1] * 256);
  517. LiftingWeight_warning = data[2];
  518. Dev.Weight_Link.connect_status = COMP_NORMAL;
  519. Dev.Weight.facid = FAC_EFT;
  520. Dev.Weight_Link.recv_time = HAL_GetTick();
  521. }
  522. else if(CanID == CAN_EFT70_WEIGHT_ACK)
  523. {
  524. //称重回馈
  525. switch (data[0])
  526. {
  527. case 0xe1:
  528. pmu_set_ack(_MSGID_SET,25,Cal_Remove_Peel,0);
  529. break;
  530. case 0xe2:
  531. pmu_set_ack(_MSGID_SET,25,Cal_Weight,0);
  532. break;
  533. case 0xe3:
  534. pmu_set_ack(_MSGID_SET,MSGID_SET_WEIGHT_K,0,0);
  535. break;
  536. case 0xe4:
  537. z70weight.info.k1 = data[1] + ((data[2] & 0x3f) << 8);
  538. z70weight.info.k2 = (data[2] >> 6) + (data[3] << 2) + ((data[4] & 0xf) << 10);
  539. z70weight.info.k3 = (data[4] >> 4) + (data[5] << 4) + ((data[6] & 0x3) << 12);
  540. z70weight.info.k4 = (data[6] >> 2) + (data[7] << 6);
  541. break;
  542. case 0XF3:
  543. for(uint8_t i = 0;i < 3;i++)
  544. {
  545. dev_weight.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  546. dev_weight.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  547. }
  548. dev_weight.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  549. dev_weight.sn[7] = (data[7] & 0xf )+ '0';
  550. regist_dev_info(&dev_weight,DEVICE_WEIGHT,false,dev_weight.sn,8,NULL,0,NULL,0,"eftweight",10);
  551. break;
  552. case 0xF4:
  553. for (uint8_t i = 2; i < 5; i++)
  554. {
  555. if(data[i] < 10)
  556. {
  557. dev_weight.soft_serial[2 * (i - 2)] = '0';
  558. Int2String(data[i],&dev_weight.soft_serial[2 * (i - 2) + 1],1);
  559. }
  560. else
  561. {
  562. Int2String(data[i],&dev_weight.soft_serial[ (i - 2) * 2],2);
  563. }
  564. }
  565. if(data[7] < 10)
  566. {
  567. dev_weight.soft_serial[2 * (4 - 1)] = '0';
  568. Int2String(data[7],&dev_weight.soft_serial[2 * (4 - 1) + 1],1);
  569. }
  570. else
  571. {
  572. Int2String(data[7],&dev_weight.soft_serial[ (4 - 1) * 2],2);
  573. }
  574. regist_dev_info(&dev_weight,DEVICE_WEIGHT,false,NULL,0,dev_weight.soft_serial,8,NULL,0,"eftweight",10);
  575. break;
  576. case 0xF5:
  577. Dev.Weight.runtime = data[2] + (data[3] + data[4] * 256) * 60;
  578. weight_runing_time = true;
  579. break;
  580. case 0xF7:
  581. pmu_set_ack(_MSGID_SET,MSGID_SET_RESIWIRE_BLOWN,data[1],0);
  582. break;
  583. default:
  584. break;
  585. }
  586. }
  587. if(CanID == 0x7010)
  588. {
  589. memcpy(&z70_info, &data[0], len);
  590. if(drone_type != Drone_Z70)
  591. drone_type = Drone_Z70;
  592. switch (z70_info.dev_type)
  593. {
  594. case Z70_Public:
  595. if(Z70_LiftingWeight_exist == false)
  596. memcpy(&fplate.weight,&data[4],2);
  597. mimo_lackloss.status = data[6];
  598. Dev.Weight_Link.connect_status = COMP_NORMAL;
  599. Dev.Weight.facid = FAC_EFT;
  600. Dev.Weight_Link.recv_time = HAL_GetTick();
  601. break;
  602. case Z70_Pump1:
  603. pump1.rpm = z70_info.rpm;
  604. pump1.error_status = z70_info.warning;
  605. Dev.L_pump1_Link.connect_status = COMP_NORMAL;
  606. Dev.L_pump1.facid = FAC_EFT;
  607. Dev.L_pump1_Link.recv_time = HAL_GetTick();
  608. Dev.Eft_CanDev_Link[0].connect_status = COMP_NORMAL;
  609. Dev.Eft_CanDev_Link[0].recv_time = HAL_GetTick();
  610. break;
  611. case Z70_Pump2:
  612. pump2.rpm = z70_info.rpm;
  613. pump2.error_status = z70_info.warning;
  614. Dev.L_pump2_Link.connect_status = COMP_NORMAL;
  615. Dev.L_pump2.facid = FAC_EFT;
  616. Dev.L_pump2_Link.recv_time = HAL_GetTick();
  617. Dev.Eft_CanDev_Link[1].connect_status = COMP_NORMAL;
  618. Dev.Eft_CanDev_Link[1].recv_time = HAL_GetTick();
  619. break;
  620. case Z70_Nozzle1:
  621. nozzle1.rpm = z70_info.rpm;
  622. nozzle1.error_status = z70_info.warning;
  623. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  624. Dev.Nozzle.facid = FAC_EFT;
  625. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  626. Dev.Eft_CanDev_Link[2].connect_status = COMP_NORMAL;
  627. Dev.Eft_CanDev_Link[2].recv_time = HAL_GetTick();
  628. break;
  629. case Z70_Nozzle2:
  630. nozzle2.rpm = z70_info.rpm;
  631. nozzle2.error_status = z70_info.warning;
  632. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  633. Dev.Nozzle.facid = FAC_EFT;
  634. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  635. Dev.Eft_CanDev_Link[3].connect_status = COMP_NORMAL;
  636. Dev.Eft_CanDev_Link[3].recv_time = HAL_GetTick();
  637. break;
  638. case Z70_Nozzle3:
  639. nozzle3.rpm = z70_info.rpm;
  640. nozzle3.error_status = z70_info.warning;
  641. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  642. Dev.Nozzle.facid = FAC_EFT;
  643. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  644. Dev.Eft_CanDev_Link[4].connect_status = COMP_NORMAL;
  645. Dev.Eft_CanDev_Link[4].recv_time = HAL_GetTick();
  646. break;
  647. case Z70_Nozzle4:
  648. nozzle4.rpm = z70_info.rpm;
  649. nozzle4.error_status = z70_info.warning;
  650. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  651. Dev.Nozzle.facid = FAC_EFT;
  652. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  653. Dev.Eft_CanDev_Link[5].connect_status = COMP_NORMAL;
  654. Dev.Eft_CanDev_Link[5].recv_time = HAL_GetTick();
  655. break;
  656. case Z70_Churn:
  657. churn.rpm = z70_info.rpm;
  658. churn.error_status = z70_info.warning;
  659. Dev.Seed_Link.connect_status = COMP_NORMAL;
  660. Dev.Seed_Link.recv_time = HAL_GetTick();
  661. Dev.Seed.facid = FAC_EFT;
  662. break;
  663. case Z70_Turntable:
  664. turntable.rpm = z70_info.rpm;
  665. turntable.error_status = z70_info.warning;
  666. Dev.Seed_Link.connect_status = COMP_NORMAL;
  667. Dev.Seed_Link.recv_time = HAL_GetTick();
  668. Dev.Seed.facid = FAC_EFT;
  669. break;
  670. default:
  671. break;
  672. }
  673. }
  674. else if(CanID == 0x7011)
  675. {
  676. if(eft_update.update_flag == true)
  677. eft_dev_update_wait_ereseflash(data);
  678. //称重回馈
  679. switch (data[0])
  680. {
  681. case 0xe1:
  682. pmu_set_ack(_MSGID_SET,25,Cal_Remove_Peel,0);
  683. break;
  684. case 0xe2:
  685. pmu_set_ack(_MSGID_SET,25,Cal_Weight,0);
  686. break;
  687. case 0xe3:
  688. pmu_set_ack(_MSGID_SET,MSGID_SET_WEIGHT_K,0,0);
  689. break;
  690. case 0xe4:
  691. z70weight.info.k1 = data[1] + ((data[2] & 0x3f) << 8);
  692. z70weight.info.k2 = (data[2] >> 6) + (data[3] << 2) + ((data[4] & 0xf) << 10);
  693. z70weight.info.k3 = (data[4] >> 4) + (data[5] << 4) + ((data[6] & 0x3) << 12);
  694. z70weight.info.k4 = (data[6] >> 2) + (data[7] << 6);
  695. break;
  696. default:
  697. break;
  698. }
  699. switch (data[1])
  700. {
  701. case Z70_Public:
  702. switch (data[0])
  703. {
  704. case 0XF3:
  705. for(uint8_t i = 0;i < 3;i++)
  706. {
  707. dev_weight.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  708. dev_weight.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  709. }
  710. dev_weight.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  711. dev_weight.sn[7] = (data[7] & 0xf )+ '0';
  712. regist_dev_info(&dev_weight,DEVICE_WEIGHT,false,dev_weight.sn,8,NULL,0,NULL,0,"eftweight",10);
  713. break;
  714. case 0xF4:
  715. for (uint8_t i = 2; i < 5; i++)
  716. {
  717. if(data[i] < 10)
  718. {
  719. dev_weight.soft_serial[2 * (i - 2)] = '0';
  720. Int2String(data[i],&dev_weight.soft_serial[2 * (i - 2) + 1],1);
  721. }
  722. else
  723. {
  724. Int2String(data[i],&dev_weight.soft_serial[ (i - 2) * 2],2);
  725. }
  726. }
  727. if(data[7] < 10)
  728. {
  729. dev_weight.soft_serial[2 * (4 - 1)] = '0';
  730. Int2String(data[7],&dev_weight.soft_serial[2 * (4 - 1) + 1],1);
  731. }
  732. else
  733. {
  734. Int2String(data[7],&dev_weight.soft_serial[ (4 - 1) * 2],2);
  735. }
  736. regist_dev_info(&dev_weight,DEVICE_WEIGHT,false,NULL,0,dev_weight.soft_serial,8,NULL,0,"eftweight",10);
  737. break;
  738. case 0xF5:
  739. Dev.Weight.runtime = data[2] + (data[3] + data[4] * 256) * 60;
  740. weight_runing_time = true;
  741. break;
  742. default:
  743. break;
  744. }
  745. break;
  746. case Z70_Pump1:
  747. switch (data[0])
  748. {
  749. case 0XF3:
  750. for(uint8_t i = 0;i < 3;i++)
  751. {
  752. dev_pump1.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  753. dev_pump1.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  754. }
  755. dev_pump1.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  756. dev_pump1.sn[7] = (data[7] & 0xf )+ '0';
  757. regist_dev_info(&dev_pump1,DEVICE_LPUMP1,false,dev_pump1.sn,8,NULL,0,NULL,0,"eftpump1",9);
  758. break;
  759. case 0XF4:
  760. for (uint8_t i = 2; i < 5; i++)
  761. {
  762. if(data[i] < 10)
  763. {
  764. dev_pump1.soft_serial[2 * (i - 2)] = '0';
  765. Int2String(data[i],&dev_pump1.soft_serial[2 * (i - 2) + 1],1);
  766. }
  767. else
  768. {
  769. Int2String(data[i],&dev_pump1.soft_serial[ (i - 2) * 2],2);
  770. }
  771. }
  772. if(data[7] < 10)
  773. {
  774. dev_pump1.soft_serial[2 * (4 - 1)] = '0';
  775. Int2String(data[7],&dev_pump1.soft_serial[2 * (4 - 1) + 1],1);
  776. }
  777. else
  778. {
  779. Int2String(data[7],&dev_pump1.soft_serial[ (4 - 1) * 2],2);
  780. }
  781. regist_dev_info(&dev_pump1,DEVICE_LPUMP1,false,NULL,0,dev_pump1.soft_serial,8,NULL,0,"eftpump1",9);
  782. break;
  783. case 0XF5:
  784. Dev.Pump.runtime1 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  785. p1_runing_time = true;
  786. break;
  787. default:
  788. break;
  789. }
  790. break;
  791. case Z70_Pump2:
  792. switch (data[0])
  793. {
  794. case 0XF3:
  795. for(uint8_t i = 0;i < 3;i++)
  796. {
  797. dev_pump2.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  798. dev_pump2.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  799. }
  800. dev_pump2.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  801. dev_pump2.sn[7] = (data[7] & 0xf )+ '0';
  802. regist_dev_info(&dev_pump2,DEVICE_LPUMP2,false,dev_pump2.sn,8,NULL,0,NULL,0,"eftpump2",9);
  803. break;
  804. case 0XF4:
  805. for (uint8_t i = 2; i < 5; i++)
  806. {
  807. if(data[i] < 10)
  808. {
  809. dev_pump2.soft_serial[2 * (i - 2)] = '0';
  810. Int2String(data[i],&dev_pump2.soft_serial[2 * (i - 2) + 1],1);
  811. }
  812. else
  813. {
  814. Int2String(data[i],&dev_pump2.soft_serial[ (i - 2) * 2],2);
  815. }
  816. }
  817. if(data[7] < 10)
  818. {
  819. dev_pump2.soft_serial[2 * (4 - 1)] = '0';
  820. Int2String(data[7],&dev_pump2.soft_serial[2 * (4 - 1) + 1],1);
  821. }
  822. else
  823. {
  824. Int2String(data[7],&dev_pump2.soft_serial[ (4 - 1) * 2],2);
  825. }
  826. regist_dev_info(&dev_pump2,DEVICE_LPUMP2,false,NULL,0,dev_pump2.soft_serial,8,NULL,0,"eftpump2",9);
  827. break;
  828. case 0XF5:
  829. Dev.Pump.runtime2 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  830. p2_runing_time = true;
  831. break;
  832. default:
  833. break;
  834. }
  835. break;
  836. case Z70_Nozzle1:
  837. switch (data[0])
  838. {
  839. case 0XF3:
  840. for(uint8_t i = 0;i < 3;i++)
  841. {
  842. dev_nozzle1.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  843. dev_nozzle1.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  844. }
  845. dev_nozzle1.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  846. dev_nozzle1.sn[7] = (data[7] & 0xf )+ '0';
  847. regist_dev_info(&dev_nozzle1,DEVICE_NOZZLE1,false,dev_nozzle1.sn,8,NULL,0,NULL,0,"eftnozzle1",11);
  848. break;
  849. case 0XF4:
  850. for (uint8_t i = 2; i < 5; i++)
  851. {
  852. if(data[i] < 10)
  853. {
  854. dev_nozzle1.soft_serial[2 * (i - 2)] = '0';
  855. Int2String(data[i],&dev_nozzle1.soft_serial[2 * (i - 2) + 1],1);
  856. }
  857. else
  858. {
  859. Int2String(data[i],&dev_nozzle1.soft_serial[ (i - 2) * 2],2);
  860. }
  861. }
  862. if(data[7] < 10)
  863. {
  864. dev_nozzle1.soft_serial[2 * (4 - 1)] = '0';
  865. Int2String(data[7],&dev_nozzle1.soft_serial[2 * (4 - 1) + 1],1);
  866. }
  867. else
  868. {
  869. Int2String(data[7],&dev_nozzle1.soft_serial[ (4 - 1) * 2],2);
  870. }
  871. regist_dev_info(&dev_nozzle1,DEVICE_NOZZLE1,false,NULL,0,dev_nozzle1.soft_serial,8,NULL,0,"eftnozzle1",11);
  872. break;
  873. case 0XF5:
  874. Dev.Nozzle.runtime1 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  875. n1_runing_time = true;
  876. break;
  877. default:
  878. break;
  879. }
  880. break;
  881. case Z70_Nozzle2:
  882. switch (data[0])
  883. {
  884. case 0XF3:
  885. if(data[5] == 0xF1 && data[6] == 0xF3)
  886. {
  887. for(uint8_t i = 0;i < 3;i++)
  888. {
  889. dev_nozzle2.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  890. dev_nozzle2.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  891. }
  892. dev_nozzle2.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  893. dev_nozzle2.sn[7] = (data[7] & 0xf )+ '0';
  894. regist_dev_info(&dev_nozzle2,DEVICE_NOZZLE2,false,dev_nozzle2.sn,8,NULL,0,NULL,0,"eftnozzle2",11);
  895. }
  896. break;
  897. case 0XF4:
  898. for (uint8_t i = 2; i < 5; i++)
  899. {
  900. if(data[i] < 10)
  901. {
  902. dev_nozzle2.soft_serial[2 * (i - 2)] = '0';
  903. Int2String(data[i],&dev_nozzle2.soft_serial[2 * (i - 2) + 1],1);
  904. }
  905. else
  906. {
  907. Int2String(data[i],&dev_nozzle2.soft_serial[ (i - 2) * 2],2);
  908. }
  909. }
  910. if(data[7] < 10)
  911. {
  912. dev_nozzle2.soft_serial[2 * (4 - 1)] = '0';
  913. Int2String(data[7],&dev_nozzle2.soft_serial[2 * (4 - 1) + 1],1);
  914. }
  915. else
  916. {
  917. Int2String(data[7],&dev_nozzle2.soft_serial[ (4 - 1) * 2],2);
  918. }
  919. regist_dev_info(&dev_nozzle2,DEVICE_NOZZLE2,false,NULL,0,dev_nozzle2.soft_serial,8,NULL,0,"eftnozzle2",11);
  920. break;
  921. case 0XF5:
  922. Dev.Nozzle.runtime2 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  923. n2_runing_time = true;
  924. break;
  925. default:
  926. break;
  927. }
  928. break;
  929. case Z70_Nozzle3:
  930. switch (data[0])
  931. {
  932. case 0XF3:
  933. for(uint8_t i = 0;i < 3;i++)
  934. {
  935. dev_nozzle3.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  936. dev_nozzle3.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  937. }
  938. dev_nozzle3.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  939. dev_nozzle3.sn[7] = (data[7] & 0xf )+ '0';
  940. regist_dev_info(&dev_nozzle3,DEVICE_NOZZLE3,false,dev_nozzle3.sn,8,NULL,0,NULL,0,"eftnozzle3",11);
  941. break;
  942. case 0XF4:
  943. for (uint8_t i = 2; i < 5; i++)
  944. {
  945. if(data[i] < 10)
  946. {
  947. dev_nozzle3.soft_serial[2 * (i - 2)] = '0';
  948. Int2String(data[i],&dev_nozzle3.soft_serial[2 * (i - 2) + 1],1);
  949. }
  950. else
  951. {
  952. Int2String(data[i],&dev_nozzle3.soft_serial[ (i - 2) * 2],2);
  953. }
  954. }
  955. if(data[7] < 10)
  956. {
  957. dev_nozzle3.soft_serial[2 * (4 - 1)] = '0';
  958. Int2String(data[7],&dev_nozzle3.soft_serial[2 * (4 - 1) + 1],1);
  959. }
  960. else
  961. {
  962. Int2String(data[7],&dev_nozzle3.soft_serial[ (4 - 1) * 2],2);
  963. }
  964. regist_dev_info(&dev_nozzle3,DEVICE_NOZZLE3,false,NULL,0,dev_nozzle3.soft_serial,8,NULL,0,"eftnozzle3",11);
  965. break;
  966. case 0XF5:
  967. Dev.Nozzle.runtime3 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  968. n3_runing_time = true;
  969. break;
  970. default:
  971. break;
  972. }
  973. break;
  974. case Z70_Nozzle4:
  975. switch (data[0])
  976. {
  977. case 0XF3:
  978. for(uint8_t i = 0;i < 3;i++)
  979. {
  980. dev_nozzle4.sn[2 * i] = ((data[2+i] >> 4) & 0xf) + '0';
  981. dev_nozzle4.sn[2 * i + 1] = (data[2+i] & 0xf )+ '0';
  982. }
  983. dev_nozzle4.sn[6] = ((data[7] >> 4) & 0xf) + '0';
  984. dev_nozzle4.sn[7] = (data[7] & 0xf )+ '0';
  985. regist_dev_info(&dev_nozzle4,DEVICE_NOZZLE4,false,dev_nozzle4.sn,8,NULL,0,NULL,0,"eftnozzle4",11);
  986. break;
  987. case 0XF4:
  988. for (uint8_t i = 1; i < 5; i++)
  989. {
  990. if(data[i] < 10)
  991. {
  992. dev_nozzle4.soft_serial[2 * (i - 2)] = '0';
  993. Int2String(data[i],&dev_nozzle4.soft_serial[2 * (i - 2) + 1],1);
  994. }
  995. else
  996. {
  997. Int2String(data[i],&dev_nozzle4.soft_serial[ (i - 2) * 2],2);
  998. }
  999. }
  1000. if(data[7] < 10)
  1001. {
  1002. dev_nozzle4.soft_serial[2 * (4 - 1)] = '0';
  1003. Int2String(data[7],&dev_nozzle4.soft_serial[2 * (4 - 1) + 1],1);
  1004. }
  1005. else
  1006. {
  1007. Int2String(data[7],&dev_nozzle4.soft_serial[ (4 - 1) * 2],2);
  1008. }
  1009. regist_dev_info(&dev_nozzle4,DEVICE_NOZZLE4,false,NULL,0,dev_nozzle4.soft_serial,8,NULL,0,"eftnozzle4",11);
  1010. break;
  1011. case 0XF5:
  1012. Dev.Nozzle.runtime4 = (data[2] + (data[3] + data[4] * 256) * 60) / 10;
  1013. n4_runing_time = true;
  1014. break;
  1015. default:
  1016. break;
  1017. }
  1018. break;
  1019. default:
  1020. break;
  1021. }
  1022. }
  1023. }
  1024. /**
  1025. * @file can_sendmsg_eft_water
  1026. * @brief 更新设备信息
  1027. * @param
  1028. * @details
  1029. * @author Zhang Sir
  1030. **/
  1031. water70_dev water70_info;
  1032. void can_sendmsg_eft_water(void)
  1033. {
  1034. uint8_t can_buf[8] = {0};
  1035. if(drone_type == Drone_Z20)
  1036. {
  1037. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL || Dev.L_pump2_Link.connect_status == COMP_NORMAL )
  1038. {
  1039. static uint8_t life[6] = {0};
  1040. can_buf[0] = 0xF1;
  1041. can_buf[5] = 0xF1;
  1042. can_buf[6] = 0xF3;
  1043. //pmup1
  1044. can_buf[1]= (pmu_pin.pump1 >> 8) & 0xff;
  1045. can_buf[2]= pmu_pin.pump1 & 0xff;
  1046. can_buf[7]= life[0];
  1047. life[0]++;
  1048. Can_Send_Msg_Func(CANID2, can_buf, 8, Pump1 + 1 , CAN_ID_EXT);
  1049. //pump2
  1050. can_buf[1]= (pmu_pin.pump2 >> 8) & 0xff;
  1051. can_buf[2]= pmu_pin.pump2 & 0xff;
  1052. can_buf[7]= life[1];
  1053. life[1]++;
  1054. Can_Send_Msg_Func(CANID2, can_buf, 8, Pump2 + 1 , CAN_ID_EXT);
  1055. //nozzle1
  1056. can_buf[1]= (pmu_pin.nozz1_fm >> 8) & 0xff;
  1057. can_buf[2]= pmu_pin.nozz1_fm & 0xff;
  1058. can_buf[7]= life[2];
  1059. life[2]++;
  1060. Can_Send_Msg_Func(CANID2, can_buf, 8, Nozzle1 + 1 , CAN_ID_EXT);
  1061. //nozzle2
  1062. can_buf[1]= (pmu_pin.nozz1_fm >> 8) & 0xff;
  1063. can_buf[2]= pmu_pin.nozz1_fm & 0xff;
  1064. can_buf[7]= life[3];
  1065. life[3]++;
  1066. Can_Send_Msg_Func(CANID2, can_buf, 8, Nozzle2 + 1 , CAN_ID_EXT);
  1067. //nozzle3
  1068. can_buf[1]= (pmu_pin.nozz2_zp >> 8) & 0xff;
  1069. can_buf[2]= pmu_pin.nozz2_zp & 0xff;
  1070. can_buf[7]= life[4];
  1071. life[4]++;
  1072. Can_Send_Msg_Func(CANID2, can_buf, 8, Nozzle3 + 1 , CAN_ID_EXT);
  1073. //nozzle4
  1074. can_buf[1]= (pmu_pin.nozz2_zp >> 8) & 0xff;
  1075. can_buf[2]= pmu_pin.nozz2_zp & 0xff;
  1076. can_buf[7]= life[5];
  1077. life[5]++;
  1078. Can_Send_Msg_Func(CANID2, can_buf, 8, Nozzle4 + 1 , CAN_ID_EXT);
  1079. }
  1080. }
  1081. else if(drone_type == Drone_Z70)
  1082. {
  1083. water70_info.dev_water70.flag = planep.lock_status == STA_LOCK ? 0x5 : 0xA;
  1084. if(Dev.Seed_Link.connect_status != COMP_NOEXIST)
  1085. {
  1086. water70_info.dev_water70.pump1 = spread_par.pwm_valve - 1000;
  1087. water70_info.dev_water70.pump2 = spread_par.pwm_turntable - 1000;
  1088. }
  1089. else
  1090. {
  1091. water70_info.dev_water70.pump1 = pmu_pin.pump1 - 1000;
  1092. water70_info.dev_water70.pump2 = pmu_pin.pump2 - 1000;
  1093. }
  1094. water70_info.dev_water70.nozzle1 = pmu_pin.nozz1_fm - 1000;
  1095. water70_info.dev_water70.nozzle2 = pmu_pin.nozz2_zp - 1000;
  1096. water70_info.dev_water70.nozzle3 = pmu_pin.nozz3 - 1000;
  1097. water70_info.dev_water70.nozzle4 = pmu_pin.nozz4 - 1000;
  1098. memcpy(&can_buf, &water70_info.buf[0], sizeof(soft_water70));
  1099. Can_Send_Msg_Func(CANID2, can_buf, 8, 0x7011 , CAN_ID_EXT);
  1100. }
  1101. }
  1102. /**
  1103. * @file decode_liquid_info
  1104. * @brief 解析液位计
  1105. * @param
  1106. * @details
  1107. * @author Zhang Sir
  1108. **/
  1109. int decode_liquid_info(void)
  1110. {
  1111. Check_dev_link(&Dev.Checklow_Link,5000,(char *)&liquid_inf.liquid_percent,sizeof(liquid));
  1112. if(Dev.Checklow_Link.connect_status == COMP_NORMAL)
  1113. {
  1114. int liquid_temp = 0;
  1115. //上电没滤波直接显示
  1116. if(liquid_opening == false)
  1117. {
  1118. return liquid_inf.liquid_percent;
  1119. }
  1120. for(uint8_t i = 0; i < 20; i++)
  1121. {
  1122. liquid_temp += liquid_aver_value[i];
  1123. }
  1124. return liquid_temp / 20;
  1125. }
  1126. else
  1127. {
  1128. return 0;
  1129. }
  1130. }
  1131. /**
  1132. * @file HobbywingCanRecvHookFunction
  1133. * @brief CAN解析好盈协议
  1134. * @param
  1135. * @details
  1136. * @author Zhang Sir
  1137. **/
  1138. HWTail rawcmdTail = {0};
  1139. HWTail setIDTail = {0};
  1140. _EscLinkDevice EscMsg[4 + 1];
  1141. void HobbywingCanRecvHookFunction(uint32_t id, uint8_t *recv_buf, uint8_t len)
  1142. {
  1143. //去掉NODEID
  1144. uint32_t Can_filte_id = id & 0x1FFFFF00;
  1145. if(Can_filte_id == 0x1F4E5200 || Can_filte_id == 0x1F4E5300 || Can_filte_id == 0x1F4E5400||
  1146. Can_filte_id == 0x004E2E00 || Can_filte_id == 0x1000D200 || Can_filte_id == 0x004E2D00||
  1147. Can_filte_id == 0x18044400){}
  1148. else{return;}
  1149. uint16_t TypeID = 0;
  1150. uint8_t SerOrMsg = ( id & HW_CANID_SNM_MASK ) >> HW_CANID_SNM_POS;
  1151. uint8_t SrcNodeID = ( id & HW_CANID_SRCNODE_MASK ) >> HW_CANID_SRCNODE_POS;
  1152. if ( SerOrMsg == HW_TYPE_SER )
  1153. TypeID = ( id & HW_CANID_SERID_MASK ) >> HW_CANID_SERID_POS;
  1154. else
  1155. TypeID = ( id & HW_CANID_MSGID_MASK ) >> HW_CANID_MSGID_POS;
  1156. switch ( TypeID )
  1157. {
  1158. //单独解析HW_FRAME_MSG_SET_ID_MODE的反馈,进入设置时电调的自身节点不确定。不一定在1~8之间。
  1159. case HW_FRAME_MSG_SET_ID_MODE:
  1160. {
  1161. uint8_t _mode = recv_buf[0];
  1162. uint8_t _control = recv_buf[1];
  1163. //进入配置ID模式
  1164. if ( _mode == HW_SETIDMODE_MODE2 && _control == HW_SETIDMODE_CONTROL1 )
  1165. {
  1166. setESCidInfo.getSetIDModeRes = true;
  1167. setESCidInfo.getSetIDModeResCnt++;
  1168. }
  1169. }
  1170. break;
  1171. case HW_FRAME_MSG_GET_ESC_ID:
  1172. //hw_canesc_link_status = COMP_NORMAL;
  1173. break;
  1174. case UAVCAN_EQUIPMENT_POWER_BATTERYINFO_ID:
  1175. //uavcan_equipment_power_BatteryInfo_decode(recv_buf, len, id);
  1176. break;
  1177. }
  1178. _EscLinkDevice *EscPtr = NULL;
  1179. if ( SrcNodeID >= 1 && SrcNodeID <= 4 )
  1180. {
  1181. EscPtr = &EscMsg[SrcNodeID];
  1182. }
  1183. else if (SrcNodeID == 16)
  1184. {
  1185. EscPtr = &EscMsg[0];
  1186. }
  1187. if ( EscPtr != NULL )
  1188. {
  1189. Dev.L_pump1_Link.connect_status = COMP_NORMAL;
  1190. Dev.L_pump1_Link.recv_time = HAL_GetTick();
  1191. Dev.L_pump1.facid = FAC_HW_ESC;
  1192. HWTail revTail = {0};
  1193. if ( len > 0 && len <= 8 )
  1194. revTail.HWTailByte = recv_buf[len - 1];
  1195. switch ( TypeID )
  1196. {
  1197. //esc自动上报 MSG1 2 3
  1198. case HW_MSG1_ID:
  1199. EscPtr->motorRPM = ( recv_buf[1] << 8 ) + recv_buf[0];
  1200. EscPtr->pwm_value = ( recv_buf[3] << 8 ) + recv_buf[2];
  1201. EscPtr->warn_flag = ( recv_buf[5] << 8 ) + recv_buf[4];
  1202. break;
  1203. case HW_MSG2_ID:
  1204. EscPtr->esc_voltage = ( ( recv_buf[1] << 8 ) + recv_buf[0] ) / 10.0f;
  1205. EscPtr->esc_current = ( ( recv_buf[3] << 8 ) + recv_buf[2] ) / 10.0f;
  1206. EscPtr->esc_temperature = recv_buf[4];
  1207. break;
  1208. case HW_MSG3_ID:
  1209. EscPtr->esc_mosTemp = recv_buf[0];
  1210. EscPtr->esc_capTemp = recv_buf[1];
  1211. EscPtr->esc_motorTemp = recv_buf[2];
  1212. break;
  1213. case HW_MSGCONTROL_ID:
  1214. EscPtr->MsgCtrOpt = recv_buf[0];
  1215. memcpy( &EscPtr->MsgCtrCmd, &recv_buf[1], 4 );
  1216. break;
  1217. case HW_FRAME_MSG_GET_ESC_ID:
  1218. EscPtr->GetESCid = true;
  1219. EscPtr->GetEscNodeID = recv_buf[0];
  1220. EscPtr->GetEscThrCh = recv_buf[1];
  1221. break;
  1222. case HW_FRAME_MSG_SET_ID_MODE:
  1223. //退出配置ID模式
  1224. if ( recv_buf[0] == 0x55 && recv_buf[1] == 0x55 )
  1225. EscPtr->ResSetIDModeExit = true;
  1226. break;
  1227. case HW_SETID_ID:
  1228. EscPtr->ResSetID = true;
  1229. EscPtr->SetIDNodeID = recv_buf[0];
  1230. EscPtr->SetIDThrCh = recv_buf[1];
  1231. break;
  1232. case HW_SETBAUD_ID:
  1233. EscPtr->SetBaud = recv_buf[0];
  1234. break;
  1235. case HW_SETLED_ID:
  1236. EscPtr->SetLEDOpt = recv_buf[0];
  1237. EscPtr->SetLEDClr = recv_buf[1];
  1238. EscPtr->SetLEDBlk = recv_buf[2];
  1239. break;
  1240. case HW_SETROTATION_ID:
  1241. EscPtr->SetRotDir = recv_buf[0];
  1242. break;
  1243. case HW_SETGET_FREQ_ID:
  1244. EscPtr->SetFreqOpt = recv_buf[0];
  1245. EscPtr->SetFreqID = ( recv_buf[2] << 8 ) + recv_buf[1];
  1246. EscPtr->SetFreqFreq = recv_buf[3];
  1247. break;
  1248. case HW_THRSELEXT_ID:
  1249. EscPtr->ThrSrc = recv_buf[0];
  1250. break;
  1251. case HW_SELFTEST_ID:
  1252. EscPtr->SelfCheckSta = recv_buf[0];
  1253. break;
  1254. case HW_ESCINFO_ID:
  1255. if ( revTail.HWTailBit.start == 1 )
  1256. {
  1257. EscPtr->_VerBufIndex = 0;
  1258. EscPtr->_VerBufGetS = true;
  1259. }
  1260. if ( EscPtr->_VerBufGetS == true && EscPtr->_VerBufIndex + len - 1 < sizeof( EscPtr->_VerBuf ) )
  1261. {
  1262. memcpy( &EscPtr->_VerBuf[EscPtr->_VerBufIndex], recv_buf, len - 1 );
  1263. EscPtr->_VerBufIndex += ( len - 1 );
  1264. }
  1265. else
  1266. {
  1267. EscPtr->_VerBufIndex = 0;
  1268. EscPtr->_VerBufGetS = false;
  1269. }
  1270. if ( EscPtr->_VerBufGetS == true && revTail.HWTailBit.end == 1 )
  1271. {
  1272. uint16_t sigcrc = crcAddSignature( HW_CRC_INITVALUE, HW_ESCINFO_SIG );
  1273. uint16_t crc = crcAdd( sigcrc, &EscPtr->_VerBuf[2], EscPtr->_VerBufIndex - 2 );
  1274. uint16_t recvCRC = ( EscPtr->_VerBuf[1] << 8 ) + EscPtr->_VerBuf[0];
  1275. if ( crc == recvCRC )
  1276. {
  1277. uint8_t ESCinfoOpt = EscPtr->_VerBuf[2];
  1278. switch ( ESCinfoOpt )
  1279. {
  1280. case HW_ESCINFO_OPT00:
  1281. EscPtr->GetESCInfoOpt00 = true;
  1282. memcpy( EscPtr->LinkSoftVer, &EscPtr->_VerBuf[3], 16 );
  1283. memcpy( EscPtr->LinkHardVer, &EscPtr->_VerBuf[19], 16 );
  1284. memcpy( EscPtr->LinkDevVer, &EscPtr->_VerBuf[35], 16 );
  1285. memcpy( EscPtr->LinkSN, &EscPtr->_VerBuf[51], 8 );
  1286. break;
  1287. case HW_ESCINFO_OPT01:
  1288. EscPtr->GetESCInfoOpt01 = true;
  1289. memcpy( EscPtr->DriveSoftVer, &EscPtr->_VerBuf[3], 16 );
  1290. memcpy( EscPtr->DriveHardVer, &EscPtr->_VerBuf[19], 16 );
  1291. memcpy( EscPtr->DriveDevVer, &EscPtr->_VerBuf[35], 16 );
  1292. memcpy( EscPtr->DriveSN, &EscPtr->_VerBuf[51], 8 );
  1293. break;
  1294. case HW_ESCINFO_OPT02:
  1295. EscPtr->GetESCInfoOpt02 = true;
  1296. memcpy( EscPtr->HardSN, &EscPtr->_VerBuf[3], 16 );
  1297. memcpy( EscPtr->ProtocolVer, &EscPtr->_VerBuf[19], 8 );
  1298. break;
  1299. default:
  1300. break;
  1301. }
  1302. }
  1303. }
  1304. break;
  1305. //设置回应ESC配置信息
  1306. case HW_GETMAJORCONF_ID:
  1307. EscPtr->GetMajorConf = true;
  1308. EscPtr->MajorConfRot = ( recv_buf[0] >> 7 ) & 0x01; //电机旋转方向(0:顺时针,1:逆时针);
  1309. EscPtr->MajorConfThrSrc = ( recv_buf[0] >> 6 ) & 0x01; //油门信号源(0:CAN数字油门,1:PWM油门);
  1310. EscPtr->MajorConfThrCh = recv_buf[0] & 0x3F; //定的数字油门通道;
  1311. EscPtr->MajorConfLEDBlink = ( recv_buf[1] >> 3 ) & 0x1f; //LED闪烁状态;
  1312. EscPtr->MajorConfLEDColor = recv_buf[1] & 0x07; //LED静态灯色RGB;
  1313. EscPtr->MajorConfMSG2UPHZ = ( recv_buf[2] >> 4 ) & 0x0f; //MSG2数据帧上报速率;
  1314. EscPtr->MajorConfMSG1UPHZ = recv_buf[2] & 0x0f; //MSG1数据帧上报速率;
  1315. EscPtr->MajorConfInstAngle = recv_buf[3] + ( recv_buf[4] << 8 ); //定位角度数值
  1316. break;
  1317. default:
  1318. break;
  1319. }
  1320. }
  1321. }
  1322. /**
  1323. * @file HW_CanGetESCInfomation
  1324. * @brief 上电获取好盈版本配置信息
  1325. * @param
  1326. * @details
  1327. * @author Zhang Sir
  1328. **/
  1329. HWTail GetEscInfoTail = {0};
  1330. HWTail GetMInfoTail = {0};
  1331. HWTail GetMajorConfTail = {0};
  1332. HWTail GetESCidTail = {0};
  1333. void HW_CanGetESCInfomation( void )
  1334. {
  1335. // uint8_t send_can_buf[8] = {0};
  1336. // uint16_t desnodeID = 0;
  1337. // uint32_t canID = 0;
  1338. // if ( Dev.Pump_Link.connect_status == COMP_NORMAL && Dev.Pump.facid == FAC_HW_ESC )
  1339. // {
  1340. // 获取版本信息
  1341. // if (EscMsg[desnodeID].GetESCInfoOpt00 != true )
  1342. // {
  1343. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1344. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  1345. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  1346. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  1347. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1348. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  1349. // send_can_buf[0] = HW_ESCINFO_OPT00;
  1350. // GetEscInfoTail.HWTailBit.start = 1;
  1351. // GetEscInfoTail.HWTailBit.end = 1;
  1352. // GetEscInfoTail.HWTailBit.toggle = 0;
  1353. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  1354. // can_send_msg_normal(send_can_buf,2,canID);
  1355. // GetEscInfoTail.HWTailBit.tranid++;
  1356. // }
  1357. // else if ( EscMsg[desnodeID].GetESCInfoOpt01 != true )
  1358. // {
  1359. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1360. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  1361. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  1362. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  1363. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1364. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  1365. // send_can_buf[0] = HW_ESCINFO_OPT01;
  1366. // GetEscInfoTail.HWTailBit.start = 1;
  1367. // GetEscInfoTail.HWTailBit.end = 1;
  1368. // GetEscInfoTail.HWTailBit.toggle = 0;
  1369. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  1370. // can_send_msg_normal(send_can_buf,2,canID);
  1371. // GetEscInfoTail.HWTailBit.tranid++;
  1372. // }
  1373. // else if (EscMsg[desnodeID].GetESCInfoOpt02 != true )
  1374. // {
  1375. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1376. // ( ( HW_ESCINFO_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  1377. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  1378. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  1379. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1380. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  1381. // send_can_buf[0] = HW_ESCINFO_OPT02;
  1382. // GetEscInfoTail.HWTailBit.start = 1;
  1383. // GetEscInfoTail.HWTailBit.end = 1;
  1384. // GetEscInfoTail.HWTailBit.toggle = 0;
  1385. // send_can_buf[1] = GetEscInfoTail.HWTailByte;
  1386. // can_send_msg_normal(send_can_buf,2,canID);
  1387. // GetEscInfoTail.HWTailBit.tranid++;
  1388. // }
  1389. // else if ( EscMsg[desnodeID].GetMajorConf != true )
  1390. // {
  1391. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1392. // ( ( HW_GETMAJORCONF_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  1393. // ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  1394. // ( ( desnodeID << HW_CANID_DESNODE_POS )& HW_CANID_DESNODE_MASK ) |
  1395. // ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1396. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS ) & HW_CANID_SRCNODE_MASK );
  1397. // send_can_buf[0] = HW_MAJORCONF_OPT0;
  1398. // GetMajorConfTail.HWTailBit.start = 1;
  1399. // GetMajorConfTail.HWTailBit.end = 1;
  1400. // GetMajorConfTail.HWTailBit.toggle = 0;
  1401. // send_can_buf[1] = GetMajorConfTail.HWTailByte;
  1402. // can_send_msg_normal(send_can_buf,2,canID);
  1403. // GetMajorConfTail.HWTailBit.tranid++;
  1404. // }
  1405. // 获取的反馈ID和VK电池有冲突
  1406. // if (EscMsg[desnodeID].GetESCid != true )
  1407. // {
  1408. // canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1409. // ( ( HW_FRAME_MSG_GET_ESC_ID << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  1410. // ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1411. // ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  1412. // send_can_buf[0] = HW_GETESCID_OPT0;
  1413. // GetESCidTail.HWTailBit.start = 1;
  1414. // GetESCidTail.HWTailBit.end = 1;
  1415. // GetESCidTail.HWTailBit.toggle = 0;
  1416. // send_can_buf[1] = GetESCidTail.HWTailByte;
  1417. // can_send_msg_normal(send_can_buf,2,canID);
  1418. // GetESCidTail.HWTailBit.tranid++;
  1419. // }
  1420. // }
  1421. }
  1422. /**
  1423. * @file HW_CanSetESCInfomation
  1424. * @brief HW设置类信息
  1425. * @param
  1426. * @details
  1427. * @author Zhang Sir
  1428. **/
  1429. bool set_HWesc_ESCid = false;
  1430. HWTail SetEscidTail = {0};
  1431. uint16_t curNodeID = 1; //当前能接收到的ESC的id
  1432. _setESCidInfo setESCidInfo = {.reTxMaxCnt = 5};
  1433. void HW_CanSetESCInfomation( void )
  1434. {
  1435. uint8_t send_can_buf[8] = {0};
  1436. uint32_t canID = 0;
  1437. if ( set_HWesc_ESCid == true )
  1438. {
  1439. //超时退出.任何阶段配置失败是否要执行退出配置模式?
  1440. if ( setESCidInfo.reTxMaxCnt <= 0 && setESCidInfo.setESCidStep != SETESCID_EXIT )
  1441. {
  1442. setESCidInfo.setESCidStep = SETESCID_EXIT;
  1443. setESCidInfo.reTxMaxCnt = 5;
  1444. set_HWesc_ESCid = false;
  1445. }
  1446. // 初始化并清零现场
  1447. if ( setESCidInfo.setESCidStep == SETESCID_INIT )
  1448. {
  1449. setESCidInfo.getSetIDModeRes = false;
  1450. setESCidInfo.reTxMaxCnt = 5;
  1451. setESCidInfo.getSetIDModeResCnt = 0;
  1452. if ( setESCidInfo.setESCidNum > 0 && setESCidInfo.setESCidNum <= 4 )
  1453. {
  1454. EscMsg[setESCidInfo.setESCidNum].ResSetID = false;
  1455. EscMsg[setESCidInfo.setESCidNum].ResSetIDModeExit = false;
  1456. setESCidInfo.setESCidStep++;
  1457. }
  1458. else
  1459. {
  1460. set_HWesc_ESCid = false;
  1461. }
  1462. }
  1463. // 进入配置模式
  1464. else if ( setESCidInfo.setESCidStep == SETESCID_ENTER )
  1465. {
  1466. if ( setESCidInfo.getSetIDModeRes == false )
  1467. {
  1468. //广播帧
  1469. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1470. ( ( HW_FRAME_MSG_SET_ID_MODE << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  1471. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1472. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  1473. send_can_buf[0] = HW_SETIDMODE_MODE2;
  1474. send_can_buf[1] = HW_SETIDMODE_CONTROL1;
  1475. SetEscidTail.HWTailBit.start = 1;
  1476. SetEscidTail.HWTailBit.end = 1;
  1477. SetEscidTail.HWTailBit.toggle = 0;
  1478. send_can_buf[2] = SetEscidTail.HWTailByte;
  1479. Can_Send_Msg_Func(CANID2, send_can_buf, 3, canID, CAN_ID_EXT);
  1480. SetEscidTail.HWTailBit.tranid++;
  1481. setESCidInfo.reTxMaxCnt--;
  1482. }
  1483. else
  1484. {
  1485. setESCidInfo.setESCidStep++;
  1486. setESCidInfo.reTxMaxCnt = 5;
  1487. setESCidInfo.setEscIDDelayTime = HAL_GetTick();
  1488. }
  1489. }
  1490. //配合油门,发送设置ID指令(要配置ID的通道PWM给1000,其余通道失能PWM输出)
  1491. else if ( setESCidInfo.setESCidStep == SETESCID_SET )
  1492. {
  1493. //配置信息
  1494. //EscSet.send_type2_canid[0] = 1;
  1495. //EscSet.send_type2_canid[1] = 1;
  1496. //setESCidInfo.setESCidNum = 2;
  1497. //配置ID属于伪服务帧,不关心DESnode
  1498. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1499. ( ( HW_SETID_ID << HW_CANID_SERID_POS ) & HW_CANID_SERID_MASK ) |
  1500. ( ( HW_TYPE_REQ << HW_CANID_RNR_POS ) & HW_CANID_RNR_MASK ) |
  1501. ( ( curNodeID << HW_CANID_DESNODE_POS ) & HW_CANID_DESNODE_MASK ) |
  1502. ( ( HW_TYPE_SER << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1503. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  1504. //等待电调的油门信号失能判定时间300ms,每次配置一个电调
  1505. if ( HAL_GetTick() - setESCidInfo.setEscIDDelayTime > 2000 )
  1506. {
  1507. if ( EscMsg[setESCidInfo.setESCidNum].ResSetID == false )
  1508. {
  1509. send_can_buf[0] = setESCidInfo.setESCidNum;
  1510. send_can_buf[1] = setESCidInfo.setESCidNum;
  1511. SetEscidTail.HWTailBit.start = 1;
  1512. SetEscidTail.HWTailBit.end = 1;
  1513. SetEscidTail.HWTailBit.toggle = 0;
  1514. send_can_buf[2] = SetEscidTail.HWTailByte;
  1515. Can_Send_Msg_Func(CANID2, send_can_buf, 3, canID, CAN_ID_EXT);
  1516. SetEscidTail.HWTailBit.tranid++;
  1517. setESCidInfo.reTxMaxCnt--;
  1518. }
  1519. else
  1520. {
  1521. setESCidInfo.setESCidStep++;
  1522. setESCidInfo.reTxMaxCnt = 5;
  1523. }
  1524. }
  1525. }
  1526. //nodeID配置完成/失败后退出配置模式,广播发送,全部回复
  1527. else if ( setESCidInfo.setESCidStep == SETESCID_EXIT )
  1528. {
  1529. if ( EscMsg[setESCidInfo.setESCidNum].ResSetIDModeExit == false )
  1530. {
  1531. //广播帧
  1532. canID = ( ( HW_PRI_MEDIUM << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1533. ( ( HW_FRAME_MSG_SET_ID_MODE << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  1534. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1535. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  1536. send_can_buf[0] = HW_SETIDMODE_MODE1;
  1537. send_can_buf[1] = HW_SETIDMODE_CONTROL1;
  1538. SetEscidTail.HWTailBit.start = 1;
  1539. SetEscidTail.HWTailBit.end = 1;
  1540. SetEscidTail.HWTailBit.toggle = 0;
  1541. send_can_buf[2] = SetEscidTail.HWTailByte;
  1542. Can_Send_Msg_Func(CANID2, send_can_buf, 3, canID, CAN_ID_EXT);
  1543. SetEscidTail.HWTailBit.tranid++;
  1544. setESCidInfo.reTxMaxCnt--;
  1545. }
  1546. else
  1547. {
  1548. //广播模式,总线上有其他同NODEID的ESC时也会收到反馈
  1549. set_HWesc_ESCid = false;
  1550. setESCidInfo.setESCidStep++;
  1551. setESCidInfo.reTxMaxCnt = 5;
  1552. //设置成功,发送ACK
  1553. }
  1554. //超时退出
  1555. if ( setESCidInfo.reTxMaxCnt <= 0 )
  1556. {
  1557. set_HWesc_ESCid = false;
  1558. setESCidInfo.setESCidStep = SETESCID_INIT;
  1559. setESCidInfo.reTxMaxCnt = 5;
  1560. }
  1561. }
  1562. }
  1563. }
  1564. /**
  1565. * @file esc_throttle_switch
  1566. * @brief 将PWM转换成HW油门
  1567. * @param
  1568. * @details
  1569. * @author Zhang Sir
  1570. **/
  1571. uint8_t send_thr_buf[8] = {0};
  1572. void esc_throttle_switch( int16_t *buf)
  1573. {
  1574. uint8_t temp_swich_buf[16] = {0};
  1575. int16_t escbuf[8] = {0};
  1576. for ( short i = 0; i < 4; i++ )
  1577. {
  1578. escbuf[i] = math_cons_i16( ( buf[i] - 1050 ), 0, 900 ) * 8191.0f / 900;
  1579. }
  1580. memcpy( temp_swich_buf, escbuf, 8 );
  1581. send_thr_buf[0] = temp_swich_buf[0];
  1582. send_thr_buf[1] = ( temp_swich_buf[1] << 2 ) | ( ( temp_swich_buf[2] >> 6 ) & 0x03 );
  1583. send_thr_buf[2] = ( temp_swich_buf[2] << 2 ) | ( ( temp_swich_buf[3] >> 4 ) & 0x03 );
  1584. send_thr_buf[3] = ( temp_swich_buf[3] << 4 ) | ( ( temp_swich_buf[4] >> 4 ) & 0x0f );
  1585. send_thr_buf[4] = ( temp_swich_buf[4] << 4 ) | ( ( temp_swich_buf[5] >> 2 ) & 0x0f );
  1586. send_thr_buf[5] = ( temp_swich_buf[5] << 6 ) | ( ( temp_swich_buf[6] >> 2 ) & 0x3f );
  1587. send_thr_buf[6] = ( temp_swich_buf[6] << 6 ) | ( temp_swich_buf[7] & 0x3f );
  1588. }
  1589. /**
  1590. * @file can_sendmsg_esc
  1591. * @brief can发送HW
  1592. * @param
  1593. * @details
  1594. * @author Zhang Sir
  1595. **/
  1596. void can_sendmsg_esc(void)
  1597. {
  1598. int16_t pwm_buf[4] = {1000,1000,1000,1000};
  1599. int canID = ( ( 0x00 << HW_CANID_PRI_POS ) & HW_CANID_PRI_MASK ) |
  1600. ( ( HW_RAWCOMMAND_ID << HW_CANID_MSGID_POS ) & HW_CANID_MSGID_MASK ) |
  1601. ( ( HW_TYPE_MSG << HW_CANID_SNM_POS ) & HW_CANID_SNM_MASK ) |
  1602. ( ( HW_NODE_BDC << HW_CANID_SRCNODE_POS )& HW_CANID_SRCNODE_MASK );
  1603. pwm_buf[0] = pmu_pin.pump1;
  1604. pwm_buf[1] = pmu_pin.pump2;
  1605. esc_throttle_switch(pwm_buf);
  1606. rawcmdTail.HWTailBit.start = 1;
  1607. rawcmdTail.HWTailBit.end = 1;
  1608. rawcmdTail.HWTailBit.toggle = 0;
  1609. send_thr_buf[7] = rawcmdTail.HWTailByte;
  1610. Can_Send_Msg_Func(CANID2, send_thr_buf, 8, canID, CAN_ID_EXT);
  1611. rawcmdTail.HWTailBit.tranid++;
  1612. }
  1613. void Hobbywing_esc_func(void)
  1614. {
  1615. static uint32_t time_1hz = 0;
  1616. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL && Dev.L_pump1.facid== FAC_HW_ESC)
  1617. {
  1618. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  1619. {
  1620. HW_CanGetESCInfomation();
  1621. HW_CanSetESCInfomation();
  1622. }
  1623. if(set_HWesc_ESCid != true)
  1624. {
  1625. can_sendmsg_esc();
  1626. }
  1627. }
  1628. }