soft_terrain.c 23 KB

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