|
@@ -8,12 +8,12 @@
|
|
|
****************************************************************************/
|
|
|
#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 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);
|
|
@@ -27,130 +27,134 @@ 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 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", 5*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
|
|
|
- sleep_timer = xTimerCreate("sleep_timer", 60*60*1000 / portTICK_RATE_MS, pdTRUE, NULL, sleep_timer_callback);
|
|
|
+ work_timer = xTimerCreate("work_timer", 5 * 60 * 1000 / portTICK_RATE_MS, pdTRUE, NULL, work_timer_callback);
|
|
|
+ sleep_timer = xTimerCreate("sleep_timer", 60 * 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休眠
|
|
|
+ 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);
|
|
|
+ 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();//获取唤醒源
|
|
|
+ Wakeup_source = slpManGetWakeupSrc(); //获取唤醒源
|
|
|
//配置文件及运行数据加载
|
|
|
- if(Error_Mutex == NULL)
|
|
|
+ if (Error_Mutex == NULL)
|
|
|
{
|
|
|
Error_Mutex = osMutexNew(NULL);
|
|
|
}
|
|
|
LoadAppConfig();
|
|
|
-
|
|
|
- if(Wakeup_source ==0)
|
|
|
+
|
|
|
+ if (Wakeup_source == 0)
|
|
|
{
|
|
|
AppDataInfo.appDataModify = TRUE;
|
|
|
AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount + 1;
|
|
|
}
|
|
|
xTimerStart(monitor_timer, 0);
|
|
|
- while(true)
|
|
|
+ UINT32 DignoseCounter = 0;
|
|
|
+ while (true)
|
|
|
{
|
|
|
- switch(gProcess_Main_Task)
|
|
|
+ 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:
|
|
|
+ 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(10);
|
|
|
+ PROC_APP_STATE_SWITCH(WORK);
|
|
|
+ //canTxTest();
|
|
|
+ if (TimeCounter != DignoseCounter)
|
|
|
{
|
|
|
- osDelay(100);
|
|
|
- PROC_APP_STATE_SWITCH(WORK);
|
|
|
- //canTxTest();
|
|
|
canRxDiagnose();
|
|
|
- //printf("%d\n",TimeCounter);
|
|
|
- //状态转换延时
|
|
|
- if(TimeCounter%10==0)
|
|
|
+ DignoseCounter = TimeCounter;
|
|
|
+ if (TimeCounter % 10 == 0)
|
|
|
{
|
|
|
- //BattWorkDelayFunc(battWorkState);
|
|
|
- #ifdef USING_PRINTF1
|
|
|
- printf("[%d]%x - %x - %x\n",__LINE__,WorkTimerEnd,TCPWorkState,PadInterrupt);
|
|
|
- #endif
|
|
|
+ // UINT32 space = osMessageQueueGetSpace(CanRecvHandle);
|
|
|
+ // printf("space=\t%d\n", space);
|
|
|
+//BattWorkDelayFunc(battWorkState);
|
|
|
+#ifdef USING_PRINTF1
|
|
|
+ printf("[%d]%x - %x - %x\n", __LINE__, WorkTimerEnd, TCPWorkState, PadInterrupt);
|
|
|
+#endif
|
|
|
//if(strcmp(AppNVMData.battSN,SN)!=0&&SN[0]!=0xFF&&SN[0]!=0x00&&SN[15]!=0xFF&&SN[15]!=0x00)
|
|
|
- if(canSNMsgRxCmpltFlag == true && canSNMsgLostFlag == false)
|
|
|
- {
|
|
|
- if(snCodeCompare(AppNVMData.battSN, SN))
|
|
|
- {
|
|
|
- AppNVMData.battSN[0] = 'T';//truck
|
|
|
- AppNVMData.battSN[1] = 'J';//金茂电池包
|
|
|
- AppNVMData.battSN[2] = 'M';
|
|
|
- AppNVMData.battSN[3] = 'C';//宁德时代电芯
|
|
|
- AppNVMData.battSN[4] = 'L';
|
|
|
- MEMCPY(&(AppNVMData.battSN[5]),SN,12);
|
|
|
- AppNVMData.EOLState=1;
|
|
|
- AppNVMData.appDataModify = TRUE;
|
|
|
- // printf("AppNVMData.battSN = ");
|
|
|
- // for(int j =0;j<17;j++)
|
|
|
- // printf("%x\t",AppNVMData.battSN[j]);
|
|
|
- // printf("\n\n");
|
|
|
- }
|
|
|
+ if (canSNMsgRxCmpltFlag == true && canSNMsgLostFlag == false)
|
|
|
+ {
|
|
|
+ if (snCodeCompare(AppNVMData.battSN, SN))
|
|
|
+ {
|
|
|
+ AppNVMData.battSN[0] = 'T'; //truck
|
|
|
+ AppNVMData.battSN[1] = 'J'; //金茂电池包
|
|
|
+ AppNVMData.battSN[2] = 'M';
|
|
|
+ AppNVMData.battSN[3] = 'C'; //宁德时代电芯
|
|
|
+ AppNVMData.battSN[4] = 'L';
|
|
|
+ MEMCPY(&(AppNVMData.battSN[5]), SN, 12);
|
|
|
+ AppNVMData.EOLState = 1;
|
|
|
+ AppNVMData.appDataModify = TRUE;
|
|
|
+ // printf("AppNVMData.battSN = ");
|
|
|
+ // for(int j =0;j<17;j++)
|
|
|
+ // printf("%x\t",AppNVMData.battSN[j]);
|
|
|
+ // printf("\n\n");
|
|
|
+ }
|
|
|
}
|
|
|
- if(canVINMsgRxCmpltFlag ==TRUE)
|
|
|
+ if (canVINMsgRxCmpltFlag == TRUE)
|
|
|
{
|
|
|
- if(VINCodeCompare(AppDataInfo.VIN, VIN))
|
|
|
+ if (VINCodeCompare(AppDataInfo.VIN, VIN))
|
|
|
{
|
|
|
- MEMCPY(AppDataInfo.VIN,VIN,17);
|
|
|
+ MEMCPY(AppDataInfo.VIN, VIN, 17);
|
|
|
AppNVMData.appDataModify = TRUE;
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
- if(AppDataInfo.appDataModify)
|
|
|
+ if (AppDataInfo.appDataModify)
|
|
|
{
|
|
|
SaveAppData();
|
|
|
}
|
|
|
- if(AppNVMData.appDataModify)
|
|
|
+ if (AppNVMData.appDataModify)
|
|
|
{
|
|
|
SaveAppConfig();
|
|
|
}
|
|
|
- if((WorkTimerEnd==TRUE)&&(TCPWorkState==0x00)&&(PadInterrupt==0x00))//从工作转换为监听的条件
|
|
|
+ if ((WorkTimerEnd == TRUE) && (TCPWorkState == 0x00) && (PadInterrupt == 0x00)) //从工作转换为监听的条件
|
|
|
{
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("[%d]sleep\n",__LINE__);
|
|
|
- #endif
|
|
|
+#ifdef USING_PRINTF
|
|
|
+ printf("[%d]sleep\n", __LINE__);
|
|
|
+#endif
|
|
|
PROC_MAIN_STATE_SWITCH(PROCESS_STATE_LISTEN);
|
|
|
- xTimerStop(work_timer,0);
|
|
|
+ xTimerStop(work_timer, 0);
|
|
|
xTimerStart(sleep_timer, 0);
|
|
|
WorkTimerEnd = FALSE;
|
|
|
NVIC_EnableIRQ(PadWakeup1_IRQn);
|
|
|
break;
|
|
|
}
|
|
|
- if(TcpErrorcount>=10 && UDSSwitch ==0)
|
|
|
+ if (TcpErrorcount >= 10 && UDSSwitch == 0)
|
|
|
{
|
|
|
AppDataInfo.appDataModify = true;
|
|
|
- AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount +1;
|
|
|
- if(AppDataInfo.SysReStartCount>=0xfffe)
|
|
|
+ AppDataInfo.SysReStartCount = AppDataInfo.SysReStartCount + 1;
|
|
|
+ if (AppDataInfo.SysReStartCount >= 0xfffe)
|
|
|
{
|
|
|
AppDataInfo.SysReStartCount = 0;
|
|
|
}
|
|
|
- if(AppNVMData.appDataModify)
|
|
|
+ if (AppNVMData.appDataModify)
|
|
|
{
|
|
|
SaveAppConfig();
|
|
|
}
|
|
|
- if(AppDataInfo.appDataModify)
|
|
|
+ if (AppDataInfo.appDataModify)
|
|
|
{
|
|
|
SaveAppData();
|
|
|
}
|
|
@@ -158,13 +162,13 @@ static void MainTask(void* arg)
|
|
|
osDelay(1000);
|
|
|
EC_SystemReset();
|
|
|
}
|
|
|
- if(NB_Fota_update_flag)
|
|
|
+ if (NB_Fota_update_flag)
|
|
|
{
|
|
|
- if(AppDataInfo.appDataModify)
|
|
|
+ if (AppDataInfo.appDataModify)
|
|
|
{
|
|
|
SaveAppData();
|
|
|
}
|
|
|
- if(AppNVMData.appDataModify)
|
|
|
+ if (AppNVMData.appDataModify)
|
|
|
{
|
|
|
SaveAppConfig();
|
|
|
}
|
|
@@ -172,80 +176,81 @@ static void MainTask(void* arg)
|
|
|
osDelay(1000);
|
|
|
EC_SystemReset();
|
|
|
}
|
|
|
- break;
|
|
|
}
|
|
|
- case PROCESS_STATE_LISTEN:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case PROCESS_STATE_LISTEN:
|
|
|
+ {
|
|
|
+ PROC_APP_STATE_SWITCH(LISTEN);
|
|
|
+ osDelay(100);
|
|
|
+ if (PadInterrupt != 0x00)
|
|
|
{
|
|
|
- PROC_APP_STATE_SWITCH(LISTEN);
|
|
|
- osDelay(100);
|
|
|
- if(PadInterrupt!=0x00)
|
|
|
- {
|
|
|
- PadInterrupt_clrCounter++;
|
|
|
- PadInterrupt = 0x00;
|
|
|
- }
|
|
|
- if(AppDataInfo.appDataModify)
|
|
|
- {
|
|
|
- SaveAppData();
|
|
|
- }
|
|
|
- if(AppNVMData.appDataModify)
|
|
|
- {
|
|
|
- SaveAppConfig();
|
|
|
- }
|
|
|
- if((SleepTimerEnd)||(TCPWorkState==1)||(PadInterrupt_clrCounter>=1))//从监听转换为工作的条件
|
|
|
- {
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("[%d]wake up\n",__LINE__);
|
|
|
- #endif
|
|
|
- PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
|
|
|
- xTimerStop(sleep_timer,0);
|
|
|
- SleepTimerEnd = FALSE;
|
|
|
- PadInterrupt = 0x00;
|
|
|
- PadInterrupt_clrCounter = 0;
|
|
|
- NVIC_DisableIRQ(PadWakeup1_IRQn);
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
+ PadInterrupt_clrCounter++;
|
|
|
+ PadInterrupt = 0x00;
|
|
|
}
|
|
|
- default:
|
|
|
+ if (AppDataInfo.appDataModify)
|
|
|
{
|
|
|
+ SaveAppData();
|
|
|
+ }
|
|
|
+ if (AppNVMData.appDataModify)
|
|
|
+ {
|
|
|
+ SaveAppConfig();
|
|
|
+ }
|
|
|
+ if ((SleepTimerEnd) || (TCPWorkState == 1) || (PadInterrupt_clrCounter >= 1)) //从监听转换为工作的条件
|
|
|
+ {
|
|
|
+#ifdef USING_PRINTF
|
|
|
+ printf("[%d]wake up\n", __LINE__);
|
|
|
+#endif
|
|
|
PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
|
|
|
+ xTimerStop(sleep_timer, 0);
|
|
|
+ SleepTimerEnd = FALSE;
|
|
|
+ PadInterrupt = 0x00;
|
|
|
+ PadInterrupt_clrCounter = 0;
|
|
|
+ NVIC_DisableIRQ(PadWakeup1_IRQn);
|
|
|
break;
|
|
|
}
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ PROC_MAIN_STATE_SWITCH(PROCESS_STATE_IDLE);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void monitor_timer_callback(TimerHandle_t xTimer)
|
|
|
{
|
|
|
TimeCounter++;
|
|
|
- if(TimeCounter>0xFFFFFFF0)
|
|
|
+ if (TimeCounter > 0xFFFFFFF0)
|
|
|
{
|
|
|
- TimeCounter=0;
|
|
|
+ TimeCounter = 0;
|
|
|
}
|
|
|
}
|
|
|
void work_timer_callback(TimerHandle_t xTimer)
|
|
|
{
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("work_timer_callback\n");
|
|
|
- #endif
|
|
|
+#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
|
|
|
+#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)
|
|
|
+#ifndef USING_PRINTF
|
|
|
+ if (BSP_GetPlatConfigItemValue(PLAT_CONFIG_ITEM_LOG_CONTROL) != 0)
|
|
|
{
|
|
|
HAL_UART_RecvFlowControl(false);
|
|
|
}
|
|
|
- #endif
|
|
|
+#endif
|
|
|
osThreadAttr_t task_attr;
|
|
|
- memset(&task_attr,0,sizeof(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;
|
|
@@ -254,7 +259,6 @@ void AppTaskMainInit(void *arg)
|
|
|
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)
|
|
|
{
|
|
@@ -266,41 +270,40 @@ 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);
|
|
|
-
|
|
|
+#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
|
|
|
+#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);
|
|
|
+#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
|
|
|
+#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);
|
|
|
+#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
|
|
|
+#ifdef USING_PRINTF
|
|
|
+ printf("sleep2 failed:%d \n", state);
|
|
|
+#endif
|
|
|
}
|