MainTask.c 26 KB

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