MainTask.c 26 KB

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