UDSService.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. #include "bsp.h"
  2. #include "bsp_custom.h"
  3. #include "osasys.h"
  4. #include "ostask.h"
  5. #include "queue.h"
  6. #include "ps_event_callback.h"
  7. #include "cmisim.h"
  8. #include "cmimm.h"
  9. #include "cmips.h"
  10. #include "sockets.h"
  11. #include "psifevent.h"
  12. #include "ps_lib_api.h"
  13. #include "lwip/netdb.h"
  14. #include <cis_def.h>
  15. #include "debug_log.h"
  16. #include "slpman_ec616.h"
  17. #include "plat_config.h"
  18. #include "ec_tcpip_api.h"
  19. #include "hal_module_adapter.h"
  20. #include "UartTask.h"
  21. #include "MainTask.h"
  22. #include "app.h"
  23. #include "CANTask.h"
  24. #include "UDSService.h"
  25. //
  26. extern UartReadMsgType UartReadMsg;
  27. extern osMutexId_t UartMutex;
  28. void UDS_Service(void);
  29. void UDS_CAN_Update(void);
  30. BOOL UDSClearFotaDownloadRegion(void);
  31. BOOL UDSAskforDownLoadData(void);
  32. extern void appSaveConfigValue(void);
  33. UINT8 UDSService[2];
  34. UINT8 UDSSubService[2];
  35. UINT8 UDSSubServiceActionCode[2];
  36. UINT8 UDSSwitch = 0;
  37. UINT8 UDSDialogMode = 0;
  38. UINT8 UDSBattSN[BATT_SN_LEN];
  39. UINT16 updateDifferDataByteLen = 0;
  40. //each package means 100 bytes, max PackageCounter = updateDifferDataByteLen%100 + 1
  41. UINT16 updateDifferDataPackageCounter = 0;
  42. //each slice means 4 bytes, max SliceCounter = 25;
  43. UINT16 updateDifferDataSliceCounter = 0;
  44. UINT8 updateDataBuffer[100];
  45. extern UINT8 BattSN[BATT_SN_LEN];
  46. void UDS_Service()
  47. {
  48. UINT8 i,j,k = 0;
  49. INT8 ret = 0;
  50. BOOL boolRet = false;
  51. static UINT8 snFlag = 0;
  52. static UINT32 sliceCounterFlag = 0;
  53. UINT16 tempSliceCounter=0;
  54. static UINT8 counter=0;
  55. CAN_Msg_Type UDSAnswer ={0};
  56. static UINT8 battInfo[8*14] = {0};
  57. //UartReadMsg Uart_Recv_Msg;
  58. //UINT8 temp00[94] ={0x00,0x0E,0x00,0x05,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x0D,0x7A,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x0E,0x42,0x0D,0xDE,0x0D,0xDE,0x0D,0xDE,0x13,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x24,0x00,0x26,0x00,0x22,0x00,0x24,0x00,0x00,0x00,0x00,0x6e,0x78,0x00,0x00,0x00,0x00,0x00,0x5F,0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x74,0x0E,0x42,0x0D,0x7A,0x00,0x00};
  59. //MEMCPY(battInfo, temp00, 94);
  60. //while(true)
  61. //{
  62. //if(UDSSwitch == 1)
  63. {
  64. for(i=0; i<2; i++)
  65. {
  66. if(CanRxMsg[i].Id == 0x7A0)
  67. {
  68. switch (UDSService[i])
  69. {
  70. case 0x10:
  71. if(UDSSubService[i] == 0x01)
  72. {
  73. if(UDSDialogMode == 0x01 || UDSDialogMode==0x02)
  74. {
  75. UDSAnswer.Id = 0x7A8;
  76. UDSAnswer.DLC = 8;
  77. UDSAnswer.Data[0] = 0x04;
  78. UDSAnswer.Data[1] = 0x78;
  79. UDSAnswer.Data[2] = UDSService[i];
  80. UDSAnswer.Data[3] = UDSSubService[i];
  81. UDSAnswer.Data[4] = 0x00;
  82. UDSAnswer.Data[5] = 0x00;
  83. UDSAnswer.Data[6] = 0x00;
  84. UDSAnswer.Data[7] = 0x00;
  85. ret = HAL_Can_Transmit(UDSAnswer);
  86. UDSSwitch = 0;
  87. UDSDialogMode = 1;
  88. }
  89. else
  90. {
  91. UDSAnswer.Id = 0x7A8;
  92. UDSAnswer.DLC = 8;
  93. UDSAnswer.Data[0] = 0x05;
  94. UDSAnswer.Data[1] = 0x7F;
  95. UDSAnswer.Data[2] = UDSService[i];
  96. UDSAnswer.Data[3] = UDSSubService[i];
  97. UDSAnswer.Data[4] = 0xFF;
  98. UDSAnswer.Data[5] = 0x00;
  99. UDSAnswer.Data[6] = 0x00;
  100. UDSAnswer.Data[7] = 0x00;
  101. ret = HAL_Can_Transmit(UDSAnswer);
  102. }
  103. }
  104. else if(UDSSubService[i] == 0x02)
  105. {
  106. UDSAnswer.Id = 0x7A8;
  107. UDSAnswer.DLC = 8;
  108. UDSAnswer.Data[0] = 0x04;
  109. UDSAnswer.Data[1] = 0x78;
  110. UDSAnswer.Data[2] = UDSService[i];
  111. UDSAnswer.Data[3] = UDSSubService[i];
  112. UDSAnswer.Data[4] = 0x00;
  113. UDSAnswer.Data[5] = 0x00;
  114. UDSAnswer.Data[6] = 0x00;
  115. UDSAnswer.Data[7] = 0x00;
  116. UDSSwitch = 1;
  117. UDSDialogMode = 2;
  118. ret = HAL_Can_Transmit(UDSAnswer);
  119. }
  120. else if(UDSSubService[i] == 0x03)
  121. {
  122. if(UDSSwitch == 1)
  123. {
  124. UDSAnswer.Id = 0x7A8;
  125. UDSAnswer.DLC = 8;
  126. UDSAnswer.Data[0] = 0x04;
  127. UDSAnswer.Data[1] = 0x78;
  128. UDSAnswer.Data[2] = UDSService[i];
  129. UDSAnswer.Data[3] = UDSSubService[i];
  130. UDSAnswer.Data[4] = 0x00;
  131. UDSAnswer.Data[5] = 0x00;
  132. UDSAnswer.Data[6] = 0x00;
  133. UDSAnswer.Data[7] = 0x00;
  134. ret = HAL_Can_Transmit(UDSAnswer);
  135. UDSSwitch = 1;
  136. UDSDialogMode = 3;
  137. }
  138. else
  139. {
  140. UDSAnswer.Id = 0x7A8;
  141. UDSAnswer.DLC = 8;
  142. UDSAnswer.Data[0] = 0x05;
  143. UDSAnswer.Data[1] = 0x7F;
  144. UDSAnswer.Data[2] = UDSService[i];
  145. UDSAnswer.Data[3] = UDSSubService[i];
  146. UDSAnswer.Data[4] = 0xFF; //the dialog mode error
  147. UDSAnswer.Data[5] = 0x00;
  148. UDSAnswer.Data[6] = 0x00;
  149. UDSAnswer.Data[7] = 0x00;
  150. ret = HAL_Can_Transmit(UDSAnswer);
  151. }
  152. }
  153. else if(UDSSubService[i] == 0x11) //make NB software reset
  154. {
  155. if(UDSDialogMode = 2)
  156. {
  157. UDSAnswer.Id = 0x7A8;
  158. UDSAnswer.DLC = 8;
  159. UDSAnswer.Data[0] = 0x04;
  160. UDSAnswer.Data[1] = 0x78;
  161. UDSAnswer.Data[2] = UDSService[i];
  162. UDSAnswer.Data[3] = UDSSubService[i];
  163. UDSAnswer.Data[4] = 0x00;
  164. UDSAnswer.Data[5] = 0x00;
  165. UDSAnswer.Data[6] = 0x00;
  166. UDSAnswer.Data[7] = 0x00;
  167. ret = HAL_Can_Transmit(UDSAnswer);
  168. osDelay(100);
  169. appSaveNVMData();
  170. appSetCFUN(0);
  171. osDelay(1000);
  172. EC_SystemReset();
  173. }
  174. else
  175. {
  176. UDSAnswer.Id = 0x7A8;
  177. UDSAnswer.DLC = 8;
  178. UDSAnswer.Data[0] = 0x05;
  179. UDSAnswer.Data[1] = 0x7F;
  180. UDSAnswer.Data[2] = UDSService[i];
  181. UDSAnswer.Data[3] = UDSSubService[i];
  182. UDSAnswer.Data[4] = 0xFF; //the dialog mode error
  183. UDSAnswer.Data[5] = 0x00;
  184. UDSAnswer.Data[6] = 0x00;
  185. UDSAnswer.Data[7] = 0x00;
  186. ret = HAL_Can_Transmit(UDSAnswer);
  187. }
  188. }
  189. else
  190. {
  191. UDSAnswer.Id = 0x7A8;
  192. UDSAnswer.DLC = 8;
  193. UDSAnswer.Data[0] = 0x05;
  194. UDSAnswer.Data[1] = 0x7F;
  195. UDSAnswer.Data[2] = UDSService[i];
  196. UDSAnswer.Data[3] = UDSSubService[i];
  197. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  198. UDSAnswer.Data[5] = 0x00;
  199. UDSAnswer.Data[6] = 0x00;
  200. UDSAnswer.Data[7] = 0x00;
  201. ret = HAL_Can_Transmit(UDSAnswer);
  202. }
  203. break;
  204. case 0x22:
  205. if(UDSDialogMode == 2)
  206. {
  207. if(UDSSubService[i] == 0x01) //check the sw of NB
  208. {
  209. UDSAnswer.Id = 0x7A8;
  210. UDSAnswer.DLC = 8;
  211. UDSAnswer.Data[0] = 0x06;
  212. UDSAnswer.Data[1] = 0x78;
  213. UDSAnswer.Data[2] = UDSService[i];
  214. UDSAnswer.Data[3] = UDSSubService[i];
  215. UDSAnswer.Data[4] = SWVERSION>>8;
  216. UDSAnswer.Data[5] = SWVERSION;
  217. UDSAnswer.Data[6] = 0x00;
  218. UDSAnswer.Data[7] = 0x00;
  219. ret = HAL_Can_Transmit(UDSAnswer);
  220. }
  221. else if(UDSSubService[i] == 0x02) //check the hw of NB
  222. {
  223. UDSAnswer.Id = 0x7A8;
  224. UDSAnswer.DLC = 8;
  225. UDSAnswer.Data[0] = 0x06;
  226. UDSAnswer.Data[1] = 0x78;
  227. UDSAnswer.Data[2] = UDSService[i];
  228. UDSAnswer.Data[3] = UDSSubService[i];
  229. UDSAnswer.Data[4] = HWVERSION>>8;
  230. UDSAnswer.Data[5] = HWVERSION;
  231. UDSAnswer.Data[6] = 0x00;
  232. UDSAnswer.Data[7] = 0x00;
  233. ret = HAL_Can_Transmit(UDSAnswer);
  234. }
  235. else if(UDSSubService[i] == 0x03) //check the SN number
  236. {
  237. UDSAnswer.DLC = 8;
  238. switch(UDSSubServiceActionCode[i])
  239. {
  240. case 00:
  241. UDSAnswer.Id = 0x20;
  242. for(k=0; k<8; k++)
  243. {
  244. UDSAnswer.Data[k] = AppNVMData.battSN[k+8*0];
  245. }
  246. ret = HAL_Can_Transmit(UDSAnswer);
  247. break;
  248. case 01:
  249. UDSAnswer.Id = 0x21;
  250. for(k=0; k<8; k++)
  251. {
  252. UDSAnswer.Data[k] = AppNVMData.battSN[k+8*1];
  253. }
  254. ret = HAL_Can_Transmit(UDSAnswer);
  255. break;
  256. case 02:
  257. UDSAnswer.Id = 0x22;
  258. UDSAnswer.Data[0] = AppNVMData.battSN[16];;
  259. for(k=1; k<8; k++)
  260. {
  261. UDSAnswer.Data[k] = 0x00;
  262. }
  263. ret = HAL_Can_Transmit(UDSAnswer);
  264. break;
  265. default:
  266. break;
  267. }
  268. #ifdef USING_PRINTF
  269. printf("ID = %x\nData = ",UDSAnswer.Id);
  270. for (int ii = 0; ii < 8; ii++)
  271. {
  272. printf("%x ", UDSAnswer.Data[ii]);
  273. }
  274. printf("\n");
  275. #endif
  276. }
  277. else if(UDSSubService[i] == 0x04) //check the batt message
  278. {
  279. /*
  280. if(UDSSubService[i] == 0x00)
  281. {
  282. ret = xQueuePeek(UartReadQueueHandle,&Uart_Recv_Msg,1000);
  283. }
  284. if(ret)
  285. {
  286. //the uart_recv_msg.len = 5+(0x21+CellNum+TempNum)*2 = 5+(33+17+7)*2 = 5+ 114(max);114>112(14*8)
  287. UINT8* p = (UINT8*)Uart_Recv_Msg.dataPtr+3;
  288. MEMCPY(battInfo, p, 14*8);
  289. }
  290. */
  291. osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
  292. if(CanRxMsg[i].Data[2] == 0x00)
  293. {
  294. memcpy(battInfo,UartReadMsg.data,14*8);
  295. #ifdef USING_PRINTF
  296. printf("battInfo=\n");
  297. for(int jj = 0;jj<14*8;jj++)
  298. printf("%x ",battInfo[jj]);
  299. printf("\n");
  300. #endif
  301. }
  302. osMutexRelease(UartMutex);
  303. UDSAnswer.Id = 0x30+UDSSubServiceActionCode[i];
  304. UDSAnswer.DLC = 8;
  305. MEMCPY(UDSAnswer.Data, &(battInfo[UDSSubServiceActionCode[i]*8]),8);
  306. ret = HAL_Can_Transmit(UDSAnswer);
  307. #ifdef USING_PRINTF
  308. printf("ID = %x\nData = ",UDSAnswer.Id);
  309. for (int ij = 0; ij < 8; ij++)
  310. {
  311. printf("%x ", UDSAnswer.Data[ij]);
  312. }
  313. printf("\n");
  314. #endif
  315. }
  316. else if(UDSSubService[i] == 0x05) //check the enviroment temp of NB
  317. {
  318. UDSAnswer.Id = 0x7A8;
  319. UDSAnswer.DLC = 8;
  320. UDSAnswer.Data[0] = 0x08;
  321. UDSAnswer.Data[1] = 0x78;
  322. UDSAnswer.Data[2] = UDSService[i];
  323. UDSAnswer.Data[3] = UDSSubService[i];
  324. UDSAnswer.Data[4] = 0x00;//gNtcDev.NTCvalue[2+NTC_Channel2];
  325. UDSAnswer.Data[5] = 0x00;//gNtcDev.NTCvalue[2+NTC_Channel3];
  326. UDSAnswer.Data[6] = 0x00;//gNtcDev.NTCvalue[2+NTC_Channel4];
  327. UDSAnswer.Data[7] = 0x00;//gNtcDev.NTCvalue[2+NTC_Channel5];
  328. ret = HAL_Can_Transmit(UDSAnswer);
  329. }
  330. else if(UDSSubService[i] == 0x06) //check the tcp link of NB
  331. {
  332. UDSAnswer.Id = 0x7A8;
  333. UDSAnswer.DLC = 8;
  334. UDSAnswer.Data[0] = 0x06;
  335. UDSAnswer.Data[1] = 0x78;
  336. UDSAnswer.Data[2] = UDSService[i];
  337. UDSAnswer.Data[3] = UDSSubService[i];
  338. UDSAnswer.Data[4] = socContext.status;
  339. UDSAnswer.Data[5] = 0x00;
  340. UDSAnswer.Data[6] = 0x00;
  341. UDSAnswer.Data[7] = 0x00;
  342. ret = HAL_Can_Transmit(UDSAnswer);
  343. }
  344. else if(UDSSubService[i] == 0x07) //check the GPS link of NB
  345. {
  346. UDSAnswer.Id = 0x7A8;
  347. UDSAnswer.DLC = 8;
  348. UDSAnswer.Data[0] = 0x05;
  349. UDSAnswer.Data[1] = 0x78;
  350. UDSAnswer.Data[2] = UDSService[i];
  351. UDSAnswer.Data[3] = UDSSubService[i];
  352. UDSAnswer.Data[4] = GpsData[1]; //gps satellite num(uint8), should be modified
  353. UDSAnswer.Data[5] = 0x00;
  354. UDSAnswer.Data[6] = 0x00;
  355. UDSAnswer.Data[7] = 0x00;
  356. ret = HAL_Can_Transmit(UDSAnswer);
  357. }
  358. else
  359. {
  360. UDSAnswer.Id = 0x7A8;
  361. UDSAnswer.DLC = 8;
  362. UDSAnswer.Data[0] = 0x05;
  363. UDSAnswer.Data[1] = 0x7F;
  364. UDSAnswer.Data[2] = UDSService[i];
  365. UDSAnswer.Data[3] = UDSSubService[i];
  366. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  367. UDSAnswer.Data[5] = 0x00;
  368. UDSAnswer.Data[6] = 0x00;
  369. UDSAnswer.Data[7] = 0x00;
  370. ret = HAL_Can_Transmit(UDSAnswer);
  371. }
  372. }
  373. else //当前会话模式错误
  374. {
  375. UDSAnswer.Id = 0x7A8;
  376. UDSAnswer.DLC = 8;
  377. UDSAnswer.Data[0] = 0x05;
  378. UDSAnswer.Data[1] = 0x7F;
  379. UDSAnswer.Data[2] = UDSService[i];
  380. UDSAnswer.Data[3] = UDSSubService[i];
  381. UDSAnswer.Data[4] = 0xFF;
  382. UDSAnswer.Data[5] = 0x00;
  383. UDSAnswer.Data[6] = 0x00;
  384. UDSAnswer.Data[7] = 0x00;
  385. ret = HAL_Can_Transmit(UDSAnswer);
  386. }
  387. break;
  388. case 0x2E:
  389. if(UDSDialogMode == 2)
  390. {
  391. if(UDSSubService[i] == 0x03)
  392. {
  393. if(UDSSubServiceActionCode[i] == 0x00 && snFlag == 0x00)
  394. {
  395. for(j=0; j<5; j++)
  396. {
  397. UDSBattSN[j+5*0] = CanRxMsg[i].Data[j+3];
  398. }
  399. snFlag = snFlag|0x01;
  400. }
  401. else if(UDSSubServiceActionCode[i] == 0x01 && snFlag == 0x01)
  402. {
  403. for(j=0; j<5; j++)
  404. {
  405. UDSBattSN[j+5*1] = CanRxMsg[i].Data[j+3];
  406. }
  407. snFlag = snFlag|0x02;
  408. }
  409. else if(UDSSubServiceActionCode[i] == 0x02 && snFlag == 0x03)
  410. {
  411. for(j=0; j<5; j++)
  412. {
  413. UDSBattSN[j+5*2] = CanRxMsg[i].Data[j+3];
  414. }
  415. snFlag = snFlag|0x04;
  416. }
  417. else if(UDSSubServiceActionCode[i] == 0x03 && snFlag == 0x07)
  418. {
  419. for(j=0; j<2; j++)
  420. {
  421. UDSBattSN[j+5*3] = CanRxMsg[i].Data[j+3];
  422. }
  423. snFlag = snFlag|0x08;
  424. }
  425. if(snFlag == 0x0F)
  426. {
  427. UDSAnswer.Id = 0x7A8;
  428. UDSAnswer.DLC = 8;
  429. UDSAnswer.Data[0] = 0x04;
  430. UDSAnswer.Data[1] = 0x78;
  431. UDSAnswer.Data[2] = UDSService[i];
  432. UDSAnswer.Data[3] = UDSSubService[i];
  433. UDSAnswer.Data[4] = 0x00;
  434. UDSAnswer.Data[5] = 0x00;
  435. UDSAnswer.Data[6] = 0x00;
  436. UDSAnswer.Data[7] = 0x00;
  437. snFlag = 0;
  438. MEMCPY(AppNVMData.battSN, UDSBattSN, BATT_SN_LEN);
  439. }
  440. else
  441. {
  442. UDSAnswer.Id = 0x7A8;
  443. UDSAnswer.DLC = 8;
  444. UDSAnswer.Data[0] = 0x05;
  445. UDSAnswer.Data[1] = 0x3E;
  446. UDSAnswer.Data[2] = UDSService[i];
  447. UDSAnswer.Data[3] = UDSSubService[i];
  448. UDSAnswer.Data[4] = snFlag;
  449. UDSAnswer.Data[5] = 0x00;
  450. UDSAnswer.Data[6] = 0x00;
  451. UDSAnswer.Data[7] = 0x00;
  452. }
  453. ret = HAL_Can_Transmit(UDSAnswer);
  454. }
  455. else
  456. {
  457. UDSAnswer.Id = 0x7A8;
  458. UDSAnswer.DLC = 8;
  459. UDSAnswer.Data[0] = 0x05;
  460. UDSAnswer.Data[1] = 0x7F;
  461. UDSAnswer.Data[2] = UDSService[i];
  462. UDSAnswer.Data[3] = UDSSubService[i];
  463. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  464. UDSAnswer.Data[5] = 0x00;
  465. UDSAnswer.Data[6] = 0x00;
  466. UDSAnswer.Data[7] = 0x00;
  467. ret = HAL_Can_Transmit(UDSAnswer);
  468. }
  469. break;
  470. }
  471. else if(UDSDialogMode==3)
  472. {
  473. if(UDSSubService[i] == 0x0F) //程序更新配置信息写入
  474. {
  475. updateDifferDataByteLen = (CanRxMsg[i].Data[2]<<8)|(CanRxMsg[i].Data[3]);
  476. UDSAnswer.Id = 0x7A8;
  477. UDSAnswer.DLC = 8;
  478. UDSAnswer.Data[0] = 0x04;
  479. UDSAnswer.Data[1] = 0x78;
  480. UDSAnswer.Data[2] = UDSService[i];
  481. UDSAnswer.Data[3] = UDSSubService[i];
  482. UDSAnswer.Data[4] = 0x00;
  483. UDSAnswer.Data[5] = 0x00;
  484. UDSAnswer.Data[6] = 0x00;
  485. UDSAnswer.Data[7] = 0x00;
  486. ret = HAL_Can_Transmit(UDSAnswer);
  487. }
  488. else
  489. {
  490. UDSAnswer.Id = 0x7A8;
  491. UDSAnswer.DLC = 8;
  492. UDSAnswer.Data[0] = 0x05;
  493. UDSAnswer.Data[1] = 0x7F;
  494. UDSAnswer.Data[2] = UDSService[i];
  495. UDSAnswer.Data[3] = UDSSubService[i];
  496. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  497. UDSAnswer.Data[5] = 0x00;
  498. UDSAnswer.Data[6] = 0x00;
  499. UDSAnswer.Data[7] = 0x00;
  500. ret = HAL_Can_Transmit(UDSAnswer);
  501. }
  502. }
  503. else
  504. {
  505. UDSAnswer.Id = 0x7A8;
  506. UDSAnswer.DLC = 8;
  507. UDSAnswer.Data[0] = 0x05;
  508. UDSAnswer.Data[1] = 0x7F;
  509. UDSAnswer.Data[2] = UDSService[i];
  510. UDSAnswer.Data[3] = UDSSubService[i];
  511. UDSAnswer.Data[4] = 0xFF; //the dialog mode error
  512. UDSAnswer.Data[5] = 0x00;
  513. UDSAnswer.Data[6] = 0x00;
  514. UDSAnswer.Data[7] = 0x00;
  515. ret = HAL_Can_Transmit(UDSAnswer);
  516. }
  517. break;
  518. case 0x31:
  519. if(UDSDialogMode == 3)
  520. {
  521. if(UDSSubService[i] == 0x0F)
  522. {
  523. if(UDSSubServiceActionCode[i] == 0x01)
  524. {
  525. //Clear the Flash
  526. boolRet = UDSClearFotaDownloadRegion();
  527. //if ok
  528. UDSAnswer.Id = 0x7A8;
  529. UDSAnswer.DLC = 8;
  530. UDSAnswer.Data[0] = 0x05;
  531. UDSAnswer.Data[1] = 0x78;
  532. UDSAnswer.Data[2] = UDSService[i];
  533. UDSAnswer.Data[3] = UDSSubService[i];
  534. UDSAnswer.Data[4] = (UINT8)boolRet; // true:01, false: 00
  535. UDSAnswer.Data[5] = 0x00;
  536. UDSAnswer.Data[6] = 0x00;
  537. UDSAnswer.Data[7] = 0x00;
  538. ret = HAL_Can_Transmit(UDSAnswer);
  539. }
  540. else
  541. {
  542. UDSAnswer.Id = 0x7A8;
  543. UDSAnswer.DLC = 8;
  544. UDSAnswer.Data[0] = 0x06;
  545. UDSAnswer.Data[1] = 0x7F;
  546. UDSAnswer.Data[2] = UDSService[i];
  547. UDSAnswer.Data[3] = UDSSubService[i];
  548. UDSAnswer.Data[4] = UDSSubServiceActionCode[i];
  549. UDSAnswer.Data[5] = 0xFF; //the uds subservice action code is not surpported
  550. UDSAnswer.Data[6] = 0x00;
  551. UDSAnswer.Data[7] = 0x00;
  552. ret = HAL_Can_Transmit(UDSAnswer);
  553. }
  554. }
  555. else
  556. {
  557. UDSAnswer.Id = 0x7A8;
  558. UDSAnswer.DLC = 8;
  559. UDSAnswer.Data[0] = 0x05;
  560. UDSAnswer.Data[1] = 0x7F;
  561. UDSAnswer.Data[2] = UDSService[i];
  562. UDSAnswer.Data[3] = UDSSubService[i];
  563. UDSAnswer.Data[4] = 0xEE; //the sub service is not surpported
  564. UDSAnswer.Data[5] = 0x00;
  565. UDSAnswer.Data[6] = 0x00;
  566. UDSAnswer.Data[7] = 0x00;
  567. ret = HAL_Can_Transmit(UDSAnswer);
  568. }
  569. }
  570. else
  571. {
  572. UDSAnswer.Id = 0x7A8;
  573. UDSAnswer.DLC = 8;
  574. UDSAnswer.Data[0] = 0x05;
  575. UDSAnswer.Data[1] = 0x7F;
  576. UDSAnswer.Data[2] = UDSService[i];
  577. UDSAnswer.Data[3] = UDSSubService[i];
  578. UDSAnswer.Data[4] = 0xFF; //the dialog mode error
  579. UDSAnswer.Data[5] = 0x00;
  580. UDSAnswer.Data[6] = 0x00;
  581. UDSAnswer.Data[7] = 0x00;
  582. ret = HAL_Can_Transmit(UDSAnswer);
  583. }
  584. break;
  585. case 0x34: //ask for download update data
  586. if(UDSDialogMode == 3)
  587. {
  588. if(UDSSubService[i] == 0x0F)
  589. {
  590. //ask for download the update data
  591. boolRet = UDSAskforDownLoadData();
  592. //if ok
  593. UDSAnswer.Id = 0x7A8;
  594. UDSAnswer.DLC = 8;
  595. UDSAnswer.Data[0] = 0x05;
  596. UDSAnswer.Data[1] = 0x78;
  597. UDSAnswer.Data[2] = UDSService[i];
  598. UDSAnswer.Data[3] = UDSSubService[i];
  599. UDSAnswer.Data[4] = (UINT8)boolRet; // true:01, false: 00
  600. UDSAnswer.Data[5] = 0x00;
  601. UDSAnswer.Data[6] = 0x00;
  602. UDSAnswer.Data[7] = 0x00;
  603. ret = HAL_Can_Transmit(UDSAnswer);
  604. }
  605. else
  606. {
  607. UDSAnswer.Id = 0x7A8;
  608. UDSAnswer.DLC = 8;
  609. UDSAnswer.Data[0] = 0x05;
  610. UDSAnswer.Data[1] = 0x7F;
  611. UDSAnswer.Data[2] = UDSService[i];
  612. UDSAnswer.Data[3] = UDSSubService[i];
  613. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  614. UDSAnswer.Data[5] = 0x00;
  615. UDSAnswer.Data[6] = 0x00;
  616. UDSAnswer.Data[7] = 0x00;
  617. ret = HAL_Can_Transmit(UDSAnswer);
  618. }
  619. }
  620. else
  621. {
  622. UDSAnswer.Id = 0x7A8;
  623. UDSAnswer.DLC = 8;
  624. UDSAnswer.Data[0] = 0x05;
  625. UDSAnswer.Data[1] = 0x7F;
  626. UDSAnswer.Data[2] = UDSService[i];
  627. UDSAnswer.Data[3] = UDSSubService[i];
  628. UDSAnswer.Data[4] = 0xFF; //the dialog mode error
  629. UDSAnswer.Data[5] = 0x00;
  630. UDSAnswer.Data[6] = 0x00;
  631. UDSAnswer.Data[7] = 0x00;
  632. ret = HAL_Can_Transmit(UDSAnswer);
  633. }
  634. break;
  635. case 0x36: //download the update data
  636. if(UDSSubService[i] == 0x0F)
  637. {
  638. counter++; //记录报文数量
  639. tempSliceCounter = (CanRxMsg[i].Data[2]<<8)|(CanRxMsg[i].Data[3]);
  640. printf("tempSliceCounter = %x\n",tempSliceCounter);
  641. // updateDifferDataByteLen
  642. if(tempSliceCounter < (updateDifferDataPackageCounter+1)*25 && tempSliceCounter>=updateDifferDataPackageCounter*25)
  643. {
  644. updateDifferDataSliceCounter = tempSliceCounter % 25;
  645. for(j=0;j<4;j++)
  646. {
  647. updateDataBuffer[updateDifferDataSliceCounter*4+j] = CanRxMsg[i].Data[4+j];
  648. }
  649. if(updateDifferDataSliceCounter>0)
  650. {
  651. sliceCounterFlag = sliceCounterFlag |(0x01<<updateDifferDataSliceCounter);
  652. }
  653. else
  654. {
  655. sliceCounterFlag = sliceCounterFlag |0x01;
  656. }
  657. printf("sliceCounterFlag = %x\n",sliceCounterFlag);
  658. }
  659. if(counter == 25)
  660. {
  661. counter = 0;
  662. if(sliceCounterFlag == 0x1FFFFFF)
  663. {
  664. UDSAnswer.Id = 0x7A8;
  665. UDSAnswer.DLC = 8;
  666. UDSAnswer.Data[0] = 0x06;
  667. UDSAnswer.Data[1] = 0x78;
  668. UDSAnswer.Data[2] = UDSService[i];
  669. UDSAnswer.Data[3] = UDSSubService[i];
  670. UDSAnswer.Data[4] = tempSliceCounter>>8;
  671. UDSAnswer.Data[5] = tempSliceCounter;
  672. UDSAnswer.Data[6] = 0x00;
  673. UDSAnswer.Data[7] = 0x00;
  674. ret = HAL_Can_Transmit(UDSAnswer);
  675. sliceCounterFlag = 0x0;
  676. updateDifferDataPackageCounter++;
  677. printf("updateDifferDataPackageCounter = %d\n",updateDifferDataPackageCounter);
  678. printf("updateDataBuffer\n");
  679. for(k=0;k<100;k++)
  680. {
  681. printf("%x ",updateDataBuffer[k]);
  682. }
  683. //BSP_QSPI_Write_Safe(updateDataBuffer,FLASH_FOTA_REGION_START+(updateDifferDataPackageCounter-1)*100,100);
  684. printf("startAddr = 0x%x,endAddr = 0x%x\n",
  685. FLASH_FOTA_REGION_START+(updateDifferDataPackageCounter-1)*100,FLASH_FOTA_REGION_START+updateDifferDataPackageCounter*100-1);
  686. memset(updateDataBuffer,0, 100);
  687. }
  688. else
  689. {
  690. UDSAnswer.Id = 0x7A8;
  691. UDSAnswer.DLC = 8;
  692. UDSAnswer.Data[0] = 0x08;
  693. UDSAnswer.Data[1] = 0x7F;
  694. UDSAnswer.Data[2] = UDSService[i];
  695. UDSAnswer.Data[3] = UDSSubService[i];
  696. UDSAnswer.Data[4] = sliceCounterFlag>>24;
  697. UDSAnswer.Data[5] = sliceCounterFlag>>16;
  698. UDSAnswer.Data[6] = sliceCounterFlag>>8;
  699. UDSAnswer.Data[7] = sliceCounterFlag;
  700. ret = HAL_Can_Transmit(UDSAnswer);
  701. printf("updateDataBuffer\n");
  702. for(k=0;k<100;k++)
  703. {
  704. printf("%x ",updateDataBuffer[k]);
  705. }
  706. }
  707. }
  708. }
  709. else
  710. {
  711. UDSAnswer.Id = 0x7A8;
  712. UDSAnswer.DLC = 8;
  713. UDSAnswer.Data[0] = 0x05;
  714. UDSAnswer.Data[1] = 0x7F;
  715. UDSAnswer.Data[2] = UDSService[i];
  716. UDSAnswer.Data[3] = UDSSubService[i];
  717. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  718. UDSAnswer.Data[5] = 0x00;
  719. UDSAnswer.Data[6] = 0x00;
  720. UDSAnswer.Data[7] = 0x00;
  721. ret = HAL_Can_Transmit(UDSAnswer);
  722. }
  723. break;
  724. case 0x37: // exit the download
  725. if(UDSSubService[i] == 0x0F)
  726. {
  727. //
  728. }
  729. else
  730. {
  731. UDSAnswer.Id = 0x7A8;
  732. UDSAnswer.DLC = 8;
  733. UDSAnswer.Data[0] = 0x05;
  734. UDSAnswer.Data[1] = 0x7F;
  735. UDSAnswer.Data[2] = UDSService[i];
  736. UDSAnswer.Data[3] = UDSSubService[i];
  737. UDSAnswer.Data[4] = 0xEE; //the sub service is not surported
  738. UDSAnswer.Data[5] = 0x00;
  739. UDSAnswer.Data[6] = 0x00;
  740. UDSAnswer.Data[7] = 0x00;
  741. ret = HAL_Can_Transmit(UDSAnswer);
  742. }
  743. break;
  744. default:
  745. UDSAnswer.Id = 0x7A8;
  746. UDSAnswer.DLC = 8;
  747. UDSAnswer.Data[0] = 0x04;
  748. UDSAnswer.Data[1] = 0x7F;
  749. UDSAnswer.Data[2] = UDSService[i]; //the serviece is not surpoted
  750. UDSAnswer.Data[3] = 0xFF;
  751. UDSAnswer.Data[4] = 0x00;
  752. UDSAnswer.Data[5] = 0x00;
  753. UDSAnswer.Data[6] = 0x00;
  754. UDSAnswer.Data[7] = 0x00;
  755. ret = HAL_Can_Transmit(UDSAnswer);
  756. break;
  757. }
  758. }
  759. }
  760. }
  761. //}
  762. for(i=0; i<2; i++)
  763. {
  764. UDSService[i] = 0;
  765. UDSSubService[i] = 0;
  766. }
  767. }
  768. void UDS_CAN_Update()
  769. {
  770. }
  771. BOOL UDSClearFotaDownloadRegion()
  772. {
  773. return TRUE;
  774. }
  775. BOOL UDSAskforDownLoadData()
  776. {
  777. return TRUE;
  778. }