usart_data_handle.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. #include "usart_data_handle.h"
  2. #include "common.h"
  3. #include "system_init.h"
  4. #include "main.h"
  5. #include "soft_flash.h"
  6. #include "config.h"
  7. #include "string.h"
  8. #include "soft_crc.h"
  9. #include "main_task.h"
  10. #include "soft_radar_handle.h"
  11. #include "soft_device.h"
  12. #include "soft_seed_weight.h"
  13. #include "soft_version.h"
  14. #include "soft_obstacle.h"
  15. #include "soft_terrain.h"
  16. #include "soft_update.h"
  17. #include "soft_adc.h"
  18. #include "soft_flow.h"
  19. #include "soft_can.h"
  20. #include "soft_timer.h"
  21. #include "soft_water.h"
  22. /**
  23. * @file check_uart_data
  24. * @brief 串口数据组包
  25. * @param none
  26. * @details
  27. * @author Zhang Sir
  28. **/
  29. Msg_Rx_Stage recv_step;
  30. Vk_protocol fcu_protocol;
  31. Vk_protocol vk_data = {.head = 0XFE,
  32. .system_id = 0,
  33. .head_bytes = 6,
  34. .check_bytes = 2};
  35. _pmu_pin pmu_pin = {.pump1 = 1000, .pump2 = 1000, .nozz1_fm = 1000,
  36. .nozz2_zp = 1000, .nozz3 = 1000, .nozz4 = 1000};
  37. void check_uart_data(void)
  38. {
  39. uint8_t c = 0;
  40. static uint32_t vk_recv_time = 0;
  41. static uint8_t i = 0;
  42. while (rkfifo_out(&uart_rkfifo, &c, 1) != 0)
  43. {
  44. if(recv_step != RX_HEAD && HAL_GetTick() - vk_recv_time > 200)
  45. {
  46. recv_step = RX_HEAD;
  47. }
  48. //解析出一包完整的数据
  49. switch (recv_step)
  50. {
  51. case RX_HEAD:
  52. if(c == vk_data.head)
  53. {
  54. vk_recv_time = HAL_GetTick();
  55. recv_step = RX_PAYLOAD_LEN;
  56. }
  57. break;
  58. case RX_PAYLOAD_LEN:
  59. vk_data.len = c;
  60. recv_step = RX_SEQ;
  61. break;
  62. case RX_SEQ:
  63. vk_data.seq = c;
  64. recv_step = RX_SYSID;
  65. break;
  66. case RX_SYSID:
  67. if(c == vk_data.system_id)
  68. {
  69. recv_step = RX_GROUPID;
  70. }
  71. else
  72. {
  73. recv_step = RX_HEAD;
  74. }
  75. break;
  76. case RX_GROUPID:
  77. if(c == GROUP_ID_FCU || c == GROUP_ID_PMU_UPDATE || c == GROUP_ID_F_UPDATE ||
  78. c == GROUP_ID_B_UPDATE || c == GROUP_ID_T_UPDATE|| c == GROUP_ID_WEIGHT_UPDATE ||
  79. (c >= GROUP_ID_EFTPUMP1_UPDATE && c <= GROUP_ID_Z70FBLIFTING_UPDATE))
  80. {
  81. vk_data.group_id = c;
  82. recv_step = RX_MSGID;
  83. }
  84. else
  85. {
  86. recv_step = RX_HEAD;
  87. }
  88. break;
  89. case RX_MSGID:
  90. vk_data.msg_id = c;
  91. recv_step = RX_PAYLOAD;
  92. i = 0;
  93. break;
  94. case RX_PAYLOAD:
  95. vk_data.payload[vk_data.head_bytes + i] = c;
  96. i++;
  97. if(i == vk_data.len)
  98. {
  99. recv_step = RX_CHECK_LOW;
  100. }
  101. else if(vk_data.len == 0) //没有payload
  102. {
  103. recv_step = RX_CHECK_HIGH;
  104. }
  105. break;
  106. case RX_CHECK_LOW:
  107. vk_data.payload[vk_data.head_bytes + i] = c;
  108. i++;
  109. recv_step = RX_CHECK_HIGH;
  110. break;
  111. case RX_CHECK_HIGH:
  112. vk_data.payload[vk_data.head_bytes + i] = c;
  113. vk_data.payload[0] = vk_data.head;
  114. vk_data.payload[1] = vk_data.len;
  115. vk_data.payload[2] = vk_data.seq;
  116. vk_data.payload[3] = vk_data.system_id;
  117. vk_data.payload[4] = vk_data.group_id;
  118. vk_data.payload[5] = vk_data.msg_id;
  119. if(0 == Get_Crc16(&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes))
  120. {
  121. if(vk_data.group_id == GROUP_ID_FCU || vk_data.group_id == GROUP_ID_PMU_UPDATE)
  122. {
  123. if(fcu_protocol.complete_flag == false)
  124. {
  125. fcu_protocol.msg_id = vk_data.msg_id;
  126. memcpy(&fcu_protocol.payload[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  127. fcu_protocol.complete_flag = true;
  128. }
  129. }
  130. //莫之比雷达升级
  131. else if((vk_data.group_id == GROUP_ID_F_UPDATE && uavr11_info.Link.connect_status != COMP_NOEXIST) ||
  132. (vk_data.group_id == GROUP_ID_B_UPDATE && uavr12_info.Link.connect_status != COMP_NOEXIST) ||
  133. (vk_data.group_id == GROUP_ID_T_UPDATE && uavr56_info.Link.connect_status != COMP_NOEXIST))
  134. {
  135. if(update_info.use_update_buf_flag == false)
  136. {
  137. memcpy(&update_info.buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  138. update_info.use_update_buf_flag = true;
  139. if (vk_data.msg_id == 200)
  140. {
  141. if(check_radar_update() == true)
  142. {
  143. radar_update_flag = true;
  144. update_count = 0;
  145. }
  146. }
  147. }
  148. }
  149. //VK协议设备升级
  150. else if (vk_data.group_id == GROUP_ID_WEIGHT_UPDATE ||
  151. (vk_data.group_id == GROUP_ID_F_UPDATE /*&& mimo_f_info.Link.connect_status != COMP_NOEXIST*/) ||
  152. (vk_data.group_id == GROUP_ID_B_UPDATE /*&& mimo_b_info.Link.connect_status != COMP_NOEXIST*/) ||
  153. (vk_data.group_id == GROUP_ID_T_UPDATE /*&& mimo_ter_info.Link.connect_status != COMP_NOEXIST*/))
  154. {
  155. #ifdef mimo_update
  156. if(vk_data.msg_id == 200)
  157. {
  158. if(EZup_par.step == STEP_DEFAULT)//mimo
  159. {//mimo
  160. memset(&EZup_par,0,sizeof(ez_update));//mimo
  161. memset(&update_info.use_update_buf_flag,0,sizeof(Update));
  162. memcpy(&update_info.bin_size,&vk_data.payload[6],4);
  163. update_info.vk_dev_pack_num = 1;
  164. update_info.vk_dev_update_flag = true;
  165. EZup_par.update_flag = true;//mimo
  166. EZup_par.step = STEP_FIND_NODE;//mimo
  167. }
  168. }
  169. #else
  170. if(vk_data.msg_id == 200)
  171. {
  172. memset(&update_info.use_update_buf_flag,0,sizeof(Update));
  173. memcpy(&update_info.bin_size,&vk_data.payload[6],4);
  174. update_info.vk_dev_pack_num = 1;
  175. update_info.vk_dev_update_flag = true;
  176. }
  177. #endif
  178. memcpy(&update_info.buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  179. //判断是否是需要的包序号
  180. if(update_info.vk_dev_pack_num > (update_info.buf[PACK_NUM] + update_info.buf[PACK_NUM + 1] * 256) &&
  181. vk_data.msg_id == 201)
  182. {
  183. Update_ack_func(update_info.buf[DEVICE],201,&update_info.buf[PACK_NUM]);
  184. }
  185. update_info.use_update_buf_flag = true;
  186. }
  187. else if(vk_data.group_id == GROUP_ID_EFTPUMP1_UPDATE || vk_data.group_id == GROUP_ID_EFTPUMP2_UPDATE ||
  188. vk_data.group_id == GROUP_ID_EFTNOZZLE1_UPDATE || vk_data.group_id == GROUP_ID_EFTNOZZLE2_UPDATE ||
  189. vk_data.group_id == GROUP_ID_EFTNOZZLE3_UPDATE || vk_data.group_id == GROUP_ID_EFTNOZZLE4_UPDATE ||
  190. vk_data.group_id == GROUP_ID_EFTFB_UPDATE || vk_data.group_id == GROUP_ID_EFTSEED_UPDATE ||
  191. vk_data.group_id == GROUP_ID_Z70FB_UPDATE || vk_data.group_id == GROUP_ID_Z70FBLIFTING_UPDATE)
  192. {
  193. if(vk_data.msg_id == 200 && eft_update.update_flag == false)
  194. {
  195. memset(&eft_update,0,sizeof(_eft_update));
  196. eft_update.dev_id = vk_data.group_id;
  197. memcpy(&eft_update.bin_size,&vk_data.payload[6],8);
  198. eft_update.step = STEP_START;
  199. eft_update.update_flag = true;
  200. }
  201. memcpy(&eft_update.buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  202. //判断是否是需要的包序号
  203. if(eft_update.pack_num > (eft_update.buf[PACK_NUM] + eft_update.buf[PACK_NUM + 1] * 256) &&
  204. vk_data.msg_id == 201)
  205. {
  206. Update_ack_func(update_info.buf[DEVICE],201,&update_info.buf[PACK_NUM]);
  207. }
  208. }
  209. }
  210. recv_step = RX_HEAD;
  211. break;
  212. default:
  213. recv_step = RX_HEAD;
  214. break;
  215. }
  216. }
  217. }
  218. /**
  219. * @file thread_usart_task_entry
  220. * @brief FMU串口数据解析
  221. * @param none
  222. * @details
  223. * @author Zhang Sir
  224. **/
  225. Connect_check fcu;
  226. Start_info start_msg;
  227. Set_info msgidset;
  228. __attribute__ ( ( aligned ( 4 ) ) ) plane_para planep = {.Candebug_flag = 0};
  229. void thread_usart_task_entry(void *param)
  230. {
  231. while(1)
  232. {
  233. rt_sem_take(&uart1_sem, RT_WAITING_FOREVER);
  234. check_uart_data();
  235. if (fcu_protocol.complete_flag == true)
  236. {
  237. uint32_t tem_32t = 0;
  238. Check_dev_link(&fcu,3000,NULL,0);
  239. switch (fcu_protocol.msg_id)
  240. {
  241. case _MSGID_PWM:
  242. memcpy(&pmu_pin.pump1, &fcu_protocol.payload[6], sizeof(_pmu_pin));
  243. if(set_HWesc_ESCid == true && setESCidInfo.setESCidStep == SETESCID_SET)
  244. {
  245. memset(&pmu_pin.pump1,0,8);
  246. pmu_pin.pump1 = 1000;
  247. }
  248. //自动配置CANID
  249. if(auto_set_canid_flag == NEED_SET)
  250. {
  251. if((auto_eft_dev_status & 1) != 1)
  252. pmu_pin.pump1 = 100;
  253. if(((auto_eft_dev_status >> 1) & 1) != 1)
  254. pmu_pin.pump2 = 200;
  255. if(((auto_eft_dev_status >> 2) & 1) != 1)
  256. pmu_pin.nozz1_fm = 300;
  257. if(((auto_eft_dev_status >> 3) & 1) != 1)
  258. pmu_pin.nozz2_zp = 400;
  259. if(((auto_eft_dev_status >> 4) & 1) != 1)
  260. pmu_pin.nozz3 = 200;
  261. if(((auto_eft_dev_status >> 5) & 1) != 1)
  262. pmu_pin.nozz4 = 100;
  263. }
  264. if(Dev.Eft_CanDev_Link[0].connect_status == COMP_NORMAL)
  265. {
  266. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pmu_pin.pump1);
  267. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pmu_pin.pump2);
  268. }
  269. else
  270. {
  271. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pmu_pin.pump1);
  272. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pmu_pin.pump2);
  273. }
  274. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pmu_pin.nozz1_fm);
  275. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pmu_pin.nozz2_zp);
  276. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, pmu_pin.nozz3);
  277. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, pmu_pin.nozz4);
  278. break;
  279. case _MSGID_LED:
  280. // for(uint8_t i = 0; i < 7; i++)
  281. // {
  282. // if(planep.UAV_type != VK_ALL_IN_ONE ) //青岛机型不用LED
  283. // {
  284. // led_set_blink(i, fcu_protocol.payload[i*3+6], fcu_protocol.payload[i*3+7], fcu_protocol.payload[i*3+8]);
  285. // }
  286. // }
  287. break;
  288. //飞机姿态信息
  289. case _MSGID_ATTITUDE:
  290. memcpy(&planep.yaw, &fcu_protocol.payload[6], sizeof(plane_para));
  291. if(cur_par.uavtype != planep.UAV_type)
  292. {
  293. stor_par.uavtype = planep.UAV_type;
  294. write_flash_flag = true;
  295. }
  296. break;
  297. case _MSGID_TIME:
  298. //tem_32t = 1684136124;
  299. memcpy(&utc_time, &fcu_protocol.payload[6], 4);
  300. covUnixTimeStp2Beijing(utc_time,&beijing_time);
  301. pmu_set_ack(_MSGID_TIME,0,0,0);
  302. break;
  303. //eft播撒器
  304. case _MSGID_EFT_CON:
  305. recv_fmu_seed_info = true;
  306. memcpy(&spread_par.pwm_turntable, &fcu_protocol.payload[6], 2);
  307. memcpy(&spread_par.pwm_valve, &fcu_protocol.payload[8], 2);
  308. break;
  309. //请求信息包
  310. case _MSGID_REQ:
  311. switch (fcu_protocol.payload[6])
  312. {
  313. case MSGID_REQ_VERSION:
  314. pmu_send = PMU_SEND_VERSION;
  315. break;
  316. default:
  317. break;
  318. }
  319. break;
  320. //主控应答
  321. case _MSGID_ACK:
  322. msgidset.content1 = fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8];
  323. switch (fcu_protocol.payload[6])
  324. {
  325. case MSGID_ACK_HEART:
  326. // stor_par.abnormal_outage_flag = 0;
  327. // write_flash_flag = true;
  328. break;
  329. case MSGID_ACK_VERSION:
  330. start_msg.version_info = true;
  331. break;
  332. case MSGID_ACK_DEV:
  333. {
  334. if(msgidset.content1 < DEVICE_END - 1)
  335. {
  336. dev_version_content *Pt = dev_ptr[msgidset.content1];
  337. if(Pt->send_times > 0)
  338. Pt->send_times--;
  339. }
  340. }
  341. break;
  342. default:
  343. break;
  344. }
  345. break;
  346. //设置雷达灵敏度
  347. case _MSGID_SET:
  348. msgidset.num = fcu_protocol.payload[6];
  349. msgidset.content1 = fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8];
  350. msgidset.content2 = fcu_protocol.payload[9] + 256 * fcu_protocol.payload[10];
  351. switch (msgidset.num)
  352. {
  353. //前雷达
  354. case MSGID_SET_F_RADAR:
  355. if(uavr12_info.fcu_set_sensi_flag != true && uavr56_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  356. {
  357. uavr11_info.fcu_set_sensi_flag = true;
  358. }
  359. memcpy(&obsfradar_sensitivity, &fcu_protocol.payload[7], 2);
  360. if(obsfradar_sensitivity == uavr11_info.get_radar_sensi)
  361. {
  362. uavr11_info.fcu_set_sensi_flag = false;
  363. pmu_set_ack(_MSGID_SET,MSGID_SET_F_RADAR,uavr11_info.get_radar_sensi,0);
  364. }
  365. break;
  366. //后雷达
  367. case MSGID_SET_B_RADAR:
  368. if(uavr11_info.fcu_set_sensi_flag != true && uavr56_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  369. {
  370. uavr12_info.fcu_set_sensi_flag = true;
  371. }
  372. memcpy(&obsbradar_sensitivity, &fcu_protocol.payload[7], 2);
  373. if(obsbradar_sensitivity == uavr12_info.get_radar_sensi)
  374. {
  375. uavr12_info.fcu_set_sensi_flag = false;
  376. pmu_set_ack(_MSGID_SET,MSGID_SET_B_RADAR,uavr12_info.get_radar_sensi,0);
  377. }
  378. break;
  379. //仿地
  380. case MSGID_SET_T_RADAR:
  381. if(uavr11_info.fcu_set_sensi_flag != true && uavr12_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  382. {
  383. uavr56_info.fcu_set_sensi_flag = true;
  384. }
  385. memcpy(&uavr56_info.fcu_set_sensi, &fcu_protocol.payload[7], 2);
  386. if(uavr56_info.fcu_set_sensi == uavr56_info.get_radar_sensi)
  387. {
  388. uavr56_info.fcu_set_sensi_flag = false;
  389. pmu_set_ack(_MSGID_SET,MSGID_SET_T_RADAR,uavr56_info.get_radar_sensi,0);
  390. }
  391. break;
  392. case MSGID_SET_VOL:
  393. stor_par.voltage = (fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8]) - (int)(Adc_Get(ADC_Bms)/100.0f) ;
  394. write_flash_flag = true;
  395. pmu_set_ack(_MSGID_SET,MSGID_SET_VOL,0,0);
  396. break;
  397. case MSGID_SET_MIMO_FLOW:
  398. if(msgidset.content1 != 0)
  399. {
  400. if(Dev.Flow.facid == FAC_MIMO_SIG || Dev.Flow.facid == FAC_MIMO_DOU)
  401. {
  402. tem_32t = flow_mimo1.flow_k * msgidset.content1 / 100;
  403. if(tem_32t >= 500 && tem_32t <= 20000)
  404. {
  405. flow_mimo1.flow_calk = tem_32t;
  406. }
  407. else{
  408. flow_mimo1.flow_calk = 10000;
  409. }
  410. flow_mimo1.set_k = true;
  411. }
  412. else if(Dev.Flow.facid == FAC_QIFEI_SIG || Dev.Flow.facid == FAC_QIFEI_DOU)
  413. {
  414. tem_32t = flow_inf.ch1.k * msgidset.content1 / 100;
  415. if(tem_32t >= 500 && tem_32t <= 20000)
  416. {
  417. flow_inf.ch1.cal_k = tem_32t;
  418. }
  419. else{
  420. flow_inf.ch1.cal_k = 10000;
  421. }
  422. flow_inf.ch1.set_k = true;
  423. }
  424. }
  425. if(msgidset.content2 != 0)
  426. {
  427. if(Dev.Flow.facid == FAC_MIMO_SIG || Dev.Flow.facid == FAC_MIMO_DOU)
  428. {
  429. tem_32t = flow_mimo2.flow_k * msgidset.content2 / 100;
  430. if(tem_32t >= 500 && tem_32t <= 20000)
  431. {
  432. flow_mimo2.flow_calk = tem_32t;
  433. }
  434. else{
  435. flow_mimo2.flow_calk = 10000;
  436. }
  437. flow_mimo2.set_k = true;
  438. }
  439. else if(Dev.Flow.facid == FAC_QIFEI_SIG || Dev.Flow.facid == FAC_QIFEI_DOU)
  440. {
  441. tem_32t = flow_inf.ch2.k * msgidset.content2 / 100;
  442. if(tem_32t >= 500 && tem_32t <= 20000)
  443. {
  444. flow_inf.ch2.cal_k = tem_32t;
  445. }
  446. else{
  447. flow_inf.ch2.cal_k = 10000;
  448. }
  449. flow_inf.ch1.set_k = true;;
  450. }
  451. }
  452. break;
  453. case MSGID_SET_FLOW_BACKGROUND:
  454. if(Dev.Flow.facid == FAC_MIMO_SIG)
  455. {
  456. flow_inf.ch1.clear_background = true;
  457. }
  458. if(Dev.Flow.facid == FAC_MIMO_DOU)
  459. {
  460. flow_inf.ch1.clear_background = true;
  461. flow_inf.ch2.clear_background = true;
  462. }
  463. break;
  464. case MSGID_SET_WEIGHT_K:
  465. weight_order.type = Weight_Set_K;
  466. weight_order.order_con1 = msgidset.content1;
  467. weight_order.order_con2 = msgidset.content2;
  468. break;
  469. case MSGID_SET_SEED_OUT_TYPE:
  470. recv_fmu_seed_info = true;
  471. spread_par.output_mode = msgidset.content1;
  472. pmu_set_ack(_MSGID_SET,MSGID_SET_SEED_OUT_TYPE,0,0);
  473. break;
  474. case MSGID_SET_SEED_CAL_TYPE:
  475. switch (msgidset.content1)
  476. {
  477. case Cal_Remove_Peel:
  478. weight_order.type = Weight_Peer;
  479. break;
  480. case Cal_Weight:
  481. weight_order.type = Weight_Kg;
  482. weight_order.order_con2 = msgidset.content2;
  483. break;
  484. case Cal_Seed_Back:
  485. weight_order.type = Weight_Bcak;
  486. break;
  487. default:
  488. break;
  489. }
  490. break;
  491. case MSGID_SET_WEIGHT_MODE:
  492. weight_order.type = Weight_Mode;
  493. weight_order.order_con1 = msgidset.content1;
  494. break;
  495. case MSGID_SET_MAX_RATE:
  496. weight_order.type = Weight_Drug_Rate;
  497. weight_order.order_con1 = msgidset.content1;
  498. break;
  499. case MSGID_SET_PMU_SERIAL:
  500. tem_32t = msgidset.content1 + ((msgidset.content2 << 16) & 0xffff0000);
  501. if(cur_par.pmu_serial == PMU_SERIAL || tem_32t == PMU_SERIAL)
  502. {
  503. stor_par.pmu_serial = tem_32t;
  504. write_flash_flag = true;
  505. pmu_set_ack(_MSGID_SET,MSGID_SET_PMU_SERIAL,0,0);
  506. dev_pmu.send_times += 5;
  507. }
  508. else if(tem_32t == cur_par.pmu_serial)
  509. {
  510. pmu_set_ack(_MSGID_SET,MSGID_SET_PMU_SERIAL,0,0);
  511. }
  512. break;
  513. case MSGID_SET_RADAR_FB:
  514. {
  515. uint8_t can_buf[8] = {0};
  516. if(msgidset.content1 == 0x11)
  517. {
  518. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X03,0X01,0X65,0X00);
  519. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  520. }
  521. else if (msgidset.content1 == 0x12)
  522. {
  523. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X03,0X02,0X66,0X00);
  524. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  525. }
  526. else if(msgidset.content1 == 0x100)
  527. {
  528. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X00,0X03,0X64,0X00);
  529. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  530. }
  531. }
  532. break;
  533. case MSGID_SET_LACKLOSS_CAL:
  534. {
  535. uint8_t can_buf[8] = {0};
  536. if(Dev.Lackloss_Link.connect_status == COMP_NORMAL)
  537. {
  538. mimo_lackloss.cal_distance = mimo_lackloss.distance + 5;
  539. put_date_to_can(can_buf,0xFA,0x03,0x00,0xB1,0XC1,0x00,0X00,0X00);
  540. can_buf[6] = mimo_lackloss.cal_distance & 0xff;
  541. can_buf[5] = (mimo_lackloss.cal_distance >> 8) & 0xff;
  542. can_buf[7] = (can_buf[1]+can_buf[2]+can_buf[3]+can_buf[4]+can_buf[5]+can_buf[6]) & 0xff;
  543. Can_Send_Msg_Func(CANID2, can_buf, 8, 0xFA, CAN_ID_STD);
  544. }
  545. }
  546. break;
  547. case MSGID_SET_PNCANID:
  548. set_eftdev_canid_flag = true;
  549. set_eftdev_canid_time = HAL_GetTick();
  550. pmu_set_ack(_MSGID_SET,1,0,0);
  551. break;
  552. case MSGID_SET_RESIWIRE_BLOWN:
  553. {
  554. uint8_t can_buf[8] = {0};
  555. put_date_to_can(can_buf,0xF7,fcu_protocol.payload[7],0x00,0x00,0x00,0xF1,0XF3,0X00);
  556. Can_Send_Msg_Func(CANID2, can_buf, 8, 0x88BB, CAN_ID_EXT);
  557. }
  558. break;
  559. default:
  560. break;
  561. }
  562. break;
  563. case _MSGID_SHA1:
  564. //智能电池秘钥
  565. if(fcu_protocol.payload[6] == 1)
  566. {
  567. //有秘钥
  568. if(fcu_protocol.payload[7] == 2 && fcu_protocol.payload[8] == 1)
  569. {
  570. if(start_msg.key_info_checking == true)
  571. {
  572. memcpy(&start_msg.key_data[0],&fcu_protocol.payload[9],20);
  573. start_msg.key_to_bms = true;//给电池发送秘钥
  574. start_msg.key_info_checking = false;
  575. }
  576. }
  577. //无秘钥
  578. else if(fcu_protocol.payload[7] == 2 && fcu_protocol.payload[8] == 2)
  579. {
  580. start_msg.key_info_checking = false;
  581. }
  582. //回馈,防止PMU一直发
  583. else if(fcu_protocol.payload[7] == 3 || fcu_protocol.payload[7] == 4)
  584. {
  585. start_msg.key_info_checking = false;
  586. }
  587. }
  588. break;
  589. case _MSGID_HEART:
  590. pmu_heart_flag = true;
  591. //pmu_set_ack(_MSGID_HEART,0x56,0,0);
  592. break;
  593. //升级固件标志
  594. case _MSGID_UPDATA:
  595. {
  596. __disable_irq();
  597. HAL_FLASH_Unlock();
  598. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
  599. FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  600. uint32_t sector = 10;
  601. sector = GetSectorFromAddress(FLASH_UPDATE_ADDR);//获取地址所在的扇区
  602. FLASH_Erase_Sector(sector,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~11)
  603. uint16_t TempBuf = 0xABCD;
  604. HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_UPDATE_ADDR, TempBuf);
  605. HAL_FLASH_Lock();
  606. __enable_irq();
  607. HAL_NVIC_DisableIRQ(USART1_IRQn);
  608. HAL_Delay(100);
  609. //软件复位
  610. HAL_NVIC_SystemReset();
  611. }
  612. break;
  613. default:
  614. break;
  615. }
  616. fcu_protocol.complete_flag = false;
  617. memset(fcu_protocol.payload, 0, MAX_UART_BUF);
  618. }
  619. }
  620. }