usart_data_handle.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  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_IDEND))
  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. vk_data.group_id == GROUP_ID_EFT_TURNMOTOR)
  193. {
  194. if(vk_data.msg_id == 200 && eft_update.update_flag == false)
  195. {
  196. memset(&eft_update,0,sizeof(_eft_update));
  197. eft_update.dev_id = vk_data.group_id;
  198. memcpy(&eft_update.bin_size,&vk_data.payload[6],8);
  199. eft_update.step = STEP_START;
  200. eft_update.update_flag = true;
  201. }
  202. memcpy(&eft_update.buf[0],&vk_data.payload[0],vk_data.len + vk_data.head_bytes + vk_data.check_bytes);
  203. //判断是否是需要的包序号
  204. if(eft_update.pack_num > (eft_update.buf[PACK_NUM] + eft_update.buf[PACK_NUM + 1] * 256) &&
  205. vk_data.msg_id == 201)
  206. {
  207. Update_ack_func(update_info.buf[DEVICE],201,&update_info.buf[PACK_NUM]);
  208. }
  209. }
  210. }
  211. recv_step = RX_HEAD;
  212. break;
  213. default:
  214. recv_step = RX_HEAD;
  215. break;
  216. }
  217. }
  218. }
  219. /**
  220. * @file thread_usart_task_entry
  221. * @brief FMU串口数据解析
  222. * @param none
  223. * @details
  224. * @author Zhang Sir
  225. **/
  226. Connect_check fcu;
  227. Start_info start_msg;
  228. Set_info msgidset;
  229. __attribute__ ( ( aligned ( 4 ) ) ) plane_para planep = {.Candebug_flag = 0};
  230. void thread_usart_task_entry(void *param)
  231. {
  232. while(1)
  233. {
  234. rt_sem_take(&uart1_sem, RT_WAITING_FOREVER);
  235. check_uart_data();
  236. if (fcu_protocol.complete_flag == true)
  237. {
  238. uint32_t tem_32t = 0;
  239. Check_dev_link(&fcu,3000,NULL,0);
  240. switch (fcu_protocol.msg_id)
  241. {
  242. case _MSGID_PWM:
  243. memcpy(&pmu_pin.pump1, &fcu_protocol.payload[6], sizeof(_pmu_pin));
  244. if(set_HWesc_ESCid == true && setESCidInfo.setESCidStep == SETESCID_SET)
  245. {
  246. memset(&pmu_pin.pump1,0,8);
  247. pmu_pin.pump1 = 1000;
  248. }
  249. //自动配置CANID
  250. if(auto_set_canid_flag == NEED_SET)
  251. {
  252. if((auto_eft_dev_status & 1) != 1)
  253. pmu_pin.pump1 = 100;
  254. if(((auto_eft_dev_status >> 1) & 1) != 1)
  255. pmu_pin.pump2 = 200;
  256. if(((auto_eft_dev_status >> 2) & 1) != 1)
  257. pmu_pin.nozz1_fm = 300;
  258. if(((auto_eft_dev_status >> 3) & 1) != 1)
  259. pmu_pin.nozz2_zp = 400;
  260. if(((auto_eft_dev_status >> 4) & 1) != 1)
  261. pmu_pin.nozz3 = 200;
  262. if(((auto_eft_dev_status >> 5) & 1) != 1)
  263. pmu_pin.nozz4 = 100;
  264. }
  265. // if(Dev.Eft_CanDev_Link[0].connect_status == COMP_NORMAL)
  266. // {
  267. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pmu_pin.pump1);
  268. __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pmu_pin.pump2);
  269. // }
  270. // else
  271. // {
  272. // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pmu_pin.pump1);
  273. // __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pmu_pin.pump2);
  274. // }
  275. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pmu_pin.nozz1_fm);
  276. __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pmu_pin.nozz2_zp);
  277. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, pmu_pin.nozz3);
  278. __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, pmu_pin.nozz4);
  279. break;
  280. case _MSGID_LED:
  281. // for(uint8_t i = 0; i < 7; i++)
  282. // {
  283. // if(planep.UAV_type != VK_ALL_IN_ONE ) //青岛机型不用LED
  284. // {
  285. // led_set_blink(i, fcu_protocol.payload[i*3+6], fcu_protocol.payload[i*3+7], fcu_protocol.payload[i*3+8]);
  286. // }
  287. // }
  288. break;
  289. //飞机姿态信息
  290. case _MSGID_ATTITUDE:
  291. memcpy(&planep.yaw, &fcu_protocol.payload[6], sizeof(plane_para));
  292. if(cur_par.uavtype != planep.UAV_type)
  293. {
  294. stor_par.uavtype = planep.UAV_type;
  295. write_flash_flag = true;
  296. }
  297. break;
  298. case _MSGID_TIME:
  299. //tem_32t = 1684136124;
  300. memcpy(&utc_time, &fcu_protocol.payload[6], 4);
  301. covUnixTimeStp2Beijing(utc_time,&beijing_time);
  302. pmu_set_ack(_MSGID_TIME,0,0,0);
  303. break;
  304. //eft播撒器
  305. case _MSGID_EFT_CON:
  306. recv_fmu_seed_info = true;
  307. memcpy(&spread_par.pwm_turntable, &fcu_protocol.payload[6], 2);
  308. memcpy(&spread_par.pwm_valve, &fcu_protocol.payload[8], 2);
  309. break;
  310. //请求信息包
  311. case _MSGID_REQ:
  312. switch (fcu_protocol.payload[6])
  313. {
  314. case MSGID_REQ_VERSION:
  315. pmu_send = PMU_SEND_VERSION;
  316. break;
  317. default:
  318. break;
  319. }
  320. break;
  321. //主控应答
  322. case _MSGID_ACK:
  323. msgidset.content1 = fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8];
  324. switch (fcu_protocol.payload[6])
  325. {
  326. case MSGID_ACK_HEART:
  327. // stor_par.abnormal_outage_flag = 0;
  328. // write_flash_flag = true;
  329. break;
  330. case MSGID_ACK_VERSION:
  331. start_msg.version_info = true;
  332. break;
  333. case MSGID_ACK_DEV:
  334. {
  335. if(msgidset.content1 < DEVICE_END - 1)
  336. {
  337. dev_version_content *Pt = dev_ptr[msgidset.content1];
  338. if(Pt->send_times > 0)
  339. Pt->send_times--;
  340. }
  341. }
  342. break;
  343. default:
  344. break;
  345. }
  346. break;
  347. //设置雷达灵敏度
  348. case _MSGID_SET:
  349. msgidset.num = fcu_protocol.payload[6];
  350. msgidset.content1 = fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8];
  351. msgidset.content2 = fcu_protocol.payload[9] + 256 * fcu_protocol.payload[10];
  352. switch (msgidset.num)
  353. {
  354. //前雷达
  355. case MSGID_SET_F_RADAR:
  356. if(uavr12_info.fcu_set_sensi_flag != true && uavr56_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  357. {
  358. uavr11_info.fcu_set_sensi_flag = true;
  359. }
  360. memcpy(&obsfradar_sensitivity, &fcu_protocol.payload[7], 2);
  361. if(obsfradar_sensitivity == uavr11_info.get_radar_sensi)
  362. {
  363. uavr11_info.fcu_set_sensi_flag = false;
  364. pmu_set_ack(_MSGID_SET,MSGID_SET_F_RADAR,uavr11_info.get_radar_sensi,0);
  365. }
  366. break;
  367. //后雷达
  368. case MSGID_SET_B_RADAR:
  369. if(uavr11_info.fcu_set_sensi_flag != true && uavr56_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  370. {
  371. uavr12_info.fcu_set_sensi_flag = true;
  372. }
  373. memcpy(&obsbradar_sensitivity, &fcu_protocol.payload[7], 2);
  374. if(obsbradar_sensitivity == uavr12_info.get_radar_sensi)
  375. {
  376. uavr12_info.fcu_set_sensi_flag = false;
  377. pmu_set_ack(_MSGID_SET,MSGID_SET_B_RADAR,uavr12_info.get_radar_sensi,0);
  378. }
  379. break;
  380. //仿地
  381. case MSGID_SET_T_RADAR:
  382. if(uavr11_info.fcu_set_sensi_flag != true && uavr12_info.fcu_set_sensi_flag != true && radar_update_flag == false)
  383. {
  384. uavr56_info.fcu_set_sensi_flag = true;
  385. }
  386. memcpy(&uavr56_info.fcu_set_sensi, &fcu_protocol.payload[7], 2);
  387. if(uavr56_info.fcu_set_sensi == uavr56_info.get_radar_sensi)
  388. {
  389. uavr56_info.fcu_set_sensi_flag = false;
  390. pmu_set_ack(_MSGID_SET,MSGID_SET_T_RADAR,uavr56_info.get_radar_sensi,0);
  391. }
  392. break;
  393. case MSGID_SET_VOL:
  394. stor_par.voltage = (fcu_protocol.payload[7] + 256 * fcu_protocol.payload[8]) - (int)(Adc_Get(ADC_Bms)/100.0f) ;
  395. write_flash_flag = true;
  396. pmu_set_ack(_MSGID_SET,MSGID_SET_VOL,0,0);
  397. break;
  398. case MSGID_SET_MIMO_FLOW:
  399. if(msgidset.content1 != 0)
  400. {
  401. if(Dev.Flow.facid == FAC_MIMO_SIG || Dev.Flow.facid == FAC_MIMO_DOU)
  402. {
  403. tem_32t = flow_mimo1.flow_k * msgidset.content1 / 100;
  404. if(tem_32t >= 500 && tem_32t <= 20000)
  405. {
  406. flow_mimo1.flow_calk = tem_32t;
  407. }
  408. else{
  409. flow_mimo1.flow_calk = 10000;
  410. }
  411. flow_mimo1.set_k = true;
  412. }
  413. else if(Dev.Flow.facid == FAC_QIFEI_SIG || Dev.Flow.facid == FAC_QIFEI_DOU)
  414. {
  415. tem_32t = flow_inf.ch1.k * msgidset.content1 / 100;
  416. if(tem_32t >= 500 && tem_32t <= 20000)
  417. {
  418. flow_inf.ch1.cal_k = tem_32t;
  419. }
  420. else{
  421. flow_inf.ch1.cal_k = 10000;
  422. }
  423. flow_inf.ch1.set_k = true;
  424. }
  425. }
  426. if(msgidset.content2 != 0)
  427. {
  428. if(Dev.Flow.facid == FAC_MIMO_SIG || Dev.Flow.facid == FAC_MIMO_DOU)
  429. {
  430. tem_32t = flow_mimo2.flow_k * msgidset.content2 / 100;
  431. if(tem_32t >= 500 && tem_32t <= 20000)
  432. {
  433. flow_mimo2.flow_calk = tem_32t;
  434. }
  435. else{
  436. flow_mimo2.flow_calk = 10000;
  437. }
  438. flow_mimo2.set_k = true;
  439. }
  440. else if(Dev.Flow.facid == FAC_QIFEI_SIG || Dev.Flow.facid == FAC_QIFEI_DOU)
  441. {
  442. tem_32t = flow_inf.ch2.k * msgidset.content2 / 100;
  443. if(tem_32t >= 500 && tem_32t <= 20000)
  444. {
  445. flow_inf.ch2.cal_k = tem_32t;
  446. }
  447. else{
  448. flow_inf.ch2.cal_k = 10000;
  449. }
  450. flow_inf.ch1.set_k = true;;
  451. }
  452. }
  453. break;
  454. case MSGID_SET_FLOW_BACKGROUND:
  455. if(Dev.Flow.facid == FAC_MIMO_SIG)
  456. {
  457. flow_inf.ch1.clear_background = true;
  458. }
  459. if(Dev.Flow.facid == FAC_MIMO_DOU)
  460. {
  461. flow_inf.ch1.clear_background = true;
  462. flow_inf.ch2.clear_background = true;
  463. }
  464. break;
  465. case MSGID_SET_WEIGHT_K:
  466. weight_order.type = Weight_Set_K;
  467. weight_order.order_con1 = msgidset.content1;
  468. weight_order.order_con2 = msgidset.content2;
  469. break;
  470. case MSGID_SET_SEED_OUT_TYPE:
  471. recv_fmu_seed_info = true;
  472. spread_par.output_mode = msgidset.content1;
  473. pmu_set_ack(_MSGID_SET,MSGID_SET_SEED_OUT_TYPE,0,0);
  474. break;
  475. case MSGID_SET_SEED_CAL_TYPE:
  476. switch (msgidset.content1)
  477. {
  478. case Cal_Remove_Peel:
  479. weight_order.type = Weight_Peer;
  480. break;
  481. case Cal_Weight:
  482. weight_order.type = Weight_Kg;
  483. weight_order.order_con2 = msgidset.content2;
  484. break;
  485. case Cal_Seed_Back:
  486. weight_order.type = Weight_Bcak;
  487. break;
  488. default:
  489. break;
  490. }
  491. break;
  492. case MSGID_SET_WEIGHT_MODE:
  493. weight_order.type = Weight_Mode;
  494. weight_order.order_con1 = msgidset.content1;
  495. break;
  496. case MSGID_SET_MAX_RATE:
  497. weight_order.type = Weight_Drug_Rate;
  498. weight_order.order_con1 = msgidset.content1;
  499. break;
  500. case MSGID_SET_PMU_SERIAL:
  501. tem_32t = msgidset.content1 + ((msgidset.content2 << 16) & 0xffff0000);
  502. if(cur_par.pmu_serial == PMU_SERIAL || tem_32t == PMU_SERIAL)
  503. {
  504. stor_par.pmu_serial = tem_32t;
  505. write_flash_flag = true;
  506. pmu_set_ack(_MSGID_SET,MSGID_SET_PMU_SERIAL,0,0);
  507. dev_pmu.send_times += 5;
  508. }
  509. else if(tem_32t == cur_par.pmu_serial)
  510. {
  511. pmu_set_ack(_MSGID_SET,MSGID_SET_PMU_SERIAL,0,0);
  512. }
  513. break;
  514. case MSGID_SET_RADAR_FB:
  515. {
  516. uint8_t can_buf[8] = {0};
  517. if(msgidset.content1 == 0x11)
  518. {
  519. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X03,0X01,0X65,0X00);
  520. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  521. }
  522. else if (msgidset.content1 == 0x12)
  523. {
  524. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X03,0X02,0X66,0X00);
  525. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  526. }
  527. else if(msgidset.content1 == 0x100)
  528. {
  529. put_date_to_can(can_buf,0x55,0XAA,0X03,0X61,0X00,0X03,0X64,0X00);
  530. Can_Send_Msg_Func(CANID1, can_buf, 7, 0xFA, CAN_ID_STD);
  531. }
  532. }
  533. break;
  534. case MSGID_SET_LACKLOSS_CAL:
  535. {
  536. uint8_t can_buf[8] = {0};
  537. if(Dev.Lackloss_Link.connect_status == COMP_NORMAL)
  538. {
  539. put_date_to_can(can_buf,0xFA,0x03,0x00,0xB2,0XE1,0x00,0X00,0X00);
  540. can_buf[7] = (can_buf[1]+can_buf[2]+can_buf[3]+can_buf[4]+can_buf[5]+can_buf[6]) & 0xff;
  541. Can_Send_Msg_Func(CANID2, can_buf, 8, 0xFA, CAN_ID_STD);
  542. }
  543. }
  544. break;
  545. case MSGID_SET_PNCANID:
  546. set_eftdev_canid_flag = true;
  547. set_eftdev_canid_time = HAL_GetTick();
  548. pmu_set_ack(_MSGID_SET,1,0,0);
  549. break;
  550. case MSGID_SET_RESIWIRE_BLOWN:
  551. {
  552. uint8_t can_buf[8] = {0};
  553. put_date_to_can(can_buf,0xF7,fcu_protocol.payload[7],0x00,0x00,0x00,0xF1,0XF3,0X00);
  554. Can_Send_Msg_Func(CANID2, can_buf, 8, 0x88BB, CAN_ID_EXT);
  555. }
  556. break;
  557. default:
  558. break;
  559. }
  560. break;
  561. case _MSGID_SHA1:
  562. //智能电池秘钥
  563. if(fcu_protocol.payload[6] == 1)
  564. {
  565. //有秘钥
  566. if(fcu_protocol.payload[7] == 2 && fcu_protocol.payload[8] == 1)
  567. {
  568. if(start_msg.key_info_checking == true)
  569. {
  570. memcpy(&start_msg.key_data[0],&fcu_protocol.payload[9],20);
  571. start_msg.key_to_bms = true;//给电池发送秘钥
  572. start_msg.key_info_checking = false;
  573. }
  574. }
  575. //无秘钥
  576. else if(fcu_protocol.payload[7] == 2 && fcu_protocol.payload[8] == 2)
  577. {
  578. start_msg.key_info_checking = false;
  579. }
  580. //回馈,防止PMU一直发
  581. else if(fcu_protocol.payload[7] == 3 || fcu_protocol.payload[7] == 4)
  582. {
  583. start_msg.key_info_checking = false;
  584. }
  585. }
  586. break;
  587. case _MSGID_HEART:
  588. pmu_heart_flag = true;
  589. //pmu_set_ack(_MSGID_HEART,0x56,0,0);
  590. break;
  591. //升级固件标志
  592. case _MSGID_UPDATA:
  593. {
  594. __disable_irq();
  595. HAL_FLASH_Unlock();
  596. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
  597. FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  598. uint32_t sector = 10;
  599. sector = GetSectorFromAddress(FLASH_UPDATE_ADDR);//获取地址所在的扇区
  600. FLASH_Erase_Sector(sector,FLASH_VOLTAGE_RANGE_3);//擦除指定的闪存扇区(0~11)
  601. uint16_t TempBuf = 0xABCD;
  602. HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_UPDATE_ADDR, TempBuf);
  603. HAL_FLASH_Lock();
  604. __enable_irq();
  605. HAL_NVIC_DisableIRQ(USART1_IRQn);
  606. HAL_Delay(100);
  607. //软件复位
  608. HAL_NVIC_SystemReset();
  609. }
  610. break;
  611. default:
  612. break;
  613. }
  614. fcu_protocol.complete_flag = false;
  615. memset(fcu_protocol.payload, 0, MAX_UART_BUF);
  616. }
  617. }
  618. }