soft_device.c 26 KB

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