AppTaskMain.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /****************************************************************************
  2. *
  3. * Copy right: Qx.CJ
  4. * File name: MainTask.c
  5. * Description: 主要负责:1.工作模式转换2.定时器定时3.定时保存运行数据4.异常状态重启
  6. * History: 2021-07-05
  7. * Version: V3.0
  8. ****************************************************************************/
  9. #include "AppTaskMain.h"
  10. static StaticTask_t gProcess_Main_Task_t;
  11. static UINT8 gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
  12. static osThreadId_t MainTaskId = NULL;
  13. static process_Main gProcess_Main_Task;
  14. #define PROC_MAIN_STATE_SWITCH(a) (gProcess_Main_Task = a)
  15. #define PROC_APP_STATE_SWITCH(a) (gProcess_app = a)
  16. static volatile BOOL WorkTimerEnd = FALSE;
  17. static volatile BOOL SleepTimerEnd = FALSE;
  18. void monitor_timer_callback(TimerHandle_t xTimer);
  19. void work_timer_callback(TimerHandle_t xTimer);
  20. void sleep_timer_callback(TimerHandle_t xTimer);
  21. static void appBeforeHib(void *pdata, slpManLpState state);
  22. static void appAfterHib(void *pdata, slpManLpState state);
  23. static void appBeforeSlp1(void *pdata, slpManLpState state);
  24. static void appAfterSlp1(void *pdata, slpManLpState state);
  25. static void appBeforeSlp2(void *pdata, slpManLpState state);
  26. static void appAfterSlp2(void *pdata, slpManLpState state);
  27. UINT8 MainSlpHandler = 0xff;//主线程睡眠句柄
  28. static void MainTask(void* arg)
  29. {
  30. UINT8 PadInterrupt_clrCounter = 0;
  31. TimerHandle_t monitor_timer = NULL;
  32. TimerHandle_t work_timer = NULL;
  33. TimerHandle_t sleep_timer = NULL;
  34. monitor_timer = xTimerCreate("monitor_timer", 100 / portTICK_RATE_MS, pdTRUE, NULL, monitor_timer_callback);
  35. work_timer = xTimerCreate("work_timer", WORK_TIME*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
  36. sleep_timer = xTimerCreate("sleep_timer", SLEEP_TIME*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, sleep_timer_callback);
  37. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  38. slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
  39. slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
  40. slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP1_STATE);//禁用SLEEP1休眠
  41. UINT32 inParam = 0xAABBCCDD;
  42. slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
  43. slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
  44. slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
  45. slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
  46. slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
  47. slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
  48. slpManWakeSrc_e Wakeup_source;
  49. Wakeup_source = slpManGetWakeupSrc();//获取唤醒源
  50. //配置文件及运行数据加载
  51. if(Error_Mutex == NULL)
  52. {
  53. Error_Mutex = osMutexNew(NULL);
  54. }
  55. LoadAppConfig();
  56. if(Wakeup_source ==0)
  57. {
  58. AppDataInfo.appDataModify = TRUE;
  59. AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount + 1;
  60. }
  61. xTimerStart(monitor_timer, 0);
  62. UINT8 Temp = 0;
  63. while(true)
  64. {
  65. switch(gProcess_Main_Task)
  66. {
  67. case PROCESS_STATE_IDLE:
  68. {
  69. LoadAppData();
  70. PROC_APP_STATE_SWITCH(IDLE);
  71. xTimerStart(work_timer, 0);
  72. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
  73. break;
  74. }
  75. case PROCESS_STATE_WORK:
  76. {
  77. osDelay(100);
  78. PROC_APP_STATE_SWITCH(WORK);
  79. //状态转换延时
  80. if(TimeCounter%10==0)
  81. {
  82. BattWorkDelayFunc(battWorkState);
  83. #ifdef USING_PRINTF1
  84. printf("[%d]-%d-%d,%d,%d \n",__LINE__,TimeCounter,socd_pct_battSoc,fastChargeTemp,normalChargeTemp);
  85. #endif
  86. if(TimeCounter%(10*60)==0)
  87. {
  88. BattLockFunc();
  89. }
  90. if(AppDataInfo.appDataModify)
  91. {
  92. SaveAppData();
  93. }
  94. }
  95. if(WorkTimerEnd==TRUE)//从工作转换为监听的条件,定时器结束
  96. {
  97. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_LISTEN);
  98. xTimerStop(work_timer,0);
  99. xTimerStart(sleep_timer, 0);
  100. WorkTimerEnd = FALSE;
  101. NVIC_EnableIRQ(PadWakeup1_IRQn);
  102. PadInterrupt = 0x00;
  103. break;
  104. }
  105. if((BMS_Fota_update_flag!=FALSE)||(TCPWorkState!=0x00)||(BattWorkStateDelay!=BATT_IDLE_SYM)||(PadInterrupt!=0x00))
  106. {
  107. xTimerReset(work_timer,0);
  108. }
  109. if(TcpErrorcount>=10 &&PadInterrupt==0x00)
  110. {
  111. AppDataInfo.appDataModify = true;
  112. AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount +1;
  113. if(AppDataInfo.SysReStartCount>=0xfffe)
  114. {
  115. AppDataInfo.SysReStartCount = 0;
  116. }
  117. if(AppDataInfo.appDataModify)
  118. {
  119. SaveAppData();
  120. }
  121. if(BcuDataInfo.appDataModify)
  122. {
  123. SaveBcuData();
  124. }
  125. appSetCFUN(0);
  126. osDelay(1000);
  127. EC_SystemReset();
  128. }
  129. if(BcuDataInfo.appDataModify)//BCU数据实时保存
  130. {
  131. SaveBcuData();
  132. }
  133. break;
  134. }
  135. case PROCESS_STATE_LISTEN:
  136. {
  137. PROC_APP_STATE_SWITCH(LISTEN);
  138. if(getbit(PadInterrupt,1)==0x01)
  139. {
  140. clrbit(PadInterrupt,1);
  141. osDelay(10);
  142. PadInterrupt_clrCounter = PadInterrupt_clrCounter + 1;
  143. Temp = PadInterrupt;
  144. }
  145. else if(getbit(PadInterrupt,1)==0x00 && PadInterrupt!=0x00)
  146. {
  147. PadInterrupt_clrCounter = PadInterrupt_clrCounter + 3;
  148. }
  149. else
  150. {
  151. osDelay(100);
  152. }
  153. if(AppDataInfo.appDataModify)
  154. {
  155. SaveAppData();
  156. }
  157. if(BcuDataInfo.appDataModify)
  158. {
  159. SaveBcuData();
  160. }
  161. #ifdef USING_PRINTF1
  162. printf("[%d]%x - %x - %x - %x\n",__LINE__,SleepTimerEnd,BMS_Fota_update_flag,TCPWorkState,PadInterrupt);
  163. #endif
  164. if((SleepTimerEnd)||(TCPWorkState==1)||(PadInterrupt_clrCounter>=3))//从监听转换为工作的条件
  165. {
  166. #ifdef USING_PRINTF1
  167. printf("[%d]-%x",__LINE__,battWorkState);
  168. printf("[%d]%x - %x - %x - %x - %x-%d\n",__LINE__,WorkTimerEnd,BMS_Fota_update_flag,TCPWorkState,BattWorkStateDelay,Temp,PadInterrupt_clrCounter);
  169. #endif
  170. #ifdef DEBUGLOG
  171. Debug_printf("WORK:%d,%d\n",PadInterrupt_clrCounter,PadInterrupt);
  172. #endif
  173. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  174. xTimerStop(sleep_timer,0);
  175. SleepTimerEnd = FALSE;
  176. PadInterrupt = 0x00;
  177. PadInterrupt_clrCounter = 0;
  178. NVIC_DisableIRQ(PadWakeup1_IRQn);
  179. break;
  180. }
  181. if(NB_Fota_update_flag)
  182. {
  183. if(AppDataInfo.appDataModify)
  184. {
  185. SaveAppData();
  186. }
  187. if(BcuDataInfo.appDataModify)
  188. {
  189. SaveBcuData();
  190. }
  191. appSetCFUN(0);
  192. osDelay(1000);
  193. EC_SystemReset();
  194. }
  195. break;
  196. }
  197. default:
  198. {
  199. PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
  200. break;
  201. }
  202. }
  203. }
  204. }
  205. void monitor_timer_callback(TimerHandle_t xTimer)
  206. {
  207. TimeCounter++;
  208. if(TimeCounter>0xFFFFFFF0)
  209. {
  210. TimeCounter=0;
  211. }
  212. }
  213. void work_timer_callback(TimerHandle_t xTimer)
  214. {
  215. #ifdef USING_PRINTF
  216. printf("work_timer_callback\n");
  217. #endif
  218. WorkTimerEnd = true;
  219. }
  220. void sleep_timer_callback(TimerHandle_t xTimer)
  221. {
  222. #ifdef USING_PRINTF
  223. printf("sleep_timer_callback\n");
  224. #endif
  225. SleepTimerEnd = true;
  226. }
  227. void AppTaskMainInit(void *arg)
  228. {
  229. #ifndef USING_PRINTF
  230. if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
  231. {
  232. HAL_UART_RecvFlowControl(false);
  233. }
  234. #endif
  235. osThreadAttr_t task_attr;
  236. memset(&task_attr,0,sizeof(task_attr));
  237. memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);
  238. task_attr.name = "Main_Task";
  239. task_attr.stack_mem = gProcess_Main_TaskStack;
  240. task_attr.stack_size = PROC_MAIN_TASK_STACK_SIZE;
  241. task_attr.priority = osPriorityNormal;
  242. task_attr.cb_mem = &gProcess_Main_Task_t;
  243. task_attr.cb_size = sizeof(StaticTask_t);
  244. MainTaskId = osThreadNew(MainTask, NULL, &task_attr);
  245. }
  246. void AppTaskMainDeInit(void *arg)
  247. {
  248. osThreadTerminate(MainTaskId);
  249. MainTaskId = NULL;
  250. }
  251. //睡眠进出函数区
  252. static void appBeforeHib(void *pdata, slpManLpState state)
  253. {
  254. uint32_t *p_param = (uint32_t *)pdata;
  255. #ifdef USING_PRINTF
  256. printf("Before Hibernate:%d \n",state);
  257. #endif
  258. slpManAONIOLatchEn(AonIOLatch_Enable);
  259. }
  260. static void appAfterHib(void *pdata, slpManLpState state)
  261. {
  262. #ifdef USING_PRINTF
  263. printf("Try Hibernate Failed:%d \n",state);
  264. #endif
  265. }
  266. static void appBeforeSlp1(void *pdata, slpManLpState state)
  267. {
  268. #ifdef USING_PRINTF
  269. printf("Before Sleep1:%d \n",state);
  270. #endif
  271. slpManAONIOLatchEn(AonIOLatch_Enable);
  272. }
  273. static void appAfterSlp1(void *pdata, slpManLpState state)
  274. {
  275. #ifdef USING_PRINTF
  276. printf("After Sleep1:%d \n",state);
  277. #endif
  278. }
  279. static void appBeforeSlp2(void *pdata, slpManLpState state)
  280. {
  281. #ifdef USING_PRINTF
  282. printf("before sleep2:%d \n",state);
  283. #endif
  284. slpManAONIOLatchEn(AonIOLatch_Enable);
  285. }
  286. static void appAfterSlp2(void *pdata, slpManLpState state)
  287. {
  288. #ifdef USING_PRINTF
  289. printf("sleep2 failed:%d \n",state);
  290. #endif
  291. }