soft_device.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. #include "soft_device.h"
  2. #include "main_task.h"
  3. #include "soft_obstacle.h"
  4. #include "soft_terrain.h"
  5. #include "usart_data_handle.h"
  6. #include "soft_seed_weight.h"
  7. #include "soft_bms.h"
  8. #include "soft_flow.h"
  9. #include "soft_radar_handle.h"
  10. #include "string.h"
  11. #include "soft_water.h"
  12. #include "math.h"
  13. #include "soft_update.h"
  14. #include "config.h"
  15. uint8_t drone_type = Drone_Z20;
  16. Device_type Dev = { .Flow.facid = 0xff};
  17. Weight_cal weight_order;
  18. uint8_t weight_init_count;
  19. bool recv_fmu_seed_info;
  20. Dev_seed_init seed_init;
  21. /**
  22. * @file update_device_type_data
  23. * @brief 更新设备信息
  24. * @param
  25. * @details
  26. * @author Zhang Sir
  27. **/
  28. void update_device_type_data(void)
  29. {
  30. //50hz更新 5hz发送
  31. static uint32_t time_1hz = 0;
  32. static uint32_t time_330hz = 0;
  33. static uint32_t time_5hz = 0;
  34. static uint32_t time_50hz = 0;
  35. if(Check_Timer_Ready(&time_1hz,_1_HZ_))
  36. {
  37. Check_dev_link(&Dev.Seed_Link,5000,(char *)&Dev.Seed.facid,sizeof(Seed_info));
  38. Check_dev_link(&Dev.Weight_Link,5000,(char *)&Dev.Weight.facid,sizeof(Weight_info));
  39. Check_dev_link(&Dev.Pump_Link,5000,(char *)&Dev.Pump.facid,sizeof(Pump_info));
  40. Check_dev_link(&Dev.Nozzle_Link,5000,(char *)&Dev.Nozzle.facid,sizeof(Nozzle_info));
  41. Check_dev_link(&Dev.Arm_Link,5000,(char *)&Dev.Arm.facid,sizeof(Arm_info));
  42. Check_dev_link(&Dev.Flow_Link1,5000,(char *)&Dev.Flow.facid,sizeof(Flow_info));
  43. Check_dev_link(&Dev.Checklow_Link,5000,(char *)&Dev.Checklow.facid,sizeof(CheckLow_info));
  44. //Check_dev_link(&Dev.Current_Link,5000,(char *)&Dev.Current.facid,sizeof(Current_info));
  45. Check_dev_link(&Dev.L_pump1_Link,5000,(char *)&Dev.L_pump1.facid,sizeof(Linear_pump_info));
  46. Check_dev_link(&Dev.L_pump2_Link,5000,(char *)&Dev.L_pump2.facid,sizeof(Linear_pump_info));
  47. Check_dev_link(&Dev.Eft_CanDev_Link[2],5000,(char *)&nozzle1,sizeof(water_dev));
  48. Check_dev_link(&Dev.Eft_CanDev_Link[3],5000,(char *)&nozzle2,sizeof(water_dev));
  49. Check_dev_link(&Dev.Eft_CanDev_Link[4],5000,(char *)&nozzle3,sizeof(water_dev));
  50. Check_dev_link(&Dev.Eft_CanDev_Link[5],5000,(char *)&nozzle4,sizeof(water_dev));
  51. check_radar_link_status();
  52. }
  53. if(Check_Timer_Ready(&time_330hz,330) && eft_update.update_flag == false)
  54. {
  55. //EFT播撒称重
  56. can_sendmsg_eft();
  57. //EFT水泵离心
  58. can_sendmsg_eft_water();
  59. //EFT上电配置CANID
  60. set_eft_dev_canid_func();
  61. }
  62. if(Check_Timer_Ready(&time_5hz,_5_HZ_))
  63. {
  64. //VK播撒称重
  65. can_sendmsg_VK();
  66. //流量计
  67. can_sendmsg_flow();
  68. //分电板
  69. //Can_sendmsg_to_distributor();
  70. }
  71. if(Check_Timer_Ready(&time_50hz,_50_HZ_))
  72. {
  73. //好盈电调水泵
  74. Hobbywing_esc_func();
  75. //播撒器
  76. if(Dev.Seed_Link.connect_status == COMP_NORMAL)
  77. {
  78. switch (Dev.Seed.facid)
  79. {
  80. case FAC_VK:
  81. Dev.Seed.angle = 0;
  82. Dev.Seed.speed = 0;
  83. Dev.Seed.caplow = 0;
  84. Dev.Seed.warn = weight_vkinfo.warn_status;
  85. break;
  86. case FAC_EFT:
  87. Dev.Seed.angle = eft_info.valve_angel;
  88. Dev.Seed.speed = eft_info.speed_rpm * 10;
  89. Dev.Seed.caplow = eft_info.warn_status & 0x1;
  90. Dev.Seed.warn = eft_info.warn_status >> 1;
  91. if(drone_type == Drone_Z70)
  92. {
  93. Dev.Seed.speed = turntable.rpm;
  94. Dev.Seed.churn_rpm = churn.rpm;
  95. Dev.Seed.warn = churn.error_status;
  96. }
  97. break;
  98. case FAC_QIFEI:
  99. Dev.Seed.angle = 0;
  100. Dev.Seed.speed = 0;
  101. Dev.Seed.caplow = 0;
  102. Dev.Seed.warn = weight_vkinfo.warn_status;
  103. break;
  104. default:
  105. break;
  106. }
  107. }
  108. //称重
  109. if(Dev.Weight_Link.connect_status == COMP_NORMAL)
  110. {
  111. switch (Dev.Weight.facid)
  112. {
  113. case FAC_VK:
  114. Dev.Weight.mode = weight_vkinfo.mode;
  115. Dev.Weight.kg = weight_vkinfo.weight / 10;
  116. Dev.Weight.rate = weight_vkinfo.weight_rate;
  117. Dev.Weight.k1 = weight_vkinfo.senor_k[0];
  118. Dev.Weight.k2 = weight_vkinfo.senor_k[1];
  119. Dev.Weight.k3 = weight_vkinfo.senor_k[2];
  120. Dev.Weight.k4 = weight_vkinfo.senor_k[3];
  121. Dev.Weight.warn = weight_vkinfo.warn_status;
  122. break;
  123. case FAC_EFT:
  124. Dev.Weight.mode = 0;
  125. Dev.Weight.kg = fplate.weight / 10;
  126. Dev.Weight.rate = 0;
  127. Dev.Weight.k1 = eft_info.seed_k[0];
  128. Dev.Weight.k2 = eft_info.seed_k[1];
  129. Dev.Weight.k3 = eft_info.seed_k[2];
  130. Dev.Weight.k4 = 0;
  131. Dev.Weight.warn = 0;
  132. if(drone_type == Drone_Z70)
  133. {
  134. Dev.Weight.kg = fplate.weight;//20单位g 70单位10g
  135. Dev.Weight.k1 = z70weight.info.k1;
  136. Dev.Weight.k2 = z70weight.info.k2;
  137. Dev.Weight.k3 = z70weight.info.k3;
  138. Dev.Weight.k4 = z70weight.info.k4;
  139. if(Z70_LiftingWeight_exist == true)
  140. Dev.Weight.warn = (LiftingWeight_warning << 8) & 0xffff;
  141. }
  142. break;
  143. case FAC_QIFEI:
  144. Dev.Weight.mode = weight_vkinfo.mode;
  145. Dev.Weight.kg = weight_vkinfo.weight / 10;
  146. Dev.Weight.rate = weight_vkinfo.weight_rate;
  147. Dev.Weight.k1 = weight_vkinfo.senor_k[0];
  148. Dev.Weight.k2 = weight_vkinfo.senor_k[1];
  149. Dev.Weight.k3 = weight_vkinfo.senor_k[2];
  150. Dev.Weight.k4 = weight_vkinfo.senor_k[3];
  151. Dev.Weight.warn = weight_vkinfo.warn_status;
  152. Dev.Weight.dose_rate = weight_vkinfo.dose_rate;
  153. break;
  154. default:
  155. break;
  156. }
  157. }
  158. //水泵
  159. if(Dev.Pump_Link.connect_status == COMP_NORMAL)
  160. {
  161. switch (Dev.Pump.facid)
  162. {
  163. case FAC_VK:
  164. break;
  165. case FAC_EFT:
  166. Dev.Pump.rpm1 = pump1.rpm;
  167. Dev.Pump.rpm2 = pump2.rpm;
  168. Dev.Pump.rpm3 = 0;
  169. Dev.Pump.rpm4 = 0;
  170. if( (eft_info.watering_warn_status & 0x3) != 0)
  171. {
  172. Dev.Pump.warn = (eft_info.watering_warn_status & 0x3) + (eft_info.watering_warn_status & 0xf0);
  173. }
  174. else if((eft_info.watering_warn_status & 0x3) == 0)
  175. {
  176. Dev.Pump.warn = 0;
  177. }
  178. Dev.Pump.warn = 0; //屏蔽报警
  179. break;
  180. // case FAC_HW_ESC:
  181. // Dev.Pump.rpm1 = EscMsg[1].motorRPM;
  182. // Dev.Pump.rpm2 = EscMsg[2].motorRPM;
  183. // Dev.Pump.rpm3 = 0;
  184. // Dev.Pump.rpm4 = 0;
  185. // Dev.Pump.warn = EscMsg[1].warn_flag;
  186. // break;
  187. default:
  188. break;
  189. }
  190. }
  191. //离心喷头
  192. if(Dev.Nozzle_Link.connect_status == COMP_NORMAL)
  193. {
  194. switch (Dev.Nozzle.facid)
  195. {
  196. case FAC_VK:
  197. break;
  198. case FAC_EFT:
  199. if(Dev.Eft_CanDev_Link[2].connect_status != COMP_NORMAL)
  200. nozzle1.rpm = -1;
  201. if(Dev.Eft_CanDev_Link[3].connect_status != COMP_NORMAL)
  202. nozzle2.rpm = -1;
  203. if(Dev.Eft_CanDev_Link[4].connect_status != COMP_NORMAL)
  204. nozzle3.rpm = -1;
  205. if(Dev.Eft_CanDev_Link[5].connect_status != COMP_NORMAL)
  206. nozzle4.rpm = -1;
  207. Dev.Nozzle.rpm1 = nozzle1.rpm;
  208. Dev.Nozzle.rpm2 = nozzle2.rpm;
  209. Dev.Nozzle.rpm3 = nozzle3.rpm;
  210. Dev.Nozzle.rpm4 = nozzle4.rpm;
  211. if(drone_type == Drone_Z20)
  212. {
  213. if( (eft_info.watering_warn_status & 0xc) != 0)
  214. {
  215. Dev.Nozzle.warn = ((eft_info.watering_warn_status >> 2) & 0x3) + (eft_info.watering_warn_status & 0xf0);
  216. }
  217. else if((eft_info.watering_warn_status & 0xc) == 0)
  218. {
  219. Dev.Nozzle.warn = 0;
  220. }
  221. Dev.Nozzle.warn = 0; //屏蔽报警
  222. }
  223. break;
  224. default:
  225. break;
  226. }
  227. }
  228. //机臂传感器
  229. if(Dev.Arm_Link.connect_status == COMP_NORMAL)
  230. {
  231. switch (Dev.Arm.facid)
  232. {
  233. case FAC_VK:
  234. break;
  235. case FAC_EFT:
  236. Dev.Arm.status = fplate.arm1 | (fplate.arm2 << 1) | (fplate.arm3 << 2) | (fplate.arm4 << 3);
  237. break;
  238. case FAC_VK_ALLINONE:
  239. Dev.Arm.status = (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_12 ) & 0x1) << 3) | \
  240. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_13 ) & 0x1) << 2) | \
  241. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_14 ) & 0x1)) | \
  242. (((uint8_t)HAL_GPIO_ReadPin( GPIOB, GPIO_PIN_15 ) & 0x1) << 1);
  243. break;
  244. default:
  245. break;
  246. }
  247. }
  248. if(Dev.L_pump1_Link.connect_status == COMP_NORMAL)
  249. {
  250. switch (Dev.L_pump1.facid)
  251. {
  252. case FAC_VK:
  253. break;
  254. case FAC_EFT:
  255. Dev.L_pump1.warn = pump1.error_status;
  256. Dev.L_pump1.rpm = pump1.rpm;
  257. break;
  258. case FAC_HW_ESC:
  259. Dev.L_pump1.warn = EscMsg[1].warn_flag;
  260. Dev.L_pump1.rpm = EscMsg[1].motorRPM;
  261. break;
  262. default:
  263. break;
  264. }
  265. }
  266. if(Dev.L_pump2_Link.connect_status == COMP_NORMAL)
  267. {
  268. switch (Dev.L_pump2.facid)
  269. {
  270. case FAC_VK:
  271. break;
  272. case FAC_EFT:
  273. Dev.L_pump2.warn = pump2.error_status;
  274. Dev.L_pump2.rpm = pump2.rpm;
  275. break;
  276. case FAC_HW_ESC:
  277. Dev.L_pump2.warn = EscMsg[1].warn_flag;
  278. Dev.L_pump2.rpm = EscMsg[1].motorRPM;
  279. break;
  280. default:
  281. break;
  282. }
  283. }
  284. //智能电池
  285. if(Dev.Bms_Link.connect_status == COMP_NORMAL)
  286. {
  287. Dev.Bms.index = 0;
  288. Dev.Bms.facid = bms_data.serial_num;
  289. bms_data.bms_version[0] = 'V';
  290. bms_data.bms_version[1] = 'K';
  291. bms_data.bms_version[2] = '3';
  292. bms_data.bms_group = group_num;
  293. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_version,5 + bms_data.bms_num * 2);
  294. Dev.Bms.index += (5 + bms_data.bms_num * 2);
  295. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_ids,43);
  296. Dev.Bms.index += 43;
  297. memcpy(&Dev.Bms.buf[Dev.Bms.index],&fplate.bms_plug_tempture,2);
  298. Dev.Bms.index += 2;
  299. if(bms_data.bms_group == 2)
  300. {
  301. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_ids,1 + bms_data.bms_num * 2);
  302. Dev.Bms.index += (1 + bms_data.bms_num * 2);
  303. memcpy(&Dev.Bms.buf[Dev.Bms.index],&bms_data.bms_ids,43);
  304. Dev.Bms.index += 43;
  305. memcpy(&Dev.Bms.buf[Dev.Bms.index],&fplate.bms_plug_tempture,2);
  306. Dev.Bms.index += 2;
  307. }
  308. }
  309. //流量计、断料记、雷达数据一直发
  310. if(true/*Dev.Flow_Link1.connect_status == COMP_NORMAL*/)
  311. {
  312. switch (Dev.Flow.facid)
  313. {
  314. case FAC_VK:
  315. Dev.Flow.speed1 = flow_dev1.speed;
  316. Dev.Flow.speed2 = flow_dev2.speed;
  317. Dev.Flow.ml1 = flow_dev1.irq_count;
  318. Dev.Flow.ml2 = flow_dev2.irq_count;
  319. Dev.Flow.warn1 = 0;
  320. Dev.Flow.warn2 = 0;
  321. Dev.Flow.k1 = 0;
  322. Dev.Flow.k2 = 0;
  323. break;
  324. case FAC_MIMO_SIG:// APP需要识别单双管
  325. Dev.Flow.speed1 = flow_mimo1.flow_speed;
  326. Dev.Flow.speed2 = flow_mimo2.flow_speed;
  327. Dev.Flow.ml1 = (flow_mimo1.total_ml + 65535 * flow_mimo1.overturn_count) * FlOW_KP * 60 / 1000;
  328. Dev.Flow.ml2 = (flow_mimo2.total_ml + 65535 * flow_mimo2.overturn_count) * FlOW_KP * 60 / 1000;
  329. Dev.Flow.warn1 = flow_mimo1.status;
  330. Dev.Flow.warn2 = flow_mimo2.status;
  331. Dev.Flow.k1 = flow_mimo1.flow_k;
  332. Dev.Flow.k2 = flow_mimo2.flow_k;
  333. break;
  334. case FAC_MIMO_DOU:
  335. Dev.Flow.speed1 = flow_mimo1.flow_speed;
  336. Dev.Flow.speed2 = flow_mimo2.flow_speed;
  337. Dev.Flow.ml1 = (flow_mimo1.total_ml + 65535 * flow_mimo1.overturn_count) * FlOW_KP * 60 / 1000;
  338. Dev.Flow.ml2 = (flow_mimo2.total_ml + 65535 * flow_mimo2.overturn_count) * FlOW_KP * 60 / 1000;
  339. Dev.Flow.warn1 = flow_mimo1.status;
  340. Dev.Flow.warn2 = flow_mimo2.status;
  341. Dev.Flow.k1 = flow_mimo1.flow_k;
  342. Dev.Flow.k2 = flow_mimo2.flow_k;
  343. break;
  344. case FAC_QIFEI_SIG:
  345. Dev.Flow.speed1 = flow_inf.ch1.speed;
  346. Dev.Flow.speed2 = flow_inf.ch2.speed;
  347. Dev.Flow.ml1 = (flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  348. Dev.Flow.ml2 = (flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  349. Dev.Flow.warn1 = flow_inf.ch1.warn;
  350. Dev.Flow.warn2 = flow_inf.ch2.warn;
  351. Dev.Flow.k1 = flow_inf.ch1.k;
  352. Dev.Flow.k2 = flow_inf.ch2.k;
  353. break;
  354. case FAC_QIFEI_DOU: // 12做个调换
  355. Dev.Flow.speed1 = flow_inf.ch2.speed;
  356. Dev.Flow.speed2 = flow_inf.ch1.speed;
  357. Dev.Flow.ml1 = (flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  358. Dev.Flow.ml2 = (flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  359. Dev.Flow.warn1 = flow_inf.ch2.warn;
  360. Dev.Flow.warn2 = flow_inf.ch1.warn;
  361. Dev.Flow.k1 = flow_inf.ch2.k;
  362. Dev.Flow.k2 = flow_inf.ch1.k;
  363. break;
  364. case FAC_HW_ESC:
  365. // Dev.Flow.speed1 = EscMsg[1].motorRPM / FlOW_KP;
  366. // Dev.Flow.speed2 = EscMsg[2].motorRPM / FlOW_KP;
  367. // Dev.Flow.ml1 = 0;//(flow_inf.ch1.ml + 65535 * flow_inf.ch1.overturn) * FlOW_KP * 60 / 1000;
  368. // Dev.Flow.ml2 = 0;//(flow_inf.ch2.ml + 65535 * flow_inf.ch2.overturn) * FlOW_KP * 60 / 1000;
  369. // Dev.Flow.warn1 = 0;
  370. // Dev.Flow.warn2 = 0;
  371. // Dev.Flow.k1 = 0;
  372. // Dev.Flow.k2 = 0;
  373. break;
  374. default:
  375. break;
  376. }
  377. switch (Dev.Checklow.facid)
  378. {
  379. case FAC_VK:
  380. if(drone_type == Drone_Z70)
  381. {
  382. Dev.Checklow.L1_status = !mimo_lackloss.status;
  383. }
  384. else if(drone_type == Drone_Z20)
  385. {
  386. Dev.Checklow.L1_status = (uint16_t)L3_status;
  387. }
  388. Dev.Checklow.L2_status = (uint16_t)L4_status;
  389. Dev.Checklow.seed_lackloss = mimo_lackloss.status;
  390. Dev.Checklow.liquid_persent = decode_liquid_info();
  391. Dev.Checklow.warn = 0;
  392. Dev.Checklow.lack_distance = mimo_lackloss.distance / 10;
  393. Dev.Checklow.lack_power = mimo_lackloss.strength;
  394. break;
  395. default:
  396. break;
  397. }
  398. //雷达
  399. Dev.Radar.height_T = get_radar_info(T_RADAR,0);
  400. Dev.Radar.distance_F_Y = get_radar_info(F_RADAR,OBS_Y);
  401. Dev.Radar.distance_F_Y_ori = Dev.Radar.distance_F_Y;
  402. // if((Dev.Radar.distance_F_Y > 0) && (Fobs_handle_function() == false))
  403. // Dev.Radar.distance_F_Y = 0;
  404. Dev.Radar.distance_F_X = get_radar_info(F_RADAR,OBS_X);
  405. Dev.Radar.signal_F_qulity = mimo_f_info.signal_qulity;
  406. Dev.Radar.distance_B_Y = get_radar_info(B_RADAR,OBS_Y);
  407. Dev.Radar.distance_B_Y_ori = Dev.Radar.distance_B_Y;
  408. // if((Dev.Radar.distance_B_Y > 0) && (Bobs_handle_function() == false))
  409. // Dev.Radar.distance_B_Y = 0;
  410. Dev.Radar.distance_B_X = get_radar_info(B_RADAR,OBS_X);
  411. Dev.Radar.signal_B_qulity = mimo_b_info.signal_qulity;
  412. terrain_is_link = Dev.Radar.height_T > -1? true:false;
  413. obs_f_is_link = Dev.Radar.distance_F_Y > -1? true:false;
  414. obs_b_is_link = Dev.Radar.distance_B_Y > -1? true:false;
  415. }
  416. // if(Dev.Current_Link.connect_status == COMP_NORMAL)
  417. // {
  418. // Dev.Current.facid = FAC_VK;
  419. // Dev.Current.tempture = power_BatteryInfo.temperature * 10;
  420. // Dev.Current.voltage = power_BatteryInfo.voltage * 10;
  421. // Dev.Current.current = power_BatteryInfo.current * 10;
  422. // }
  423. if(Dev.Part_Tradar_Link.connect_status == COMP_NORMAL)
  424. {
  425. // Dev.Part_radarT.height_part1 = T_radar[0].Distance * 0.05f * 100 * cos(T_radar[0].Amuzith * 0.1f / RAD);
  426. // Dev.Part_radarT.height_part2 = T_radar[1].Distance * 0.05f * 100 * cos(T_radar[1].Amuzith * 0.1f / RAD);
  427. // Dev.Part_radarT.height_part3 = T_radar[2].Distance * 0.05f * 100 * cos(T_radar[2].Amuzith * 0.1f / RAD);
  428. // Dev.Part_radarT.raw_height_part1 = T_radar[0].Distance * 0.05f * 100;
  429. // Dev.Part_radarT.raw_height_part2 = T_radar[1].Distance * 0.05f * 100;
  430. // Dev.Part_radarT.raw_height_part3 = T_radar[2].Distance * 0.05f * 100;
  431. // Dev.Part_radarT.angle_part1 = T_radar[0].Amuzith; //0.1
  432. // Dev.Part_radarT.angle_part2 = T_radar[1].Amuzith;
  433. // Dev.Part_radarT.angle_part3 = T_radar[2].Amuzith;
  434. for(uint8_t i = 0; i < 5; i++)
  435. {
  436. Dev.Part_radarT.height_part[i] = T_radar[i].Distance * 0.05f * 100 * cos(T_radar[i].Amuzith * 0.1f / RAD);
  437. Dev.Part_radarT.raw_height_part[i] = T_radar[i].Distance * 0.05f * 100;
  438. Dev.Part_radarT.angle_part[i] = T_radar[i].Amuzith;
  439. }
  440. }
  441. if(Dev.Part_Fradar_Link.connect_status == COMP_NORMAL)
  442. {
  443. for(uint8_t i = 0; i < 3; i++)
  444. {
  445. Dev.Part_radarF.height_part[i] = F_radar[i].Distance * 0.05f * 100 * cos(F_radar[i].Amuzith * 0.1f / RAD);
  446. Dev.Part_radarF.raw_height_part[i] = F_radar[i].Distance * 0.05f * 100;
  447. Dev.Part_radarF.angle_part[i] = F_radar[i].Amuzith;
  448. }
  449. }
  450. if(Dev.Part_Bradar_Link.connect_status == COMP_NORMAL)
  451. {
  452. for(uint8_t i = 0; i < 3; i++)
  453. {
  454. Dev.Part_radarB.height_part[i] = B_radar[i].Distance * 0.05f * 100 * cos(B_radar[i].Amuzith * 0.1f / RAD);
  455. Dev.Part_radarB.raw_height_part[i] = B_radar[i].Distance * 0.05f * 100;
  456. Dev.Part_radarB.angle_part[i] = B_radar[i].Amuzith;
  457. }
  458. }
  459. }
  460. }
  461. bool set_eftdev_canid_flag = false;
  462. uint32_t set_eftdev_canid_time = 0;
  463. uint16_t set_eftdev_canid_status = 0;
  464. uint8_t auto_set_canid_flag = 0; // 0 自检,1设置ID,2结束
  465. uint32_t auto_eft_dev_status = 0;
  466. void set_eft_dev_canid_func( void )
  467. {
  468. if(set_eftdev_canid_flag == true && HAL_GetTick() - set_eftdev_canid_time < 3000)
  469. {
  470. static uint16_t last_status = 0;
  471. if(last_status != set_eftdev_canid_status)
  472. {
  473. last_status = set_eftdev_canid_status;
  474. pmu_set_ack(_MSGID_SET,2,set_eftdev_canid_status,0);
  475. }
  476. }
  477. else if(set_eftdev_canid_flag == true && HAL_GetTick() - set_eftdev_canid_time > 3000)
  478. {
  479. set_eftdev_canid_flag = false;
  480. pmu_set_ack(_MSGID_SET,3,set_eftdev_canid_status,0);
  481. }
  482. if(HAL_GetTick() > 3000 && auto_set_canid_flag == 0)
  483. {
  484. for(uint8_t i = 0; i < 6; i++)
  485. {
  486. if(Dev.Eft_CanDev_Link[i].connect_status == COMP_NORMAL)
  487. {
  488. auto_eft_dev_status = auto_eft_dev_status | (1 << i);
  489. }
  490. }
  491. //6个设备全识别
  492. if((auto_eft_dev_status & 0xff) == 0x3f) //两水泵4喷头
  493. auto_set_canid_flag = NO_NEED_SET;
  494. //2水泵2喷头
  495. else if((auto_eft_dev_status & 0xff) == 0x33) //两水泵 后两个喷头
  496. auto_set_canid_flag = NO_NEED_SET;
  497. else if((auto_eft_dev_status & 0xff) == 0x31) //单水泵 后俩喷头
  498. auto_set_canid_flag = NO_NEED_SET;
  499. else
  500. {
  501. auto_set_canid_flag = NEED_SET;
  502. set_eftdev_canid_time = HAL_GetTick();
  503. }
  504. }
  505. //设置5S ID
  506. if(auto_set_canid_flag == NEED_SET && HAL_GetTick() - set_eftdev_canid_time > 5000)
  507. auto_set_canid_flag = NO_NEED_SET;
  508. }