soft_update.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. #include "soft_update.h"
  2. #include "soft_obstacle.h"
  3. #include "soft_terrain.h"
  4. #include "string.h"
  5. #include "soft_usart.h"
  6. #include "soft_device.h"
  7. #include "soft_can.h"
  8. #include "main_task.h"
  9. #include "soft_crc.h"
  10. #include "usart_data_handle.h"
  11. #include "config.h"
  12. #include "soft_version.h"
  13. bool radar_update_flag = false;
  14. Radar Rupdate;
  15. /**
  16. * @file can_recv_mocib_updata_read_set_hookfunction
  17. * @brief 莫之比协议升级
  18. * @param
  19. * @details
  20. * @author Zhang Sir
  21. **/
  22. bool uavrhup_getr1_ack = false;
  23. void can_recv_mocib_updata_read_set_hookfunction(uint32_t cellCanID, uint8_t data[])
  24. {
  25. //AG代码 和雷达升级不兼容,优先升级
  26. if (Rupdate.update_flag == true)
  27. {
  28. //避障雷达升级
  29. if (Rupdate.buf_flag == false)
  30. {
  31. memcpy(Rupdate.update_buf, data, 8);
  32. Rupdate.buf_flag = true;
  33. switch (cellCanID)
  34. {
  35. case 0x7E1:
  36. Rupdate.U7E1 = true;
  37. break;
  38. case 0x7E3:
  39. Rupdate.U7E3 = true;
  40. break;
  41. case 0x7E6:
  42. Rupdate.U7E6 = true;
  43. break;
  44. default:
  45. break;
  46. }
  47. }
  48. }
  49. else
  50. {
  51. switch (cellCanID)
  52. {
  53. //莫之比雷达反馈版本信息
  54. case 0X7E1:
  55. uavrhup_getr1_ack = true;
  56. break;
  57. //莫之比雷达设置灵敏度及反馈
  58. case CAN_UAVRH_SENSI_SA:
  59. if (data[0] == 0x11)
  60. {
  61. uavr11_info.set_radar_sensi_ack = true;
  62. //莫之比大端模式
  63. uavr11_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  64. }
  65. else if (data[0] == 0x12)
  66. {
  67. uavr12_info.set_radar_sensi_ack = true;
  68. //莫之比大端模式
  69. uavr12_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  70. }
  71. else if(data[0] == 0x0B)
  72. {
  73. uavr56_info.set_radar_sensi_ack = true;
  74. uavr56_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  75. }
  76. break;
  77. //莫之比雷达读取灵敏度及反馈
  78. case CAN_UAVRH_SENSI_RA:
  79. if (data[0] == 0x11)
  80. {
  81. uavr11_info.get_radar_sensi_flag = true;
  82. //莫之比大端模式
  83. uavr11_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  84. }
  85. else if (data[0] == 0x12)
  86. {
  87. uavr12_info.get_radar_sensi_flag = true; //莫之比大端模式
  88. uavr12_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  89. }
  90. else if(data[0] == 0x0B)
  91. {
  92. uavr56_info.get_radar_sensi_flag = true;
  93. uavr56_info.get_radar_sensi = ((data[1] << 8) & 0xff00) + data[2];
  94. }
  95. default:
  96. break;
  97. }
  98. }
  99. }
  100. /**
  101. * @file Vk_Update_Device_Protocol
  102. * @brief VK协议设备升级
  103. * @param
  104. * @details
  105. * @author Zhang Sir
  106. **/
  107. uint8_t Factory_DevId[3] = {0};
  108. Update update_info;
  109. void Vk_Update_Device_Protocol(void)
  110. {
  111. static uint32_t send_msgtime_2HZ = 0;
  112. if(uart_send_is_ok(USART_1) == true)
  113. {
  114. if(update_info.step_200_flag == true )
  115. {
  116. Update_ack_func(update_info.buf[DEVICE],200,&update_info.buf[PACK_NUM]);
  117. update_info.step_200_flag = false;
  118. }
  119. else if(update_info.step_201_flag == true)
  120. {
  121. Update_ack_func(update_info.buf[DEVICE],201,&update_info.buf[PACK_NUM]);
  122. update_info.step_201_flag = false;
  123. }
  124. else if(update_info.step_202_flag == true)
  125. {
  126. Update_ack_func(update_info.buf[DEVICE],202,&update_info.buf[PACK_NUM]);
  127. update_info.step_202_flag = false;
  128. }
  129. }
  130. if(update_info.vk_dev_update_flag == false)
  131. return;
  132. if(HAL_GetTick() - send_msgtime_2HZ < 100)
  133. return;
  134. send_msgtime_2HZ = HAL_GetTick();
  135. uint16_t crc = 0;
  136. uint8_t can_buf[8] = {0};
  137. uint8_t i = 0;
  138. uint8_t dev_id = 0;
  139. //FMUPMU协议ID号10进制,设备升级协议16进制
  140. if(update_info.buf[DEVICE] == 56)
  141. dev_id = 0x56;
  142. else if(update_info.buf[DEVICE] == 51)
  143. dev_id = 0x11;
  144. else if(update_info.buf[DEVICE] == 52)
  145. dev_id = 0x12;
  146. else
  147. dev_id = update_info.buf[DEVICE];
  148. switch (update_info.buf[UPDATE_STEP])
  149. {
  150. case UPDATE_START:
  151. can_buf[0] = dev_id;
  152. memcpy(&can_buf[1],&update_info.buf[PAYLOAD - 2],4);
  153. switch (can_buf[0])
  154. {
  155. case UPDATE_OBS_F:
  156. if(Dev.Radar.facid_F == FAC_MIMO_RF || Dev.Part_radarF.facid == FAC_MIMO_RF)
  157. {
  158. memcpy(&can_buf[5],"TR0",3);
  159. }
  160. else if(Dev.Part_radarF.facid == FAC_MOCIB_RF)
  161. {
  162. memcpy(&can_buf[5],"MZB",3);
  163. }
  164. else if(Dev.DM_Part_radarF.facid == FAC_DM_RF_4D)
  165. {
  166. memcpy(&can_buf[5],"D4F",3);
  167. }
  168. break;
  169. case UPDATE_OBS_B:
  170. if(Dev.Radar.facid_B == FAC_MIMO_RB || Dev.Part_radarB.facid == FAC_MIMO_RB)
  171. {
  172. memcpy(&can_buf[5],"TR0",3);
  173. }
  174. else if(Dev.Part_radarB.facid == FAC_MOCIB_RB)
  175. {
  176. memcpy(&can_buf[5],"MZB",3);
  177. }
  178. else if(Dev.DM_Part_radarB.facid == FAC_DM_RB_4D)
  179. {
  180. memcpy(&can_buf[5],"D4B",3);
  181. }
  182. break;
  183. case UPDATE_TERAIN:
  184. if(Dev.Radar.facid_T == FAC_MIMO_RT || Dev.Part_radarT.facid == FAC_MIMO_RT)
  185. {
  186. memcpy(&can_buf[5],"TR0",3);
  187. }
  188. if(Dev.Part_Tradar_Link.connect_status == COMP_NORMAL && Dev.Part_radarT.facid == FAC_MOCIB_RT)
  189. {
  190. memcpy(&can_buf[5],"MZB",3);
  191. }
  192. else if(Dev.Radar.facid_T == FAC_DM_RT)
  193. {
  194. /*if(Dev.Part_Tradar_Link.connect_status == COMP_NORMAL)
  195. memcpy(&can_buf[5],"D4T",3);
  196. else*/
  197. memcpy(&can_buf[5],"DS1",3);
  198. }
  199. break;
  200. case UPDATE_OBS360:
  201. break;
  202. case UPDATE_SEED:
  203. break;
  204. case UPDATE_FLOW:
  205. break;
  206. case UPDATE_BMS:
  207. break;
  208. case UPDATE_DISTOR:
  209. break;
  210. case UPDATE_WEIGHT:
  211. if(Dev.Weight.facid == FAC_VK)
  212. {
  213. memcpy(&can_buf[5],"VK1",3);
  214. }
  215. break;
  216. default:
  217. break;
  218. }
  219. Can_Send_Msg_Func(CANID1, can_buf, 8, 0x381400, CAN_ID_EXT);
  220. break;
  221. case UPDATE_ING:
  222. while (i < (update_info.buf[LEN] - 2 + 8) && update_info.vk_dev_pack_num == (update_info.buf[PACK_NUM] + update_info.buf[PACK_NUM + 1] * 256))
  223. {
  224. if(i == 0)
  225. {
  226. crc = Get_Crc16( &update_info.buf[PAYLOAD],update_info.buf[LEN] - 2);
  227. can_buf[0] = 0xFE;
  228. can_buf[1] = 0xFE;
  229. can_buf[2] = dev_id;
  230. can_buf[3] = update_info.buf[LEN] - 2;
  231. can_buf[4] = update_info.buf[PACK_NUM];
  232. can_buf[5] = update_info.buf[PACK_NUM + 1];
  233. can_buf[6] = crc & 0xff;
  234. can_buf[7] = (crc >> 8) & 0xff;
  235. }
  236. else
  237. {
  238. memcpy(&can_buf[0],&update_info.buf[i],8);
  239. }
  240. i += 8;
  241. Can_Send_Msg_Func(CANID1, can_buf, 8, 0x401400, CAN_ID_EXT);
  242. memset(&can_buf[0],0,8);
  243. }
  244. break;
  245. case UPDATE_END:
  246. can_buf[0] = dev_id;
  247. Can_Send_Msg_Func(CANID1, can_buf, 8, 0x481400, CAN_ID_EXT);
  248. update_info.vk_dev_update_flag = false;
  249. if (dev_id == UPDATE_OBS_F)
  250. {
  251. if (Dev.DM_Part_radarF.facid == FAC_DM_RF_4D)
  252. DM_f_info.get_radar_ver_flag = false;
  253. memset(&dev_obsf, 0, sizeof(dev_version_content));
  254. }
  255. else if (dev_id == UPDATE_OBS_B)
  256. {
  257. if (Dev.DM_Part_radarB.facid == FAC_DM_RB_4D)
  258. DM_4DB_info.get_radar_ver_flag = false;
  259. memset(&dev_obsb, 0, sizeof(dev_version_content));
  260. }
  261. else if (dev_id == UPDATE_TERAIN)
  262. {
  263. if (Dev.Radar.facid_F == FAC_DM_RT)
  264. DM_ter_info.get_radar_ver_flag = false;
  265. memset(&dev_ter, 0, sizeof(dev_version_content));
  266. }
  267. default:
  268. break;
  269. }
  270. }
  271. void Update_Dev_Bootversion_Function(uint8_t data[])
  272. {
  273. if(data[4] != 0x01)
  274. return;
  275. pmu_send = PMU_SEND_VERSION;
  276. switch (data[0])
  277. {
  278. case UPDATE_OBS_F:
  279. if(memcmp((char *)&data[1],"TR0",3) == 0)
  280. {
  281. mimo_f_info.Link.connect_status = COMP_NORMAL;
  282. mimo_f_info.Link.recv_time = HAL_GetTick();
  283. mimo_f_info.Link.boot_flag = true;
  284. Dev.Radar.facid_F = FAC_MIMO_RF;
  285. }
  286. else if(memcmp((char *)&data[1],"MZB",3) == 0)
  287. {
  288. Dev.Part_Fradar_Link.connect_status = COMP_NORMAL;
  289. Dev.Part_Fradar_Link.recv_time = HAL_GetTick();
  290. Dev.Part_radarF.facid = FAC_MOCIB_RF;
  291. }
  292. else if(memcmp((char *)&data[1],"D4F",3) == 0)
  293. {
  294. Dev.DM_Part_Fradar_Link.recv_time = HAL_GetTick();
  295. Dev.DM_Part_Fradar_Link.connect_status = COMP_NORMAL;
  296. Dev.DM_Part_radarF.facid = FAC_DM_RF_4D;
  297. }
  298. break;
  299. case UPDATE_OBS_B:
  300. if(memcmp((char *)&data[1],"TR0",3) == 0)
  301. {
  302. mimo_b_info.Link.connect_status = COMP_NORMAL;
  303. mimo_b_info.Link.recv_time = HAL_GetTick();
  304. mimo_b_info.Link.boot_flag = true;
  305. Dev.Radar.facid_B = FAC_MIMO_RB;
  306. }
  307. else if(memcmp((char *)&data[1],"MZB",3) == 0)
  308. {
  309. Dev.Part_Bradar_Link.connect_status = COMP_NORMAL;
  310. Dev.Part_Bradar_Link.recv_time = HAL_GetTick();
  311. Dev.Part_radarB.facid = FAC_MOCIB_RB;
  312. }
  313. else if(memcmp((char *)&data[1],"D4B",3) == 0)
  314. {
  315. Dev.DM_Part_Bradar_Link.recv_time = HAL_GetTick();
  316. Dev.DM_Part_Bradar_Link.connect_status = COMP_NORMAL;
  317. Dev.DM_Part_radarB.facid = FAC_DM_RB_4D;
  318. // Dev.Part_Tradar_Link.recv_time = HAL_GetTick();
  319. // Dev.Part_Tradar_Link.connect_status = COMP_NORMAL;
  320. // Dev.Part_radarT.facid = FAC_DM_RF;
  321. }
  322. break;
  323. break;
  324. case UPDATE_TERAIN:
  325. if(memcmp((char *)&data[1],"TR0",3) == 0)
  326. {
  327. mimo_ter_info.Link.connect_status = COMP_NORMAL;
  328. mimo_ter_info.Link.recv_time = HAL_GetTick();
  329. mimo_ter_info.Link.boot_flag = true;
  330. Dev.Radar.facid_T = FAC_MIMO_RT;
  331. }
  332. else if(memcmp((char *)&data[1],"MZB",3) == 0)
  333. {
  334. Dev.Part_Tradar_Link.recv_time = HAL_GetTick();
  335. Dev.Part_Tradar_Link.connect_status = COMP_NORMAL;
  336. Dev.Part_radarT.facid = FAC_MOCIB_RT;
  337. }
  338. else if(memcmp((char *)&data[1],"DS1",3) == 0)
  339. {
  340. DM_ter_info.Link.connect_status = COMP_NORMAL;
  341. DM_ter_info.Link.recv_time = HAL_GetTick();
  342. DM_ter_info.Link.boot_flag = true;
  343. Dev.Radar.facid_T = FAC_DM_RT;
  344. DM_ter_info.version[0] = 'D';
  345. DM_ter_info.version[1] = 'S';
  346. DM_ter_info.version[2] = '1';
  347. DM_ter_info.version[3] = 'N';
  348. for(uint8_t i = 4;i < 10; i++)
  349. {
  350. DM_ter_info.version[i] = '0';
  351. }
  352. regist_dev_info(&dev_ter,DEVICE_TERRA,false,NULL,0,DM_ter_info.version,10,NULL,0,"dmter",6);
  353. }
  354. break;
  355. case UPDATE_OBS360:
  356. break;
  357. case UPDATE_SEED:
  358. break;
  359. case UPDATE_FLOW:
  360. break;
  361. case UPDATE_BMS:
  362. break;
  363. case UPDATE_DISTOR:
  364. break;
  365. case UPDATE_WEIGHT:
  366. if(memcmp((char *)&data[1],"VK1",3) == 0)
  367. {
  368. }
  369. break;
  370. default:
  371. break;
  372. }
  373. }
  374. /**
  375. * @file Can_obstacle_update
  376. * @brief 莫之比雷达CAN口在线升级函数
  377. * @param 0=发送升级请求 1=接收请求升级状态 2=发送格式化指令
  378. * 3=接收格式化状态 4=向雷达发送升级包 5=发送校验和 6=接收雷达固件更新状态
  379. * @details
  380. * @author Zhang Sir
  381. **/
  382. uint32_t update_count = 0;
  383. void Can_obstacle_update()
  384. {
  385. static uint32_t update_i = 0;
  386. static uint32_t check_sum = 0;
  387. static uint16_t pack_count = 1;
  388. uint16_t size_count = 0;
  389. uint32_t for_i = 0;
  390. uint8_t obstacle_buf[8] = {0};
  391. switch (update_count)
  392. {
  393. case 0:
  394. //向雷达发送请求升级
  395. if (update_info.buf[4] == 51)
  396. {
  397. obstacle_buf[0] = 0x11; // 前雷达
  398. }
  399. else if (update_info.buf[4] == 52)
  400. {
  401. obstacle_buf[0] = 0x12; //后雷达
  402. }
  403. else if (update_info.buf[4] == 56)
  404. {
  405. obstacle_buf[0] = 0x0B;
  406. }
  407. rt_thread_delay(50);
  408. Can_Send_Msg_Func(CANID1, obstacle_buf, 1, 0x7E0, CAN_ID_EXT);
  409. update_count = 1;
  410. break;
  411. case 1:
  412. if (Rupdate.buf_flag == true && Rupdate.U7E1 == true)
  413. {
  414. if (Rupdate.update_buf[1] == 0x00) //radar_update_buf[0] 0x11 0x12
  415. {
  416. //雷达进入刷写模式
  417. update_count = 2;
  418. }
  419. else if (Rupdate.update_buf[1] == 0x01)
  420. { //退出刷写模式
  421. radar_update_flag = false; //关闭升级
  422. update_count = 0;
  423. }
  424. Rupdate.U7E1 = false;
  425. Rupdate.buf_flag = false;
  426. memset(Rupdate.update_buf,0,8);
  427. }
  428. break;
  429. case 2:
  430. memset(obstacle_buf, 0, 8);
  431. obstacle_buf[0] = 0x01;
  432. obstacle_buf[1] = 0x09;
  433. obstacle_buf[2] = 0x09;
  434. obstacle_buf[3] = 0x04;
  435. obstacle_buf[4] = 0x00;
  436. obstacle_buf[5] = 0x09;
  437. obstacle_buf[6] = 0x02;
  438. obstacle_buf[7] = 0x06;
  439. rt_thread_delay(50);
  440. Can_Send_Msg_Func(CANID1, obstacle_buf, 8, 0x7E2, CAN_ID_EXT);
  441. update_count = 3;
  442. break;
  443. case 3:
  444. if (Rupdate.buf_flag == true && Rupdate.U7E3 == true)
  445. {
  446. if (Rupdate.update_buf[0] == 0xA6)
  447. { //格式化成功
  448. update_count = 4;
  449. update_i = 16;
  450. Update_ack_func(update_info.buf[4], 200, &update_info.buf[6]);
  451. update_info.use_update_buf_flag = false;
  452. //防止连续升级
  453. check_sum = 0;
  454. }
  455. else if (Rupdate.update_buf[0] == 0xA8)
  456. { //格式化失败
  457. radar_update_flag = false;
  458. Rupdate.update_flag = false;
  459. update_count = 0;
  460. }
  461. Rupdate.U7E3 = false;
  462. Rupdate.buf_flag = false;
  463. }
  464. break;
  465. case 4:
  466. if (update_info.use_update_buf_flag == true)
  467. {
  468. if (update_info.buf[5] == 201)
  469. {
  470. memcpy(&size_count, &update_info.buf[6], 2);
  471. if (pack_count == size_count)
  472. { //防止发送相同包
  473. // 第一包前8字节不要 第二包开始发送全部128字节
  474. Can_Send_Msg_Func(CANID1, &update_info.buf[update_i], 8, 0x7E4, CAN_ID_EXT);
  475. for (for_i = 0; for_i < 8; for_i++) // 计算校验
  476. {
  477. check_sum += update_info.buf[update_i + for_i];
  478. }
  479. update_i += 8;
  480. if (update_i >= 136)
  481. {
  482. update_i = 8;
  483. pack_count++;
  484. Update_ack_func(update_info.buf[4], 201, &update_info.buf[6]);
  485. memset(&update_info.buf[0], 0, 150);
  486. update_info.use_update_buf_flag = false;
  487. }
  488. }
  489. else if(pack_count > size_count)
  490. {
  491. Update_ack_func(update_info.buf[4], 201, &update_info.buf[6]);
  492. update_info.use_update_buf_flag = false;
  493. }
  494. }
  495. else if (update_info.buf[5] == 202)
  496. {
  497. //串口结束标志
  498. Update_ack_func(update_info.buf[4], 202, &update_info.buf[6]);
  499. update_count = 5;
  500. update_info.use_update_buf_flag = false;
  501. }
  502. else if (update_info.buf[5] == 200)
  503. {
  504. Update_ack_func(update_info.buf[4], 200, &update_info.buf[6]);
  505. update_info.use_update_buf_flag = false;
  506. }
  507. else
  508. {
  509. update_info.use_update_buf_flag = false;
  510. }
  511. }
  512. break;
  513. case 5:
  514. memset(obstacle_buf, 0, 8);
  515. obstacle_buf[0] = (check_sum >> 24) & 0xff;
  516. obstacle_buf[1] = (check_sum >> 16) & 0xff;
  517. obstacle_buf[2] = (check_sum >> 8) & 0xff;
  518. obstacle_buf[3] = (check_sum)&0xff;
  519. Can_Send_Msg_Func(CANID1, obstacle_buf, 4, 0x7E5, CAN_ID_EXT);
  520. update_count = 6;
  521. break;
  522. case 6:
  523. if (Rupdate.buf_flag == true && Rupdate.U7E6 == true)
  524. {
  525. if (Rupdate.update_buf[0] == 0x66)
  526. {
  527. update_count = 0; //更新成功
  528. }
  529. else if (Rupdate.update_buf[0] == 0x88)
  530. {
  531. update_count = 0; //校验失败
  532. }
  533. else if (Rupdate.update_buf[0] == 0xff)
  534. {
  535. update_count = 0; //表示固件超出最大存储空间, bootloader将重新格式化扇区,并将版本回退到出厂固件??
  536. }
  537. pack_count = 1;
  538. Rupdate.buf_flag = false;
  539. radar_update_flag = false;
  540. Rupdate.update_flag = false;
  541. Rupdate.U7E6 = false;
  542. //重新发送版本信息
  543. uavr11_info.get_radar_ver_flag = false;
  544. uavr12_info.get_radar_ver_flag = false;
  545. uavr56_info.get_radar_ver_flag = false;
  546. }
  547. break;
  548. default:
  549. break;
  550. }
  551. }
  552. /**
  553. * @file mimo_obs_update_func
  554. * @brief EZ雷达升级
  555. * @param
  556. * @details
  557. * @author Zhang Sir
  558. **/
  559. uint8_t radar_node_id = 0;
  560. ez_update EZup_par;
  561. void mimo_obs_update_func(void)
  562. {
  563. static uint32_t send_msgtime_5HZ = 0;
  564. if(uart_send_is_ok(USART_1) == true)
  565. {
  566. if(update_info.step_200_flag == true )
  567. {
  568. Update_ack_func(update_info.buf[DEVICE],200,&update_info.buf[PACK_NUM]);
  569. update_info.step_200_flag = false;
  570. }
  571. else if(update_info.step_201_flag == true)
  572. {
  573. Update_ack_func(update_info.buf[DEVICE],201,&update_info.buf[PACK_NUM]);
  574. update_info.step_201_flag = false;
  575. }
  576. else if(update_info.step_202_flag == true)
  577. {
  578. Update_ack_func(update_info.buf[DEVICE],202,&update_info.buf[PACK_NUM]);
  579. update_info.step_202_flag = false;
  580. }
  581. }
  582. if(EZup_par.update_flag != true)
  583. return;
  584. if(Check_Timer_Ready(&send_msgtime_5HZ,_20_HZ_) != true)
  585. return;
  586. uint8_t ez_can[8] = {0};
  587. static uint8_t frame_i = 1;
  588. static uint16_t data_count = 0,ez_crc = 0;
  589. if(UPDATE_END == update_info.buf[UPDATE_STEP])
  590. {
  591. EZup_par.step = STEP_ENDING;
  592. update_info.step_202_flag = true;
  593. }
  594. switch (EZup_par.step)
  595. {
  596. case STEP_FIND_NODE:
  597. for(uint8_t i = 0;i < 126;i++)
  598. {
  599. put_date_to_can(ez_can,i,0x06,0xB2,0X80,0XFF,0XFF,0XFF,0XFF);
  600. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  601. }
  602. break;
  603. case STEP_JUMP_BOOT:
  604. put_date_to_can(ez_can,EZup_par.node_id,0x06,0xB3,0XC1,0X42,0X4F,0X4F,0X54);
  605. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  606. put_date_to_can(ez_can,EZup_par.node_id,0x06,0xB2,0X80,0XFF,0XFF,0XFF,0XFF); //确定雷达所在区域
  607. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  608. break;
  609. case STEP_EASER_FLASH:
  610. HAL_Delay(500);
  611. put_date_to_can(ez_can,EZup_par.node_id,0x06,0xB4,0X42,0X00,0X00,0X00,0X00);
  612. ez_can[4] = (update_info.bin_size >> 24) & 0xff;
  613. ez_can[5] = (update_info.bin_size >> 16) & 0xff;
  614. ez_can[6] = (update_info.bin_size >> 8) & 0xff;
  615. ez_can[7] = update_info.bin_size & 0xff;
  616. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  617. break;
  618. case STEP_SET_OFFSET_ADR:
  619. put_date_to_can(ez_can,EZup_par.node_id,0x06,0xB4,0X03,0X00,0X01,0X17,0X3C);
  620. ez_can[4] = (EZup_par.adr_offset>> 24) & 0xff;
  621. ez_can[5] = (EZup_par.adr_offset >> 16) & 0xff;
  622. ez_can[6] = (EZup_par.adr_offset >> 8) & 0xff;
  623. ez_can[7] = EZup_par.adr_offset & 0xff;
  624. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  625. break;
  626. case STEP_SEND_DATE:
  627. while (update_info.vk_dev_pack_num == (update_info.buf[PACK_NUM] + update_info.buf[PACK_NUM + 1] * 256) &&
  628. EZup_par.pack_content != PACK_WAIT)
  629. {
  630. switch (EZup_par.pack_content)
  631. {
  632. case PACK_HEAD:
  633. EZup_par.frame_pci = 0x10 + (((128 + 2) >> 8) & 0x7);
  634. EZup_par.frame_len = (128+2) & 0xff;
  635. put_date_to_can(ez_can,EZup_par.node_id,EZup_par.frame_pci,EZup_par.frame_len,0XB4,0XC4,0X00,0X00,0X00);
  636. memcpy(&ez_can[5],&update_info.buf[PAYLOAD],3);
  637. EZup_par.pack_content = PACK_CONT;
  638. data_count += 3;
  639. break;
  640. case PACK_CONT:
  641. EZup_par.frame_pci = 0x20 + frame_i;
  642. ez_can[0] = EZup_par.node_id;
  643. ez_can[1] = EZup_par.frame_pci;
  644. frame_i++;
  645. memcpy(&ez_can[2],&update_info.buf[PAYLOAD + data_count],6);
  646. data_count += 6;
  647. if(data_count >= 128)
  648. {
  649. EZup_par.pack_content = PACK_CRC;
  650. ez_can[7] = 0xff;
  651. }
  652. if(frame_i > 15)
  653. frame_i = 0;
  654. break;
  655. case PACK_TAIL:
  656. EZup_par.pack_content = PACK_CRC;
  657. break;
  658. case PACK_CRC:
  659. data_count = 0;
  660. frame_i = 1;
  661. ez_crc = crc16_ccitt(&update_info.buf[PAYLOAD],128);
  662. put_date_to_can(ez_can,EZup_par.node_id,0X06,0xB4,0X85,(ez_crc >> 8) & 0xff,(ez_crc & 0xff),0XFF,0XFF);
  663. EZup_par.pack_content = PACK_WAIT; //只发一次
  664. break;
  665. default:
  666. break;
  667. }
  668. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  669. HAL_Delay(1);
  670. }
  671. break;
  672. case STEP_ENDING:
  673. put_date_to_can(ez_can,EZup_par.node_id,0x06,0xB4,0X06,0X41,0X50,0X50,0XFF);
  674. Can_Send_Msg_Func(CANID1, ez_can, 8, 0x3c, CAN_ID_STD);
  675. EZup_par.step = STEP_DEFAULT;
  676. EZup_par.update_flag = false;
  677. mimo_f_info.get_radar_ver_flag = false;
  678. mimo_b_info.get_radar_ver_flag = false;
  679. mimo_ter_info.get_radar_ver_flag = false;
  680. break;
  681. default:
  682. break;
  683. }
  684. }
  685. void EZ_Radar_UpdateCanRecvHookFunction(uint32_t CanID, uint8_t data[], uint8_t len)
  686. {
  687. if(data[1] == 0x06 && data[2] == 0xF2 && data[3] == 0xAA) //搜索节点
  688. {
  689. EZup_par.node_id = data[0];
  690. EZup_par.step = STEP_JUMP_BOOT;
  691. }
  692. else if(data[1] == 0x06 && data[2] == 0xF2 && data[3] == 0x55) //确定在boot
  693. {
  694. EZup_par.node_id = data[0];
  695. EZup_par.step = STEP_EASER_FLASH;
  696. }
  697. else if(data[0] == EZup_par.node_id && data[1] == 0x06 && data[2] == 0xF4 && //擦FLASH //CRC校验回复一样?
  698. data[3] == 0x00 && data[4] == 0xFF && data[5] == 0xFF && data[6] == 0xFF && data[7] == 0xFF)
  699. {
  700. if(EZup_par.step == STEP_EASER_FLASH )
  701. {
  702. EZup_par.step = STEP_SET_OFFSET_ADR;
  703. update_info.step_200_flag = true;
  704. }
  705. else if(EZup_par.step == STEP_SEND_DATE || EZup_par.step == STEP_WAIT)
  706. {
  707. EZup_par.adr_offset += 128;
  708. update_info.vk_dev_pack_num++;
  709. EZup_par.step = STEP_SET_OFFSET_ADR;
  710. update_info.step_201_flag = true;
  711. }
  712. }
  713. else if(data[0] == EZup_par.node_id && data[1] == 0x06 && data[2] == 0xF4 &&
  714. data[3] == 0x00 && (data[4] == 0x04 || data[4] == 0x08) && data[5] == 0x00 && data[6] == 0xFF && data[7] == 0xFF) //设置地址偏移
  715. {
  716. EZup_par.step = STEP_SEND_DATE;
  717. EZup_par.pack_content = PACK_HEAD;
  718. }
  719. else if(data[0] == EZup_par.node_id && data[1] == 0x06 && data[2] == 0xF4 && //校验错误
  720. data[3] == 0x07 && data[4] == 0xFF && data[5] == 0xFF && data[6] == 0xFF && data[7] == 0xFF)
  721. {
  722. EZup_par.step = STEP_SET_OFFSET_ADR;
  723. }
  724. }
  725. uint8_t WordXorCrc(uint8_t *pData, uint32_t len)
  726. {
  727. uint8_t crc = 0;
  728. for (uint32_t i = 0; i < len; i++)
  729. {
  730. crc ^= pData[i];
  731. }
  732. return crc;
  733. }
  734. /**
  735. * @file eft_dev_update_func
  736. * @brief efg设备升级
  737. * @param
  738. * @details
  739. * @author Zhang Sir
  740. **/
  741. _eft_update eft_update = {.pack_num = 1};
  742. void eft_dev_update_func(void)
  743. {
  744. if(uart_send_is_ok(USART_1) == true)
  745. {
  746. if(eft_update.step_200_flag == true )
  747. {
  748. Update_ack_func(eft_update.buf[DEVICE],200,&eft_update.buf[PACK_NUM]);
  749. eft_update.step_200_flag = false;
  750. }
  751. else if(eft_update.step_201_flag == true)
  752. {
  753. Update_ack_func(eft_update.buf[DEVICE],201,&eft_update.buf[PACK_NUM]);
  754. eft_update.step_201_flag = false;
  755. }
  756. else if(eft_update.step_202_flag == true)
  757. {
  758. Update_ack_func(eft_update.buf[DEVICE],202,&eft_update.buf[PACK_NUM]);
  759. eft_update.step_202_flag = false;
  760. }
  761. }
  762. static uint32_t send_msgtime_5HZ = 0;
  763. if(eft_update.update_flag != true)
  764. return;
  765. if(Check_Timer_Ready(&send_msgtime_5HZ,_20_HZ_) != true)
  766. return;
  767. uint8_t canN = 0;
  768. uint8_t can_buf[8] = {0};
  769. int can_id = 0;
  770. if(eft_update.dev_id == GROUP_ID_EFTFB_UPDATE)
  771. {
  772. canN = CANID1;
  773. }
  774. else if(eft_update.dev_id == GROUP_ID_EFTPUMP1_UPDATE || eft_update.dev_id == GROUP_ID_EFTPUMP2_UPDATE ||
  775. eft_update.dev_id == GROUP_ID_EFTNOZZLE1_UPDATE || eft_update.dev_id == GROUP_ID_EFTNOZZLE2_UPDATE ||
  776. eft_update.dev_id == GROUP_ID_EFTNOZZLE3_UPDATE || eft_update.dev_id == GROUP_ID_EFTNOZZLE4_UPDATE ||
  777. eft_update.dev_id == GROUP_ID_EFTSEED_UPDATE || eft_update.dev_id == GROUP_ID_Z70FB_UPDATE || GROUP_ID_Z70FBLIFTING_UPDATE ||
  778. eft_update.dev_id == GROUP_ID_EFT_TURNMOTOR || eft_update.dev_id == GROUP_ID_EFT_CHURN || eft_update.dev_id == GROUP_ID_EFT_CHURNTURN)
  779. {
  780. canN = CANID2;
  781. }
  782. if(eft_update.dev_id == GROUP_ID_EFTPUMP1_UPDATE)
  783. can_id = 0x8811;
  784. else if(eft_update.dev_id == GROUP_ID_EFTPUMP2_UPDATE)
  785. can_id = 0x8822;
  786. else if(eft_update.dev_id == GROUP_ID_EFTNOZZLE1_UPDATE)
  787. can_id = 0x8833;
  788. else if(eft_update.dev_id == GROUP_ID_EFTNOZZLE2_UPDATE)
  789. can_id = 0x8844;
  790. else if(eft_update.dev_id == GROUP_ID_EFTNOZZLE3_UPDATE)
  791. can_id = 0x8855;
  792. else if(eft_update.dev_id == GROUP_ID_EFTNOZZLE4_UPDATE)
  793. can_id = 0x8866;
  794. else if(eft_update.dev_id == GROUP_ID_EFTFB_UPDATE)
  795. can_id = 0x8877;
  796. else if(eft_update.dev_id == GROUP_ID_EFTSEED_UPDATE)
  797. can_id = 0x8899;
  798. else if(eft_update.dev_id == GROUP_ID_Z70FB_UPDATE)
  799. can_id = 0x7011;
  800. else if(eft_update.dev_id == GROUP_ID_Z70FBLIFTING_UPDATE)
  801. can_id = 0x88BB;
  802. else if(eft_update.dev_id == GROUP_ID_EFT_TURNMOTOR)
  803. can_id = 0x7733;
  804. else if(eft_update.dev_id == GROUP_ID_EFT_TURNMOTOR)
  805. can_id = 0x7711;
  806. else if(eft_update.dev_id == GROUP_ID_EFT_TURNMOTOR)
  807. can_id = 0x7722;
  808. switch (eft_update.step)
  809. {
  810. case STEP_START:
  811. put_date_to_can(can_buf,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); //停止广播
  812. Can_Send_Msg_Func(canN, can_buf, 8, 0x88FF, CAN_ID_EXT);
  813. put_date_to_can(can_buf,0xEB,0x90,0xEB,0x90,0xEB,0x90,0x10,0x06);
  814. Can_Send_Msg_Func(canN,can_buf, 8, can_id, CAN_ID_EXT);
  815. memcpy(&can_buf,&eft_update.bin_size,4);
  816. memcpy(&can_buf[4],&eft_update.bin_crc,4);
  817. Can_Send_Msg_Func(canN,can_buf, 8, can_id, CAN_ID_EXT);
  818. if(eft_update.bin_size % 128 > 0)
  819. eft_update.totol_packNum = (eft_update.bin_size / 128) + 1;
  820. else if(eft_update.bin_size % 128 == 0)
  821. eft_update.totol_packNum = eft_update.bin_size / 128;
  822. break;
  823. case STEP_UPDATING:
  824. if(eft_update.pack_num == (eft_update.buf[PACK_NUM] + eft_update.buf[PACK_NUM + 1] * 256) &&
  825. eft_update.send_pack_complete == false && eft_update.buf[UPDATE_STEP] == 201)
  826. {
  827. uint8_t i = 0;
  828. //首帧
  829. put_date_to_can(can_buf,0xEB,0x90,0xEB,0x90,0xEB,0x90,128+10,0x2B);
  830. Can_Send_Msg_Func(canN, can_buf, 8, can_id, CAN_ID_EXT);
  831. //第二帧
  832. if(eft_update.pack_num != eft_update.totol_packNum)
  833. can_buf[0] = 1;
  834. else
  835. can_buf[0] = 0;
  836. memcpy(&can_buf[1],&eft_update.buf[PAYLOAD + i],7);
  837. i += 7;
  838. Can_Send_Msg_Func(canN, can_buf, 8, can_id, CAN_ID_EXT);
  839. //中间帧
  840. while( i < 127)
  841. {
  842. memcpy(can_buf,&eft_update.buf[PAYLOAD + i],8);
  843. Can_Send_Msg_Func(canN, can_buf, 8, can_id, CAN_ID_EXT);
  844. i += 8;
  845. }
  846. //结束 帧
  847. eft_update.pack_crc = WordXorCrc(&eft_update.buf[PAYLOAD],128);
  848. can_buf[0] = eft_update.buf[PAYLOAD + i];
  849. can_buf[1] = eft_update.pack_crc;
  850. can_buf[2] = 0xFF;
  851. can_buf[3] = 0xFF;
  852. can_buf[4] = 0xFF;
  853. can_buf[5] = 0xFF;
  854. can_buf[6] = 0xFF;
  855. can_buf[7] = 0xFF;
  856. Can_Send_Msg_Func(canN, can_buf, 8, can_id, CAN_ID_EXT);
  857. eft_update.send_pack_complete = true;
  858. }
  859. break;
  860. case STEP_END:
  861. put_date_to_can(can_buf,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE); //开始广播
  862. Can_Send_Msg_Func(canN, can_buf, 8, 0x88FF, CAN_ID_EXT);
  863. eft_update.update_flag = false;
  864. eft_update.step_202_flag = true;
  865. break;
  866. case STEP_WAIT_ACK:
  867. break;
  868. default:
  869. break;
  870. }
  871. }
  872. void eft_dev_update_wait_ereseflash(uint8_t data[])
  873. {
  874. if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  875. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x07)
  876. {
  877. eft_update.step = STEP_WAIT_ACK;
  878. }
  879. else if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  880. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x17)
  881. {
  882. eft_update.step_200_flag = true;
  883. if(eft_update.step != STEP_UPDATING)
  884. {
  885. eft_update.step = STEP_UPDATING;
  886. eft_update.pack_num++;
  887. }
  888. }
  889. //下一包数据
  890. else if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  891. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x0B)
  892. {
  893. eft_update.pack_num++;
  894. eft_update.send_pack_complete = false;
  895. eft_update.step_201_flag = true;
  896. }
  897. //重新发送此包
  898. else if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  899. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x09)
  900. {
  901. eft_update.send_pack_complete = false;
  902. }
  903. //升级成功
  904. else if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  905. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x0C)
  906. {
  907. eft_update.step = STEP_END;
  908. }
  909. //重新升级
  910. else if(data[0] == 0xEB && data[1] == 0x90 && data[2] == 0xEB && data[3] == 0x90 &&
  911. data[4] == 0xEB && data[5] == 0x90 && data[6] == 0x08 && data[7] == 0x0D)
  912. {
  913. }
  914. }