/******************************************************************* * DMW_Timer.c * * Copyright 2003 Digital STREAM Technology, Inc. * All Rights Reserved * * $Id: DMW_Timer.c,v 1.10 2003/04/01 cafrii Exp $ * ********************************************************************/ #include "DMW_Platform.h" #include "DHL_OSAL_Config.h" #include "DHL_Timer.h" #include "DMW_Timer.h" #include "DMW_Mutex.h" //#include DHL_MODULE("$tmr", 0); /********************************************************************* General Variables for Timer M/W *********************************************************************/ #define DMW_TIMER_TEST 1 #if COMMENT ______DMW_Timer____(){} #endif DHL_TMHANDLE g_dmw_timer; static STATUS dhlresult2status(DHL_RESULT dhlResult) { if (dhlResult == DHL_OK) return statusOK; else if (dhlResult == DHL_FAIL_INVALID_PARAM) return statusInvalidArgument; else if (dhlResult == DHL_FAIL_NOT_INITIALIZED) return statusNotInitialized; else if (dhlResult == DHL_FAIL_NOT_FOUND) return statusNotFound; else if (dhlResult == DHL_FAIL_INVALID_STATE) return statusInvalidState; else return statusError; } void DMW_SYS_TimerInit(void) { // DHL_RESULT dhlResult; DHL_TIMER_INIT_PARAM param; if (g_dmw_timer) { dprint(0, "!! dmw timer already init\n"); return; /* dmw timer already initialized. */ } memset(¶m, 0, sizeof(DHL_TIMER_INIT_PARAM)); param.max_timer_entry = DMW_MAX_TIMER; param.name = "DMWTMR"; param.task_priority = TASK_PRI_DMW_TIMER; param.stack_size = EXTTIMEOUT_TASK_STACKSIZE; param.use_mutex_lock = 0; /* we should support ISR!! */ DHL_TIMER_Initialize(¶m, &g_dmw_timer); //dhlResult = DHL_TIMER_Initialize(¶m, &g_dmw_timer); /* return dhlresult2status(dhlResult); */ } void DMW_SYS_TimerTerminate() { DHL_TIMER_Terminate(g_dmw_timer); } // zooyouny 100630 : »ç¿ë µÇ´Â °÷ÀÌ ¾øÀ½, ÀÏ´Ü ÁÖ¼® ó¸® STATUS DMW_SYS_GetStartTimeofTimer(UINT32 nIdTimer, UINT32 *pnStartTime) { DHL_RESULT dhlResult = DHL_OK; // dhlResult = dhl_timer_get_start_tick(g_dmw_timer, nIdTimer, pnStartTime); return dhlresult2status(dhlResult); } STATUS DMW_SYS_SetTimer(UINT32 nIdTimer,UINT32 nPeriodMs, DMW_TIMER_PROC func, UINT32 param, BOOL bOneShot) { DHL_RESULT dhlResult; dhlResult = DHL_TIMER_Start(g_dmw_timer, nIdTimer, nPeriodMs, func, param, bOneShot); return dhlresult2status(dhlResult); } STATUS DMW_SYS_KillTimer(UINT32 nIdTimer) { DHL_RESULT dhlResult; dhlResult = DHL_TIMER_Stop(g_dmw_timer, nIdTimer); return dhlresult2status(dhlResult); } void DMW_SYS_PrintTimer(void) { DHL_TIMER_Show(g_dmw_timer); } #if COMMENT ____Counter____(){} #endif /*--------------------- Generic Counter cafrii 050728 add */ void DMW_ResetCounter(DMW_Counter *pCounter) { pCounter->bHoldState = FALSE; pCounter->nHoldPeriod = DHL_OS_GetMsCount(); } UINT32 DMW_GetTickCount(DMW_Counter *pCounter) { if (pCounter->bHoldState) return pCounter->tickHoldStart - pCounter->nHoldPeriod; return DHL_OS_GetMsCount() - pCounter->nHoldPeriod; } void DMW_HoldCounter(DMW_Counter *pCounter) { if (pCounter->bHoldState) { dprint(0, "!! counter already hold state\n"); return; /**/ } pCounter->tickHoldStart = DHL_OS_GetMsCount(); pCounter->bHoldState = TRUE; } void DMW_ResumeCounter(DMW_Counter *pCounter) { if (pCounter->bHoldState == 0) { dprint(0, "!! counter already running\n"); return; } pCounter->nHoldPeriod += (DHL_OS_GetMsCount() - pCounter->tickHoldStart); pCounter->bHoldState = FALSE; } /* cafrii 060814 add */ BOOL DMW_GetCounterHoldState(DMW_Counter *pCounter) { return pCounter->bHoldState ? TRUE : FALSE; } #if COMMENT ______TEST____(){} #endif #if DMW_TIMER_TEST void TestTimerProc(int id, int param) { DHL_OS_Printf("@@@@ timer proc: id %d, param %d\n\n", id, param); } /* test: DMW_SYS_SetTimer 9100 1000 TestTimerProc 1 0 DMW_SYS_SetTimer 9200 1300 TestTimerProc 2 0 DMW_SYS_SetTimer 9300 7000 TestTimerProc 555 1 DMW_SYS_PrintTimer DMW_SYS_KillTimer 9100 */ DMW_Counter g_cnt; void TestCounter() { /* ÀÌ ÇÔ¼ö¸¦ ½ÇÇàÇϸé tick ¿Ã¶ó°¡´Â °ÍÀÌ Ãâ·ÂµÊ. À̶§ ¾Æ·¡ cnthold, cntresume µîÀ» ÀÔ·ÂÇØ¼­ hold/resume ÀÌ µÇ´ÂÁö È®ÀÎ. Shell ÀÌ background run À» Áö¿øÇØ¾ß ÇÑ´Ù. CB2 HAL ¿¡¼­´Â &¸¦ ºÙÀÌ¸é °¡´ÉÇÔ.. Shell> TestCounter & */ int i; DMW_ResetCounter(&g_cnt); for (i=0; i<240; i++) /* 60 second, 1 minute. */ { DHL_OS_Printf("time %u\n", DMW_GetTickCount(&g_cnt)/1000); DHL_OS_Delay(250); } } void cnthold() { DMW_HoldCounter(&g_cnt); } void cntresume() { DMW_ResumeCounter(&g_cnt); } void myTimerTestFunc(UINT32 nIDTimer, UINT32 param) { DHL_OS_Printf("My address: 0x%x, ID: %d (0x%x), param: %d (0x%x)\n", (int)myTimerTestFunc, nIDTimer, nIDTimer, param, param); } /* // timerID, elapse, func, param, oneshot DMW_SYS_SetTimer 1000, 2000, myTimerTestFunc, 3, 1 DMW_SYS_SetTimer 1001, 500, myTimerTestFunc, 777, 0 DMW_SYS_KillTimer 1000 DMW_SYS_PrintTimer */ #endif /* DMW_TIMER_TEST */ #if COMMENT ______DebugSymbol____(){} #endif #if DMW_REGISTER_DEBUG_SYMBOL static DHL_SymbolTable TimerSymbols[] = { /*---- functions */ DHL_FNC_SYM_ENTRY(DMW_SYS_PrintTimer), /* DHL_FNC_SYM_ENTRY(DMW_SYS_KillTimer), */ /*---- variables */ /* DHL_VAR_SYM_ENTRY(g_Trace_bTimerDebugPrint), */ }; #endif /* DMW_REGISTER_DEBUG_SYMBOL */ void DMW_SYS_RegisterTimerSymbols() { #if DMW_REGISTER_DEBUG_SYMBOL DHL_DBG_RegisterSymbols(TimerSymbols, DHL_NUMSYMBOLS(TimerSymbols)); #endif } /******************************************************************** $Log: DMW_Timer.c,v $ # History 1.12 2004/7/23 add timer shutdown code.. not fully tested. 1.11 2004/6/18 remove sys time codes completely.. GetStartTimeofTimer statusNotFound ¿¡·¯°ª Ãß°¡ 1.10 2003/10/22 PCE only version: System Timer¿Í General Timer¸¦ ±¸ºÐÇØ¼­ Àû¿ë. ÀÌ ÆÄÀÏÀº General Timer¸¸ °ü¸®. 1.02 2003/04/09 modify some function and add a few function for supporting daylight saving,timezone feature and sync. by user defined time(mightwar) 1.00 2003/01/?? first design, *********************************************************************/