MainTask.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. /****************************************************************************
  2. *
  3. * Copy right: Qx.
  4. * File name: MainTask.c
  5. * Description: APP任务调取和异常处理
  6. * History: 2021-03-05
  7. * PS:主线程里面关闭了网络为了测试睡眠和唤醒
  8. ****************************************************************************/
  9. #include "bsp.h"
  10. #include "bsp_custom.h"
  11. #include "osasys.h"
  12. #include "ostask.h"
  13. #include "queue.h"
  14. #include "ps_event_callback.h"
  15. #include "cmisim.h"
  16. #include "cmimm.h"
  17. #include "cmips.h"
  18. #include "sockets.h"
  19. #include "psifevent.h"
  20. #include "ps_lib_api.h"
  21. #include "lwip/netdb.h"
  22. //#include <cis_def.h>
  23. #include "debug_log.h"
  24. #include "slpman_ec616.h"
  25. #include "plat_config.h"
  26. #include "ec_tcpip_api.h"
  27. #include "hal_module_adapter.h"
  28. #include "timers.h"
  29. #include "app.h"
  30. #include "MainTask.h"
  31. #include "TcpTask.h"
  32. #include "Fota.h"
  33. #include "UartTask.h"
  34. #include "sensor.h"
  35. #include "Signal.h"
  36. extern UINT8 UDSSwitch;
  37. extern volatile bool NB_Fota_update_flag;
  38. extern volatile bool BMS_Fota_update_flag;
  39. CHAR defaultBattSN[BATT_SN_LEN] = "RLTEST00000000001";//未进行下线检测的默认SN
  40. //全局变量
  41. UINT32 Timer_count;//每100ms加1
  42. volatile BOOL Sleep_flag = false;//睡眠标志位
  43. extern UINT32 TcpService;
  44. extern UINT8 BattChrgEndFlag;
  45. AppConfigHeader AppConfigHr; //4 bytes
  46. AppNVMDataType AppNVMData;
  47. AppDataHeader AppDataHr;
  48. AppDataBody AppDataInfo;
  49. //主线程堆栈声明区
  50. static StaticTask_t gProcess_Main_Task_t;
  51. static UINT8 gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
  52. static osThreadId_t MainTaskId = NULL;
  53. uint8_t MainSlpHandler = 0xff;//主线程睡眠句柄
  54. uint8_t deepslpTimerID = DEEPSLP_TIMER_ID7;//睡眠定时器ID
  55. static volatile bool Work_timer_end = false;
  56. static process_Main gProcess_Main_Task;
  57. #define PROC_MAIN_STATE_SWITCH(a) (gProcess_Main_Task = a)
  58. extern void GsensorInit(void);
  59. extern void GsensorI2CHandler(ARM_I2C_SignalEvent_t cb_event);
  60. extern void GsensorI2CCallback(UINT32 event);
  61. //函数声明区
  62. static void appBeforeHib(void *pdata, slpManLpState state);
  63. static void appAfterHib(void *pdata, slpManLpState state);
  64. static void appBeforeSlp1(void *pdata, slpManLpState state);
  65. static void appAfterSlp1(void *pdata, slpManLpState state);
  66. static void appBeforeSlp2(void *pdata, slpManLpState state);
  67. static void appAfterSlp2(void *pdata, slpManLpState state);
  68. void montior_timer_callback(TimerHandle_t xTimer);
  69. void work_timer_callback(TimerHandle_t xTimer);
  70. static void setDefaultAppDataValue(void);
  71. void appLoadConfig(void);
  72. void appSaveConfig(void);
  73. static void appGetNVMSavedData(void);
  74. void appSaveNVMData(void);
  75. static void setDefaultAppDataInfo(void);
  76. static void LoadAppDataInfo(void);
  77. static void appSaveDataInfo(void);
  78. //主线程任务区
  79. static void MainTask(void* arg)
  80. {
  81. GsensorI2CHandler(GsensorI2CCallback);
  82. GsensorInit();
  83. int32_t inParam = 0xAABBCCDD;
  84. UINT32 param;
  85. UINT32 adcValue;
  86. UINT8 i=0;
  87. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  88. slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
  89. slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP1_STATE);
  90. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  91. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  92. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  93. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  94. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  95. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  96. slpManSlpState_t slpstate = slpManGetLastSlpState();
  97. TimerHandle_t montior_timer = NULL;
  98. TimerHandle_t work_timer = NULL;
  99. slpManWakeSrc_e Wakeup_source;
  100. Wakeup_source = slpManGetWakeupSrc();//获取唤醒源
  101. #ifdef USING_PRINTF1
  102. printf("Wakeup_source:%d \n",Wakeup_source);
  103. #endif
  104. #ifdef DEBUGLOG
  105. Debug_printf("Wkp-%d \n",Wakeup_source);
  106. #endif
  107. appGetNVMSavedData();
  108. LoadAppDataInfo();
  109. #ifdef USING_PRINTF1
  110. UINT8 *pReadAppConfig;
  111. UINT32 readCount;
  112. //AppConfigHeader AppConfigHr;
  113. OSAFILE file;
  114. file = OsaFopen(APP_CONFIG_FILE_NAME,"rb");
  115. OsaFseek(file, 0, SEEK_SET);
  116. pReadAppConfig = OsaAllocZeroMemory(AppConfigHr.fileBodySize+4);
  117. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize+4, 1, file);
  118. printf("AppConfigHr.fileBodySize+4 = %d\n",AppConfigHr.fileBodySize+4);
  119. printf("readCount = %d\n",readCount);
  120. printf("the config data = \n");
  121. for (int i ;i<AppConfigHr.fileBodySize+4;i++)
  122. printf("%d ",*(pReadAppConfig+i));
  123. printf("\n");
  124. #endif
  125. #ifdef USING_PRINTF1
  126. UINT8 *pReadAppData;
  127. UINT32 readCount;
  128. //AppConfigHeader AppConfigHr;
  129. OSAFILE file;
  130. file = OsaFopen(APP_DATAINFO_FILE_NAME,"rb");
  131. OsaFseek(file, 0, SEEK_SET);
  132. pReadAppData = OsaAllocZeroMemory(AppDataHr.fileBodySize+3);
  133. readCount = OsaFread(pReadAppData, AppDataHr.fileBodySize+3, 1, file);
  134. printf("AppDataHr.fileBodySize+3 = %d\n",AppDataHr.fileBodySize+3);
  135. printf("readCount = %d\n",readCount);
  136. printf("the data = ");
  137. for (int i=0 ;i<AppDataHr.fileBodySize+3;i++)
  138. printf("%x(%d) ",*(pReadAppData+i),i);
  139. printf("\n");
  140. #endif
  141. if(AppNVMData.AppSwVersion!=APPSWVERSION)
  142. {
  143. AppNVMData.HwVersion = HWVERSION;
  144. AppNVMData.BLSwVersion = BLSWVERSION;
  145. AppNVMData.DrvSwVersion = DRVSWVERSION;
  146. AppNVMData.AppSwVersion = APPSWVERSION;
  147. AppNVMData.appDataModify=TRUE;
  148. }
  149. montior_timer = xTimerCreate("montior_timer", 100 / portTICK_RATE_MS, pdTRUE, NULL, montior_timer_callback);
  150. work_timer = xTimerCreate("work_timer", AppNVMData.wakeupWorkTime*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
  151. /***calibrate the ADC Collect***/
  152. AdcSendReq(ADC_REQ_BITMAP_VBAT_CALI,&param,1,ADC_GET_RESULT_TIMOUT);
  153. AdcSendReq(ADC_REQ_BITMAP_INRES_CALI,&param,1,ADC_GET_RESULT_TIMOUT);
  154. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  155. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  156. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  157. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  158. FaultDisplay(LED_TURN_OFF);
  159. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  160. while(true)
  161. {
  162. switch(gProcess_Main_Task)
  163. {
  164. case PROCESS_STATE_IDLE:
  165. {
  166. Timer_count = 0;
  167. xTimerStart(montior_timer, 0);
  168. xTimerStart(work_timer, 0);
  169. Sleep_flag = false;
  170. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  171. break;
  172. }
  173. case PROCESS_STATE_WORK:
  174. {
  175. if(Error_count>=5 && CanMsgFlag==0)
  176. {
  177. AppDataInfo.appDataModify = true;
  178. AppDataInfo.SysReStart = AppDataInfo.SysReStart +1;
  179. if(AppDataInfo.SysReStart>=0xfffe)
  180. {
  181. AppDataInfo.SysReStart = 0;
  182. }
  183. if(AppNVMData.appDataModify)
  184. {
  185. appSaveNVMData();
  186. }
  187. if(AppDataInfo.appDataModify)
  188. {
  189. appSaveDataInfo();
  190. }
  191. appSetCFUN(0);
  192. osDelay(1000);
  193. EC_SystemReset();
  194. }
  195. WDT_Kick();//喂狗
  196. osDelay(1000);
  197. if(Work_timer_end)
  198. {
  199. xTimerStop(montior_timer, 0);
  200. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
  201. break;
  202. }
  203. else
  204. {
  205. switch (i)
  206. {
  207. case FAST_CHARGE_TEMP:
  208. NB_ADC_Get(&adcValue,FAST_CHARGE_TEMP);
  209. fastChargeTemp = LookUpRTtable(adcValue);
  210. break;
  211. case NORMAL_CHARGE_TEMP:
  212. NB_ADC_Get(&adcValue,NORMAL_CHARGE_TEMP);
  213. normalChargeTemp = LookUpRTtable(adcValue);
  214. break;
  215. case OTHER_TEMP_1:
  216. NB_ADC_Get(&adcValue,OTHER_TEMP_1);
  217. heatTemp1 = LookUpRTtable(adcValue);
  218. break;
  219. case OTHER_TEMP_2:
  220. NB_ADC_Get(&adcValue,OTHER_TEMP_2);
  221. heatTemp2 = LookUpRTtable(adcValue);
  222. break;
  223. case VBAT:
  224. NB_ADC_Get(&adcValue,VBAT);
  225. i = 0;
  226. break;
  227. default:
  228. i=0;
  229. break;
  230. }
  231. i++;
  232. }
  233. #ifdef USING_PRINTF1
  234. printf("TcpService:%d,UDSSwitch:%d,BMS_Fota_update_flag:%d,battWorkState:%d,Can_Msg_Enble:%d\r\n",TcpService,UDSSwitch,BMS_Fota_update_flag,battWorkState,Can_Msg_Enble);
  235. #endif
  236. if(TcpService!=0x00||UDSSwitch==1||BMS_Fota_update_flag||battWorkState!=0||CanMsgFlag==1)
  237. {
  238. xTimerReset(work_timer,0);
  239. }
  240. if(BattChrgEndFlag)
  241. {
  242. xTimerChangePeriod(work_timer,AppNVMData.chargEndWorkTime*60*1000 / portTICK_RATE_MS,0);
  243. xTimerReset(work_timer,0);
  244. }
  245. break;
  246. }
  247. case PROCESS_STATE_SLEEP:
  248. {
  249. Sleep_flag = true;
  250. if(AppNVMData.appDataModify)
  251. {
  252. appSaveNVMData();
  253. }
  254. if(AppDataInfo.appDataModify)
  255. {
  256. appSaveDataInfo();
  257. }
  258. if(NB_Fota_update_flag)
  259. {
  260. appSetCFUN(0);
  261. osDelay(1000);
  262. EC_SystemReset();
  263. }
  264. osDelay(1*1000);
  265. xTimerStop(work_timer, 0);
  266. slpManSlpState_t State;
  267. uint8_t cnt;
  268. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  269. {
  270. #ifdef USING_PRINTF
  271. printf("[%d]We Can Check Vote Main State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  272. #endif
  273. }
  274. slpManPlatVoteForceEnableSleep(MainSlpHandler, SLP_SLP1_STATE);
  275. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  276. {
  277. #ifdef USING_PRINTF
  278. printf("[%d]We Can Check Vote Main State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  279. #endif
  280. }
  281. #ifdef USING_PRINTF
  282. printf("[%d]Waiting sleep\r\n",__LINE__);
  283. #endif
  284. FaultDisplay(LED_TURN_ON);
  285. slpManSlpState_t slpstate = slpManPlatGetSlpState();
  286. #ifdef USING_PRINTF
  287. printf("which slpstate can go now :%d \n",slpstate);
  288. #endif
  289. #ifdef DEBUGLOG
  290. Debug_printf("slp-%d,%d,%d,%d\n",slpstate,AppDataInfo.AccMileage,AppDataInfo.SysReStart,Battdesigncap);
  291. #endif
  292. slpManDeepSlpTimerStart(deepslpTimerID, AppNVMData.sleepTime*1000*60);
  293. UINT8 sleeptime_count=0;
  294. while(1)
  295. {
  296. if(!slpManDeepSlpTimerIsRunning(deepslpTimerID))
  297. slpManDeepSlpTimerDel(deepslpTimerID);
  298. slpManDeepSlpTimerStart(deepslpTimerID, AppNVMData.sleepTime*1000*60);
  299. osDelay(1*60*1000/portTICK_PERIOD_MS);
  300. sleeptime_count++;
  301. #ifdef USING_PRINTF
  302. printf("sleeptime_count :%d \n",sleeptime_count);
  303. #endif
  304. if(sleeptime_count>10)
  305. {
  306. #ifdef DEBUGLOG
  307. Debug_printf("405\n");
  308. #endif
  309. appSetCFUN(0);
  310. osDelay(1000);
  311. EC_SystemReset();
  312. }
  313. }
  314. break;
  315. }
  316. default:
  317. {
  318. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  319. #ifdef USING_PRINTF
  320. printf("default!\n");
  321. #endif
  322. break;
  323. }
  324. }
  325. }
  326. }
  327. void MainTaskInit(void *arg)
  328. {
  329. #ifndef USING_PRINTF
  330. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  331. {
  332. HAL_UART_RecvFlowControl(false);
  333. }
  334. #endif
  335. osThreadAttr_t task_attr;
  336. memset(&task_attr,0,sizeof(task_attr));
  337. memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);
  338. task_attr.name = "Main_Task";
  339. task_attr.stack_mem = gProcess_Main_TaskStack;
  340. task_attr.stack_size = PROC_MAIN_TASK_STACK_SIZE;
  341. task_attr.priority = osPriorityNormal;
  342. task_attr.cb_mem = &gProcess_Main_Task_t;
  343. task_attr.cb_size = sizeof(StaticTask_t);
  344. MainTaskId = osThreadNew(MainTask, NULL, &task_attr);
  345. }
  346. void MainTaskDeInit(void *arg)
  347. {
  348. osThreadTerminate(MainTaskId);
  349. MainTaskId = NULL;
  350. }
  351. //定时器回调函数区
  352. void montior_timer_callback(TimerHandle_t xTimer)
  353. {
  354. #ifdef USING_PRINTF1
  355. if (Timer_count%50==0)
  356. {
  357. printf("Main Task,Batt_Cell_Num:%d,%d!\n",BATT_CELL_VOL_NUM,Timer_count);
  358. }
  359. #endif
  360. Timer_count++;
  361. if(Timer_count>100000*100)
  362. {
  363. Timer_count=0;
  364. }
  365. }
  366. void work_timer_callback(TimerHandle_t xTimer)
  367. {
  368. Work_timer_end = true;
  369. #ifdef USING_PRINTF
  370. printf("Hello work Timer!\n");
  371. #endif
  372. }
  373. //睡眠进出函数区
  374. static void appBeforeHib(void *pdata, slpManLpState state)
  375. {
  376. uint32_t *p_param = (uint32_t *)pdata;
  377. #ifdef USING_PRINTF
  378. printf("Before Hibernate:%d \n",state);
  379. #endif
  380. slpManAONIOLatchEn(AonIOLatch_Enable);
  381. }
  382. static void appAfterHib(void *pdata, slpManLpState state)
  383. {
  384. #ifdef USING_PRINTF
  385. printf("Try Hibernate Failed:%d \n",state);
  386. #endif
  387. }
  388. static void appBeforeSlp1(void *pdata, slpManLpState state)
  389. {
  390. #ifdef USING_PRINTF
  391. printf("Before Sleep1:%d \n",state);
  392. #endif
  393. slpManAONIOLatchEn(AonIOLatch_Enable);
  394. }
  395. static void appAfterSlp1(void *pdata, slpManLpState state)
  396. {
  397. #ifdef USING_PRINTF
  398. printf("After Sleep1:%d \n",state);
  399. #endif
  400. }
  401. static void appBeforeSlp2(void *pdata, slpManLpState state)
  402. {
  403. #ifdef USING_PRINTF
  404. printf("before sleep2:%d \n",state);
  405. #endif
  406. slpManAONIOLatchEn(AonIOLatch_Enable);
  407. }
  408. static void appAfterSlp2(void *pdata, slpManLpState state)
  409. {
  410. #ifdef USING_PRINTF
  411. printf("sleep2 failed:%d \n",state);
  412. #endif
  413. }
  414. static void appGetNVMSavedData(void)
  415. {
  416. appLoadConfig();
  417. }
  418. void appSaveNVMData(void)
  419. {
  420. appSaveConfig();
  421. }
  422. static void appSaveConfig(void)
  423. {
  424. OSAFILE fp = PNULL;
  425. UINT32 writeCount = 0;
  426. AppConfigHeader AppConfigHr; //4 bytes
  427. /*
  428. * open the NVM file
  429. */
  430. fp = OsaFopen(APP_CONFIG_FILE_NAME, "wb"); //read & write
  431. if(OsaFseek(fp, 0, SEEK_SET) != 0)
  432. {
  433. #ifdef USING_PRINTF
  434. printf("Seek file failed [%d] \r\n",__LINE__);
  435. #endif
  436. OsaFclose(fp);
  437. return;
  438. }
  439. if (fp == PNULL)
  440. {
  441. #ifdef USING_PRINTF
  442. printf(" NVM, can't open/create NVM: 'qxappconfig.nvm', save NVM failed\n");
  443. #endif
  444. return;
  445. }
  446. /*
  447. * write the header
  448. */
  449. AppConfigHr.fileBodySize = sizeof(AppNVMData);
  450. AppConfigHr.version = APP_CONFIG_FILE_LATEST_VERSION;
  451. AppConfigHr.checkSum = OsaCalcCrcValue((UINT8 *)&AppNVMData, sizeof(AppNVMData));
  452. writeCount = OsaFwrite(&AppConfigHr, sizeof(AppConfigHeader), 1, fp);
  453. if (writeCount != 1)
  454. {
  455. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppConfigSave_2, P_ERROR, 0,
  456. // " NVM: 'qxappconfig.nvm', write the file header failed");
  457. #ifdef USING_PRINTF
  458. printf(" NVM: 'qxappconfig.nvm', write the file header failed\n");
  459. #endif
  460. OsaFclose(fp);
  461. return;
  462. }
  463. /*
  464. * write the file body
  465. */
  466. AppNVMData.appDataModify = FALSE;
  467. writeCount = OsaFwrite(&AppNVMData, sizeof(AppNVMData), 1, fp);
  468. if (writeCount != 1)
  469. {
  470. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppConfigSave_3, P_ERROR, 0,
  471. // " NVM: 'qxappconfig.nvm', write the file body failed");
  472. #ifdef USING_PRINTF
  473. printf(" NVM: 'qxappconfig.nvm', write the file body failed\n");
  474. #endif
  475. }
  476. OsaFclose(fp);
  477. return;
  478. }
  479. void appLoadConfig(void)
  480. {
  481. OSAFILE fp = PNULL;
  482. UINT32 readCount = 0;
  483. //AppConfigHeader AppConfigHr; //4 bytes
  484. UINT8 crcCheck = 0;
  485. void *pReadAppConfig = (void *)&AppNVMData;
  486. /*
  487. * open the NVM file
  488. */
  489. fp = OsaFopen(APP_CONFIG_FILE_NAME, "rb"); //read only
  490. if (fp == PNULL)
  491. {
  492. #ifdef USING_PRINTF
  493. printf(" NVM, can't open NVM: 'qxappConfig.nvm', use the defult value\n");
  494. #endif
  495. setDefaultAppDataValue();
  496. appSaveConfig();
  497. return;
  498. }
  499. /*
  500. * read the file header
  501. */
  502. readCount = OsaFread(&AppConfigHr, sizeof(AppConfigHeader), 1, fp);
  503. UINT8 readtimes=0;
  504. while (readCount != 1 && readtimes<=5 )
  505. {
  506. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_header_e_1, P_ERROR, 1,
  507. // "NVM: 'qxappconfig.nvm', can't read header, return: %d, use the defult value", readCount);
  508. #ifdef USING_PRINTF
  509. printf("NVM: 'qxappconfig.nvm', can't read header, return: %d, use the defult value \n");
  510. #endif
  511. readtimes++;
  512. readCount = OsaFread(&AppConfigHr, sizeof(AppConfigHeader), 1, fp);
  513. osDelay(10);
  514. }
  515. if(readtimes>5)
  516. {
  517. OsaFclose(fp);
  518. setDefaultAppDataValue();
  519. appSaveConfig();
  520. return;
  521. }
  522. if (AppConfigHr.version != APP_CONFIG_FILE_LATEST_VERSION)
  523. {
  524. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_ver_w_1, P_ERROR, 2,
  525. // "NVM: 'qxappconfig.nvm', version: %d not latest: %d, try to adapt",
  526. // AppConfigHr.version, MID_WARE_NVM_FILE_LATEST_VERSION);
  527. #ifdef USING_PRINTF
  528. printf("NVM: 'qxappconfig.nvm', version: %d not latest: %d, try to adapt\n",
  529. AppConfigHr.version, MID_WARE_NVM_FILE_LATEST_VERSION);
  530. #endif
  531. if (AppConfigHr.fileBodySize > 1024) //in fact this NVM size should limited in 1KB
  532. {
  533. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_ver_e_1, P_ERROR, 2,
  534. // "NVM: 'qxappconfig.nvm', version: %d, NVM body size: %d > 1024, not right, use the default value",
  535. // AppConfigHr.version, AppConfigHr.fileBodySize);
  536. #ifdef USING_PRINTF
  537. printf("NVM: 'qxappconfig.nvm', version: %d, NVM body size: %d > 1024, not right, use the default value",
  538. AppConfigHr.version, AppConfigHr.fileBodySize);
  539. #endif
  540. OsaFclose(fp);
  541. setDefaultAppDataValue();
  542. appSaveConfig();
  543. return;
  544. }
  545. /*
  546. * As need to do adaption, can't read the old NVM into "mwNvmConfig", here we allocate a new buffer to store it
  547. */
  548. pReadAppConfig = OsaAllocZeroMemory(AppConfigHr.fileBodySize);
  549. if (pReadAppConfig == PNULL)
  550. {
  551. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_buff_e_1, P_ERROR, 2,
  552. // "NVM: 'qxappconfig.nvm', version: %d, can not allo memsize: %d, use the default value",
  553. // AppConfigHr.version, AppConfigHr.fileBodySize);
  554. #ifdef USING_PRINTF
  555. printf("NVM: 'qxappconfig.nvm', version: %d, can not allo memsize: %d, use the default value",
  556. AppConfigHr.version, AppConfigHr.fileBodySize);
  557. #endif
  558. OsaFclose(fp);
  559. setDefaultAppDataValue();
  560. appSaveConfig();
  561. return;
  562. }
  563. //needAdjust = TRUE;
  564. }
  565. else if (AppConfigHr.fileBodySize != sizeof(AppNVMData)) //file version is the same, but NVM file size not right
  566. {
  567. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_2, P_ERROR, 2,
  568. // "MW NVM: 'midwareconfig.nvm', file body size not right: (%u/%u), use the defult value",
  569. // AppConfigHr.fileBodySize, sizeof(AppNVMData));
  570. #ifdef USING_PRINTF
  571. printf("MW NVM: 'midwareconfig.nvm', file body size not right: (%u/%u), use the defult value",
  572. AppConfigHr.fileBodySize, sizeof(AppNVMData));
  573. #endif
  574. OsaFclose(fp);
  575. setDefaultAppDataValue();
  576. appSaveConfig();
  577. return;
  578. }
  579. /*
  580. * read the file body
  581. */
  582. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize, 1, fp);
  583. crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  584. readtimes = 0;
  585. //while (readtimes<=5 && crcCheck != AppConfigHr.checkSum)
  586. while (readtimes<=5 && readCount != 1)
  587. {
  588. readtimes++;
  589. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize, 1, fp);
  590. crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  591. }
  592. if (readtimes>5)
  593. {
  594. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_3, P_ERROR, 2,
  595. // "NVM: 'qxappconfig.nvm', can't read body, or body not right, (%u/%u), use the defult value",
  596. // crcCheck, AppConfigHr.checkSum);
  597. #ifdef USING_PRINTF
  598. printf(" NVM: 'qxappconfig.nvm', can't read body, or body not right, (%u/%u), use the defult value\n ",
  599. crcCheck, AppConfigHr.checkSum);
  600. #endif
  601. OsaFclose(fp);
  602. setDefaultAppDataValue();
  603. appSaveConfig();
  604. /*
  605. if (needAdjust)
  606. {
  607. OsaFreeMemory(&pReadAppConfig);
  608. }
  609. */
  610. return;
  611. }
  612. #if 0
  613. if (needAdjust)
  614. {
  615. OsaFclose(fp);
  616. setDefaultAppDataValue();
  617. appSaveConfig();
  618. /* free memory */
  619. OsaFreeMemory(&pReadAppConfig);
  620. }
  621. #endif
  622. #if 0
  623. int i=0;
  624. printf("AppConfigHeader:\n");
  625. printf("%d,%d,%d\n",AppConfigHr.fileBodySize,AppConfigHr.version,AppConfigHr.checkSum);
  626. printf("AppConfigFileBody:\n");
  627. printf("%d,%d,%d\n",AppNVMData.chargEndWorkTime,AppNVMData.wakeupWorkTime,AppNVMData.sleepTime);
  628. printf("\n");
  629. #endif
  630. OsaFclose(fp);
  631. return;
  632. }
  633. //if the AppNVMData.version(read form nvm) != APP_CONFIG_FILE_LATEST_VERSION, it will setDefaultAppDataValue()
  634. //so if you want to modify the default value, please modify the APP_CONFIG_FILE_LATEST_VERSION (in MainTask.h) meanwhile, so that will be store to the nvm file
  635. static void setDefaultAppDataValue(void)
  636. {
  637. UINT8 i = 0;
  638. memset(&AppNVMData, 0x00, sizeof(AppNVMDataType));
  639. for(i=0;i<BATT_SN_LEN;i++)
  640. {
  641. AppNVMData.battSN[i] = defaultBattSN[i]; //the defult sn is "0000..0000"(17 bytes ASCII)
  642. }
  643. AppNVMData.isBattLocked = false;
  644. AppNVMData.chargEndWorkTime = 30; //30 min
  645. AppNVMData.wakeupWorkTime = 2; //2min
  646. AppNVMData.sleepTime = 5; //5min
  647. AppNVMData.HwVersion = HWVERSION;
  648. AppNVMData.BLSwVersion = BLSWVERSION;
  649. AppNVMData.DrvSwVersion = DRVSWVERSION;
  650. AppNVMData.AppSwVersion = APPSWVERSION;
  651. AppNVMData.EOLState = EOLSTATE; //未进行下线配置,北京电池测试默认进行下线测试
  652. return;
  653. }
  654. static void appSaveDataInfo(void)
  655. {
  656. OSAFILE fp = PNULL;
  657. UINT32 writeCount = 0;
  658. fp = OsaFopen(APP_DATAINFO_FILE_NAME, "wb"); //read & write
  659. if(OsaFseek(fp, 0, SEEK_SET) != 0)
  660. {
  661. #ifdef USING_PRINTF
  662. printf("Seek file failed [%d] \r\n",__LINE__);
  663. #endif
  664. OsaFclose(fp);
  665. return;
  666. }
  667. if (fp == PNULL)
  668. {
  669. #ifdef USING_PRINTF
  670. printf(" NVM, can't open/create NVM: 'qxappconfig.nvm', save NVM failed\n");
  671. #endif
  672. return;
  673. }
  674. AppDataHr.fileBodySize = sizeof(AppDataInfo);
  675. AppDataHr.checkSum = OsaCalcCrcValue((UINT8 *)&AppDataInfo, sizeof(AppDataInfo));
  676. #ifdef USING_PRINTF
  677. printf(" AppDataHr.fileBodySize:%x\n",AppDataHr.fileBodySize);
  678. #endif
  679. writeCount = OsaFwrite(&AppDataHr, sizeof(AppDataHr), 1, fp);
  680. if (writeCount != 1)
  681. {
  682. #ifdef USING_PRINTF
  683. printf(" NVM: 'qxappconfig.nvm', write the file header failed\n");
  684. #endif
  685. OsaFclose(fp);
  686. return;
  687. }
  688. AppDataInfo.appDataModify = FALSE;
  689. writeCount = OsaFwrite(&AppDataInfo, sizeof(AppDataInfo), 1, fp);
  690. if (writeCount != 1)
  691. {
  692. #ifdef USING_PRINTF
  693. printf(" NVM: 'qxappconfig.nvm', write the file body failed\n");
  694. #endif
  695. }
  696. OsaFclose(fp);
  697. return;
  698. }
  699. static void LoadAppDataInfo(void)
  700. {
  701. OSAFILE fp = PNULL;
  702. UINT32 readCount = 0;
  703. UINT8 crcCheck = 0;
  704. void *pReadAppConfig = (void *)&AppDataInfo;
  705. fp = OsaFopen(APP_DATAINFO_FILE_NAME, "rb"); //read only
  706. if (fp == PNULL)
  707. {
  708. #ifdef USING_PRINTF
  709. printf(" NVM, can't open NVM: 'qxappData.nvm', use the defult value\n");
  710. #endif
  711. setDefaultAppDataInfo();
  712. appSaveDataInfo();
  713. return;
  714. }
  715. readCount = OsaFread(&AppDataHr, sizeof(AppDataHr), 1, fp);
  716. UINT8 readtimes=0;
  717. while (readCount != 1 && readtimes<=5 )
  718. {
  719. readtimes++;
  720. readCount = OsaFread(&AppDataHr, sizeof(AppDataHr), 1, fp);
  721. osDelay(10);
  722. }
  723. if(readtimes>5)
  724. {
  725. OsaFclose(fp);
  726. setDefaultAppDataInfo();
  727. appSaveDataInfo();
  728. return;
  729. }
  730. if(AppDataHr.fileBodySize==sizeof(AppDataInfo))//结构体数据没变动,可直接读出
  731. {
  732. readCount = OsaFread(pReadAppConfig, AppDataHr.fileBodySize, 1, fp);
  733. //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  734. readtimes = 0;
  735. while (readtimes<=5 && readCount != 1)
  736. {
  737. readtimes++;
  738. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize, 1, fp);
  739. //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  740. }
  741. }
  742. else
  743. {
  744. setDefaultAppDataInfo();
  745. readCount = OsaFread(pReadAppConfig, AppDataHr.fileBodySize, 1, fp);
  746. //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  747. readtimes = 0;
  748. while (readtimes<=5 && readCount != 1)
  749. {
  750. readtimes++;
  751. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize, 1, fp);
  752. //crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, sizeof(AppNVMData));
  753. }
  754. appSaveDataInfo();
  755. #ifdef USING_PRINTF
  756. printf(" Struct update\n");
  757. #endif
  758. }
  759. OsaFclose(fp);
  760. return;
  761. }
  762. //无法找到文件时的第一次启动,后续不会启动此函数
  763. static void setDefaultAppDataInfo(void)
  764. {
  765. memset(&AppDataInfo, 0x00, sizeof(AppDataInfo));
  766. AppDataInfo.appDataModify = false;
  767. AppDataInfo.BmsChrgInfoSendFreq = 5;
  768. AppDataInfo.BmsDisChrgInfoSendFreq = 30;
  769. AppDataInfo.GpsChrgInfoSendFreq = 30;
  770. AppDataInfo.GpsDisChrgInfoSendFreq = 5;
  771. AppDataInfo.BattCurrentNegFlag = 1;
  772. AppDataInfo.CumulativeCapacity = 0;
  773. AppDataInfo.AccMileage = 0;
  774. AppDataInfo.SysReStart = 0;
  775. return;
  776. }