123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- /****************************************************************************
- *
- * Copy right: Qx.CJ
- * File name: MainTask.c
- * Description: 主要负责:1.工作模式转换2.定时器定时3.定时保存运行数据4.异常状态重启
- * History: 2021-07-05
- * Version: V3.0
- ****************************************************************************/
- #include "AppTaskMain.h"
- static StaticTask_t gProcess_Main_Task_t;
- static UINT8 gProcess_Main_TaskStack[PROC_MAIN_TASK_STACK_SIZE];
- static osThreadId_t MainTaskId = NULL;
- static process_Main gProcess_Main_Task;
- #define PROC_MAIN_STATE_SWITCH(a) (gProcess_Main_Task = a)
- #define PROC_APP_STATE_SWITCH(a) (gProcess_app = a)
- static volatile BOOL WorkTimerEnd = FALSE;
- static volatile BOOL SleepTimerEnd = FALSE;
- void monitor_timer_callback(TimerHandle_t xTimer);
- void work_timer_callback(TimerHandle_t xTimer);
- void sleep_timer_callback(TimerHandle_t xTimer);
- static void appBeforeHib(void *pdata, slpManLpState state);
- static void appAfterHib(void *pdata, slpManLpState state);
- static void appBeforeSlp1(void *pdata, slpManLpState state);
- static void appAfterSlp1(void *pdata, slpManLpState state);
- static void appBeforeSlp2(void *pdata, slpManLpState state);
- static void appAfterSlp2(void *pdata, slpManLpState state);
- UINT8 MainSlpHandler = 0xff;//主线程睡眠句柄
- static void MainTask(void* arg)
- {
- UINT8 PadInterrupt_clrCounter = 0;
- TimerHandle_t monitor_timer = NULL;
- TimerHandle_t work_timer = NULL;
- TimerHandle_t sleep_timer = NULL;
- monitor_timer = xTimerCreate("monitor_timer", 100 / portTICK_RATE_MS, pdTRUE, NULL, monitor_timer_callback);
- work_timer = xTimerCreate("work_timer", WORK_TIME*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
- sleep_timer = xTimerCreate("sleep_timer", SLEEP_TIME*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, sleep_timer_callback);
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
- slpManSetPmuSleepMode(true,SLP_HIB_STATE,false);
- slpManApplyPlatVoteHandle("MainSlp",&MainSlpHandler);
- slpManPlatVoteDisableSleep(MainSlpHandler, SLP_SLP1_STATE);//禁用SLEEP1休眠
- UINT32 inParam = 0xAABBCCDD;
- slpManRegisterUsrdefinedBackupCb(appBeforeHib,&inParam,SLPMAN_HIBERNATE_STATE);
- slpManRegisterUsrdefinedRestoreCb(appAfterHib,NULL,SLPMAN_HIBERNATE_STATE);
- slpManRegisterUsrdefinedBackupCb(appBeforeSlp1,NULL,SLPMAN_SLEEP1_STATE);
- slpManRegisterUsrdefinedRestoreCb(appAfterSlp1,NULL,SLPMAN_SLEEP1_STATE);
- slpManRegisterUsrdefinedBackupCb(appBeforeSlp2,NULL,SLPMAN_SLEEP2_STATE);
- slpManRegisterUsrdefinedRestoreCb(appAfterSlp2,NULL,SLPMAN_SLEEP2_STATE);
- slpManWakeSrc_e Wakeup_source;
- Wakeup_source = slpManGetWakeupSrc();//获取唤醒源
- //配置文件及运行数据加载
- if(Error_Mutex == NULL)
- {
- Error_Mutex = osMutexNew(NULL);
- }
- LoadAppConfig();
-
- if(Wakeup_source ==0)
- {
- AppDataInfo.appDataModify = TRUE;
- AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount + 1;
- }
- xTimerStart(monitor_timer, 0);
- UINT8 Temp = 0;
- while(true)
- {
- switch(gProcess_Main_Task)
- {
- case PROCESS_STATE_IDLE:
- {
- LoadAppData();
- PROC_APP_STATE_SWITCH(IDLE);
- xTimerStart(work_timer, 0);
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_WORK);
- break;
- }
- case PROCESS_STATE_WORK:
- {
- osDelay(100);
- PROC_APP_STATE_SWITCH(WORK);
- //状态转换延时
- if(TimeCounter%10==0)
- {
- BattWorkDelayFunc(battWorkState);
- #ifdef USING_PRINTF1
- printf("[%d]-%d-%d,%d,%d \n",__LINE__,TimeCounter,socd_pct_battSoc,fastChargeTemp,normalChargeTemp);
- #endif
- if(TimeCounter%(10*60)==0)
- {
- BattLockFunc();
- }
- if(AppDataInfo.appDataModify)
- {
- SaveAppData();
- }
- }
- if(WorkTimerEnd==TRUE)//从工作转换为监听的条件,定时器结束
- {
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_LISTEN);
- xTimerStop(work_timer,0);
- xTimerStart(sleep_timer, 0);
- WorkTimerEnd = FALSE;
- NVIC_EnableIRQ(PadWakeup1_IRQn);
- PadInterrupt = 0x00;
- break;
- }
- if((BMS_Fota_update_flag!=FALSE)||(TCPWorkState!=0x00)||(BattWorkStateDelay!=BATT_IDLE_SYM)||(PadInterrupt!=0x00))
- {
- xTimerReset(work_timer,0);
- }
- if(TcpErrorcount>=10 &&PadInterrupt==0x00)
- {
- AppDataInfo.appDataModify = true;
- AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount +1;
- if(AppDataInfo.SysReStartCount>=0xfffe)
- {
- AppDataInfo.SysReStartCount = 0;
- }
- if(AppDataInfo.appDataModify)
- {
- SaveAppData();
- }
- if(BcuDataInfo.appDataModify)
- {
- SaveBcuData();
- }
- appSetCFUN(0);
- osDelay(1000);
- EC_SystemReset();
- }
- if(BcuDataInfo.appDataModify)//BCU数据实时保存
- {
- SaveBcuData();
- }
- break;
- }
- case PROCESS_STATE_LISTEN:
- {
- PROC_APP_STATE_SWITCH(LISTEN);
- if(getbit(PadInterrupt,1)==0x01)
- {
- clrbit(PadInterrupt,1);
- osDelay(10);
- PadInterrupt_clrCounter = PadInterrupt_clrCounter + 1;
- Temp = PadInterrupt;
- }
- else if(getbit(PadInterrupt,1)==0x00 && PadInterrupt!=0x00)
- {
- PadInterrupt_clrCounter = PadInterrupt_clrCounter + 3;
- }
- else
- {
- osDelay(100);
- }
- if(AppDataInfo.appDataModify)
- {
- SaveAppData();
- }
- if(BcuDataInfo.appDataModify)
- {
- SaveBcuData();
- }
- #ifdef USING_PRINTF1
- printf("[%d]%x - %x - %x - %x\n",__LINE__,SleepTimerEnd,BMS_Fota_update_flag,TCPWorkState,PadInterrupt);
- #endif
- if((SleepTimerEnd)||(TCPWorkState==1)||(PadInterrupt_clrCounter>=3))//从监听转换为工作的条件
- {
- #ifdef USING_PRINTF1
- printf("[%d]-%x",__LINE__,battWorkState);
- printf("[%d]%x - %x - %x - %x - %x-%d\n",__LINE__,WorkTimerEnd,BMS_Fota_update_flag,TCPWorkState,BattWorkStateDelay,Temp,PadInterrupt_clrCounter);
- #endif
- #ifdef DEBUGLOG
- Debug_printf("WORK:%d,%d\n",PadInterrupt_clrCounter,PadInterrupt);
- #endif
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
- xTimerStop(sleep_timer,0);
- SleepTimerEnd = FALSE;
- PadInterrupt = 0x00;
- PadInterrupt_clrCounter = 0;
- NVIC_DisableIRQ(PadWakeup1_IRQn);
- break;
- }
- if(NB_Fota_update_flag)
- {
- if(AppDataInfo.appDataModify)
- {
- SaveAppData();
- }
- if(BcuDataInfo.appDataModify)
- {
- SaveBcuData();
- }
- appSetCFUN(0);
- osDelay(1000);
- EC_SystemReset();
- }
- break;
- }
- default:
- {
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
- break;
- }
- }
- }
- }
- void monitor_timer_callback(TimerHandle_t xTimer)
- {
- TimeCounter++;
- if(TimeCounter>0xFFFFFFF0)
- {
- TimeCounter=0;
- }
- }
- void work_timer_callback(TimerHandle_t xTimer)
- {
- #ifdef USING_PRINTF
- printf("work_timer_callback\n");
- #endif
- WorkTimerEnd = true;
- }
- void sleep_timer_callback(TimerHandle_t xTimer)
- {
- #ifdef USING_PRINTF
- printf("sleep_timer_callback\n");
- #endif
- SleepTimerEnd = true;
- }
- void AppTaskMainInit(void *arg)
- {
- #ifndef USING_PRINTF
- if(BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
- {
- HAL_UART_RecvFlowControl(false);
- }
- #endif
- osThreadAttr_t task_attr;
- memset(&task_attr,0,sizeof(task_attr));
- memset(gProcess_Main_TaskStack, 0xA5, PROC_MAIN_TASK_STACK_SIZE);
- task_attr.name = "Main_Task";
- task_attr.stack_mem = gProcess_Main_TaskStack;
- task_attr.stack_size = PROC_MAIN_TASK_STACK_SIZE;
- task_attr.priority = osPriorityNormal;
- task_attr.cb_mem = &gProcess_Main_Task_t;
- task_attr.cb_size = sizeof(StaticTask_t);
- MainTaskId = osThreadNew(MainTask, NULL, &task_attr);
- }
- void AppTaskMainDeInit(void *arg)
- {
- osThreadTerminate(MainTaskId);
- MainTaskId = NULL;
- }
- //睡眠进出函数区
- static void appBeforeHib(void *pdata, slpManLpState state)
- {
- uint32_t *p_param = (uint32_t *)pdata;
- #ifdef USING_PRINTF
- printf("Before Hibernate:%d \n",state);
- #endif
- slpManAONIOLatchEn(AonIOLatch_Enable);
- }
- static void appAfterHib(void *pdata, slpManLpState state)
- {
- #ifdef USING_PRINTF
- printf("Try Hibernate Failed:%d \n",state);
- #endif
- }
- static void appBeforeSlp1(void *pdata, slpManLpState state)
- {
- #ifdef USING_PRINTF
- printf("Before Sleep1:%d \n",state);
- #endif
- slpManAONIOLatchEn(AonIOLatch_Enable);
- }
- static void appAfterSlp1(void *pdata, slpManLpState state)
- {
- #ifdef USING_PRINTF
- printf("After Sleep1:%d \n",state);
- #endif
- }
- static void appBeforeSlp2(void *pdata, slpManLpState state)
- {
- #ifdef USING_PRINTF
- printf("before sleep2:%d \n",state);
- #endif
- slpManAONIOLatchEn(AonIOLatch_Enable);
- }
- static void appAfterSlp2(void *pdata, slpManLpState state)
- {
- #ifdef USING_PRINTF
- printf("sleep2 failed:%d \n",state);
- #endif
- }
|