AppTaskMain.c 9.4 KB

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