soft_seed_device.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112
  1. #include "soft_seed_device.h"
  2. #include "common.h"
  3. #include "string.h"
  4. #include "soft_p_2_c.h"
  5. #include "soft_eft.h"
  6. #include "soft_flow.h"
  7. #include "soft_water_device.h"
  8. #include "soft_uart.h"
  9. #include "soft_terrain.h"
  10. #include "soft_obstacle.h"
  11. #include "soft_bms.h"
  12. #include "soft_okcell.h"
  13. #include "soft_version.h"
  14. #include "math.h"
  15. #include "qingxie_bms.h"
  16. weight weight_vkinfo;
  17. seed seed_vkinfo;
  18. send_seed_device seed_dev;
  19. Weight_cal weight_order;
  20. /**
  21. * @file Weight_recieved_hookfuction
  22. * @brief VK协议称重传感器
  23. * @param none
  24. * @details
  25. * @author Zhang Sir
  26. **/
  27. void Weight_recieved_hookfuction(uint32_t CanID, uint8_t data[], uint8_t len)
  28. {
  29. switch (CanID)
  30. {
  31. //称重传感器
  32. case 0x81320:
  33. memcpy(&weight_vkinfo.sensor_status,&data[0],8);
  34. if(weight_vkinfo.weight < 0)
  35. {
  36. weight_vkinfo.weight = abs(weight_vkinfo.weight);
  37. }
  38. //Dev.Weight_facid = 0;
  39. Dev.Weight_Link.connect_status = COMP_NORMAL;
  40. Dev.Weight_Link.recv_time = HAL_GetTick();
  41. break;
  42. //称重传感器设置回馈
  43. case 0x81322:
  44. switch (data[0])
  45. {
  46. //去皮校准ack
  47. case 0xf1:
  48. pmu_set_ack(_MSGID_SET,25,Cal_Remove_Peel,0);
  49. break;
  50. //称重校准ack
  51. case 0xf2:
  52. pmu_set_ack(_MSGID_SET,25,Cal_Weight,0);
  53. break;
  54. //恢复出厂设置ack
  55. case 0xf4:
  56. pmu_set_ack(_MSGID_SET,25,Cal_Seed_Back,0);
  57. break;
  58. case 0xf5:
  59. break;
  60. case 0xf6:
  61. {
  62. char ver_buf[6] = {0};
  63. int ver_temp32 = 0;
  64. memcpy(&ver_temp32,&data[1],4);
  65. Int2String(ver_temp32,ver_buf,6);
  66. if(dev_weight.regist.dev == false)
  67. regist_dev_info(&dev_weight,DEVICE_WEIGHT,false,NULL,0,(char *)&ver_buf[0],6,NULL,0,"weight",7);
  68. break;
  69. }
  70. //厂家编号
  71. case 0xf7:
  72. if(data[1] == 'Q' && data[2] == 'F') //0x 51 46
  73. {
  74. weight_vkinfo.serial_num = 3;
  75. Dev.Weight.facid = FAC_QIFEI;
  76. }
  77. else
  78. {
  79. weight_vkinfo.serial_num = 0;
  80. }
  81. weight_init_vk.step.fac_num_flag = 0;
  82. weight_init_count = 10;
  83. //memcpy(&weight_vkinfo.serial_num, &data[1],4);
  84. break;
  85. //读取传感器K值
  86. case 0xe1:
  87. if(data[7] == 0x1)
  88. {
  89. memcpy(&weight_vkinfo.senor_k[0],&data[1],4);
  90. }
  91. else if(data[7] == 0x2)
  92. {
  93. memcpy(&weight_vkinfo.senor_k[2],&data[1],4);
  94. }
  95. weight_init_vk.step.read_k_flag = 0;
  96. break;
  97. //设置传感器K值ack
  98. case 0xe2:
  99. pmu_set_ack(_MSGID_SET,Cal_Set_Sensor_K,0,0);
  100. weight_vkinfo.senor_k[data[7]] = data[1] + (data[2] << 8);
  101. break;
  102. //称重传感器模式读取
  103. case 0xe3:
  104. weight_vkinfo.mode = data[1];
  105. weight_init_vk.step.weight_mode_flag = 0;
  106. weight_init_count = 10;
  107. break;
  108. //称重传感器模式ack
  109. case 0xe4:
  110. pmu_set_ack(_MSGID_SET,Cal_Set_Sensor_Mode,0,0);
  111. weight_vkinfo.mode = data[1];
  112. break;
  113. //最大下药率读取
  114. case 0xe5:
  115. memcpy(&weight_vkinfo.dose_rate,&data[1],2);
  116. weight_init_vk.step.dose_rate_flag = 0;
  117. weight_init_count = 10;
  118. break;
  119. //最高下药率ack
  120. case 0xe6:
  121. pmu_set_ack(_MSGID_EFT_CON,Cal_Set_Doserate,0,0);
  122. weight_vkinfo.dose_rate = data[1] + (data[2] << 8);
  123. break;
  124. default:
  125. break;
  126. }
  127. break;
  128. //播撒器
  129. case 0x81323:
  130. memcpy(&seed_vkinfo,&data[0],7);
  131. Dev.Seed_Link.connect_status = COMP_NORMAL;
  132. Dev.Seed_Link.recv_time = HAL_GetTick();
  133. break;
  134. //播撒器回馈
  135. case 0x81325:
  136. switch (data[0])
  137. {
  138. case 0xf5:
  139. break;
  140. case 0xf6:
  141. break;
  142. case 0xf7:
  143. if(data[1] == 'Q' && data[2] == 'F')
  144. {
  145. seed_vkinfo.serial_num = 3;
  146. Dev.Seed.facid = FAC_QIFEI;
  147. }
  148. break;
  149. default:
  150. break;
  151. }
  152. break;
  153. default:
  154. break;
  155. }
  156. }
  157. //上电初始化发送的参数
  158. //device_type : 1 称重
  159. // : 2 播撒
  160. /**
  161. * @file seed_init_send_info
  162. * @brief 上电初始化发送的参数
  163. * @param 1 称重
  164. 2 播撒
  165. * @details
  166. * @author Zhang Sir
  167. **/
  168. Dev_weight_init weight_init_eft = {.step.read_k_flag = 1};
  169. Dev_weight_init weight_init_vk = {.step.dose_rate_flag = 1,
  170. .step.weight_mode_flag = 1,
  171. .step.read_k_flag = 1,
  172. .step.verison = 1,
  173. .step.fac_num_flag = 1};
  174. Dev_seed_init seed_init;
  175. bool recv_fmu_seed_info = false;
  176. uint8_t weight_init_count = 10;
  177. void seed_init_send_info(uint8_t device_type,char *factory)
  178. {
  179. uint8_t vk_canbuf[8] = {0,0,0,0,0,0XFE,0XFE,0};
  180. static uint8_t spread_init_count = 10;
  181. int vk_can_id = 0;
  182. if(strcmp(factory,"VK") == 0)
  183. {
  184. switch (device_type)
  185. {
  186. //称重
  187. case WEIGHT_DEVICE:
  188. vk_can_id = 0x81321;
  189. if(weight_init_vk.status != 0)
  190. {
  191. if(weight_init_vk.step.read_k_flag != 0)
  192. {
  193. vk_canbuf[0] = 0xE1;
  194. }
  195. else if(weight_init_vk.step.fac_num_flag != 0 && weight_init_count > 0)
  196. {
  197. vk_canbuf[0] = 0xF7;
  198. weight_init_count--;
  199. if(weight_init_count == 0)
  200. {
  201. weight_init_count = 10;
  202. weight_init_vk.step.fac_num_flag = 0;
  203. }
  204. }
  205. else if(weight_init_vk.step.verison != 0 && weight_init_count > 0)
  206. {
  207. vk_canbuf[0] = 0xF6;
  208. weight_init_count--;
  209. if(weight_init_count == 0)
  210. {
  211. weight_init_count = 10;
  212. weight_init_vk.step.verison = 0;
  213. }
  214. }
  215. else if (weight_init_vk.step.weight_mode_flag != 0 && weight_init_count > 0)
  216. {
  217. vk_canbuf[0] = 0xE3;
  218. weight_init_count--;
  219. if(weight_init_count == 0)
  220. {
  221. weight_init_count = 10;
  222. weight_init_vk.step.weight_mode_flag = 0;
  223. }
  224. }
  225. else if (weight_init_vk.step.dose_rate_flag != 0 && weight_init_count > 0)
  226. {
  227. vk_canbuf[0] = 0xE5;
  228. weight_init_count--;
  229. if(weight_init_count == 0)
  230. {
  231. weight_init_count = 10;
  232. weight_init_vk.step.dose_rate_flag = 0;
  233. }
  234. }
  235. // else if (weight_init_vk.step.dose_rate_flag != 0) //序列号和固件版本
  236. // {
  237. // vk_canbuf[0] = 0xf6;;
  238. // }
  239. // else if (weight_init_vk.step.dose_rate_flag != 0)
  240. // {
  241. // vk_canbuf[0] = 0xf5;
  242. // }
  243. can_send_msg_normal((unsigned char *)&vk_canbuf, 8, vk_can_id);
  244. }
  245. break;
  246. //播撒
  247. case SEED_DEVICE:
  248. vk_can_id = 0x81324;
  249. if(spread_init_count > 0)
  250. {
  251. //获取厂家信息
  252. vk_canbuf[0] = 0xf7;
  253. spread_init_count--;
  254. can_send_msg_normal((unsigned char *)&vk_canbuf, 8, vk_can_id);
  255. }
  256. break;
  257. default:
  258. break;
  259. }
  260. }
  261. else if (strcmp(factory,"EFT") == 0)
  262. {
  263. vk_can_id = SEND_EFT_INFO;
  264. switch (device_type)
  265. {
  266. case WEIGHT_DEVICE:
  267. if(weight_init_eft.status != 0)
  268. {
  269. if(weight_init_eft.step.read_k_flag != 0)
  270. {
  271. vk_canbuf[0] = 0xFD;
  272. vk_canbuf[5] = 0xf1;
  273. vk_canbuf[6] = 0xf3;
  274. }
  275. // else if(weight_init.step.sn_flag != 0) //EFT前板没有反馈。SN和版本
  276. // {
  277. // vk_canbuf[0] = 0xF8;
  278. // vk_canbuf[5] = 0xf1;
  279. // vk_canbuf[6] = 0xf3;
  280. // }
  281. // else if(weight_init.step.version_flag != 0)
  282. // {
  283. // vk_canbuf[0] = 0xf9;
  284. // vk_canbuf[5] = 0xf1;
  285. // vk_canbuf[6] = 0xf3;
  286. // }
  287. can_send_msg_normal((unsigned char *)&vk_canbuf, 8, vk_can_id);
  288. }
  289. break;
  290. case SEED_DEVICE:
  291. if(seed_init.status != 0)
  292. {
  293. if(seed_init.step.sn_flag != 0)
  294. {
  295. }
  296. else if(seed_init.step.version_flag != 0)
  297. {
  298. }
  299. //can_send_msg_normal((unsigned char *)&vk_canbuf, 8, vk_can_id);
  300. }
  301. break;
  302. default:
  303. break;
  304. }
  305. }
  306. }
  307. /**
  308. * @file Set_Seed_Weight_Par
  309. * @brief 设置称重播撒参数
  310. * @param 1 称重
  311. 2 播撒
  312. * @details
  313. * @author Zhang Sir
  314. **/
  315. void Set_Seed_Weight_Par(uint8_t device_type,char *factory)
  316. {
  317. uint8_t can_buf[8] = {0};
  318. if(strcmp(factory,"VK") == 0)
  319. {
  320. switch (device_type)
  321. {
  322. case WEIGHT_DEVICE:
  323. if(weight_order.type != 0)
  324. {
  325. can_buf[1] = 0x00; //D1 - D4
  326. can_buf[2] = 0x00;
  327. can_buf[3] = 0x00;
  328. can_buf[4] = 0x00;
  329. can_buf[5] = 0xFE;
  330. can_buf[6] = 0xFE;
  331. can_buf[7] = 0x00; //D5
  332. switch (weight_order.type)
  333. {
  334. //去皮校准
  335. case Weight_Peer:
  336. can_buf[0] = 0xF1;
  337. break;
  338. //重量校准
  339. case Weight_Kg:
  340. can_buf[0] = 0xF2;
  341. memcpy(&can_buf[1], &weight_order.order_con2,2);
  342. break;
  343. case Weight_Reserve:
  344. break;
  345. //恢复出厂设置
  346. case Weight_Bcak:
  347. can_buf[0] = 0xF4;
  348. break;
  349. //称重传感器K值
  350. case Weight_Set_K:
  351. can_buf[0] = 0xE2;
  352. can_buf[1] = weight_order.order_con2 & 0xff;
  353. can_buf[2] = (weight_order.order_con2 >> 8) & 0xff;
  354. can_buf[7] = weight_order.order_con1 - 1; //VK协议传感器编号是0-3
  355. break;
  356. //称重传感器模式
  357. case Weight_Mode:
  358. can_buf[0] = 0xE4;
  359. can_buf[1] = weight_order.order_con1 & 0xff;
  360. break;
  361. //最高下药率
  362. case Weight_Drug_Rate:
  363. can_buf[0] = 0xE6;
  364. can_buf[1] = weight_order.order_con1 & 0xff;
  365. can_buf[2] = (weight_order.order_con1 >> 8) & 0xff;
  366. break;
  367. default:
  368. break;
  369. }
  370. can_send_msg_normal((unsigned char *)&can_buf, 8, 0x81321);
  371. weight_order.type = 0;
  372. }
  373. break;
  374. case SEED_DEVICE:
  375. //更换信号输出方式 0 PWM 1 CAN
  376. if((seed_vkinfo.output != seed_output_mode) && recv_fmu_seed_info == true)
  377. {
  378. can_buf[0] = 0xF2;
  379. can_buf[1] = seed_output_mode;
  380. can_buf[2] = 0x00;
  381. can_buf[3] = 0x00;
  382. can_buf[4] = 0x00;
  383. can_buf[5] = 0xFE;
  384. can_buf[6] = 0xFE;
  385. can_buf[7] = 0;
  386. can_send_msg_normal((unsigned char *)&can_buf, 8, 0x81324);
  387. }
  388. break;
  389. default:
  390. break;
  391. }
  392. }
  393. else if (strcmp(factory,"EFT") == 0)
  394. {
  395. switch (device_type)
  396. {
  397. case SEED_DEVICE:
  398. //更换信号输出方式 0 PWM 1 CAN
  399. if((eft_info.can_enable != seed_output_mode) && recv_fmu_seed_info == true)
  400. {
  401. can_buf[0] = 0xF2;
  402. can_buf[1] = seed_output_mode;
  403. can_buf[2] = 0x00;
  404. can_buf[3] = 0x00;
  405. can_buf[4] = 0x00;
  406. can_buf[5] = 0xf1;
  407. can_buf[6] = 0xf3;
  408. can_buf[7] = 0;
  409. can_send_msg_normal((unsigned char *)&can_buf, 8, SEND_EFT_INFO);
  410. HAL_Delay(10);
  411. }
  412. break;
  413. case WEIGHT_DEVICE:
  414. if(weight_order.type != 0)
  415. {
  416. can_buf[1] = 0x00;
  417. can_buf[2] = 0x00;
  418. can_buf[3] = 0x00;
  419. can_buf[4] = 0x00;
  420. can_buf[5] = 0xf1;
  421. can_buf[6] = 0xf3;
  422. can_buf[7] = 0;
  423. switch (weight_order.type)
  424. {
  425. case Weight_Peer:
  426. can_buf[0] = 0xF6;
  427. break;
  428. case Weight_Kg:
  429. can_buf[0] = 0xF7;
  430. can_buf[1] = (weight_order.order_con2 >> 8) & 0xff;
  431. can_buf[2] = weight_order.order_con2 & 0xff;
  432. break;
  433. case Weight_Reserve:
  434. break;
  435. case Weight_Bcak:
  436. can_buf[0] = 0xF5;
  437. break;
  438. case Weight_Set_K:
  439. can_buf[0] = 0xFC;
  440. can_buf[1] = eft_info.seed_k[0];
  441. can_buf[2] = eft_info.seed_k[1];
  442. can_buf[3] = eft_info.seed_k[2];
  443. can_buf[weight_order.order_con1] = weight_order.order_con2 & 0xff;
  444. break;
  445. default:
  446. break;
  447. }
  448. can_send_msg_normal((unsigned char *)&can_buf, 8, SEND_EFT_INFO);
  449. HAL_Delay(10);
  450. weight_order.type = 0;
  451. }
  452. break;
  453. default:
  454. break;
  455. }
  456. }
  457. }
  458. /**
  459. * @file can_sendmsg_VK
  460. * @brief 播撒常发数据包
  461. * @param
  462. * @details
  463. * @author Zhang Sir
  464. **/
  465. void can_sendmsg_VK(void)
  466. {
  467. static uint8_t vk_count = 0;
  468. uint8_t vk_canbuf[8] = {0};
  469. if(Dev.Weight_Link.connect_status == COMP_NORMAL && (Dev.Weight.facid == FAC_VK ||
  470. Dev.Weight.facid == FAC_QIFEI) && HAL_GetTick() > 3000)
  471. {
  472. seed_init_send_info(WEIGHT_DEVICE,"VK");
  473. Set_Seed_Weight_Par(WEIGHT_DEVICE,"VK");
  474. }
  475. if(Dev.Seed_Link.connect_status == COMP_NORMAL && (Dev.Seed.facid == FAC_VK ||
  476. Dev.Seed.facid == FAC_QIFEI) && HAL_GetTick() > 2000)
  477. {
  478. seed_init_send_info(SEED_DEVICE,"VK");
  479. Set_Seed_Weight_Par(SEED_DEVICE,"VK");
  480. if(seed_output_mode == 1 )
  481. {
  482. if(HAL_GetTick() < 5000) //初始化自检
  483. {
  484. tppwm_value = 1000;
  485. sow_rotate_value = 1000;
  486. }
  487. //发送转速 和阀门
  488. vk_canbuf[0] = 0xf1;
  489. vk_canbuf[1] = tppwm_value & 0xff;
  490. vk_canbuf[2] = (tppwm_value >> 8) & 0xff;
  491. vk_canbuf[3] = sow_rotate_value & 0xff;
  492. vk_canbuf[4] = (sow_rotate_value >> 8) & 0xff;
  493. vk_canbuf[5] = 0xfe;
  494. vk_canbuf[6] = 0xfe;
  495. vk_canbuf[7] = vk_count;
  496. vk_count++;
  497. can_send_msg_normal((unsigned char *)&vk_canbuf, 8, 0x81324);
  498. }
  499. if(vk_count >= 255)
  500. {
  501. vk_count = 0;
  502. }
  503. }
  504. }
  505. Device_type Dev;
  506. comp_status seed_dev_link_status = COMP_NOEXIST;
  507. void check_dev_type_link(void )
  508. {
  509. int error_time = 0;
  510. error_time = HAL_GetTick() - Dev.Seed_Link.recv_time;
  511. if(Dev.Seed_Link.connect_status == COMP_NORMAL && error_time > 5000)
  512. {
  513. Dev.Seed_Link.connect_status = COMP_LOST;
  514. memset(&Dev.Seed.facid, 0, 7);
  515. }
  516. error_time = HAL_GetTick() - Dev.Weight_Link.recv_time;
  517. if(Dev.Pump_Link.connect_status == COMP_NORMAL && error_time > 5000)
  518. {
  519. Dev.Pump_Link.connect_status = COMP_LOST;
  520. memset(&Dev.Weight.facid, 0, 16);
  521. }
  522. error_time = HAL_GetTick() - Dev.Pump_Link.recv_time;
  523. if(Dev.Pump_Link.connect_status == COMP_NORMAL && error_time > 5000)
  524. {
  525. Dev.Pump_Link.connect_status = COMP_LOST;
  526. memset(&Dev.Pump.facid, 0, 11);
  527. }
  528. //
  529. error_time = HAL_GetTick() - Dev.Nozzle_Link.recv_time;
  530. if(Dev.Nozzle_Link.connect_status == COMP_NORMAL && error_time > 5000)
  531. {
  532. Dev.Nozzle_Link.connect_status = COMP_LOST;
  533. memset(&Dev.Nozzle.facid, 0, 11);
  534. }
  535. //
  536. error_time = HAL_GetTick() - Dev.Arm_Link.recv_time;
  537. if(Dev.Arm_Link.connect_status == COMP_NORMAL && error_time > 5000)
  538. {
  539. Dev.Arm_Link.connect_status = COMP_LOST;
  540. memset(&Dev.Arm.facid, 0, 2);
  541. }
  542. }
  543. void tes_mmm(void )
  544. {
  545. Dev.Nozzle_Link.connect_status = COMP_NORMAL;
  546. Dev.Nozzle_Link.recv_time = HAL_GetTick();
  547. Dev.Arm_Link.connect_status = COMP_NORMAL;
  548. Dev.Arm_Link.recv_time = HAL_GetTick();
  549. Dev.Pump_Link.connect_status = COMP_NORMAL;
  550. Dev.Pump_Link.recv_time = HAL_GetTick();
  551. Dev.Weight_Link.connect_status = COMP_NORMAL;
  552. Dev.Weight_Link.recv_time = HAL_GetTick();
  553. Dev.Seed_Link.connect_status = COMP_NORMAL;
  554. Dev.Seed_Link.recv_time = HAL_GetTick();
  555. Dev.Flow.speed1 = 5000;
  556. Dev.Flow.ml1 = 50000;
  557. Dev.Flow.warn1 = 1;
  558. eft_info.weight = 12000;
  559. eft_info.seed_k[0] = 10;
  560. eft_info.seed_k[1] = 15;
  561. eft_info.seed_k[2] = 40;
  562. eft_info.valve_angel = 50;
  563. eft_info.speed_rpm = 50;
  564. eft_info.warn_status = uart_info.uart3_recv_buf[0];
  565. eft_info.pump1_rpm = 20;
  566. eft_info.pump2_rpm = 40;
  567. eft_info.cent1_rpm = 20;
  568. eft_info.cent2_rpm = 40;
  569. eft_info.enginearm_lock = 6;
  570. eft_info.watering_warn_status =uart_info.uart3_recv_buf[0];
  571. }
  572. /**
  573. * @file update_device_type_data
  574. * @brief 更新设备信息
  575. * @param
  576. * @details
  577. * @author Zhang Sir
  578. **/
  579. void update_device_type_data(void)
  580. {
  581. //50hz更新 5hz发送
  582. static uint32_t time_1hz = 0;
  583. static uint32_t time_330hz = 0;
  584. static uint32_t time_5hz = 0;
  585. static uint32_t time_50hz = 0;
  586. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  587. {
  588. Check_dev_link(&Dev.Seed_Link,5000,(char *)&Dev.Seed.facid,sizeof(Seed_info));
  589. Check_dev_link(&Dev.Weight_Link,5000,(char *)&Dev.Weight.facid,sizeof(Weight_info));
  590. Check_dev_link(&Dev.Pump_Link,5000,(char *)&Dev.Pump.facid,sizeof(Pump_info));
  591. Check_dev_link(&Dev.Nozzle_Link,5000,(char *)&Dev.Nozzle.facid,sizeof(Nozzle_info));
  592. Check_dev_link(&Dev.Arm_Link,5000,(char *)&Dev.Arm.facid,sizeof(Arm_info));
  593. Check_dev_link(&Dev.Flow_Link1,5000,(char *)&Dev.Flow.facid,sizeof(Flow_info));
  594. Check_dev_link(&Dev.Checklow_Link,5000,(char *)&Dev.Checklow.facid,sizeof(CheckLow_info));
  595. Check_dev_link(&Distributor_Link,5000,(char *)&distributor.arm_sensor1,sizeof(distributor_info));
  596. Check_dev_link(&Dev.Current_Link,5000,(char *)&Dev.Current.facid,sizeof(Current_info));
  597. Check_dev_link(&Dev.Lackloss_Link,5000,NULL,0);
  598. Check_dev_link(&Dev.L_pump1_Link,5000,(char *)&Dev.L_pump1.facid,sizeof(Linear_pump_info));
  599. Check_dev_link(&Dev.L_pump2_Link,5000,(char *)&Dev.L_pump2.facid,sizeof(Linear_pump_info));
  600. check_radar_link_status();
  601. }
  602. if(Check_Timer_Ready(&time_330hz,330))
  603. {
  604. //EFT播撒称重
  605. can_sendmsg_eft();
  606. }
  607. if(Check_Timer_Ready(&time_5hz,_5_HZ_))
  608. {
  609. //VK播撒称重
  610. can_sendmsg_VK();
  611. //流量计
  612. can_sendmsg_flow();
  613. //分电板
  614. Can_sendmsg_to_distributor();
  615. }
  616. if(Check_Timer_Ready(&time_50hz,_50_HZ_))
  617. {
  618. //tes_mmm();
  619. //好盈电调水泵
  620. Hobbywing_esc_func();
  621. //播撒器
  622. if(Dev.Seed_Link.connect_status == COMP_NORMAL)
  623. {
  624. switch (Dev.Seed.facid)
  625. {
  626. case FAC_VK:
  627. Dev.Seed.angle = 0;
  628. Dev.Seed.speed = 0;
  629. Dev.Seed.caplow = 0;
  630. Dev.Seed.warn = 0;
  631. break;
  632. case FAC_EFT:
  633. Dev.Seed.angle = eft_info.valve_angel;
  634. Dev.Seed.speed = eft_info.speed_rpm * 10;
  635. Dev.Seed.caplow = eft_info.warn_status & 0x1;
  636. Dev.Seed.warn = eft_info.warn_status >> 1;
  637. break;
  638. case FAC_QIFEI:
  639. Dev.Seed.angle = 0;
  640. Dev.Seed.speed = 0;
  641. Dev.Seed.caplow = 0;
  642. Dev.Seed.warn = 0;//weight_vkinfo.warn_status;
  643. break;
  644. default:
  645. break;
  646. }
  647. }
  648. //称重
  649. if(Dev.Weight_Link.connect_status == COMP_NORMAL)
  650. {
  651. switch (Dev.Weight.facid)
  652. {
  653. case FAC_VK:
  654. Dev.Weight.mode = weight_vkinfo.mode;
  655. Dev.Weight.kg = weight_vkinfo.weight / 10;
  656. Dev.Weight.rate = weight_vkinfo.weight_rate;
  657. Dev.Weight.k1 = weight_vkinfo.senor_k[0];
  658. Dev.Weight.k2 = weight_vkinfo.senor_k[1];
  659. Dev.Weight.k3 = weight_vkinfo.senor_k[2];
  660. Dev.Weight.k4 = weight_vkinfo.senor_k[3];
  661. Dev.Weight.warn = weight_vkinfo.warn_status;
  662. break;
  663. case FAC_EFT:
  664. Dev.Weight.mode = 0;
  665. Dev.Weight.kg = eft_info.weight / 10;
  666. Dev.Weight.rate = 0;
  667. Dev.Weight.k1 = eft_info.seed_k[0];
  668. Dev.Weight.k2 = eft_info.seed_k[1];
  669. Dev.Weight.k3 = eft_info.seed_k[2];
  670. Dev.Weight.k4 = 0;
  671. Dev.Weight.warn = 0;
  672. break;
  673. case FAC_QIFEI:
  674. Dev.Weight.mode = weight_vkinfo.mode;
  675. Dev.Weight.kg = weight_vkinfo.weight / 10;
  676. Dev.Weight.rate = weight_vkinfo.weight_rate;
  677. Dev.Weight.k1 = weight_vkinfo.senor_k[0];
  678. Dev.Weight.k2 = weight_vkinfo.senor_k[1];
  679. Dev.Weight.k3 = weight_vkinfo.senor_k[2];
  680. Dev.Weight.k4 = weight_vkinfo.senor_k[3];
  681. Dev.Weight.warn = weight_vkinfo.warn_status;
  682. Dev.Weight.dose_rate = weight_vkinfo.dose_rate;
  683. break;
  684. default:
  685. break;
  686. }
  687. }
  688. //水泵
  689. if(Dev.Pump_Link.connect_status == COMP_NORMAL)
  690. {
  691. switch (Dev.Pump.facid)
  692. {
  693. case FAC_VK:
  694. break;
  695. case FAC_EFT:
  696. Dev.Pump.rpm1 = eft_info.pump1_rpm * 60;
  697. Dev.Pump.rpm2 = eft_info.pump2_rpm * 60;
  698. Dev.Pump.rpm3 = 0;
  699. Dev.Pump.rpm4 = 0;
  700. if( (eft_info.watering_warn_status & 0x3) != 0)
  701. {
  702. Dev.Pump.warn = (eft_info.watering_warn_status & 0x3) + (eft_info.watering_warn_status & 0xf0);
  703. }
  704. else if((eft_info.watering_warn_status & 0x3) == 0)
  705. {
  706. Dev.Pump.warn = 0;
  707. }
  708. Dev.Pump.warn = 0; //屏蔽报警
  709. break;
  710. // case FAC_HW_ESC:
  711. // Dev.Pump.rpm1 = EscMsg[1].motorRPM;
  712. // Dev.Pump.rpm2 = EscMsg[2].motorRPM;
  713. // Dev.Pump.rpm3 = 0;
  714. // Dev.Pump.rpm4 = 0;
  715. // Dev.Pump.warn = EscMsg[1].warn_flag;
  716. // break;
  717. default:
  718. break;
  719. }
  720. }
  721. //离心喷头
  722. if(Dev.Nozzle_Link.connect_status == COMP_NORMAL)
  723. {
  724. switch (Dev.Nozzle.facid)
  725. {
  726. case FAC_VK:
  727. break;
  728. case FAC_EFT:
  729. Dev.Nozzle.rpm1 = eft_info.cent1_rpm * 60;
  730. Dev.Nozzle.rpm2 = eft_info.cent2_rpm * 60;
  731. Dev.Nozzle.rpm3 = 0;
  732. Dev.Nozzle.rpm4 = 0;
  733. if( (eft_info.watering_warn_status & 0xc) != 0)
  734. {
  735. Dev.Nozzle.warn = ((eft_info.watering_warn_status >> 2) & 0x3) + (eft_info.watering_warn_status & 0xf0);
  736. }
  737. else if((eft_info.watering_warn_status & 0xc) == 0)
  738. {
  739. Dev.Nozzle.warn = 0;
  740. }
  741. Dev.Nozzle.warn = 0; //屏蔽报警
  742. break;
  743. default:
  744. break;
  745. }
  746. }
  747. //机臂传感器
  748. if(Dev.Arm_Link.connect_status == COMP_NORMAL)
  749. {
  750. switch (Dev.Arm.facid)
  751. {
  752. case FAC_VK:
  753. break;
  754. case FAC_EFT:
  755. Dev.Arm.status = eft_info.enginearm_lock;
  756. break;
  757. case FAC_VK_ALLINONE:
  758. Dev.Arm.status = (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_12 ) & 0x1) << 3) | \
  759. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_13 ) & 0x1) << 2) | \
  760. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_14 ) & 0x1)) | \
  761. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_15 ) & 0x1) << 1);
  762. break;
  763. default:
  764. break;
  765. }
  766. }
  767. //线性水泵
  768. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL)
  769. {
  770. switch (Dev.L_pump1.facid)
  771. {
  772. case FAC_VK:
  773. break;
  774. case FAC_EFT:
  775. break;
  776. case FAC_HW_ESC:
  777. Dev.L_pump1.warn = EscMsg[1].warn_flag;
  778. Dev.L_pump1.rpm = EscMsg[1].motorRPM;
  779. break;
  780. default:
  781. break;
  782. }
  783. }
  784. if(Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  785. {
  786. switch (Dev.L_pump2.facid)
  787. {
  788. case FAC_VK:
  789. break;
  790. case FAC_EFT:
  791. break;
  792. case FAC_HW_ESC:
  793. Dev.L_pump2.warn = EscMsg[2].warn_flag;
  794. Dev.L_pump2.rpm = EscMsg[2].motorRPM;
  795. break;
  796. default:
  797. break;
  798. }
  799. }
  800. // if(Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  801. // {
  802. // switch (Dev.L_pump2.facid)
  803. // {
  804. // case FAC_VK:
  805. // break;
  806. // case FAC_HW_ESC:
  807. // Dev.L_pump2.warn = EscMsg[1].warn_flag;
  808. // Dev.L_pump2.rpm = EscMsg[1].motorRPM;
  809. // break;
  810. // default:
  811. // break;
  812. // }
  813. // }
  814. //智能电池
  815. if(Dev.Bms_Link.connect_status == COMP_NORMAL)
  816. {
  817. Dev.Bms.index = 0;
  818. Dev.Bms.facid = bms_data.serial_num;
  819. bms_data.bms_version[0] = 'V';
  820. bms_data.bms_version[1] = 'K';
  821. bms_data.bms_version[2] = '3';
  822. bms_data.bms_group = group_num;
  823. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_version,5 + bms_data.bms_num * 2);
  824. Dev.Bms.index += (5 + bms_data.bms_num * 2);
  825. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_ids,43);
  826. Dev.Bms.index += 43;
  827. memset(&Dev.Bms.buf[Dev.Bms.index],0,2); //EFT协议新加插头问题
  828. Dev.Bms.index += 2;
  829. if(bms_data.bms_group == 2)
  830. {
  831. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data2.bms_num,1 + bms_data2.bms_num * 2);
  832. Dev.Bms.index += (1 + bms_data2.bms_num * 2);
  833. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data2.bms_ids,43);
  834. Dev.Bms.index += 43;
  835. memset(&Dev.Bms.buf[Dev.Bms.index],0,2); //EFT协议新加插头问题
  836. Dev.Bms.index += 2;
  837. }
  838. }
  839. if(_Aqx_bms_link.connect_status == COMP_NORMAL)
  840. {
  841. Dev.Bms.facid = FAC_QX_BMS;
  842. Dev.Bms.buf[0] = 0;//电池串数
  843. Dev.Bms.index = 0;
  844. Dev.Bms.index++;
  845. for(uint8_t i = 0; i < 4; i++)
  846. {
  847. if(_qx_bms_link[i].connect_status == COMP_NORMAL)
  848. {
  849. Dev.Bms.buf[0]++;
  850. memcpy(&Dev.Bms.buf[Dev.Bms.index],&_qx_bms[i].bat_voltage,sizeof(qingxie_bms_status_t));
  851. Dev.Bms.index += sizeof(qingxie_bms_status_t);
  852. }
  853. }
  854. }
  855. //流量计、断料记、雷达数据一直发
  856. if(true/*Dev.Flow_Link1.connect_status == COMP_NORMAL*/)
  857. {
  858. switch (Dev.Flow.facid)
  859. {
  860. case FAC_VK:
  861. Dev.Flow.speed1 = flow_dev1.speed;
  862. Dev.Flow.speed2 = flow_dev2.speed;
  863. Dev.Flow.ml1 = flow_dev1.irq_count;
  864. Dev.Flow.ml2 = flow_dev2.irq_count;
  865. Dev.Flow.warn1 = 0;
  866. Dev.Flow.warn2 = 0;
  867. Dev.Flow.k1 = 0;
  868. Dev.Flow.k2 = 0;
  869. break;
  870. case FAC_MIMO_SIG:// APP需要识别单双管
  871. Dev.Flow.speed1 = flow_mimo1.flow_speed;
  872. Dev.Flow.speed2 = flow_mimo2.flow_speed;
  873. Dev.Flow.ml1 = (flow_mimo1.total_ml + 65535 * flow_mimo1.overturn_count) * FlOW_KP * 60 / 1000;
  874. Dev.Flow.ml2 = (flow_mimo2.total_ml + 65535 * flow_mimo2.overturn_count) * FlOW_KP * 60 / 1000;
  875. Dev.Flow.warn1 = flow_mimo1.status;
  876. Dev.Flow.warn2 = flow_mimo2.status;
  877. Dev.Flow.k1 = flow_mimo1.flow_k;
  878. Dev.Flow.k2 = flow_mimo2.flow_k;
  879. break;
  880. case FAC_MIMO_DOU:
  881. Dev.Flow.speed1 = flow_mimo1.flow_speed;
  882. Dev.Flow.speed2 = flow_mimo2.flow_speed;
  883. Dev.Flow.ml1 = (flow_mimo1.total_ml + 65535 * flow_mimo1.overturn_count) * FlOW_KP * 60 / 1000;
  884. Dev.Flow.ml2 = (flow_mimo2.total_ml + 65535 * flow_mimo2.overturn_count) * FlOW_KP * 60 / 1000;
  885. Dev.Flow.warn1 = flow_mimo1.status;
  886. Dev.Flow.warn2 = flow_mimo2.status;
  887. Dev.Flow.k1 = flow_mimo1.flow_k;
  888. Dev.Flow.k2 = flow_mimo2.flow_k;
  889. break;
  890. case FAC_QIFEI_SIG:
  891. Dev.Flow.speed1 = flow_inf.ch1.speed;
  892. Dev.Flow.speed2 = flow_inf.ch2.speed;
  893. Dev.Flow.ml1 = (flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  894. Dev.Flow.ml2 = (flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  895. Dev.Flow.warn1 = flow_inf.ch1.warn;
  896. Dev.Flow.warn2 = flow_inf.ch2.warn;
  897. Dev.Flow.k1 = flow_inf.ch1.k;
  898. Dev.Flow.k2 = flow_inf.ch2.k;
  899. break;
  900. case FAC_QIFEI_DOU: // 12做个调换
  901. Dev.Flow.speed1 = flow_inf.ch2.speed;
  902. Dev.Flow.speed2 = flow_inf.ch1.speed;
  903. Dev.Flow.ml1 = (flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  904. Dev.Flow.ml2 = (flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  905. Dev.Flow.warn1 = flow_inf.ch2.warn;
  906. Dev.Flow.warn2 = flow_inf.ch1.warn;
  907. Dev.Flow.k1 = flow_inf.ch2.k;
  908. Dev.Flow.k2 = flow_inf.ch1.k;
  909. break;
  910. case FAC_HW_ESC:
  911. Dev.Flow.speed1 = EscMsg[1].motorRPM / FlOW_KP;
  912. Dev.Flow.speed2 = EscMsg[2].motorRPM / FlOW_KP;
  913. Dev.Flow.ml1 = 0;//(flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  914. Dev.Flow.ml2 = 0;//(flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  915. Dev.Flow.warn1 = 0;
  916. Dev.Flow.warn2 = 0;
  917. Dev.Flow.k1 = 0;
  918. Dev.Flow.k2 = 0;
  919. break;
  920. default:
  921. break;
  922. }
  923. switch (Dev.Checklow.facid)
  924. {
  925. case FAC_VK:
  926. Dev.Checklow.L1_status = (uint16_t)L3_status;
  927. Dev.Checklow.L2_status = (uint16_t)L4_status;
  928. Dev.Checklow.liquid_persent = decode_liquid_info();
  929. Dev.Checklow.seed_lackloss = mimo_lackloss.status;
  930. Dev.Checklow.warn = 0;
  931. Dev.Checklow.lack_distance = mimo_lackloss.distance / 10; //cm
  932. Dev.Checklow.lack_power = mimo_lackloss.strength;
  933. break;
  934. default:
  935. break;
  936. }
  937. //雷达
  938. Dev.Radar.height_T = get_radar_info(MSGID_SET_T_RADAR,0);
  939. Dev.Radar.distance_F_Y = get_radar_info(MSGID_SET_F_RADAR,OBS_Y);
  940. Dev.Radar.distance_F_Y_ori = Dev.Radar.distance_F_Y;
  941. // if((Dev.Radar.distance_F_Y > 0) && (Fobs_handle_function() == false))
  942. // Dev.Radar.distance_F_Y = 0;
  943. Dev.Radar.distance_F_X = get_radar_info(MSGID_SET_F_RADAR,OBS_X);
  944. Dev.Radar.signal_F_qulity = mimo_f_info.signal_qulity;
  945. Dev.Radar.distance_B_Y = get_radar_info(MSGID_SET_B_RADAR,OBS_Y);
  946. Dev.Radar.distance_B_Y_ori = Dev.Radar.distance_B_Y;
  947. // if((Dev.Radar.distance_B_Y > 0) && (Bobs_handle_function() == false))
  948. // Dev.Radar.distance_B_Y = 0;
  949. Dev.Radar.distance_B_X = get_radar_info(MSGID_SET_B_RADAR,OBS_X);
  950. Dev.Radar.signal_B_qulity = mimo_b_info.signal_qulity;
  951. terrain_is_link = Dev.Radar.height_T > -1? true:false;
  952. obs_f_is_link = Dev.Radar.distance_F_Y > -1? true:false;
  953. obs_b_is_link = Dev.Radar.distance_B_Y > -1? true:false;
  954. }
  955. if(Dev.Current_Link.connect_status == COMP_NORMAL)
  956. {
  957. Dev.Current.facid = FAC_VK;
  958. Dev.Current.tempture = power_BatteryInfo.temperature * 10;
  959. Dev.Current.voltage = power_BatteryInfo.voltage * 10;
  960. Dev.Current.current = power_BatteryInfo.current * 10;
  961. }
  962. if(Dev.Part_Tradar_Link.connect_status == COMP_NORMAL)
  963. {
  964. Dev.Part_radarT.height_part1 = T_radar[0].Distance * 0.05f * 100 * cos(T_radar[0].Amuzith * 0.1f / RAD);
  965. Dev.Part_radarT.height_part2 = T_radar[1].Distance * 0.05f * 100 * cos(T_radar[1].Amuzith * 0.1f / RAD);
  966. Dev.Part_radarT.height_part3 = T_radar[2].Distance * 0.05f * 100 * cos(T_radar[2].Amuzith * 0.1f / RAD);
  967. }
  968. }
  969. }
  970. comp_status QIFEI_link_status = COMP_NOEXIST;
  971. uint32_t get_QIFEI_time = 0;
  972. volatile char get_QIFEI_time_sem = 0;
  973. unsigned int get_QIFEI_time_err = 0;
  974. void QIFEI_recieved_hookfuction(uint32_t CanID, uint8_t data[], uint8_t len)
  975. {
  976. uint8_t id = 0;
  977. QIFEI_link_status = COMP_NORMAL;
  978. get_QIFEI_time = HAL_GetTick();
  979. id = data[0];
  980. switch (CanID)
  981. {
  982. case 0x0AD2:
  983. break;
  984. case 0x0AD0:
  985. switch (id)
  986. {
  987. case 0x01:
  988. break;
  989. default:
  990. break;
  991. }
  992. break;
  993. default:
  994. break;
  995. }
  996. }