MainTask.c 27 KB

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