soft_terrain.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. //muniu muniu_ter_info;
  19. bool terrain_is_link = false;
  20. uint16_t terrain_height = 0;
  21. /**
  22. * @file can_recv_mocib_terrain
  23. * @brief 莫之比防地解析
  24. * @param none
  25. * @details
  26. * @author Zhang Sir
  27. **/
  28. void can_recv_mocib_terrain(uint8_t *data)
  29. {
  30. uavh30_dist.powerful = (data[0] << 8) + data[1];
  31. uavh30_dist.near = (data[2] << 8) + data[3];
  32. uavh30_dist.far = (data[4] << 8) + data[5];
  33. uavr56_info.height = uavh30_dist.powerful;
  34. uavr56_info.Link.recv_time = HAL_GetTick();
  35. uavr56_info.Link.connect_status = COMP_NORMAL;
  36. }
  37. /**
  38. * @file can_recv_enzhao_terrain
  39. * @brief 恩曌防地解析
  40. * @param none
  41. * @details
  42. * @author Zhang Sir
  43. **/
  44. mimo_part_radar T_radar[3];
  45. void can_recv_enzhao_terrain(uint32_t CanID, uint8_t data[], uint8_t len)
  46. {
  47. switch (CanID)
  48. {
  49. case CAN_MIMO_T_ID: //单点雷达
  50. mimo_ter_info.crc = data[3] + data[4] + data[5] + data[6];
  51. if (data[7] == mimo_ter_info.crc)
  52. {
  53. mimo_ter_info.height = (256 * data[4]) + (data[3]); //cm
  54. // printf("%d %d\n", mimo_ter_info.height, m.muniu_hight); //输出到串口助手上 需要pringtf重定向
  55. }
  56. mimo_ter_info.Link.recv_time = HAL_GetTick();
  57. mimo_ter_info.Link.connect_status = COMP_NORMAL;
  58. Dev.Radar.facid_T = FAC_MIMO_RT;
  59. break;
  60. case CAN_MIMO_T_ID1:
  61. memcpy(&T_radar[0], data, 8);
  62. Dev.Part_Tradar_Link.recv_time = HAL_GetTick();
  63. Dev.Part_Tradar_Link.connect_status = COMP_NORMAL;
  64. Dev.Part_radarT.facid = FAC_MIMO_RT;
  65. Dev.Radar.facid_T = FAC_MIMO_RT;
  66. break;
  67. case CAN_MIMO_T_ID2:
  68. memcpy(&T_radar[1], data, 8);
  69. break;
  70. case CAN_MIMO_T_ID3:
  71. memcpy(&T_radar[2], data, 8);
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77. //木牛仿地雷达
  78. // void can_recv_muniu_terrain(uint8_t *data)
  79. // {
  80. // muniu_ter_info.muniu_hight = (data[0] << 8) + data[1];
  81. // muniu_ter_info.muniu_SNR = (data[2] << 8) + data[3];
  82. // muniu_ter_info.Link.connect_status = COMP_NORMAL;
  83. // muniu_ter_info.Link.recv_time = HAL_GetTick();
  84. // }
  85. //电目雷达
  86. DM_RADAR DM_T_info,FMU_DM_info;
  87. DM_RADAR DM_F_info;
  88. uint8_t dm_i = 0;
  89. uint8_t DM_recv_flag = 0;
  90. Connect_check DM_status;
  91. uavr_terrain DM_ter_info;
  92. void DM_terrain_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  93. {
  94. if(cellCanID == 0x901300) //多点协议
  95. {
  96. DM_T_info.byte7.frame_flag = data[7];
  97. DM_status.connect_status = COMP_NORMAL;
  98. DM_status.recv_time = HAL_GetTick();
  99. if(DM_T_info.byte7.flag.head != 0 ) //头
  100. {
  101. memcpy(&DM_T_info.target_num,&data[0],7);
  102. dm_i = 0;
  103. if(DM_T_info.target_num == 0 && DM_recv_flag == 0)
  104. {
  105. FMU_DM_info.target_num = 0;
  106. }
  107. }
  108. else if(DM_T_info.byte7.flag.tail != 0) //尾
  109. {
  110. if(DM_T_info.target_num != 1)
  111. {
  112. memcpy(&DM_T_info.buf[dm_i],&data[0],DM_T_info.target_num*4%7);
  113. }
  114. else
  115. {
  116. memcpy(&DM_T_info.buf[dm_i],&data[0],4);
  117. }
  118. if(DM_T_info.crc == Get_Crc16(&DM_T_info.buf[0],DM_T_info.target_num * 4) && DM_recv_flag == 0)
  119. {
  120. memcpy(&FMU_DM_info.target_num,&DM_T_info.target_num,DM_T_info.target_num * 4 + 8);
  121. //memcpy(&FMU_DM_info.buf[0], &DM_T_info.buf[0], DM_T_info.target_num * 4);
  122. }
  123. }
  124. else
  125. {
  126. memcpy(&DM_T_info.buf[dm_i],&data[0],7);
  127. dm_i += 7;
  128. }
  129. if(dm_i >= 255 -7)
  130. {
  131. dm_i = 0;
  132. }
  133. }
  134. else if(cellCanID == 0x901301)//单点协议
  135. {
  136. DM_ter_info.Link.connect_status = COMP_NORMAL;
  137. DM_ter_info.Link.recv_time = HAL_GetTick();
  138. Dev.Radar.facid_T = FAC_DM_RT;
  139. DM_ter_info.height = data[3] + data[4] * 256;
  140. }
  141. //版本信息
  142. if(cellCanID == 0x981301 && data[0] == 0x1)
  143. {
  144. uint32_t version_temp = 0;
  145. DM_T_info.byte7.frame_flag = data[7];
  146. if(DM_T_info.byte7.flag.head != 0 ) //头
  147. {
  148. memcpy(&version_temp,&data[1],4);
  149. Int2String(version_temp,DM_ter_info.sn,9);
  150. //通过SN序号判断新旧boot
  151. if((version_temp % 10000000) < 2502999)
  152. DM_ter_info.version[3] = 'O';
  153. else
  154. DM_ter_info.version[3] = 'N';
  155. regist_dev_info(&dev_ter,DEVICE_TERRA,false,DM_ter_info.sn,9,NULL,0,NULL,0,"dmter",6);
  156. }
  157. else if(DM_T_info.byte7.flag.tail != 0) //尾
  158. {
  159. memcpy(&version_temp,&data[1],4);
  160. Int2String(version_temp,&DM_ter_info.version[4],6);
  161. DM_ter_info.version[0] = 'D';
  162. DM_ter_info.version[1] = 'S';
  163. DM_ter_info.version[2] = '1';
  164. regist_dev_info(&dev_ter,DEVICE_TERRA,false,NULL,0,DM_ter_info.version,10,NULL,0,"dmter",6);
  165. DM_ter_info.get_radar_ver_flag = true;
  166. pmu_send = PMU_SEND_VERSION; //旧版APP
  167. }
  168. }
  169. else if(cellCanID == 0x981301 && (data[0] == 0x8 || data[0] == 0x5))
  170. {
  171. if(data[0] == 0x8)
  172. DM_ter_info.get_radar_blind_flag = true;
  173. pmu_set_ack(_MSGID_SET,MSGID_SET_TR_BLIND,0x56,data[1] + data[2] * 256);
  174. }
  175. else if(cellCanID == 0x981301 && (data[0] == 0x9 || data[0] == 0x7))
  176. {
  177. if(data[0] == 0x9)
  178. DM_ter_info.get_radar_power_flag = true;
  179. pmu_set_ack(_MSGID_SET,MSGID_SET_BR_POWER,0x56,data[1] + data[2] * 256);
  180. }
  181. else if(cellCanID == 0x981301 && (data[0] == 0xA || data[0] == 0xB))
  182. {
  183. if(data[0] == 0xB)
  184. DM_ter_info.get_radar_rawSwitch_flag = true;
  185. pmu_set_ack(_MSGID_SET,MSGID_SET_RAW_SWITCH,0x56,data[1] + data[2] * 256);
  186. }
  187. else if(cellCanID == 0x981301 && data[0] == 0x4 )
  188. {
  189. pmu_set_ack(_MSGID_SET,MSGID_SET_R_FUNC,0,data[1] + data[2] * 256);
  190. }
  191. }
  192. void DM_Fobs_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len)
  193. {
  194. if(cellCanID == 0XA01300) //多点协议
  195. {
  196. DM_T_info.byte7.frame_flag = data[7];
  197. DM_status.connect_status = COMP_NORMAL;
  198. DM_status.recv_time = HAL_GetTick();
  199. if(DM_T_info.byte7.flag.head != 0 ) //头
  200. {
  201. memcpy(&DM_T_info.target_num,&data[0],7);
  202. dm_i = 0;
  203. if(DM_T_info.target_num == 0 && DM_recv_flag == 0)
  204. {
  205. FMU_DM_info.target_num = 0;
  206. }
  207. }
  208. else if(DM_T_info.byte7.flag.tail != 0) //尾
  209. {
  210. if(DM_T_info.target_num != 1)
  211. {
  212. memcpy(&DM_T_info.buf[dm_i],&data[0],DM_T_info.target_num*4%7);
  213. }
  214. else
  215. {
  216. memcpy(&DM_T_info.buf[dm_i],&data[0],4);
  217. }
  218. if(DM_T_info.crc == Get_Crc16(&DM_T_info.buf[0],DM_T_info.target_num * 4) && DM_recv_flag == 0)
  219. {
  220. memcpy(&FMU_DM_info.target_num,&DM_T_info.target_num,DM_T_info.target_num * 4 + 8);
  221. //memcpy(&FMU_DM_info.buf[0], &DM_T_info.buf[0], DM_T_info.target_num * 4);
  222. }
  223. }
  224. else
  225. {
  226. memcpy(&DM_T_info.buf[dm_i],&data[0],7);
  227. dm_i += 7;
  228. }
  229. if(dm_i >= 255 -7)
  230. {
  231. dm_i = 0;
  232. }
  233. }
  234. else if(cellCanID == 0XA01301)//单点协议
  235. {
  236. DM_f_info.Link.connect_status = COMP_NORMAL;
  237. DM_f_info.Link.recv_time = HAL_GetTick();
  238. Dev.Radar.facid_F = FAC_DM_RF;
  239. DM_f_info.distance_y = data[3] + data[4] * 256;
  240. }
  241. //版本信息
  242. if(cellCanID == 0XA81301 && data[0] == 0x1)
  243. {
  244. uint32_t version_temp = 0;
  245. DM_T_info.byte7.frame_flag = data[7];
  246. if(DM_T_info.byte7.flag.head != 0 ) //头
  247. {
  248. memcpy(&version_temp,&data[1],4);
  249. Int2String(version_temp,DM_f_info.sn,9);
  250. //通过SN序号判断新旧boot
  251. if((version_temp % 10000000) < 2502999)
  252. DM_f_info.version[3] = 'O';
  253. else
  254. DM_f_info.version[3] = 'N';
  255. regist_dev_info(&dev_obsf,DEVICE_OBSF,false,DM_f_info.sn,9,NULL,0,NULL,0,"dmter",6);
  256. }
  257. else if(DM_T_info.byte7.flag.tail != 0) //尾
  258. {
  259. memcpy(&version_temp,&data[1],4);
  260. Int2String(version_temp,&DM_f_info.version[4],6);
  261. DM_f_info.version[0] = 'D';
  262. DM_f_info.version[1] = 'W';
  263. DM_f_info.version[2] = '1';
  264. regist_dev_info(&dev_obsf,DEVICE_OBSF,false,NULL,0,DM_f_info.version,10,NULL,0,"dmter",6);
  265. DM_f_info.get_radar_ver_flag = true;
  266. pmu_send = PMU_SEND_VERSION; //旧版APP
  267. }
  268. }
  269. else if(cellCanID == 0xA81301 && (data[0] == 0x8 || data[0] == 0x5))
  270. {
  271. if(data[0] == 0x8)
  272. DM_f_info.get_radar_blind_flag = true;
  273. pmu_set_ack(_MSGID_SET,MSGID_SET_TR_BLIND,0x11,data[1] + data[2] * 256);
  274. }
  275. else if(cellCanID == 0xA81301 && (data[0] == 0x9 || data[0] == 0x7))
  276. {
  277. if(data[0] == 0x9)
  278. DM_f_info.get_radar_power_flag = true;
  279. pmu_set_ack(_MSGID_SET,MSGID_SET_BR_POWER,0x11,data[1] + data[2] * 256);
  280. }
  281. else if(cellCanID == 0xA81301 && (data[0] == 0xA || data[0] == 0xB))
  282. {
  283. if(data[0] == 0xB)
  284. DM_f_info.get_radar_rawSwitch_flag = true;
  285. pmu_set_ack(_MSGID_SET,MSGID_SET_RAW_SWITCH,0x11,data[1] + data[2] * 256);
  286. }
  287. else if(cellCanID == 0xA81301 && data[0] == 0x4 )
  288. {
  289. pmu_set_ack(_MSGID_SET,MSGID_SET_R_FUNC,0,data[1] + data[2] * 256);
  290. }
  291. }