soft_terrain.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. #include "soft_terrain.h"
  2. #include "stdint.h"
  3. #include "stdbool.h"
  4. #include "tim.h"
  5. #include "can.h"
  6. #include "soft_can.h"
  7. #include "common.h"
  8. #include "soft_seed_device.h"
  9. #include "soft_crc.h"
  10. #include "string.h"
  11. #include "soft_obstacle.h"
  12. #include "soft_seed_device.h"
  13. #include "soft_version.h"
  14. #include "soft_p_2_c.h"
  15. UAVH30 uavh30_dist;
  16. uavr_terrain uavr56_info = {.get_radar_sensi = 50};
  17. uavr_terrain mimo_ter_info;
  18. _dev_par Dev_parameter;
  19. // muniu muniu_ter_info;
  20. bool terrain_is_link = false;
  21. uint16_t terrain_height = 0;
  22. /**
  23. * @file can_recv_mocib_terrain
  24. * @brief 莫之比防地解析
  25. * @param none
  26. * @details
  27. * @author Zhang Sir
  28. **/
  29. void can_recv_mocib_terrain(uint8_t *data)
  30. {
  31. uavh30_dist.powerful = (data[0] << 8) + data[1];
  32. uavh30_dist.near = (data[2] << 8) + data[3];
  33. uavh30_dist.far = (data[4] << 8) + data[5];
  34. uavr56_info.height = uavh30_dist.powerful;
  35. uavr56_info.Link.recv_time = HAL_GetTick();
  36. uavr56_info.Link.connect_status = COMP_NORMAL;
  37. }
  38. /**
  39. * @file can_recv_enzhao_terrain
  40. * @brief 恩曌防地解析
  41. * @param none
  42. * @details
  43. * @author Zhang Sir
  44. **/
  45. mimo_part_radar T_radar[3];
  46. void can_recv_enzhao_terrain(uint32_t CanID, uint8_t data[], uint8_t len)
  47. {
  48. switch (CanID)
  49. {
  50. case CAN_MIMO_T_ID: // 单点雷达
  51. mimo_ter_info.crc = data[3] + data[4] + data[5] + data[6];
  52. if (data[7] == mimo_ter_info.crc)
  53. {
  54. mimo_ter_info.height = (256 * data[4]) + (data[3]); // cm
  55. // printf("%d %d\n", mimo_ter_info.height, m.muniu_hight); //输出到串口助手上 需要pringtf重定向
  56. }
  57. mimo_ter_info.Link.recv_time = HAL_GetTick();
  58. mimo_ter_info.Link.connect_status = COMP_NORMAL;
  59. Dev.Radar.facid_T = FAC_MIMO_RT;
  60. break;
  61. case CAN_MIMO_T_ID1:
  62. memcpy(&T_radar[0], data, 8);
  63. Dev.Part_Tradar_Link.recv_time = HAL_GetTick();
  64. Dev.Part_Tradar_Link.connect_status = COMP_NORMAL;
  65. Dev.Part_radarT.facid = FAC_MIMO_RT;
  66. Dev.Radar.facid_T = FAC_MIMO_RT;
  67. break;
  68. case CAN_MIMO_T_ID2:
  69. memcpy(&T_radar[1], data, 8);
  70. break;
  71. case CAN_MIMO_T_ID3:
  72. memcpy(&T_radar[2], data, 8);
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. // 木牛仿地雷达
  79. // void can_recv_muniu_terrain(uint8_t *data)
  80. // {
  81. // muniu_ter_info.muniu_hight = (data[0] << 8) + data[1];
  82. // muniu_ter_info.muniu_SNR = (data[2] << 8) + data[3];
  83. // muniu_ter_info.Link.connect_status = COMP_NORMAL;
  84. // muniu_ter_info.Link.recv_time = HAL_GetTick();
  85. // }
  86. //电目雷达
  87. DM_RADAR DM_T_info,FMU_DM_info; //原始数据
  88. uint8_t dm_i = 0;
  89. uint8_t DM_recv_flag = 0;
  90. uint8_t DM4d_recv_flag = 0;
  91. Connect_check DM_status;
  92. Connect_check DM_4dstatus;
  93. uavr_terrain DM_ter_info,FourD_ter_info;
  94. uint8_t DM4dt_recv_flag = 0;
  95. uint8_t DM4dbt_recv_flag = 0;
  96. void DM_terrain_recieved_hookfuction(uint32_t cellCanID, uint8_t data[], uint8_t len)
  97. {
  98. if (cellCanID == 0x901300) // 多点协议
  99. {
  100. DM_T_info.byte7.frame_flag = data[7];
  101. DM_status.connect_status = COMP_NORMAL;
  102. DM_status.recv_time = HAL_GetTick();
  103. if (DM_T_info.byte7.flag.head != 0) // 头
  104. {
  105. memcpy(&DM_T_info.target_num, &data[0], 7);
  106. if( DM_T_info.target_num > 30 )
  107. DM_T_info.target_num = 30;
  108. dm_i = 0;
  109. if (DM_T_info.target_num == 0 && DM_recv_flag == 0)
  110. {
  111. FMU_DM_info.target_num = 0;
  112. }
  113. }
  114. else if (DM_T_info.byte7.flag.tail != 0) // 尾
  115. {
  116. if (DM_T_info.target_num != 1)
  117. {
  118. memcpy(&DM_T_info.buf[dm_i], &data[0], DM_T_info.target_num * 4 % 7);
  119. }
  120. else
  121. {
  122. memcpy(&DM_T_info.buf[dm_i], &data[0], 4);
  123. }
  124. if (DM_T_info.crc == Get_Crc16(&DM_T_info.buf[0], DM_T_info.target_num * 4) && DM_recv_flag == 0)
  125. {
  126. memcpy(&FMU_DM_info.target_num, &DM_T_info.target_num, DM_T_info.target_num * 4 + 8);
  127. // memcpy(&FMU_DM_info.buf[0], &DM_T_info.buf[0], DM_T_info.target_num * 4);
  128. }
  129. }
  130. else
  131. {
  132. memcpy(&DM_T_info.buf[dm_i], &data[0], 7);
  133. dm_i += 7;
  134. }
  135. if (dm_i >= 255 - 7)
  136. {
  137. dm_i = 0;
  138. }
  139. }
  140. else if (cellCanID == 0x901301) // 单点协议
  141. {
  142. DM_ter_info.Link.connect_status = COMP_NORMAL;
  143. DM_ter_info.Link.recv_time = HAL_GetTick();
  144. Dev.Radar.facid_T = FAC_DM_RT;
  145. DM_ter_info.height = data[3] + data[4] * 256;
  146. }
  147. else if (cellCanID == 0x901302) // 单点协议
  148. {
  149. FourD_ter_info.Link.connect_status = COMP_NORMAL;
  150. FourD_ter_info.Link.recv_time = HAL_GetTick();
  151. Dev.Radar.facid_T = FAC_DM_RT_4D;
  152. FourD_ter_info.height = data[3] + data[4] * 256;
  153. }
  154. // 版本信息
  155. if (cellCanID == 0x981301 && data[0] == 0x1)
  156. {
  157. uint32_t version_temp = 0;
  158. DM_T_info.byte7.frame_flag = data[7];
  159. if (DM_T_info.byte7.flag.head != 0) // 头
  160. {
  161. memcpy(&version_temp, &data[1], 4);
  162. Int2String(version_temp, DM_ter_info.sn, 9);
  163. // 通过SN序号判断新旧boot
  164. if ((version_temp % 10000000) < 2502999)
  165. DM_ter_info.version[3] = 'O';
  166. else
  167. DM_ter_info.version[3] = 'N';
  168. regist_dev_info(&dev_ter, DEVICE_TERRA, false, DM_ter_info.sn, 9, NULL, 0, NULL, 0, "dmter", 6);
  169. }
  170. else if (DM_T_info.byte7.flag.tail != 0) // 尾
  171. {
  172. memcpy(&version_temp, &data[1], 4);
  173. Int2String(version_temp, &DM_ter_info.version[4], 6);
  174. DM_ter_info.version[0] = 'D';
  175. DM_ter_info.version[1] = 'S';
  176. DM_ter_info.version[2] = '1';
  177. regist_dev_info(&dev_ter, DEVICE_TERRA, false, NULL, 0, DM_ter_info.version, 10, NULL, 0, "dmter", 6);
  178. DM_ter_info.get_radar_ver_flag = true;
  179. pmu_send = PMU_SEND_VERSION; // 旧版APP
  180. }
  181. }
  182. else if (cellCanID == 0x981301 && (data[0] == 0x8 || data[0] == 0x5))
  183. {
  184. if (data[0] == 0x8)
  185. DM_ter_info.get_radar_blind_flag = true;
  186. pmu_set_ack(_MSGID_SET, MSGID_SET_TR_BLIND, 0x56, data[1] + data[2] * 256);
  187. }
  188. else if (cellCanID == 0x981301 && (data[0] == 0x9 || data[0] == 0x7))
  189. {
  190. if (data[0] == 0x9)
  191. DM_ter_info.get_radar_power_flag = true;
  192. pmu_set_ack(_MSGID_SET, MSGID_SET_BR_POWER, 0x56, data[1] + data[2] * 256);
  193. }
  194. else if (cellCanID == 0x981301 && (data[0] == 0xA || data[0] == 0xB))
  195. {
  196. if (data[0] == 0xB)
  197. DM_ter_info.get_radar_rawSwitch_flag = true;
  198. pmu_set_ack(_MSGID_SET, MSGID_SET_RAW_SWITCH, 0x56, data[1] + data[2] * 256);
  199. }
  200. else if (cellCanID == 0x981301 && data[0] == 0x4)
  201. {
  202. pmu_set_ack(_MSGID_SET, MSGID_SET_R_FUNC, 0, data[1] + data[2] * 256);
  203. }
  204. // 版本信息
  205. if (cellCanID == 0x981302 && data[0] == 0x1)
  206. {
  207. uint32_t version_temp = 0;
  208. DM_T_info.byte7.frame_flag = data[7];
  209. if (DM_T_info.byte7.flag.head != 0) // 头
  210. {
  211. memcpy(&version_temp, &data[1], 4);
  212. Int2String(version_temp, FourD_ter_info.sn, 9);
  213. FourD_ter_info.version[3] = 'N';
  214. regist_dev_info(&dev_ter, DEVICE_TERRA, false, FourD_ter_info.sn, 9, NULL, 0, NULL, 0, "dmter", 6);
  215. }
  216. else if (DM_T_info.byte7.flag.tail != 0) // 尾
  217. {
  218. memcpy(&version_temp, &data[1], 4);
  219. Int2String(version_temp, &FourD_ter_info.version[4], 6);
  220. FourD_ter_info.version[0] = 'D';
  221. FourD_ter_info.version[1] = '4';
  222. FourD_ter_info.version[2] = 'T';
  223. regist_dev_info(&dev_ter, DEVICE_TERRA, false, NULL, 0, FourD_ter_info.version, 10, NULL, 0, "dmter", 6);
  224. FourD_ter_info.get_radar_ver_flag = true;
  225. pmu_send = PMU_SEND_VERSION; // 旧版APP
  226. }
  227. }
  228. }
  229. int16_t F_4DRadar[3][3] = {0}; // X Y Z
  230. DM_4dFRADAR DM_F4d;
  231. int dm_4df_i = 0;
  232. DM_4DRADAR FMU_4D_info;
  233. bool F4d_send_flag = false;
  234. bool DM4Dmsg_send_fmu=false;
  235. DM_4dTRADAR DM_T4d;
  236. DM_4dTRADAR DM_BT4d;
  237. int dm_4dt_i = 0;
  238. int dm_4dbt_i = 0;
  239. DM_4dTRADAR_tofmu D4T_tofmu;
  240. DM_4dTRADAR_tofmu D4BT_tofmu;
  241. bool F4DT_send_flag = false;
  242. bool F4DB_send_flag = false;
  243. void DM_Fobs_recieved_hookfuction(uint32_t cellCanID, uint8_t data[], uint8_t len)
  244. {
  245. if (cellCanID == 0XA01300) // 多点协议
  246. {
  247. DM_T_info.byte7.frame_flag = data[7];
  248. DM_status.connect_status = COMP_NORMAL;
  249. DM_status.recv_time = HAL_GetTick();
  250. if (DM_T_info.byte7.flag.head != 0) // 头
  251. {
  252. memcpy(&DM_T_info.target_num, &data[0], 7);
  253. if( DM_T_info.target_num > 30 )
  254. DM_T_info.target_num = 30;
  255. dm_i = 0;
  256. if (DM_T_info.target_num == 0 && DM_recv_flag == 0)
  257. {
  258. FMU_DM_info.target_num = 0;
  259. }
  260. }
  261. else if (DM_T_info.byte7.flag.tail != 0) // 尾
  262. {
  263. if (DM_T_info.target_num != 1)
  264. {
  265. memcpy(&DM_T_info.buf[dm_i], &data[0], DM_T_info.target_num * 4 % 7);
  266. }
  267. else
  268. {
  269. memcpy(&DM_T_info.buf[dm_i], &data[0], 4);
  270. }
  271. if (DM_T_info.crc == Get_Crc16(&DM_T_info.buf[0], DM_T_info.target_num * 4) && DM_recv_flag == 0)
  272. {
  273. memcpy(&FMU_DM_info.target_num, &DM_T_info.target_num, DM_T_info.target_num * 4 + 8);
  274. // memcpy(&FMU_DM_info.buf[0], &DM_T_info.buf[0], DM_T_info.target_num * 4);
  275. }
  276. }
  277. else
  278. {
  279. memcpy(&DM_T_info.buf[dm_i], &data[0], 7);
  280. dm_i += 7;
  281. }
  282. if (dm_i >= 255 - 7)
  283. {
  284. dm_i = 0;
  285. }
  286. }
  287. else if (cellCanID == 0XA01301) // 单点协议
  288. {
  289. DM_f_info.Link.connect_status = COMP_NORMAL;
  290. DM_f_info.Link.recv_time = HAL_GetTick();
  291. Dev.Radar.facid_F = FAC_DM_RF;
  292. DM_f_info.distance_y = data[3] + data[4] * 256;
  293. }
  294. // 4D前避障雷达协议 点云
  295. /*if (cellCanID == 0XA01310)
  296. {
  297. DM_4dstatus.connect_status = COMP_NORMAL;
  298. DM_4dstatus.recv_time = HAL_GetTick();
  299. Dev.Part_radarF.facid = FAC_DM_RF_4D;
  300. DM_F4d.byte7.frame_flag = data[7];
  301. if (DM_F4d.byte7.flag.head != 0) // 头
  302. {
  303. memcpy(&DM_F4d.target_num, &data[0], 7);
  304. if(DM_F4d.target_num > 130)
  305. DM_F4d.target_num = 130;
  306. dm_4df_i = 0;
  307. }
  308. else if (DM_F4d.byte7.flag.tail != 0) // 尾
  309. {
  310. if (DM_F4d.target_num != 1)
  311. {
  312. if ((DM_F4d.target_num * 5) % 7 != 0)
  313. {
  314. memcpy(&DM_F4d.RawData[dm_4df_i], &data[0], (DM_F4d.target_num * 5) % 7);
  315. dm_4df_i += (DM_F4d.target_num * 5) % 7;
  316. }
  317. else
  318. {
  319. memcpy(&DM_F4d.RawData[dm_4df_i], &data[0], 7);
  320. dm_4df_i += 7;
  321. }
  322. }
  323. else
  324. {
  325. memcpy(&DM_F4d.RawData[dm_4df_i], &data[0], 5);
  326. dm_4df_i += 5;
  327. }
  328. if (DM_F4d.crc == Get_Crc16(&DM_F4d.RawData[0], DM_F4d.target_num * 5) && DM4d_recv_flag == 0)
  329. {
  330. FMU_4D_info.target_num = DM_F4d.target_num;
  331. memcpy(&FMU_4D_info.buf, &DM_F4d.RawData, DM_F4d.target_num * 5);
  332. F4d_send_flag = true;
  333. }
  334. }
  335. else
  336. {
  337. memcpy(&DM_F4d.RawData[dm_4df_i], &data[0], 7);
  338. dm_4df_i += 7;
  339. }
  340. if (dm_4df_i >= 145 * 5)
  341. {
  342. dm_4df_i = 0;
  343. }
  344. }*/
  345. // 4D前避障雷达协议 单点
  346. if (cellCanID == 0XA01302)
  347. {
  348. F_4DRadar[0][0] = data[1] + data[2] * 256;
  349. F_4DRadar[0][1] = data[3] + data[4] * 256;
  350. F_4DRadar[0][2] = data[5] + data[6] * 256;
  351. Dev.Part_Fradar_Link.recv_time = HAL_GetTick();
  352. Dev.Part_Fradar_Link.connect_status = COMP_NORMAL;
  353. Dev.Part_radarF.facid = FAC_DM_RF_4D;
  354. }
  355. else if (cellCanID == 0XA01303)
  356. {
  357. F_4DRadar[1][0] = data[1] + data[2] * 256;
  358. F_4DRadar[1][1] = data[3] + data[4] * 256;
  359. F_4DRadar[1][2] = data[5] + data[6] * 256;
  360. }
  361. else if (cellCanID == 0XA01304)
  362. {
  363. F_4DRadar[2][0] = data[1] + data[2] * 256;
  364. F_4DRadar[2][1] = data[3] + data[4] * 256;
  365. F_4DRadar[2][2] = data[5] + data[6] * 256;
  366. }
  367. else if(cellCanID == 0XA01305)
  368. {
  369. DM_T4d.byte7.frame_flag = data[7];
  370. if(DM_T4d.byte7.flag.head != 0 && data[0] == 25)
  371. {
  372. memcpy(&DM_T4d.target_num, &data[0], 7);
  373. dm_4dt_i = 0;
  374. }
  375. else if(DM_T4d.byte7.flag.tail != 0)
  376. {
  377. if(data[0] == 0xFE)
  378. {
  379. memcpy(&DM_T4d.RawData[dm_4dt_i], &data[1], 2);
  380. dm_4dt_i += 2;
  381. }
  382. if(DM_T4d.crc == Get_Crc16(&DM_T4d.RawData[0], DM_T4d.target_num * 2) && DM4dt_recv_flag == 0)
  383. {
  384. D4T_tofmu.target_num = DM_T4d.target_num;
  385. D4T_tofmu.time_delay = DM_T4d.time_delay;
  386. D4T_tofmu.err_num = DM_T4d.err_num;
  387. memcpy(&D4T_tofmu.RawData, &DM_T4d.RawData, DM_T4d.target_num * 2);
  388. F4DT_send_flag = true;
  389. }
  390. else
  391. {
  392. static uint32_t tmpnum = 0;
  393. tmpnum++;
  394. }
  395. }
  396. else
  397. {
  398. if(data[0] == 0xFE)
  399. {
  400. memcpy(&DM_T4d.RawData[dm_4dt_i], &data[1], 6);
  401. dm_4dt_i += 6;
  402. }
  403. }
  404. if (dm_4dt_i >= 25 * 2)
  405. {
  406. dm_4dt_i = 0;
  407. }
  408. }
  409. // 版本信息
  410. if (cellCanID == 0XA81301 && data[0] == 0x1)
  411. {
  412. uint32_t version_temp = 0;
  413. DM_T_info.byte7.frame_flag = data[7];
  414. if (DM_T_info.byte7.flag.head != 0) // 头
  415. {
  416. memcpy(&version_temp, &data[1], 4);
  417. Int2String(version_temp, DM_f_info.sn, 9);
  418. // 通过SN序号判断新旧boot
  419. if ((version_temp % 10000000) < 2502999)
  420. DM_f_info.version[3] = 'O';
  421. else
  422. DM_f_info.version[3] = 'N';
  423. regist_dev_info(&dev_obsf, DEVICE_OBSF, false, DM_f_info.sn, 9, NULL, 0, NULL, 0, "dmter", 6);
  424. }
  425. else if (DM_T_info.byte7.flag.tail != 0) // 尾
  426. {
  427. memcpy(&version_temp, &data[1], 4);
  428. Int2String(version_temp, &DM_f_info.version[4], 6);
  429. DM_f_info.version[0] = 'D';
  430. DM_f_info.version[1] = 'W';
  431. DM_f_info.version[2] = '1';
  432. regist_dev_info(&dev_obsf, DEVICE_OBSF, false, NULL, 0, DM_f_info.version, 10, NULL, 0, "dmter", 6);
  433. DM_f_info.get_radar_ver_flag = true;
  434. pmu_send = PMU_SEND_VERSION; // 旧版APP
  435. }
  436. }
  437. else if (cellCanID == 0xA81301 && (data[0] == 0x8 || data[0] == 0x5))
  438. {
  439. if (data[0] == 0x8)
  440. DM_f_info.get_radar_blind_flag = true;
  441. pmu_set_ack(_MSGID_SET, MSGID_SET_TR_BLIND, 0x11, data[1] + data[2] * 256);
  442. }
  443. else if (cellCanID == 0xA81301 && (data[0] == 0x9 || data[0] == 0x7))
  444. {
  445. if (data[0] == 0x9)
  446. DM_f_info.get_radar_power_flag = true;
  447. pmu_set_ack(_MSGID_SET, MSGID_SET_BR_POWER, 0x11, data[1] + data[2] * 256);
  448. }
  449. else if (cellCanID == 0xA81301 && (data[0] == 0xA || data[0] == 0xB))
  450. {
  451. if (data[0] == 0xB)
  452. DM_f_info.get_radar_rawSwitch_flag = true;
  453. pmu_set_ack(_MSGID_SET, MSGID_SET_RAW_SWITCH, 0x11, data[1] + data[2] * 256);
  454. }
  455. else if (cellCanID == 0xA81301 && data[0] == 0x4)
  456. {
  457. pmu_set_ack(_MSGID_SET, MSGID_SET_R_FUNC, 0, data[1] + data[2] * 256);
  458. }
  459. else if (cellCanID == 0XA81302 && data[0] == 0x1)
  460. {
  461. uint32_t version_temp = 0;
  462. DM_F4d.byte7.frame_flag = data[7];
  463. if (DM_F4d.byte7.flag.head != 0) // 头
  464. {
  465. memcpy(&version_temp, &data[1], 4);
  466. Int2String(version_temp, DM_f_info.sn, 9);
  467. DM_f_info.version[3] = 'N';
  468. regist_dev_info(&dev_obsf, DEVICE_OBSF, false, DM_f_info.sn, 9, NULL, 0, NULL, 0, "dmter", 6);
  469. }
  470. else if (DM_F4d.byte7.flag.tail != 0) // 尾
  471. {
  472. memcpy(&version_temp, &data[1], 4);
  473. Int2String(version_temp, &DM_f_info.version[4], 6);
  474. DM_f_info.version[0] = 'D';
  475. DM_f_info.version[1] = '4';
  476. DM_f_info.version[2] = 'F';
  477. regist_dev_info(&dev_obsf, DEVICE_OBSF, false, NULL, 0, DM_f_info.version, 10, NULL, 0, "dmter", 6);
  478. DM_f_info.get_radar_ver_flag = true;
  479. pmu_send = PMU_SEND_VERSION; // 旧版APP
  480. }
  481. }
  482. else if (cellCanID == 0xA81302 && (data[0] == 0xD || data[0] == 0xC))
  483. {
  484. if (data[0] == 0xD)
  485. Dev_parameter.get_angel_4DF = true;
  486. Dev_parameter.angel_4DF = data[1] + data[2] * 256;
  487. DM4Dmsg_send_fmu = true;
  488. }
  489. else if (cellCanID == 0xA81302 && (data[0] == 0xF || data[0] == 0xE))
  490. {
  491. if (data[0] == 0xF)
  492. Dev_parameter.get_ground_filter_4DF = true;
  493. Dev_parameter.ground_filter_4DF = data[1] + data[2] * 256;
  494. DM4Dmsg_send_fmu = true;
  495. }
  496. else if (cellCanID == 0xA81302 && (data[0] == 0xA || data[0] == 0xB))
  497. {
  498. if (data[0] == 0xB)
  499. Dev_parameter.get_dotcloud_switch_4DF = true;
  500. Dev_parameter.dotcloud_switch_4DF = data[1] + data[2] * 256;
  501. DM4Dmsg_send_fmu = true;
  502. }
  503. else if (cellCanID == 0xA81302 && (data[0] == 0x8 || data[0] == 0x5))
  504. {
  505. if (data[0] == 0x8)
  506. Dev_parameter.get_DM4DF_Blind_spot_distance = true;
  507. Dev_parameter.DM4DF_Blind_spot_distance = data[1] + data[2] * 256;
  508. DM4Dmsg_send_fmu = true;
  509. }
  510. /*else if(cellCanID == 0xA81302 && (data[0] == 0x1))
  511. {
  512. }*/
  513. }
  514. int16_t B_4DRadar[3][3] = {0}; // X Y Z
  515. DM_4dFRADAR DM_B4d;
  516. int dm_4dB_i = 0;
  517. // DM_4DRADAR FMU_4DB_info;
  518. uint8_t DM4dB_recv_flag = 0;
  519. void DM_Bobs_recieved_hookfuction(uint32_t cellCanID, uint8_t data[], uint8_t len)
  520. {
  521. // 4D后避障雷达协议 点云
  522. /*if (cellCanID == 0XB01310)
  523. {
  524. // DM_4dstatus.connect_status = COMP_NORMAL;
  525. // DM_4dstatus.recv_time = HAL_GetTick();
  526. Dev.Part_radarB.facid = FAC_DM_RB_4D;
  527. DM_B4d.byte7.frame_flag = data[7];
  528. if (DM_B4d.byte7.flag.head != 0) // 头
  529. {
  530. memcpy(&DM_B4d.target_num, &data[0], 7);
  531. dm_4dB_i = 0;
  532. }
  533. else if (DM_B4d.byte7.flag.tail != 0) // 尾
  534. {
  535. if (DM_B4d.target_num != 1)
  536. {
  537. if ((DM_B4d.target_num * 5) % 7 != 0)
  538. {
  539. memcpy(&DM_B4d.RawData[dm_4dB_i], &data[0], (DM_B4d.target_num * 5) % 7);
  540. dm_4dB_i += (DM_B4d.target_num * 5) % 7;
  541. }
  542. else
  543. {
  544. memcpy(&DM_B4d.RawData[dm_4dB_i], &data[0], 7);
  545. dm_4dB_i += 7;
  546. }
  547. }
  548. else
  549. {
  550. memcpy(&DM_B4d.RawData[dm_4dB_i], &data[0], 5);
  551. dm_4dB_i += 5;
  552. }
  553. if (DM_4dstatus.connect_status != COMP_NORMAL)
  554. {
  555. if (DM_B4d.crc == Get_Crc16(&DM_B4d.RawData[0], DM_B4d.target_num * 5) && DM4dB_recv_flag == 0)
  556. {
  557. FMU_4D_info.target_num = DM_B4d.target_num;
  558. memcpy(&FMU_4D_info.buf, &DM_B4d.RawData, DM_B4d.target_num * 5);
  559. F4d_send_flag = true;
  560. }
  561. }
  562. }
  563. else
  564. {
  565. memcpy(&DM_B4d.RawData[dm_4dB_i], &data[0], 7);
  566. dm_4dB_i += 7;
  567. }
  568. if (dm_4dB_i >= 254 * 5)
  569. {
  570. dm_4dB_i = 0;
  571. }
  572. }*/
  573. // 4D后避障雷达协议 单点
  574. if (cellCanID == 0XB01302)
  575. {
  576. B_4DRadar[0][0] = data[1] + data[2] * 256;
  577. B_4DRadar[0][1] = data[3] + data[4] * 256;
  578. B_4DRadar[0][2] = data[5] + data[6] * 256;
  579. Dev.Part_Bradar_Link.recv_time = HAL_GetTick();
  580. Dev.Part_Bradar_Link.connect_status = COMP_NORMAL;
  581. Dev.Part_radarB.facid = FAC_DM_RB_4D;
  582. }
  583. else if (cellCanID == 0XB01303)
  584. {
  585. B_4DRadar[1][0] = data[1] + data[2] * 256;
  586. B_4DRadar[1][1] = data[3] + data[4] * 256;
  587. B_4DRadar[1][2] = data[5] + data[6] * 256;
  588. }
  589. else if (cellCanID == 0XB01304)
  590. {
  591. B_4DRadar[2][0] = data[1] + data[2] * 256;
  592. B_4DRadar[2][1] = data[3] + data[4] * 256;
  593. B_4DRadar[2][2] = data[5] + data[6] * 256;
  594. }
  595. else if(cellCanID == 0XB01305)
  596. {
  597. DM_BT4d.byte7.frame_flag = data[7];
  598. if(DM_BT4d.byte7.flag.head != 0 && data[0] == 25)
  599. {
  600. memcpy(&DM_BT4d.target_num, &data[0], 7);
  601. dm_4dbt_i = 0;
  602. }
  603. else if(DM_BT4d.byte7.flag.tail != 0)
  604. {
  605. if(data[0] == 0xFE)
  606. {
  607. memcpy(&DM_BT4d.RawData[dm_4dbt_i], &data[1], 2);
  608. dm_4dbt_i += 2;
  609. }
  610. if(DM_BT4d.crc == Get_Crc16(&DM_BT4d.RawData[0], DM_BT4d.target_num * 2) && DM4dbt_recv_flag == 0)
  611. {
  612. D4BT_tofmu.target_num = DM_BT4d.target_num;
  613. D4BT_tofmu.time_delay = DM_BT4d.time_delay;
  614. D4BT_tofmu.err_num = DM_BT4d.err_num;
  615. memcpy(&D4BT_tofmu.RawData, &DM_BT4d.RawData, DM_BT4d.target_num * 2);
  616. F4DB_send_flag = true;
  617. }
  618. else
  619. {
  620. static uint32_t tmpnum = 0;
  621. tmpnum++;
  622. }
  623. }
  624. else
  625. {
  626. if(data[0] == 0xFE)
  627. {
  628. memcpy(&DM_BT4d.RawData[dm_4dbt_i], &data[1], 6);
  629. dm_4dbt_i += 6;
  630. }
  631. }
  632. if (dm_4dbt_i >= 25 * 2)
  633. {
  634. dm_4dbt_i = 0;
  635. }
  636. }
  637. else if (cellCanID == 0xB81302 && (data[0] == 0x1 || data[0] == 0x2))
  638. {
  639. uint32_t version_temp = 0;
  640. DM_B4d.byte7.frame_flag = data[7];
  641. if (DM_B4d.byte7.flag.head != 0) // 头
  642. {
  643. memcpy(&version_temp, &data[1], 4);
  644. Int2String(version_temp, DM_4DB_info.sn, 9);
  645. DM_4DB_info.version[3] = 'N';
  646. regist_dev_info(&dev_obsb, DEVICE_OBSB, false, DM_4DB_info.sn, 9, NULL, 0, NULL, 0, "dmter", 6);
  647. }
  648. else if (DM_B4d.byte7.flag.tail != 0) // 尾
  649. {
  650. memcpy(&version_temp, &data[1], 4);
  651. Int2String(version_temp, &DM_4DB_info.version[4], 6);
  652. DM_4DB_info.version[0] = 'D';
  653. DM_4DB_info.version[1] = '4';
  654. DM_4DB_info.version[2] = 'B';
  655. regist_dev_info(&dev_obsb, DEVICE_OBSB, false, NULL, 0, DM_4DB_info.version, 10, NULL, 0, "dmter", 6);
  656. DM_4DB_info.get_radar_ver_flag = true;
  657. pmu_send = PMU_SEND_VERSION; // 旧版APP
  658. }
  659. }
  660. else if (cellCanID == 0xB81302 && (data[0] == 0xA || data[0] == 0xB))
  661. {
  662. if (data[0] == 0xB)
  663. Dev_parameter.get_dotcloud_switch_4DB = true;
  664. Dev_parameter.dotcloud_switch_4DB = data[1] + data[2] * 256;
  665. DM4Dmsg_send_fmu = true;
  666. }
  667. else if (cellCanID == 0xB81302 && (data[0] == 0xD || data[0] == 0xC))
  668. {
  669. if (data[0] == 0xD)
  670. Dev_parameter.get_angel_4DB = true;
  671. Dev_parameter.angel_4DB = data[1] + data[2] * 256;
  672. DM4Dmsg_send_fmu = true;
  673. }
  674. else if (cellCanID == 0xB81302 && (data[0] == 0xF || data[0] == 0xE))
  675. {
  676. if (data[0] == 0xF)
  677. Dev_parameter.get_ground_filter_4DB = true;
  678. Dev_parameter.ground_filter_4DB = data[1] + data[2] * 256;
  679. DM4Dmsg_send_fmu = true;
  680. }
  681. else if (cellCanID == 0xB81302 && (data[0] == 0x8 || data[0] == 0x5))
  682. {
  683. if (data[0] == 0x8)
  684. Dev_parameter.get_DM4DB_Blind_spot_distance = true;
  685. Dev_parameter.DM4DB_Blind_spot_distance = data[1] + data[2] * 256;
  686. DM4Dmsg_send_fmu = true;
  687. }
  688. }