soft_obstacle.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599
  1. #include "soft_obstacle.h"
  2. #include "tim.h"
  3. #include "string.h"
  4. #include "math.h"
  5. #include "soft_terrain.h"
  6. #include "soft_uart.h"
  7. #include "common.h"
  8. #include "soft_can.h"
  9. #include "soft_p_2_c.h"
  10. #include "stdlib.h"
  11. #include "soft_flow.h"
  12. #include "common.h"
  13. #include "soft_seed_device.h"
  14. #include "soft_water_device.h"
  15. #include "soft_version.h"
  16. #include "soft_eft.h"
  17. #include "common.h"
  18. uavr_obs uavr11_info = {.get_radar_sensi = 50};
  19. uavr_obs uavr12_info= {.get_radar_sensi = 50};
  20. uavr_obs uavr13_info= {.get_radar_sensi = 50};
  21. uavr_obs uavr14_info= {.get_radar_sensi = 50};
  22. uavr_obs mimo_f_info = {.signal_qulity = 0};
  23. uavr_obs mimo_b_info = {.signal_qulity = 0};
  24. uavr_obs DM_f_info;
  25. DM_4D_REDARVER DM_4DB_info;
  26. /**
  27. * @file can_recv_enzhao_obstacle
  28. * @brief 恩曌多点避障解析
  29. * @param none
  30. * @details
  31. * @author Zhang Sir
  32. **/
  33. mimo_part_radar F_radar[3];
  34. mimo_part_radar B_radar[3];
  35. uint8_t recv_comF_flag = 0,recv_comB_flag = 0;
  36. void can_recv_enzhao_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  37. {
  38. switch (cellCanID)
  39. {
  40. case CAN_MIMO_FOBS_ID1:
  41. memcpy(&F_radar[0], data, 8);
  42. recv_comF_flag = recv_comF_flag | 1;
  43. Dev.Radar.facid_F = FAC_MIMO_RF;
  44. break;
  45. case CAN_MIMO_FOBS_ID2:
  46. memcpy(&F_radar[1], data, 8);
  47. recv_comF_flag = recv_comF_flag | 2;
  48. break;
  49. case CAN_MIMO_FOBS_ID3:
  50. memcpy(&F_radar[2], data, 8);
  51. recv_comF_flag = recv_comF_flag | 4;
  52. break;
  53. case CAN_MIMO_BOBS_ID1:
  54. memcpy(&B_radar[0], data, 8);
  55. recv_comB_flag = recv_comB_flag | 1;
  56. Dev.Radar.facid_B = FAC_MIMO_RB;
  57. break;
  58. case CAN_MIMO_BOBS_ID2:
  59. memcpy(&B_radar[1], data, 8);
  60. recv_comB_flag = recv_comB_flag | 2;
  61. break;
  62. case CAN_MIMO_BOBS_ID3:
  63. memcpy(&B_radar[2], data, 8);
  64. recv_comB_flag = recv_comB_flag | 4;
  65. break;
  66. default:
  67. break;
  68. }
  69. if(recv_comF_flag == 7)
  70. {
  71. recv_comF_flag = 0;
  72. mimomocib_buf_sort(&F_radar[0], 3);
  73. for (uint8_t i = 0; i < 3; i++)
  74. {
  75. //X轴小于4M内数据
  76. if (/*(abs(F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ F_radar[i].Distance > 0)
  77. {
  78. mimo_f_info.distance_x = F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD);
  79. mimo_f_info.distance_y = F_radar[i].Distance * 0.05f * 100 * cos(F_radar[i].Amuzith * 0.1f / RAD);
  80. break;
  81. }
  82. if(i == 2)
  83. {
  84. mimo_f_info.distance_x = 0;
  85. mimo_f_info.distance_y = 0;
  86. }
  87. }
  88. mimo_f_info.Link.connect_status = COMP_NORMAL;
  89. mimo_f_info.Link.recv_time = HAL_GetTick();
  90. }
  91. if(recv_comB_flag == 7)
  92. {
  93. recv_comB_flag = 0;
  94. mimomocib_buf_sort(&B_radar[0], 3);
  95. for (uint8_t i = 0; i < 3; i++)
  96. {
  97. //X轴小于4M内数据
  98. if (/*(abs(B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ B_radar[i].Distance > 0)
  99. {
  100. mimo_b_info.distance_x = B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD);
  101. mimo_b_info.distance_y = B_radar[i].Distance * 0.05f * 100 * cos(B_radar[i].Amuzith * 0.1f / RAD);
  102. break;
  103. }
  104. if(i == 2)
  105. {
  106. mimo_b_info.distance_x = 0;
  107. mimo_b_info.distance_y = 0;
  108. }
  109. }
  110. mimo_b_info.Link.recv_time = HAL_GetTick();
  111. mimo_b_info.Link.connect_status = COMP_NORMAL;
  112. }
  113. }
  114. /**
  115. * @file can_recv_enzhao_obstacle
  116. * @brief 恩曌单避障解析
  117. * @param none
  118. * @details
  119. * @author Zhang Sir
  120. **/
  121. void can_recv_mimo_signal_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  122. {
  123. uint16_t frame_header = 0;
  124. memcpy(&frame_header,&data[0],2);
  125. if(frame_header == 0x5AA5 && data[2] == 0x04)
  126. {
  127. switch (cellCanID)
  128. {
  129. case CAN_MIMO_FOBS_SIG:
  130. mimo_f_info.distance_y = data[3] + data[4] * 256;
  131. mimo_f_info.signal_qulity = data[5];
  132. mimo_f_info.Link.recv_time = HAL_GetTick();
  133. mimo_f_info.Link.connect_status = COMP_NORMAL;
  134. Dev.Radar.facid_F = FAC_MIMO_RF;
  135. break;
  136. case CAN_MIMO_BOBS_SIG:
  137. mimo_b_info.distance_y = data[3] + data[4] * 256;
  138. mimo_b_info.signal_qulity = data[5];
  139. mimo_b_info.Link.recv_time = HAL_GetTick();
  140. mimo_b_info.Link.connect_status = COMP_NORMAL;
  141. Dev.Radar.facid_B = FAC_MIMO_RB;
  142. break;
  143. default:
  144. break;
  145. }
  146. }
  147. }
  148. /**
  149. * @file can_recv_mimo_radar_version
  150. * @brief 恩曌设备版本获取
  151. * @param none
  152. * @details
  153. * @author Zhang Sir
  154. **/
  155. void can_recv_mimo_radar_version(uint32_t cellCanID, uint8_t data[], uint8_t len)
  156. {
  157. static uint8_t mimo_version[28] = {0};
  158. static uint8_t frame_num = 0;
  159. static bool frame_head = false;
  160. uint8_t i = 0;
  161. uint32_t checksum = 0;
  162. uint32_t soft_ver = 0;
  163. switch (cellCanID)
  164. {
  165. case 0XFB:
  166. if(data[0] == 0XAA && data[1] == 0X55)
  167. {
  168. if(data[2] == 0X03 && data[3] == 0X61 && data[4] == 0X03 && data[5] == 0X01 && data[6] == 0X65)
  169. {
  170. pmu_set_ack(_MSGID_SET,MSGID_SET_RADAR_FB,0x11,0);
  171. }
  172. else if(data[2] == 0X03 && data[3] == 0X61 && data[4] == 0X03 && data[5] == 0X02 && data[6] == 0X66)
  173. {
  174. pmu_set_ack(_MSGID_SET,MSGID_SET_RADAR_FB,0x12,0);
  175. }
  176. else if(data[2] == 0X03 && data[3] == 0X61 && data[4] == 0X00 && data[5] == 0X03 && data[6] == 0X64)
  177. {
  178. pmu_set_ack(_MSGID_SET,MSGID_SET_RADAR_FB,0x100,0);
  179. }
  180. else
  181. {
  182. frame_num = 0;
  183. memcpy(&mimo_version[frame_num],&data[4],4);
  184. frame_num += 4;
  185. frame_head = true;
  186. }
  187. }
  188. //断料记
  189. else if(data[0] == 0xFB && data[1] == 0x03 && data[2] == 0)
  190. {
  191. //设置距离最大值反馈
  192. if(data[3] == 0xB2 && data[4] == 0xE1)
  193. {
  194. pmu_set_ack(_MSGID_SET,MSGID_SET_LACKLOSS_CAL,mimo_lackloss.cal_distance,mimo_lackloss.strength);
  195. }
  196. }
  197. //流量计
  198. else if(data[0] == 0xFB && data[1] == 0x10) //雷达版本和流量计协议有冲突
  199. {
  200. switch (data[2])
  201. {
  202. case 0:
  203. if(data[4] == 0XD1) //流速K
  204. {
  205. flow_mimo1.flow_k = data[5] * 256 + data[6];
  206. }
  207. else if(data[4] == 0XC1)//设置流速K ack
  208. {
  209. if(data[6] == 0)
  210. {
  211. flow_mimo1.flow_k = flow_mimo1.flow_calk;
  212. if(Dev.Flow_Link1.connect_status == COMP_NORMAL && Dev.Flow_Link2.connect_status != COMP_NORMAL)
  213. {
  214. pmu_set_ack(_MSGID_SET,MSGID_SET_MIMO_FLOW,flow_mimo1.flow_k,0);
  215. }
  216. }
  217. }
  218. else if(data[4] == 0xE2)
  219. {
  220. if(data[6] == 0 && Dev.Flow_Link1.connect_status == COMP_NORMAL && Dev.Flow_Link2.connect_status != COMP_NORMAL)
  221. {
  222. pmu_set_ack(_MSGID_SET,MSGID_SET_FLOW_BACKGROUND,0,0);
  223. }
  224. flow_inf.ch1.clear_background = false;
  225. }
  226. else if (data[4] == 0XEB)//sn 两包 协议冲突 协议有问题
  227. {
  228. for( i= 0;i<2;i++) //内容第一自字节0X0F?先舍弃一字节,
  229. {
  230. flow_mimo1.sn[2*i] = ((data[6 + i] >> 4) & 0xf) + '0';
  231. flow_mimo1.sn[2*i+1] = (data[6 + i] & 0xf )+ '0';
  232. }
  233. frame_num = 21;//流量序列号的标记
  234. }
  235. else if(data[4] == 0XEC)//软件号
  236. {
  237. flow_mimo1.soft_version[0] = data[5] + '0';
  238. flow_mimo1.soft_version[1] = data[6] + '0';
  239. }
  240. break;
  241. case 1:
  242. if(data[4] == 0XD1)
  243. {
  244. flow_mimo2.flow_k = data[5] * 256 + data[6];
  245. }
  246. else if(data[4] == 0XC1)
  247. {
  248. if(data[6] == 0)
  249. {
  250. flow_mimo2.flow_k = flow_mimo2.flow_calk;
  251. if(Dev.Flow_Link1.connect_status == COMP_NORMAL && Dev.Flow_Link2.connect_status == COMP_NORMAL)
  252. {
  253. pmu_set_ack(_MSGID_SET,MSGID_SET_MIMO_FLOW,flow_mimo1.flow_k,flow_mimo2.flow_k);
  254. }
  255. else if(Dev.Flow_Link1.connect_status != COMP_NORMAL && Dev.Flow_Link2.connect_status == COMP_NORMAL)
  256. {
  257. pmu_set_ack(_MSGID_SET,MSGID_SET_MIMO_FLOW,0,flow_mimo2.flow_k);
  258. }
  259. }
  260. }
  261. else if(data[4] == 0xE2)
  262. {
  263. if(data[6] == 0 && Dev.Flow_Link1.connect_status == COMP_NORMAL && Dev.Flow_Link2.connect_status == COMP_NORMAL)
  264. {
  265. pmu_set_ack(_MSGID_SET,MSGID_SET_FLOW_BACKGROUND,0,0);
  266. }
  267. flow_inf.ch1.clear_background = false;
  268. }
  269. break;
  270. default:
  271. break;
  272. }
  273. }
  274. else
  275. {
  276. if(frame_num == 21)
  277. {
  278. for( i=0;i<5;i++)
  279. {
  280. flow_mimo1.sn[4+2*i] = ((data[i] >> 4) & 0xf) + '0';
  281. flow_mimo1.sn[4+2*i+1] = (data[i] & 0xf )+ '0';
  282. }
  283. //flow_mimo1.sn[1] = 'F';
  284. frame_num = 0;
  285. }
  286. if(frame_num <= 20)
  287. {
  288. if(frame_head == true)
  289. {
  290. memcpy(&mimo_version[frame_num],&data[0],8);
  291. frame_num += 8;
  292. }
  293. if(frame_num == 0x1c) //恩曌SN取中间日期12位,其他有问题
  294. {
  295. checksum = 0x01;
  296. for(uint8_t i = 0; i < 27; i++)
  297. {
  298. checksum += mimo_version[i];
  299. }
  300. if((checksum & 0xFF) == mimo_version[27])
  301. {
  302. memcpy(&soft_ver,&mimo_version[23],4);
  303. switch (mimo_version[18])
  304. {
  305. case 0x00:
  306. mimo_ter_info.version[0] = 'E';
  307. mimo_ter_info.version[1] = 'B';
  308. mimo_ter_info.version[2] = '0';
  309. mimo_ter_info.version[3] = '0';
  310. Int2String(soft_ver,&mimo_ter_info.version[4],6);
  311. memcpy(&mimo_ter_info.hard_version,&mimo_version[19],4);
  312. if(mimo_ter_info.hard_version == 210221)
  313. {
  314. mimo_ter_info.version[3] = 'J';
  315. }
  316. for( i= 0;i<9;i++)
  317. {
  318. mimo_ter_info.sn[2*i] = ((mimo_version[7 + i] >> 4) & 0xf) + '0';
  319. mimo_ter_info.sn[2*i+1] = (mimo_version[7 + i] & 0xf )+ '0';
  320. }
  321. //memcpy(&mimo_ter_info.sn[0],&mimo_version[4],18);
  322. regist_dev_info(&dev_ter,DEVICE_TERRA,false,mimo_ter_info.sn,18,mimo_ter_info.version,10,NULL,0,"mimo",5);
  323. mimo_ter_info.get_radar_ver_flag = true;
  324. mimo_ter_info.Link.boot_flag = false;
  325. break;
  326. case 0x03:
  327. mimo_f_info.version[0] = 'E';
  328. mimo_f_info.version[1] = '1';
  329. mimo_f_info.version[2] = '0';
  330. mimo_f_info.version[3] = '0';
  331. Int2String(soft_ver,&mimo_f_info.version[4],6);
  332. memcpy(&mimo_f_info.hard_version,&mimo_version[19],4);
  333. if(mimo_f_info.hard_version == 190302) //恩曌协议定义
  334. {
  335. mimo_f_info.version[2] = '1'; //极翼
  336. mimo_f_info.version[3] = 'J';
  337. }
  338. else
  339. {
  340. mimo_f_info.version[2] = '0'; //vk
  341. mimo_f_info.version[3] = 'V';
  342. }
  343. for( i= 0;i<9;i++)
  344. {
  345. mimo_f_info.sn[2*i] = ((mimo_version[7 + i] >> 4) & 0xf) + '0';
  346. mimo_f_info.sn[2*i+1] = (mimo_version[7 + i] & 0xf )+ '0';
  347. }
  348. //memcpy(&mimo_f_info.sn[0],&mimo_version[4],12);
  349. regist_dev_info(&dev_obsf,DEVICE_OBSF,false,mimo_f_info.sn,18,mimo_f_info.version,10,mimo_f_info.version,10,"mimo",5);
  350. mimo_f_info.get_radar_ver_flag = true;
  351. mimo_f_info.Link.boot_flag = false;
  352. break;
  353. case 0x04:
  354. mimo_b_info.version[0] = 'E';
  355. mimo_b_info.version[1] = '2';
  356. mimo_b_info.version[2] = '0';
  357. mimo_b_info.version[3] = '0';
  358. Int2String(soft_ver,&mimo_b_info.version[4],6);
  359. memcpy(&mimo_b_info.hard_version,&mimo_version[19],4);
  360. if(mimo_b_info.hard_version == 190302) //恩曌协议定义
  361. {
  362. mimo_b_info.version[2] = '1'; //极翼
  363. mimo_b_info.version[3] = 'J';
  364. }
  365. else
  366. {
  367. mimo_b_info.version[2] = '0'; //vk
  368. mimo_b_info.version[3] = 'V';
  369. }
  370. for( i= 0;i<9;i++)
  371. {
  372. mimo_b_info.sn[2*i] = ((mimo_version[7 + i] >> 4) & 0xf) + '0';
  373. mimo_b_info.sn[2*i+1] = (mimo_version[7 + i] & 0xf )+ '0';
  374. }
  375. //memcpy(&mimo_b_info.sn[0],&mimo_version[4],12);
  376. regist_dev_info(&dev_obsb,DEVICE_OBSB,false,mimo_b_info.sn,18,mimo_b_info.version,10,mimo_b_info.version,10,"mimo",5);
  377. mimo_b_info.get_radar_ver_flag = true;
  378. mimo_b_info.Link.boot_flag = false;
  379. break;
  380. default:
  381. break;
  382. }
  383. frame_num = 0;
  384. frame_head = false;
  385. pmu_send = PMU_SEND_VERSION;
  386. }
  387. }
  388. }
  389. else
  390. {
  391. }
  392. }
  393. // char_to_hex_string(&data[5], 3, &mimo_ter_info.version[4], 6, "00");
  394. // mimo_ter_info.soft_verison = ((data[5] & 0xff) << 16) + ((data[6] & 0xff) << 8) + (data[7] & 0xff);
  395. break;
  396. default:
  397. break;
  398. }
  399. }
  400. /**
  401. * @file can_recv_mocib_F_obstacle
  402. * @brief 莫之比前避障解析
  403. * @param none
  404. * @details
  405. * @author Zhang Sir
  406. **/
  407. bool obs_f_is_link = false;
  408. void can_recv_mocib_F_obstacle(uint8_t *data)
  409. {
  410. uavr11_info.distance_x= (data[0] << 8) + data[1] - 32768;
  411. uavr11_info.distance_y = (data[2] << 8) + data[3];
  412. // if(abs(uavr11_info.distance_x) > 400)
  413. // {
  414. // uavr11_info.distance_y = 0;
  415. // uavr11_info.distance_x = 0;
  416. // }
  417. uavr11_info.Link.connect_status = COMP_NORMAL;
  418. uavr11_info.Link.recv_time = HAL_GetTick();
  419. }
  420. // /**
  421. // * @brief 恩曌360雷达
  422. // */
  423. // #pragma pack(push)
  424. // #pragma pack(1)
  425. // typedef struct
  426. // {
  427. // uint8_t totalSect; //总分区数
  428. // uint8_t validSect; // 有效分区数
  429. // uint8_t cycleCounter;
  430. // uint8_t reserve0;
  431. // uint32_t reserve : 20;
  432. // uint32_t height : 12; // 精度 0.01m
  433. // } FrameHeader1S;
  434. // typedef struct
  435. // {
  436. // uint8_t sectID; //分区 ID
  437. // uint16_t dis; //距离
  438. // int16_t ele;
  439. // uint8_t rcs; //目标雷达截面积
  440. // int16_t reserve1;
  441. // } SectionPackS;
  442. // typedef struct
  443. // {
  444. // uint32_t ID;
  445. // uint8_t data[8];
  446. // } CanMessage_t;
  447. // #pragma pack(pop)
  448. // #define MAX_SECTNUM 180
  449. // typedef struct
  450. // {
  451. // uint32_t totalSect; //总分区个数,数组中对应位置对应目标所在分区
  452. // uint32_t validSect; //总分区个数,数组中对应位置对应目标所在分区
  453. // uint32_t completeQ; // 0 代表无数据 1 代表数据接收到但不全 2 代表全部接收成功
  454. // float height;
  455. // float dis[MAX_SECTNUM]; // 雷达到目标距离,当目标不存在时距离为
  456. // float ele[MAX_SECTNUM]; // 目标的 RCS
  457. // float rcs[MAX_SECTNUM]; // 目标的 RCS
  458. // } TargetInfoS; // 原始目标结构信息
  459. // TargetInfoS Targetbuffer = {0}; // 用于缓存
  460. // TargetInfoS TargetOut = {0};
  461. // static int LastSection = -1;
  462. // int ValidSect = 0;
  463. // comp_status mimo360_link_status = COMP_NOEXIST;
  464. // void can_recv_mocib_360_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  465. // {
  466. // int index;
  467. // CanMessage_t *can_tmp_ptr = NULL;
  468. // CanMessage_t can_tmp;
  469. // FrameHeader1S *frameHead_ptr;
  470. // SectionPackS *pack_ptr;
  471. // can_tmp_ptr = &can_tmp;
  472. // can_tmp_ptr->ID = cellCanID;
  473. // memcpy(&can_tmp_ptr->data[0], data, len);
  474. // mimo360_link_status = COMP_NORMAL;
  475. // if (can_tmp_ptr->ID == 0x301) // 检测到帧头
  476. // {
  477. // if (Targetbuffer.completeQ == 1) // 如果数据未接完
  478. // {
  479. // memcpy(&TargetOut, &Targetbuffer, sizeof(Targetbuffer));
  480. // }
  481. // memset(&Targetbuffer, 0, sizeof(Targetbuffer));
  482. // frameHead_ptr = (FrameHeader1S *)can_tmp_ptr->data;
  483. // Targetbuffer.totalSect = frameHead_ptr->totalSect;
  484. // Targetbuffer.height = frameHead_ptr->height / 100.0F;
  485. // if (frameHead_ptr->validSect == 0) // 如果不存在分区数据
  486. // {
  487. // Targetbuffer.completeQ = 2;
  488. // Targetbuffer.validSect = 0;
  489. // memcpy(&TargetOut, &Targetbuffer, sizeof(Targetbuffer));
  490. // }
  491. // else // 如果存在分区数据
  492. // {
  493. // ValidSect = frameHead_ptr->validSect;
  494. // Targetbuffer.completeQ = 1;
  495. // }
  496. // LastSection = -1;
  497. // }
  498. // else if (can_tmp_ptr->ID == 0x302) // 检测到目标数据
  499. // {
  500. // pack_ptr = (SectionPackS *)can_tmp_ptr->data;
  501. // if (Targetbuffer.completeQ == 1) //如果数据未接收完
  502. // {
  503. // index = pack_ptr->sectID; //获取分区 ID
  504. // if (LastSection == -1)
  505. // {
  506. // Targetbuffer.dis[index] = pack_ptr->dis * 0.01F;
  507. // Targetbuffer.ele[index] = pack_ptr->ele * 0.01F;
  508. // Targetbuffer.rcs[index] = pack_ptr->rcs;
  509. // Targetbuffer.validSect++;
  510. // LastSection = index;
  511. // }
  512. // else if (LastSection < index) //分区数据是按照从小到大输出才是正确的
  513. // {
  514. // Targetbuffer.dis[index] = pack_ptr->dis * 0.01F;
  515. // Targetbuffer.ele[index] = pack_ptr->ele * 0.1F;
  516. // Targetbuffer.rcs[index] = pack_ptr->rcs;
  517. // Targetbuffer.validSect++;
  518. // }
  519. // else // 如果不是则存在丢失包含帧 ID 的多个数据包
  520. // {
  521. // Targetbuffer.completeQ = 0; //数据不保存
  522. // }
  523. // if (Targetbuffer.completeQ == 1)
  524. // {
  525. // if (ValidSect == Targetbuffer.validSect) //有效个数等于实际接收个数
  526. // {
  527. // Targetbuffer.completeQ = 2;
  528. // memcpy(&TargetOut, &Targetbuffer, sizeof(Targetbuffer));
  529. // memset(&Targetbuffer, 0, sizeof(Targetbuffer));
  530. // }
  531. // }
  532. // }
  533. // }
  534. // }
  535. /**
  536. * @file can_recv_mocib_B_obstacle
  537. * @brief 莫之比后避障障解析
  538. * @param none
  539. * @details
  540. * @author Zhang Sir
  541. **/
  542. bool obs_b_is_link = false;
  543. void can_recv_mocib_B_obstacle(uint8_t *data)
  544. {
  545. uavr12_info.distance_x = (data[0] << 8) + data[1] - 32768;
  546. uavr12_info.distance_y = (data[2] << 8) + data[3];
  547. // if(abs(uavr12_info.distance_x) > 400)
  548. // {
  549. // uavr12_info.distance_x = 0;
  550. // uavr12_info.distance_y = 0;
  551. // }
  552. uavr12_info.Link.connect_status = COMP_NORMAL;
  553. uavr12_info.Link.recv_time = HAL_GetTick();
  554. }
  555. /**
  556. * @file can_recv_mocib_L_obstacle
  557. * @brief 莫之比左避障障解析
  558. * @param none
  559. * @details
  560. * @author ZHOU
  561. **/
  562. void can_recv_mocib_L_obstacle(uint8_t *data)
  563. {
  564. uavr13_info.distance_x = (data[0] << 8) + data[1] - 32768;
  565. uavr13_info.distance_y = (data[2] << 8) + data[3];
  566. // if(abs(uavr12_info.distance_x) > 400)
  567. // {
  568. // uavr12_info.distance_x = 0;
  569. // uavr12_info.distance_y = 0;
  570. // }
  571. uavr13_info.Link.connect_status = COMP_NORMAL;
  572. uavr13_info.Link.recv_time = HAL_GetTick();
  573. }
  574. /**
  575. * @file can_recv_mocib_R_obstacle
  576. * @brief 莫之比右避障障解析
  577. * @param none
  578. * @details
  579. * @author ZHOU
  580. **/
  581. void can_recv_mocib_R_obstacle(uint8_t *data)
  582. {
  583. uavr14_info.distance_x = (data[0] << 8) + data[1] - 32768;
  584. uavr14_info.distance_y = (data[2] << 8) + data[3];
  585. // if(abs(uavr12_info.distance_x) > 400)
  586. // {
  587. // uavr12_info.distance_x = 0;
  588. // uavr12_info.distance_y = 0;
  589. // }
  590. uavr14_info.Link.connect_status = COMP_NORMAL;
  591. uavr14_info.Link.recv_time = HAL_GetTick();
  592. }
  593. uint32_t uavr20_ver_time = 0;
  594. uint32_t uavr20_sensi_time = 0;
  595. char can_get_uavr21_ver_comp = 0;
  596. /**
  597. * @file can_sendmsg_uavr20
  598. * @brief 给墨汁比雷达发送无人机姿态信息
  599. * @param none
  600. * @details
  601. * @author Zhang Sir
  602. **/
  603. uint32_t uavr20_send_time = 0;
  604. void can_sendmsg_uavr20(void)
  605. {
  606. if (uavr12_info.Link.connect_status == COMP_NORMAL || uavr11_info.Link.connect_status == COMP_NORMAL ||
  607. uavr56_info.Link.connect_status == COMP_NORMAL || uavr13_info.Link.connect_status == COMP_NORMAL ||
  608. uavr14_info.Link.connect_status == COMP_NORMAL)
  609. {
  610. //10hz发送
  611. if ((HAL_GetTick() - uavr20_send_time > 100) && planep.lock_status == 1)
  612. {
  613. uavr20_send_time = HAL_GetTick();
  614. int16_t index = 0;
  615. short tmpShort = 0;
  616. uint8_t send_uavr20_data[16] = {0};
  617. // 开头
  618. send_uavr20_data[index++] = 0XA5;
  619. // 俯仰
  620. tmpShort = planep.pitch_angle;
  621. short2buf(&send_uavr20_data[index], &tmpShort);
  622. index += 2;
  623. // 前后速度
  624. tmpShort = planep.E_vel * sinf(planep.yaw / 100.0f * DEG_TO_RAD) +
  625. planep.N_vel * cosf(planep.yaw / 100.0f * DEG_TO_RAD);
  626. short2buf(&send_uavr20_data[index], &tmpShort);
  627. index += 2;
  628. // 横滚
  629. tmpShort = planep.roll_angle;
  630. short2buf(&send_uavr20_data[index], &tmpShort);
  631. index += 2;
  632. // 左右速度
  633. tmpShort = planep.E_vel * cosf(planep.yaw / 100.0f * DEG_TO_RAD) +
  634. planep.N_vel * sinf(planep.yaw / 100.0f * DEG_TO_RAD);
  635. short2buf(&send_uavr20_data[index], &tmpShort);
  636. index += 2;
  637. // 后边的都没用上
  638. // 上下加速度
  639. tmpShort = planep.alt_vel;
  640. short2buf(&send_uavr20_data[index], &tmpShort);
  641. index += 2;
  642. // 仿地最近距离
  643. tmpShort = uavh30_dist.near;
  644. short2buf(&send_uavr20_data[index], &tmpShort);
  645. index += 2;
  646. // 仿地最远距离
  647. tmpShort = uavh30_dist.far;
  648. short2buf(&send_uavr20_data[index], &tmpShort);
  649. index += 2;
  650. // 结束
  651. send_uavr20_data[index++] = 0X5A;
  652. can_send_msg_normal(send_uavr20_data, sizeof(send_uavr20_data), SEND_UAV20_MSG);
  653. }
  654. //读取前雷达版本
  655. else
  656. {
  657. //读取前雷达灵敏度
  658. if (uavr11_info.Link.connect_status == COMP_NORMAL && uavr11_info.get_radar_sensi_flag == false &&
  659. uavr11_info.get_radar_sensi_count < 5)
  660. {
  661. if (HAL_GetTick() - uavr20_sensi_time > 1000)
  662. {
  663. // 开头
  664. uint8_t send_uavr20_sensi[1] = {0};
  665. send_uavr20_sensi[0] = 0x11;
  666. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_SENSI_RA);
  667. uavr20_sensi_time = HAL_GetTick();
  668. uavr11_info.get_radar_sensi_count++;
  669. }
  670. }
  671. else
  672. {
  673. //读取后雷达灵敏度
  674. if (uavr12_info.Link.connect_status == COMP_NORMAL && uavr12_info.get_radar_sensi_flag == false &&
  675. uavr12_info.get_radar_sensi_count < 5)
  676. {
  677. if (HAL_GetTick() - uavr20_sensi_time > 1000)
  678. {
  679. // 开头
  680. uint8_t send_uavr20_sensi[1] = {0};
  681. send_uavr20_sensi[0] = 0x12;
  682. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_SENSI_RA);
  683. uavr20_sensi_time = HAL_GetTick();
  684. uavr12_info.get_radar_sensi_count++;
  685. }
  686. }
  687. else if(uavr56_info.Link.connect_status == COMP_NORMAL && uavr56_info.get_radar_sensi_flag == false &&
  688. uavr56_info.get_radar_sensi_count < 5)
  689. {
  690. if (HAL_GetTick() - uavr20_sensi_time > 1000)
  691. {
  692. // 开头
  693. uint8_t send_uavr20_sensi[1] = {0};
  694. send_uavr20_sensi[0] = 0x0B;
  695. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_SENSI_RA);
  696. uavr20_sensi_time = HAL_GetTick();
  697. uavr56_info.get_radar_sensi_count++;
  698. }
  699. }
  700. }
  701. }
  702. }
  703. }
  704. bool uavrhup_getr1_ack = false;
  705. short obsfradar_sensitivity = 50;
  706. short obsbradar_sensitivity = 50;
  707. /**
  708. * @file can_set_radar_sensi
  709. * @brief 设置雷达灵敏度
  710. * @param none
  711. * @details
  712. * @author Zhang Sir
  713. **/
  714. void can_set_radar_sensi()
  715. {
  716. static int radar_sensi_ack_time = 0;
  717. // 设置前雷达灵敏度
  718. if (uavr11_info.get_radar_sensi_flag == true &&
  719. uavr11_info.fcu_set_sensi_flag == true && uavr11_info.set_radar_sensi_count < 5 &&
  720. HAL_GetTick() - uavr20_sensi_time > 1000 && uavr11_info.Link.connect_status == COMP_NORMAL)
  721. {
  722. uint8_t send_uavr20_sensi[3] = {0};
  723. uavr11_info.set_radar_sensi_count++;
  724. uavr20_sensi_time = HAL_GetTick();
  725. if (uavrhup_getr1_ack == false)
  726. {
  727. //设置灵敏度先进入boot模式 新版本不进入boot
  728. if(uavr11_info.soft_verison >= RADAR_NER_VERSION )
  729. {
  730. uavrhup_getr1_ack = true;
  731. }
  732. else
  733. {
  734. send_uavr20_sensi[0] = 0x11;
  735. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_UPDATE_S1);
  736. }
  737. uavr11_info.set_radar_sensi_ack = false;
  738. }
  739. else
  740. {
  741. if (uavr11_info.set_radar_sensi_ack == false)
  742. {
  743. send_uavr20_sensi[0] = 0x11;
  744. //大端方式发送
  745. send_uavr20_sensi[1] = (obsfradar_sensitivity >> 8) & 0xff;
  746. send_uavr20_sensi[2] = (obsfradar_sensitivity)&0xff;
  747. can_send_msg_normal(send_uavr20_sensi, sizeof(send_uavr20_sensi), CAN_UAVRH_SENSI_SA);
  748. }
  749. else
  750. {
  751. uavr11_info.fcu_set_sensi_flag = false;
  752. uavrhup_getr1_ack = false;
  753. uavr11_info.set_radar_sensi_ack = false;
  754. uavr11_info.set_radar_sensi_count = 0;
  755. }
  756. }
  757. //超过5次失败后恢复
  758. if (uavr11_info.set_radar_sensi_count >= 5)
  759. {
  760. uavr11_info.fcu_set_sensi_flag = false;
  761. uavrhup_getr1_ack = false;
  762. uavr11_info.set_radar_sensi_ack = false;
  763. uavr11_info.set_radar_sensi_count = 0;
  764. }
  765. }
  766. //设置后雷达灵敏度
  767. else if (uavr12_info.get_radar_sensi_flag == true &&
  768. uavr12_info.fcu_set_sensi_flag == true && uavr12_info.set_radar_sensi_count < 5 &&
  769. HAL_GetTick() - uavr20_sensi_time > 1000 && uavr12_info.Link.connect_status == COMP_NORMAL)
  770. {
  771. uint8_t send_uavr20_sensi[3] = {0};
  772. uavr12_info.set_radar_sensi_count++;
  773. uavr20_sensi_time = HAL_GetTick();
  774. if (uavrhup_getr1_ack == false)
  775. {
  776. //设置灵敏度先进入boot模式 新版本不进入boot
  777. if(uavr12_info.soft_verison >= RADAR_NER_VERSION )
  778. {
  779. uavrhup_getr1_ack = true;
  780. }
  781. else
  782. {
  783. //设置灵敏度先进入boot模式
  784. send_uavr20_sensi[0] = 0x12;
  785. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_UPDATE_S1);
  786. }
  787. uavr12_info.set_radar_sensi_ack = false;
  788. }
  789. else
  790. {
  791. if (uavr12_info.set_radar_sensi_ack == false)
  792. {
  793. send_uavr20_sensi[0] = 0x12;
  794. send_uavr20_sensi[1] = (obsbradar_sensitivity >> 8) & 0xff;
  795. send_uavr20_sensi[2] = (obsbradar_sensitivity)&0xff;
  796. can_send_msg_normal(send_uavr20_sensi, sizeof(send_uavr20_sensi), CAN_UAVRH_SENSI_SA);
  797. }
  798. else
  799. {
  800. uavr12_info.fcu_set_sensi_flag = false;
  801. uavrhup_getr1_ack = false;
  802. uavr12_info.set_radar_sensi_ack = false;
  803. uavr12_info.set_radar_sensi_count = 0;
  804. }
  805. }
  806. //超过5次失败后恢复
  807. if (uavr12_info.set_radar_sensi_count >= 5)
  808. {
  809. uavr12_info.fcu_set_sensi_flag = false;
  810. uavrhup_getr1_ack = false;
  811. uavr12_info.set_radar_sensi_ack = false;
  812. uavr12_info.set_radar_sensi_count = 0;
  813. }
  814. }
  815. //设置仿地雷达灵敏度
  816. else if (uavr56_info.get_radar_sensi_flag == true &&
  817. uavr56_info.fcu_set_sensi_flag == true && uavr56_info.set_radar_sensi_count < 5 &&
  818. HAL_GetTick() - uavr20_sensi_time > 1000 && uavr56_info.Link.connect_status == COMP_NORMAL)
  819. {
  820. uint8_t send_uavr20_sensi[3] = {0};
  821. uavr56_info.set_radar_sensi_count++;
  822. uavr20_sensi_time = HAL_GetTick();
  823. if (uavrhup_getr1_ack == false)
  824. {
  825. if(uavr56_info.soft_verison >= RADAR_NER_VERSION )
  826. {
  827. uavrhup_getr1_ack = true;
  828. }
  829. else
  830. {
  831. //设置灵敏度先进入boot模式
  832. send_uavr20_sensi[0] = 0x0B;
  833. can_send_msg_normal(send_uavr20_sensi, 1, CAN_UAVRH_UPDATE_S1);
  834. }
  835. uavr56_info.set_radar_sensi_ack = false;
  836. }
  837. else
  838. {
  839. if (uavr56_info.set_radar_sensi_ack == false)
  840. {
  841. send_uavr20_sensi[0] = 0x0B;
  842. send_uavr20_sensi[1] = (uavr56_info.fcu_set_sensi >> 8) & 0xff;
  843. send_uavr20_sensi[2] = (uavr56_info.fcu_set_sensi)&0xff;
  844. can_send_msg_normal(send_uavr20_sensi, sizeof(send_uavr20_sensi), CAN_UAVRH_SENSI_SA);
  845. }
  846. else
  847. {
  848. uavr56_info.fcu_set_sensi_flag = false;
  849. uavrhup_getr1_ack = false;
  850. uavr56_info.set_radar_sensi_ack = false;
  851. uavr56_info.set_radar_sensi_count = 0;
  852. }
  853. }
  854. //超过5次失败后恢复
  855. if (uavr56_info.set_radar_sensi_count >= 5)
  856. {
  857. uavr56_info.fcu_set_sensi_flag = false;
  858. uavrhup_getr1_ack = false;
  859. uavr56_info.set_radar_sensi_ack = false;
  860. uavr56_info.set_radar_sensi_count = 0;
  861. }
  862. }
  863. //设置莫之比避障灵敏度成功后ACK主控
  864. if (uavr11_info.set_radar_sensi_ack == true || uavr12_info.set_radar_sensi_ack == true || uavr56_info.set_radar_sensi_ack == true)
  865. {
  866. //同时设置有个1.5s间隔
  867. if(HAL_GetTick() - radar_sensi_ack_time > 1500)
  868. {
  869. radar_sensi_ack_time = HAL_GetTick();
  870. if (uavr11_info.set_radar_sensi_ack == true)
  871. {
  872. pmu_set_ack(22, 1, uavr11_info.get_radar_sensi,0);
  873. uavr11_info.set_radar_sensi_ack = false;
  874. uavr11_info.fcu_set_sensi_flag = false;
  875. }
  876. else if (uavr12_info.set_radar_sensi_ack == true)
  877. {
  878. pmu_set_ack(22, 2, uavr12_info.get_radar_sensi,0);
  879. uavr12_info.set_radar_sensi_ack = false;
  880. uavr12_info.fcu_set_sensi_flag = false;
  881. }
  882. else if(uavr56_info.set_radar_sensi_ack == true)
  883. {
  884. pmu_set_ack(22, 6, uavr56_info.get_radar_sensi,0);
  885. uavr56_info.set_radar_sensi_ack = false;
  886. uavr56_info.fcu_set_sensi_flag = false;
  887. }
  888. }
  889. }
  890. }
  891. void can_recv_mocib_updata_read_set_hookfunction(uint32_t cellCanID, uint8_t data[])
  892. {
  893. //AG代码 和雷达升级不兼容,优先升级
  894. if (Rupdate.update_flag == true)
  895. {
  896. //避障雷达升级
  897. if (Rupdate.buf_flag == false)
  898. {
  899. memcpy(Rupdate.update_buf, data, 8);
  900. Rupdate.buf_flag = true;
  901. switch (cellCanID)
  902. {
  903. case 0x7E1:
  904. Rupdate.U7E1 = true;
  905. break;
  906. case 0x7E3:
  907. Rupdate.U7E3 = true;
  908. break;
  909. case 0x7E6:
  910. Rupdate.U7E6 = true;
  911. break;
  912. default:
  913. break;
  914. }
  915. }
  916. }
  917. else
  918. {
  919. switch (cellCanID)
  920. {
  921. //莫之比雷达反馈版本信息
  922. case CAN_UAVRH_UPDATE_R1:
  923. uavrhup_getr1_ack = true;
  924. break;
  925. //case CAN_UAVRH_VER_R:
  926. // if (uavr11_info.get_radar_ver_flag == false && can_get_uavr21_ver_comp == 1)
  927. // {
  928. // //char_to_hex_string(data, 4, uavr11_info.version, 10, "11");
  929. // uavr11_info.get_radar_ver_flag = true;
  930. // //升完级发送版本信息
  931. // if(HAL_GetTick() > 10000)
  932. // {
  933. // pmu_send = VERSION;
  934. // }
  935. // }
  936. // else if (uavr12_info.get_radar_ver_flag == false && can_get_uavr21_ver_comp == 2)
  937. // {
  938. // //char_to_hex_string(data, 4, uavr12_info.version, 10, "12");
  939. // uavr12_info.get_radar_ver_flag = true;
  940. // if(HAL_GetTick() > 10000)
  941. // {
  942. // pmu_send = VERSION;
  943. // }
  944. // }
  945. // else if (uavr56_info.get_radar_ver_flag == false && can_get_uavr21_ver_comp == 3)
  946. // {
  947. // //char_to_hex_string(data, 4, uavr56_info.version, 10, "56");
  948. // uavr56_info.get_radar_ver_flag = true;
  949. // if(HAL_GetTick() > 10000)
  950. // {
  951. // pmu_send = VERSION;
  952. // }
  953. // }
  954. // break;
  955. //莫之比雷达设置灵敏度及反馈
  956. case CAN_UAVRH_SENSI_SA:
  957. if (data[0] == 0x11)
  958. {
  959. uavr11_info.set_radar_sensi_ack = true;
  960. //莫之比大端模式
  961. uavr11_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  962. }
  963. else if (data[0] == 0x12)
  964. {
  965. uavr12_info.set_radar_sensi_ack = true;
  966. //莫之比大端模式
  967. uavr12_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  968. }
  969. else if(data[0] == 0x0B)
  970. {
  971. uavr56_info.set_radar_sensi_ack = true;
  972. uavr56_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  973. }
  974. break;
  975. //莫之比雷达读取灵敏度及反馈
  976. case CAN_UAVRH_SENSI_RA:
  977. if (data[0] == 0x11)
  978. {
  979. uavr11_info.get_radar_sensi_flag = true;
  980. //莫之比大端模式
  981. uavr11_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  982. }
  983. else if (data[0] == 0x12)
  984. {
  985. uavr12_info.get_radar_sensi_flag = true; //莫之比大端模式
  986. uavr12_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  987. }
  988. else if(data[0] == 0x0B)
  989. {
  990. uavr56_info.get_radar_sensi_flag = true;
  991. uavr56_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  992. }
  993. default:
  994. break;
  995. }
  996. }
  997. }
  998. /**
  999. * @file can_send_info_to_mimo
  1000. * @brief 给恩曌避障发送姿态信息
  1001. * @param none
  1002. * @details
  1003. * @author Zhang Sir
  1004. **/
  1005. void can_send_info_to_mimo()
  1006. {
  1007. static int mimo_50HZ = 0;
  1008. static int mimo_49HZ = 0;
  1009. if (mimo_f_info.Link.connect_status == COMP_NORMAL || mimo_b_info.Link.connect_status == COMP_NORMAL /*||
  1010. mimo_360_info.connect_status == COMP_NORMAL*/ || (Dev.Part_Fradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarF.facid == FAC_MIMO_RF))
  1011. {
  1012. int16_t index = 0;
  1013. short tmpShort = 0;
  1014. int8_t tmpChar = 0;
  1015. uint8_t send_mimo_data[8] = {0};
  1016. if (HAL_GetTick() - mimo_50HZ > 20)
  1017. {
  1018. mimo_50HZ = HAL_GetTick();
  1019. // tmpShort = 1;
  1020. // short2buf(&send_mimo_data[index], &tmpShort);
  1021. // index += 2;
  1022. // // 俯仰
  1023. // tmpShort = planep.pitch_angle;
  1024. // short2buf(&send_mimo_data[index], &tmpShort);
  1025. // index += 2;
  1026. // // 横滚
  1027. // tmpShort = planep.roll_angle;
  1028. // short2buf(&send_mimo_data[index], &tmpShort);
  1029. // index += 2;
  1030. // //航向
  1031. // if(planep.yaw < 0)
  1032. // tmpShort = planep.yaw + 360;
  1033. // else
  1034. // tmpShort = planep.yaw;
  1035. // short2buf(&send_mimo_data[index], &tmpShort);
  1036. // index += 2;
  1037. // can_send_msg_normal(send_mimo_data, sizeof(send_mimo_data), 0x3740403);
  1038. index = 0;
  1039. // 俯仰
  1040. tmpShort = -planep.roll_angle;
  1041. short2buf(&send_mimo_data[index], &tmpShort);
  1042. index += 2;
  1043. // 横滚
  1044. tmpShort = planep.pitch_angle;
  1045. short2buf(&send_mimo_data[index], &tmpShort);
  1046. index += 2;
  1047. //航向
  1048. if(planep.yaw < 0)
  1049. tmpShort = planep.yaw + 360;
  1050. else
  1051. tmpShort = planep.yaw;
  1052. short2buf(&send_mimo_data[index], &tmpShort);
  1053. index += 2;
  1054. // 前后速度
  1055. tmpChar = (planep.E_vel * sinf(planep.yaw / 100.0f * DEG_TO_RAD) +
  1056. planep.N_vel * cosf(planep.yaw / 100.0f * DEG_TO_RAD)) /
  1057. 10; //0.1m/s
  1058. send_mimo_data[index++] = tmpChar;
  1059. //雷达安装俯仰角
  1060. tmpChar = 0;
  1061. send_mimo_data[index] = tmpChar;
  1062. can_send_msg_normal(send_mimo_data, sizeof(send_mimo_data), CAN_MIMO_ATTI_INFO1);
  1063. }
  1064. if (HAL_GetTick() - mimo_49HZ > 21)
  1065. {
  1066. mimo_49HZ = HAL_GetTick();
  1067. index = 0;
  1068. //高度
  1069. tmpShort = planep.alt;
  1070. short2buf(&send_mimo_data[index], &tmpShort);
  1071. index += 2;
  1072. //俯仰角速度
  1073. tmpShort = 0;
  1074. short2buf(&send_mimo_data[index], &tmpShort);
  1075. index += 2;
  1076. //横滚角速度
  1077. tmpShort = 0;
  1078. short2buf(&send_mimo_data[index], &tmpShort);
  1079. index += 2;
  1080. // 左右速度
  1081. tmpChar = (planep.E_vel * cosf(planep.yaw / 100.0f * DEG_TO_RAD) +
  1082. planep.N_vel * sinf(planep.yaw / 100.0f * DEG_TO_RAD)) /
  1083. 10;
  1084. send_mimo_data[index++] = tmpChar;
  1085. //Z速度
  1086. tmpChar = planep.alt_vel / 10; //0.1m/s
  1087. send_mimo_data[index] = tmpChar;
  1088. can_send_msg_normal(send_mimo_data, sizeof(send_mimo_data), CAN_MIMO_ATTI_INFO2);
  1089. }
  1090. }
  1091. }
  1092. /**
  1093. * @file lidar_function
  1094. * @brief 雷达相关函数
  1095. * @param none
  1096. * @details
  1097. * @author Zhang Sir
  1098. **/
  1099. void send_mocib_radar_sensi(void)
  1100. {
  1101. static int radar_sensi_send_time = 0;
  1102. //uint8_t radar_can_buf[8] = {0};
  1103. if(HAL_GetTick() > 7000 && HAL_GetTick() - radar_sensi_send_time > 300)
  1104. {
  1105. //给FMU发送雷达灵敏度
  1106. radar_sensi_send_time = HAL_GetTick();
  1107. //上电后 检测到有雷达连接,向飞控发送雷达灵敏度信息
  1108. if (uavr11_info.Link.connect_status == COMP_NORMAL && uavr11_info.get_radar_sensi_flag == true &&
  1109. uavr11_info.send_fcu_sensi_count <= 3)
  1110. {
  1111. pmu_set_ack(22, 1, uavr11_info.get_radar_sensi,0);
  1112. uavr11_info.send_fcu_sensi_count++;
  1113. }
  1114. else if (uavr12_info.Link.connect_status == COMP_NORMAL && uavr12_info.get_radar_sensi_flag == true &&
  1115. uavr12_info.send_fcu_sensi_count <= 3)
  1116. {
  1117. pmu_set_ack(22, 2, uavr12_info.get_radar_sensi,0);
  1118. uavr12_info.send_fcu_sensi_count++;
  1119. }
  1120. else if (uavr56_info.Link.connect_status == COMP_NORMAL && uavr56_info.get_radar_sensi_flag == true &&
  1121. uavr56_info.send_fcu_sensi_count <= 3)
  1122. {
  1123. pmu_set_ack(22, 6, uavr56_info.get_radar_sensi,0);
  1124. uavr56_info.send_fcu_sensi_count++;
  1125. }
  1126. }
  1127. }
  1128. void lidar_function(void)
  1129. {
  1130. //莫之比避障雷达升级
  1131. if (radar_update_flag == true && uavr11_info.fcu_set_sensi_flag != true && uavr12_info.fcu_set_sensi_flag != true
  1132. && uavr56_info.fcu_set_sensi_flag != true)
  1133. {
  1134. Rupdate.update_flag = true;
  1135. Can_obstacle_update();
  1136. }
  1137. //上电给fcu发送雷达灵敏度
  1138. send_mocib_radar_sensi();
  1139. //设置莫之比避障雷达灵敏度
  1140. can_set_radar_sensi();
  1141. //获取电目雷达盲区、能量、原始数据开关
  1142. get_radar_blindAndPower_function();
  1143. //雷达升级不再给雷达发送信息,莫之比雷达发送姿态信息
  1144. if (radar_update_flag == false)
  1145. {
  1146. can_sendmsg_uavr20();
  1147. }
  1148. //给恩曌雷达发送姿态信息数据
  1149. can_send_info_to_mimo();
  1150. }
  1151. void can_recv_mocib_version_info(uint32_t cellCanID, uint8_t data[], uint8_t len)
  1152. {
  1153. static uint8_t frame_fi = 0,frame_bi = 0,frame_ti = 0;
  1154. switch (cellCanID)
  1155. {
  1156. //SN号
  1157. case CAN_OBSTARCLE11_SN:
  1158. if(frame_fi == 0)
  1159. {
  1160. memcpy(&uavr11_info.sn[0],&data[2],6);//要后六个字节
  1161. frame_fi += 6;
  1162. }
  1163. else if(frame_fi == 6)
  1164. {
  1165. memcpy(&uavr11_info.sn[frame_fi],&data[1],7);//要后7个字节
  1166. frame_fi += 7;
  1167. }
  1168. else if(frame_fi >= 13)
  1169. {
  1170. memcpy(&uavr11_info.sn[frame_fi],&data[1],3);
  1171. frame_fi = 0;
  1172. regist_dev_info(&dev_obsf,DEVICE_OBSF,false,uavr11_info.sn,20,NULL,0,NULL,0,"mocib",6);
  1173. uavr11_info.get_radar_sn_flag = true;
  1174. }
  1175. break;
  1176. case CAN_OBSTARCLE12_SN:
  1177. if(frame_bi == 0)
  1178. {
  1179. memcpy(&uavr12_info.sn[0],&data[2],6);//要后六个字节
  1180. frame_bi += 6;
  1181. }
  1182. else if(frame_bi == 6)
  1183. {
  1184. memcpy(&uavr12_info.sn[frame_bi],&data[1],7);//要后7个字节
  1185. frame_bi += 7;
  1186. }
  1187. else if(frame_bi >= 13)
  1188. {
  1189. memcpy(&uavr12_info.sn[frame_bi],&data[1],3);
  1190. frame_bi = 0;
  1191. regist_dev_info(&dev_obsb,DEVICE_OBSB,false,uavr12_info.sn,20,NULL,0,NULL,0,"mocib",6);
  1192. uavr12_info.get_radar_sn_flag = true;
  1193. }
  1194. break;
  1195. case CAN_OBSTARCLE56_SN:
  1196. if(frame_ti == 0)
  1197. {
  1198. memcpy(&uavr56_info.sn[0],&data[2],6);//要后六个字节
  1199. frame_ti += 6;
  1200. }
  1201. else if(frame_ti == 6)
  1202. {
  1203. memcpy(&uavr56_info.sn[frame_ti],&data[1],7);//要后7个字节
  1204. frame_ti += 7;
  1205. }
  1206. else if(frame_ti >= 13)
  1207. {
  1208. memcpy(&uavr56_info.sn[frame_ti],&data[1],3);
  1209. frame_ti = 0;
  1210. regist_dev_info(&dev_ter,DEVICE_TERRA,false,uavr56_info.sn,20,NULL,0,NULL,0,"mocib",6);
  1211. uavr56_info.get_radar_sn_flag = true;
  1212. }
  1213. break;
  1214. //版本信息
  1215. case 0x00eeff11:
  1216. uavr11_info.version[0] = 'M';
  1217. uavr11_info.version[1] = '1';
  1218. uavr11_info.version[2] = (data[1] + data[2]) + '0';
  1219. uavr11_info.version[3] = (data[3] + data[4]) + '0';
  1220. char_to_hex_string(&data[5], 3, &uavr11_info.version[4], 6, "00");
  1221. uavr11_info.soft_verison = ((data[5] & 0xff) << 16) + ((data[6] & 0xff) << 8) + (data[7] & 0xff);
  1222. uavr11_info.get_radar_ver_flag = true;
  1223. regist_dev_info(&dev_obsf,DEVICE_OBSF,false,NULL,0,uavr11_info.version,10,NULL,0,"mocib",6);
  1224. break;
  1225. case 0x00eeff12:
  1226. uavr12_info.version[0] = 'M';
  1227. uavr12_info.version[1] = '2';
  1228. uavr12_info.version[2] = (data[1] + data[2]) + '0';
  1229. uavr12_info.version[3] = (data[3] + data[4]) + '0';
  1230. char_to_hex_string(&data[5], 3, &uavr12_info.version[4], 6, "00");
  1231. uavr12_info.soft_verison = ((data[5] & 0xff) << 16) + ((data[6] & 0xff) << 8) + (data[7] & 0xff);
  1232. uavr12_info.get_radar_ver_flag = true;
  1233. regist_dev_info(&dev_obsb,DEVICE_OBSB,false,NULL,0,uavr12_info.version,10,NULL,0,"mocib",6);
  1234. break;
  1235. case 0x00eeff0b:
  1236. uavr56_info.version[0] = 'M';
  1237. uavr56_info.version[1] = 'B';
  1238. uavr56_info.version[2] = (data[1] + data[2]) + '0';
  1239. uavr56_info.version[3] = (data[3] + data[4]) + '0';
  1240. char_to_hex_string(&data[5], 3, &uavr56_info.version[4], 6, "00");
  1241. uavr56_info.soft_verison = ((data[5] & 0xff) << 16) + ((data[6] & 0xff) << 8) + (data[7] & 0xff);
  1242. uavr56_info.get_radar_ver_flag = true;
  1243. regist_dev_info(&dev_ter,DEVICE_TERRA,false,NULL,0,uavr56_info.version,10,NULL,0,"mocib",6);
  1244. break;
  1245. default:
  1246. break;
  1247. }
  1248. // if(HAL_GetTick() > 10000)
  1249. // {
  1250. pmu_send = PMU_SEND_VERSION;
  1251. // }
  1252. }
  1253. bool check_radar_update(void)
  1254. {
  1255. if (uavr12_info.Link.connect_status == COMP_NORMAL && uavr12_info.get_radar_sensi_flag == false &&
  1256. uavr12_info.get_radar_sensi_count < 5)
  1257. {
  1258. return false;
  1259. }
  1260. if (uavr11_info.Link.connect_status == COMP_NORMAL && uavr11_info.get_radar_sensi_flag == false &&
  1261. uavr11_info.get_radar_sensi_count < 5)
  1262. {
  1263. return false;
  1264. }
  1265. if (uavr56_info.Link.connect_status == COMP_NORMAL && uavr56_info.get_radar_sensi_flag == false &&
  1266. uavr56_info.get_radar_sensi_count < 5)
  1267. {
  1268. return false;
  1269. }
  1270. if(uavr11_info.fcu_set_sensi_flag == true ||uavr12_info.fcu_set_sensi_flag == true
  1271. || uavr56_info.fcu_set_sensi_flag == true)
  1272. {
  1273. return false;
  1274. }
  1275. return true;
  1276. }
  1277. void get_radar_blindAndPower_function( void )
  1278. {
  1279. uint8_t can_buf[8] = {0};
  1280. uint32_t can_id = 0;
  1281. static uint32_t time_1hz = 0;
  1282. if(!Check_Timer_Ready(&time_1hz,_1_HZ_))
  1283. return;
  1284. if (DM_f_info.Link.connect_status == COMP_NORMAL && DM_f_info.get_radar_blind_flag == false)
  1285. {
  1286. can_id = 0xA81300;
  1287. put_date_to_can(can_buf, 0x8, 0, 0, 0, 0, 0, 0, 0X7);
  1288. can_send_msg_normal(&can_buf[0], 8, can_id);
  1289. }
  1290. else if ((Dev.Part_Fradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarF.facid == FAC_DM_RF_4D) &&
  1291. (DM_4DRADARMAG.get_DM4DF_Blind_spot_distance == false && DM4Dmsg_send_fmu == false))
  1292. {
  1293. can_id = 0xA81300;
  1294. put_date_to_can(can_buf, 0x8, 0, 0, 0, 0, 0, 0, 0X7);
  1295. can_send_msg_normal(&can_buf[0], 8, can_id);
  1296. }
  1297. else if(DM_f_info.Link.connect_status == COMP_NORMAL && DM_f_info.get_radar_power_flag == false)
  1298. {
  1299. can_id = 0xA81300;
  1300. put_date_to_can(can_buf,0x9,0,0,0,0,0,0,0X7);
  1301. can_send_msg_normal(&can_buf[0], 8, can_id);
  1302. }
  1303. else if(DM_f_info.Link.connect_status == COMP_NORMAL && DM_f_info.get_radar_rawSwitch_flag == false )
  1304. {
  1305. can_id = 0xA81300;
  1306. put_date_to_can(can_buf,0xB,0,0,0,0,0,0,0X7);
  1307. can_send_msg_normal(&can_buf[0], 8, can_id);
  1308. }
  1309. else if((Dev.Part_Fradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarF.facid == FAC_DM_RF_4D) &&
  1310. (DM_4DRADARMAG.get_dotcloud_switch_4DF == false && DM4Dmsg_send_fmu == false))
  1311. {
  1312. can_id = 0xA81300;
  1313. put_date_to_can(can_buf,0xB,0,0,0,0,0,0,0X7);
  1314. can_send_msg_normal(&can_buf[0], 8, can_id);
  1315. }
  1316. if(DM_ter_info.Link.connect_status == COMP_NORMAL && DM_ter_info.get_radar_blind_flag == false)
  1317. {
  1318. can_id = 0x981300;
  1319. put_date_to_can(can_buf,0x8,0,0,0,0,0,0,0X7);
  1320. can_send_msg_normal(&can_buf[0], 8, can_id);
  1321. }
  1322. else if(DM_ter_info.Link.connect_status == COMP_NORMAL && DM_ter_info.get_radar_power_flag == false)
  1323. {
  1324. can_id = 0x981300;
  1325. put_date_to_can(can_buf,0x9,0,0,0,0,0,0,0X7);
  1326. can_send_msg_normal(&can_buf[0], 8, can_id);
  1327. }
  1328. else if(DM_ter_info.Link.connect_status == COMP_NORMAL && DM_ter_info.get_radar_rawSwitch_flag == false)
  1329. {
  1330. can_id = 0x981300;
  1331. put_date_to_can(can_buf,0xB,0,0,0,0,0,0,0X7);
  1332. can_send_msg_normal(&can_buf[0], 8, can_id);
  1333. }
  1334. else if((Dev.Part_Bradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarB.facid == FAC_DM_RB_4D) &&
  1335. (DM_4DRADARMAG.get_dotcloud_switch_4DB == false && DM4Dmsg_send_fmu == false))
  1336. {
  1337. can_id = 0xB81300;
  1338. put_date_to_can(can_buf,0xB,0,0,0,0,0,0,0X7);
  1339. can_send_msg_normal(&can_buf[0], 8, can_id);
  1340. }
  1341. if ((Dev.Part_Fradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarF.facid == FAC_DM_RF_4D) &&
  1342. (DM_4DRADARMAG.get_angel_4DF == false && DM4Dmsg_send_fmu == false))
  1343. {
  1344. can_id = 0xA81300;
  1345. put_date_to_can(can_buf, 0xD, 0, 0, 0, 0, 0, 0, 0X7);
  1346. can_send_msg_normal(&can_buf[0], 8, can_id);
  1347. }
  1348. else if ((Dev.Part_Fradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarF.facid == FAC_DM_RF_4D) &&
  1349. (DM_4DRADARMAG.get_ground_filter_4DF == false && DM4Dmsg_send_fmu == false))
  1350. {
  1351. can_id = 0xA81300;
  1352. put_date_to_can(can_buf, 0xF, 0, 0, 0, 0, 0, 0, 0X7);
  1353. can_send_msg_normal(&can_buf[0], 8, can_id);
  1354. }
  1355. if ((Dev.Part_Bradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarB.facid == FAC_DM_RB_4D) &&
  1356. (DM_4DRADARMAG.get_angel_4DB == false && DM4Dmsg_send_fmu == false))
  1357. {
  1358. can_id = 0xB81300;
  1359. put_date_to_can(can_buf, 0xD, 0, 0, 0, 0, 0, 0, 0X7);
  1360. can_send_msg_normal(&can_buf[0], 8, can_id);
  1361. }
  1362. else if ((Dev.Part_Bradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarB.facid == FAC_DM_RB_4D) &&
  1363. (DM_4DRADARMAG.get_ground_filter_4DB == false && DM4Dmsg_send_fmu == false))
  1364. {
  1365. can_id = 0xB81300;
  1366. put_date_to_can(can_buf, 0xF, 0, 0, 0, 0, 0, 0, 0X7);
  1367. can_send_msg_normal(&can_buf[0], 8, can_id);
  1368. }
  1369. else if ((Dev.Part_Bradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarB.facid == FAC_DM_RB_4D) &&
  1370. (DM_4DRADARMAG.get_DM4DB_Blind_spot_distance == false && DM4Dmsg_send_fmu == false))
  1371. {
  1372. can_id = 0xB81300;
  1373. put_date_to_can(can_buf, 0x8, 0, 0, 0, 0, 0, 0, 0X7);
  1374. can_send_msg_normal(&can_buf[0], 8, can_id);
  1375. }
  1376. }
  1377. // mimo_360info mimo360_info[MIMO_360_TotalSect];
  1378. // mimo_360status mimo360_status;
  1379. // Connect_check mimo_360_info;
  1380. // void mimo360_sort(mimo_360info *arr,uint16_t length)
  1381. // {
  1382. // if ( length < 2 )
  1383. // {
  1384. // return;
  1385. // }
  1386. // uint16_t num = 0, num1 = 0;
  1387. // mimo_360info tmp;
  1388. // for ( num = length - 1; num >= 1; num-- )
  1389. // {
  1390. // for ( num1 = 0; num1 <= num - 1; num1++ )
  1391. // {
  1392. // if ( ( ( arr + num1 )->dis0 ) > ( ( arr + num1 + 1 )->dis0 ) )
  1393. // {
  1394. // tmp = *( arr + num1 );
  1395. // *( arr + num1 ) = *( arr + num1 + 1 );
  1396. // *( arr + num1 + 1 ) = tmp;
  1397. // }
  1398. // }
  1399. // }
  1400. // }
  1401. // uint16_t test_index = 0;
  1402. // uint16_t compelte = 0;
  1403. // uint8_t radar360_proflag = 0;
  1404. // mimo_360_cont fmu_360info;
  1405. // void can_recv_mocib_new360_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  1406. // {
  1407. // mimo_360_info.connect_status = COMP_NORMAL;
  1408. // mimo_360_info.recv_time = HAL_GetTick();
  1409. // switch (cellCanID)
  1410. // {
  1411. // case CAN_360MIMO_1ID:
  1412. // memcpy(&mimo360_status,&data[0],8);
  1413. // mimo360_status.index = 0;
  1414. // if(mimo360_status.nTarget == 0)
  1415. // {
  1416. // fmu_360info.total_tar = 0;
  1417. // memset(&fmu_360info.data[0],0,sizeof(mimo_360_data));
  1418. // }
  1419. // break;
  1420. // case CAN_360MIMO_2ID:
  1421. // if(mimo360_status.nTarget <= MIMO_360_TotalSect && mimo360_status.nTarget > 0)
  1422. // {
  1423. // for(uint8_t i = 0;i < 2;i++)
  1424. // {
  1425. // if(i == 0)
  1426. // {
  1427. // memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[0],sizeof(mimo_360info));
  1428. // }
  1429. // else
  1430. // {
  1431. // memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[4],sizeof(mimo_360info));
  1432. // }
  1433. // if(mimo360_status.nTarget - 1 == mimo360_status.index && radar360_proflag == 0)
  1434. // {
  1435. // //mimo360_sort(&mimo360_info[0],mimo360_status.nTarget);
  1436. // fmu_360info.TotalSect = mimo360_status.TotalSect;
  1437. // fmu_360info.total_tar = mimo360_status.nTarget;
  1438. // for(uint8_t j = 0;j < mimo360_status.nTarget;j++)
  1439. // {
  1440. // fmu_360info.data[j].sec_angle = mimo360_info[j].sectId0 * 360 / mimo360_status.TotalSect;
  1441. // fmu_360info.data[j].distance = mimo360_info[j].dis0 * mimo360_status.RangeRes/100; //cm
  1442. // fmu_360info.data[j].rcs0 = mimo360_info[j].rcs0;
  1443. // fmu_360info.data[j].el0 = mimo360_info[j].el0 * 0.5;
  1444. // }
  1445. // }
  1446. // mimo360_status.index++;
  1447. // }
  1448. // }
  1449. // break;
  1450. // default:
  1451. // break;
  1452. // }
  1453. // }