MainTask.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  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. extern volatile bool Fota_update_flag;
  34. CHAR BattSN[BATT_SN_LEN] = "GYTEST00000000003";//SN仍在测试
  35. //全局变量
  36. UINT32 Timer_count;//每100ms加1
  37. volatile bool Sleep_flag = false;//睡眠标志位
  38. extern UINT32 TcpService;
  39. AppNVMDataType AppNVMData;
  40. //主线程堆栈声明区
  41. static StaticTask_t gProcess_Main_Task_t;
  42. static UINT8 gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
  43. static osThreadId_t MainTaskId = NULL;
  44. uint8_t MainSlpHandler = 0xff;//主线程睡眠句柄
  45. uint8_t deepslpTimerID = DEEPSLP_TIMER_ID7;//睡眠定时器ID
  46. volatile bool Work_timer_end = false;
  47. static process_Main gProcess_Main_Task;
  48. #define PROC_MAIN_STATE_SWITCH(a) (gProcess_Main_Task = a)
  49. //函数声明区
  50. static void appBeforeHib(void *pdata, slpManLpState state);
  51. static void appAfterHib(void *pdata, slpManLpState state);
  52. static void appBeforeSlp1(void *pdata, slpManLpState state);
  53. static void appAfterSlp1(void *pdata, slpManLpState state);
  54. static void appBeforeSlp2(void *pdata, slpManLpState state);
  55. static void appAfterSlp2(void *pdata, slpManLpState state);
  56. void montior_timer_callback(TimerHandle_t xTimer);
  57. void work_timer_callback(TimerHandle_t xTimer);
  58. static void setDefaultAppDataValue(void);
  59. void appLoadConfig(void);
  60. void appSaveConfig(void);
  61. static void appGetNVMSavedData(void);
  62. void appSaveNVMData(void);
  63. AppConfigHeader AppConfigHr; //4 bytes
  64. //主线程任务区
  65. static void MainTask(void* arg)
  66. {
  67. int32_t inParam = 0xAABBCCDD;
  68. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  69. slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
  70. slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP1_STATE);
  71. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  72. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  73. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  74. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  75. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  76. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  77. slpManSlpState_t slpstate = slpManGetLastSlpState();
  78. TimerHandle_t montior_timer = NULL;
  79. TimerHandle_t work_timer = NULL;
  80. slpManWakeSrc_e Wakeup_source;
  81. appGetNVMSavedData();
  82. #ifdef USING_PRINTF
  83. UINT8 *pReadAppConfig;
  84. UINT32 readCount;
  85. //AppConfigHeader AppConfigHr;
  86. OSAFILE file;
  87. file = OsaFopen(APP_CONFIG_FILE_NAME,"rb");
  88. OsaFseek(file, 0, SEEK_SET);
  89. pReadAppConfig = OsaAllocZeroMemory(AppConfigHr.fileBodySize+4);
  90. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize+4, 1, file);
  91. printf("AppConfigHr.fileBodySize+4 = %d\n",AppConfigHr.fileBodySize+4);
  92. printf("readCount = %d\n",readCount);
  93. printf("the config data = \n");
  94. for (int i ;i<AppConfigHr.fileBodySize+4;i++)
  95. printf("%d ",*(pReadAppConfig+i));
  96. printf("\n");
  97. #endif
  98. if(AppNVMData.AppSwVersion!=APPSWVERSION)
  99. {
  100. AppNVMData.HwVersion = HWVERSION;
  101. AppNVMData.BLSwVersion = BLSWVERSION;
  102. AppNVMData.DrvSwVersion = DRVSWVERSION;
  103. AppNVMData.AppSwVersion = APPSWVERSION;
  104. AppNVMData.appDataModify=TRUE;
  105. }
  106. montior_timer = xTimerCreate("montior_timer", 100 / portTICK_RATE_MS, pdTRUE, NULL, montior_timer_callback);
  107. work_timer = xTimerCreate("work_timer", AppNVMData.wakeupWorkTime*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
  108. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  109. while(true)
  110. {
  111. switch(gProcess_Main_Task)
  112. {
  113. case PROCESS_STATE_IDLE:
  114. {
  115. Timer_count = 0;
  116. xTimerStart(montior_timer, 0);
  117. xTimerStart(work_timer, 0);
  118. Sleep_flag = false;
  119. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  120. break;
  121. }
  122. case PROCESS_STATE_WORK:
  123. {
  124. osDelay(1000);
  125. if(Work_timer_end)
  126. {
  127. #ifdef USING_PRINTF
  128. printf("Main Task,Work_timer_end!\n");
  129. #endif
  130. xTimerStop(montior_timer, 0);
  131. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_SLEEP);
  132. }
  133. if(TcpService!=0x00)
  134. {
  135. xTimerReset(work_timer,0);
  136. }
  137. break;
  138. }
  139. case PROCESS_STATE_SLEEP:
  140. {
  141. Sleep_flag = true;
  142. if(AppNVMData.appDataModify)
  143. {
  144. appSaveNVMData();
  145. }
  146. osDelay(5000);
  147. if(Fota_update_flag)
  148. {
  149. appSetCFUN(0);
  150. osDelay(1000);
  151. EC_SystemReset();
  152. }
  153. xTimerStop(work_timer, 0);
  154. slpManSlpState_t State;
  155. uint8_t cnt;
  156. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  157. {
  158. #ifdef USING_PRINTF
  159. printf("[%d]We Can Check Vote Main State, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  160. #endif
  161. }
  162. slpManPlatVoteForceEnableSleep(MainSlpHandler, SLP_SLP1_STATE);
  163. if(slpManCheckVoteState(MainSlpHandler, &State, &cnt)==RET_TRUE)
  164. {
  165. #ifdef USING_PRINTF
  166. printf("[%d]We Can Check Vote Main State Again, state=%d, cnt=%d\r\n",__LINE__,State,cnt);
  167. #endif
  168. }
  169. #ifdef USING_PRINTF
  170. printf("[%d]Waiting sleep\r\n",__LINE__);
  171. #endif
  172. FaultDisplay(LED_TURN_ON);
  173. slpManSlpState_t slpstate = slpManPlatGetSlpState();
  174. #ifdef USING_PRINTF
  175. printf("which slpstate can go now :%d \n",slpstate);
  176. #endif
  177. slpManDeepSlpTimerStart(deepslpTimerID, AppNVMData.sleepTime*1000*60);
  178. while(1)
  179. {
  180. osDelay(20*60*1000/portTICK_PERIOD_MS);
  181. break;
  182. }
  183. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  184. break;
  185. }
  186. default:
  187. {
  188. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  189. break;
  190. }
  191. }
  192. }
  193. }
  194. void MainTaskInit(void *arg)
  195. {
  196. #ifndef USING_PRINTF
  197. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  198. {
  199. HAL_UART_RecvFlowControl(false);
  200. }
  201. #endif
  202. osThreadAttr_t task_attr;
  203. memset(&task_attr,0,sizeof(task_attr));
  204. memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);
  205. task_attr.name = "Main_Task";
  206. task_attr.stack_mem = gProcess_Main_TaskStack;
  207. task_attr.stack_size = PROC_MAIN_TASK_STACK_SIZE;
  208. task_attr.priority = osPriorityNormal;
  209. task_attr.cb_mem = &gProcess_Main_Task_t;
  210. task_attr.cb_size = sizeof(StaticTask_t);
  211. MainTaskId = osThreadNew(MainTask, NULL, &task_attr);
  212. }
  213. void MainTaskDeInit(void *arg)
  214. {
  215. osThreadTerminate(MainTaskId);
  216. MainTaskId = NULL;
  217. }
  218. //定时器回调函数区
  219. void montior_timer_callback(TimerHandle_t xTimer)
  220. {
  221. Timer_count++;
  222. if(Timer_count>100000*100)
  223. {
  224. Timer_count=0;
  225. }
  226. }
  227. void work_timer_callback(TimerHandle_t xTimer)
  228. {
  229. Work_timer_end = true;
  230. #ifdef USING_PRINTF
  231. printf("Hello work Timer!\n");
  232. #endif
  233. }
  234. //睡眠进出函数区
  235. static void appBeforeHib(void *pdata, slpManLpState state)
  236. {
  237. uint32_t *p_param = (uint32_t *)pdata;
  238. #ifdef USING_PRINTF
  239. printf("Before Hibernate:%d \n",state);
  240. #endif
  241. slpManAONIOLatchEn(AonIOLatch_Enable);
  242. }
  243. static void appAfterHib(void *pdata, slpManLpState state)
  244. {
  245. #ifdef USING_PRINTF
  246. printf("Try Hibernate Failed:%d \n",state);
  247. #endif
  248. }
  249. static void appBeforeSlp1(void *pdata, slpManLpState state)
  250. {
  251. #ifdef USING_PRINTF
  252. printf("Before Sleep1:%d \n",state);
  253. #endif
  254. slpManAONIOLatchEn(AonIOLatch_Enable);
  255. }
  256. static void appAfterSlp1(void *pdata, slpManLpState state)
  257. {
  258. #ifdef USING_PRINTF
  259. printf("After Sleep1:%d \n",state);
  260. #endif
  261. }
  262. static void appBeforeSlp2(void *pdata, slpManLpState state)
  263. {
  264. #ifdef USING_PRINTF
  265. printf("before sleep2:%d \n",state);
  266. #endif
  267. slpManAONIOLatchEn(AonIOLatch_Enable);
  268. }
  269. static void appAfterSlp2(void *pdata, slpManLpState state)
  270. {
  271. #ifdef USING_PRINTF
  272. printf("sleep2 failed:%d \n",state);
  273. #endif
  274. }
  275. static void appGetNVMSavedData(void)
  276. {
  277. appLoadConfig();
  278. /* IH_appChargEndWorkTime = AppNVMData.chargEndWorkTime;
  279. IH_appWakeupWorkTime=AppNVMData.wakeupWorkTime;
  280. IH_appSleepTime = AppNVMData.sleepTime;
  281. IH_isBattLocked = AppNVMData.isBattLocked;
  282. MEMCPY(&BattSN, AppNVMData.battSN, BATT_SN_LEN);
  283. */
  284. }
  285. void appSaveNVMData(void)
  286. {
  287. /*
  288. AppNVMData.chargEndWorkTime = OH_appChargEndWorkTime;
  289. AppNVMData.wakeupWorkTime = OH_appWakeupWorkTime;
  290. AppNVMData.sleepTime = OH_appSleepTime ;
  291. AppNVMData.isBattLocked = OH_isBattLocked;
  292. MEMCPY( AppNVMData.battSN, &BattSN, BATT_SN_LEN);
  293. */
  294. appSaveConfig();
  295. }
  296. static void appSaveConfig(void)
  297. {
  298. OSAFILE fp = PNULL;
  299. UINT32 writeCount = 0;
  300. AppConfigHeader AppConfigHr; //4 bytes
  301. /*
  302. * open the NVM file
  303. */
  304. fp = OsaFopen(APP_CONFIG_FILE_NAME, "wb"); //read & write
  305. if(OsaFseek(fp, 0, SEEK_SET) != 0)
  306. {
  307. #ifdef USING_PRINTF
  308. printf("Seek file failed [%d] \r\n",__LINE__);
  309. #endif
  310. OsaFclose(fp);
  311. return;
  312. }
  313. if (fp == PNULL)
  314. {
  315. #ifdef USING_PRINTF
  316. printf(" NVM, can't open/create NVM: 'qxappconfig.nvm', save NVM failed\n");
  317. #endif
  318. return;
  319. }
  320. /*
  321. * write the header
  322. */
  323. AppConfigHr.fileBodySize = sizeof(AppNVMData);
  324. AppConfigHr.version = APP_CONFIG_FILE_LATEST_VERSION;
  325. AppConfigHr.checkSum = OsaCalcCrcValue((UINT8 *)&AppNVMData, sizeof(AppNVMData));
  326. writeCount = OsaFwrite(&AppConfigHr, sizeof(AppConfigHeader), 1, fp);
  327. if (writeCount != 1)
  328. {
  329. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppConfigSave_2, P_ERROR, 0,
  330. // " NVM: 'qxappconfig.nvm', write the file header failed");
  331. #ifdef USING_PRINTF
  332. printf(" NVM: 'qxappconfig.nvm', write the file header failed\n");
  333. #endif
  334. OsaFclose(fp);
  335. return;
  336. }
  337. /*
  338. * write the file body
  339. */
  340. AppNVMData.appDataModify = FALSE;
  341. writeCount = OsaFwrite(&AppNVMData, sizeof(AppNVMData), 1, fp);
  342. if (writeCount != 1)
  343. {
  344. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppConfigSave_3, P_ERROR, 0,
  345. // " NVM: 'qxappconfig.nvm', write the file body failed");
  346. #ifdef USING_PRINTF
  347. printf(" NVM: 'qxappconfig.nvm', write the file body failed\n");
  348. #endif
  349. }
  350. OsaFclose(fp);
  351. return;
  352. }
  353. void appLoadConfig(void)
  354. {
  355. OSAFILE fp = PNULL;
  356. UINT32 readCount = 0;
  357. //AppConfigHeader AppConfigHr; //4 bytes
  358. UINT8 crcCheck = 0;
  359. BOOL needAdjust = FALSE;
  360. void *pReadAppConfig = (void *)&AppNVMData;
  361. /*
  362. * open the NVM file
  363. */
  364. fp = OsaFopen(APP_CONFIG_FILE_NAME, "rb"); //read only
  365. if (fp == PNULL)
  366. {
  367. #ifdef USING_PRINTF
  368. printf(" NVM, can't open NVM: 'qxappConfig.nvm', use the defult value\n");
  369. #endif
  370. setDefaultAppDataValue();
  371. appSaveConfig();
  372. return;
  373. }
  374. /*
  375. * read the file header
  376. */
  377. readCount = OsaFread(&AppConfigHr, sizeof(AppConfigHeader), 1, fp);
  378. if (readCount != 1)
  379. {
  380. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_header_e_1, P_ERROR, 1,
  381. // "NVM: 'qxappconfig.nvm', can't read header, return: %d, use the defult value", readCount);
  382. #ifdef USING_PRINTF
  383. printf("NVM: 'qxappconfig.nvm', can't read header, return: %d, use the defult value \n");
  384. #endif
  385. OsaFclose(fp);
  386. setDefaultAppDataValue();
  387. appSaveConfig();
  388. return;
  389. }
  390. if (AppConfigHr.version != APP_CONFIG_FILE_LATEST_VERSION)
  391. {
  392. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_ver_w_1, P_ERROR, 2,
  393. // "NVM: 'qxappconfig.nvm', version: %d not latest: %d, try to adapt",
  394. // AppConfigHr.version, MID_WARE_NVM_FILE_LATEST_VERSION);
  395. #ifdef USING_PRINTF
  396. printf("NVM: 'qxappconfig.nvm', version: %d not latest: %d, try to adapt\n",
  397. AppConfigHr.version, MID_WARE_NVM_FILE_LATEST_VERSION);
  398. #endif
  399. if (AppConfigHr.fileBodySize > 1024) //in fact this NVM size should limited in 1KB
  400. {
  401. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_ver_e_1, P_ERROR, 2,
  402. // "NVM: 'qxappconfig.nvm', version: %d, NVM body size: %d > 1024, not right, use the default value",
  403. // AppConfigHr.version, AppConfigHr.fileBodySize);
  404. #ifdef USING_PRINTF
  405. printf("NVM: 'qxappconfig.nvm', version: %d, NVM body size: %d > 1024, not right, use the default value",
  406. AppConfigHr.version, AppConfigHr.fileBodySize);
  407. #endif
  408. OsaFclose(fp);
  409. setDefaultAppDataValue();
  410. appSaveConfig();
  411. return;
  412. }
  413. /*
  414. * As need to do adaption, can't read the old NVM into "mwNvmConfig", here we allocate a new buffer to store it
  415. */
  416. pReadAppConfig = OsaAllocZeroMemory(AppConfigHr.fileBodySize);
  417. if (pReadAppConfig == PNULL)
  418. {
  419. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_buff_e_1, P_ERROR, 2,
  420. // "NVM: 'qxappconfig.nvm', version: %d, can not allo memsize: %d, use the default value",
  421. // AppConfigHr.version, AppConfigHr.fileBodySize);
  422. #ifdef USING_PRINTF
  423. printf("NVM: 'qxappconfig.nvm', version: %d, can not allo memsize: %d, use the default value",
  424. AppConfigHr.version, AppConfigHr.fileBodySize);
  425. #endif
  426. OsaFclose(fp);
  427. setDefaultAppDataValue();
  428. appSaveConfig();
  429. return;
  430. }
  431. needAdjust = TRUE;
  432. }
  433. else if (AppConfigHr.fileBodySize != sizeof(AppNVMData)) //file version is the same, but NVM file size not right
  434. {
  435. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_2, P_ERROR, 2,
  436. // "MW NVM: 'midwareconfig.nvm', file body size not right: (%u/%u), use the defult value",
  437. // AppConfigHr.fileBodySize, sizeof(AppNVMData));
  438. #ifdef USING_PRINTF
  439. printf("MW NVM: 'midwareconfig.nvm', file body size not right: (%u/%u), use the defult value",
  440. AppConfigHr.fileBodySize, sizeof(AppNVMData));
  441. #endif
  442. OsaFclose(fp);
  443. setDefaultAppDataValue();
  444. appSaveConfig();
  445. return;
  446. }
  447. /*
  448. * read the file body
  449. */
  450. readCount = OsaFread(pReadAppConfig, AppConfigHr.fileBodySize, 1, fp);
  451. crcCheck = OsaCalcCrcValue((UINT8 *)pReadAppConfig, AppConfigHr.fileBodySize);
  452. if (readCount != 1 ||
  453. crcCheck != AppConfigHr.checkSum)
  454. {
  455. //ECOMM_TRACE(UNILOG_PLA_MIDWARE, AppLoadNvmConfig_3, P_ERROR, 2,
  456. // "NVM: 'qxappconfig.nvm', can't read body, or body not right, (%u/%u), use the defult value",
  457. // crcCheck, AppConfigHr.checkSum);
  458. #ifdef USING_PRINTF
  459. printf(" NVM: 'qxappconfig.nvm', can't read body, or body not right, (%u/%u), use the defult value\n ",
  460. crcCheck, AppConfigHr.checkSum);
  461. #endif
  462. OsaFclose(fp);
  463. setDefaultAppDataValue();
  464. appSaveConfig();
  465. if (needAdjust)
  466. {
  467. OsaFreeMemory(&pReadAppConfig);
  468. }
  469. return;
  470. }
  471. #if 1
  472. if (needAdjust)
  473. {
  474. OsaFclose(fp);
  475. setDefaultAppDataValue();
  476. appSaveConfig();
  477. /* free memory */
  478. OsaFreeMemory(&pReadAppConfig);
  479. }
  480. #endif
  481. #if 0
  482. int i=0;
  483. printf("AppConfigHeader:\n");
  484. printf("%d,%d,%d\n",AppConfigHr.fileBodySize,AppConfigHr.version,AppConfigHr.checkSum);
  485. printf("AppConfigFileBody:\n");
  486. printf("%d,%d,%d\n",AppNVMData.chargEndWorkTime,AppNVMData.wakeupWorkTime,AppNVMData.sleepTime);
  487. printf("\n");
  488. #endif
  489. return;
  490. }
  491. //if the AppNVMData.version(read form nvm) != APP_CONFIG_FILE_LATEST_VERSION, it will setDefaultAppDataValue()
  492. //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
  493. static void setDefaultAppDataValue(void)
  494. {
  495. UINT8 i = 0;
  496. memset(&AppNVMData, 0x00, sizeof(AppNVMDataType));
  497. for(i=0;i<BATT_SN_LEN;i++)
  498. {
  499. AppNVMData.battSN[i] = BattSN[i]; //the defult sn is "0000..0000"(17 bytes ASCII)
  500. }
  501. AppNVMData.isBattLocked = false;
  502. AppNVMData.chargEndWorkTime = 30; //30 min
  503. AppNVMData.wakeupWorkTime = 15; //2min
  504. AppNVMData.sleepTime = 5; //5min
  505. AppNVMData.HwVersion = HWVERSION;
  506. AppNVMData.BLSwVersion = BLSWVERSION;
  507. AppNVMData.DrvSwVersion = DRVSWVERSION;
  508. AppNVMData.AppSwVersion = APPSWVERSION;
  509. return;
  510. }