/*
*/
//#define RF_PRINTF_LEVEL 4
#include <windows.h>
#include <nkintr.h>
#include <ceddk.h> //For DMA Buffer Alloc
#include"rf_printf_level.h"
#define MRFI_TIMER_COUNT 4
typedef struct MRFI_Timer_s{
DWORD isCreate;
DWORD isThreadCreat;
DWORD isStart;
DWORD isPeriodic;
HANDLE hTimerEvent[MRFI_TIMER_COUNT][2];
HANDLE hThreadHandle[MRFI_TIMER_COUNT];
DWORD dwThreadID[MRFI_TIMER_COUNT];
DWORD dwTimeval[MRFI_TIMER_COUNT];
void (*pfun[MRFI_TIMER_COUNT])(void);
}MRFI_Timer_t;
static MRFI_Timer_t g_MRFI_Timer;
void mrfiTimerInit(void)
{
static BOOL isMrfiTimerIntitialed = FALSE;
if(isMrfiTimerIntitialed == FALSE)
{
isMrfiTimerIntitialed = TRUE;
g_MRFI_Timer.isCreate=0;
g_MRFI_Timer.isThreadCreat=0;
g_MRFI_Timer.isStart=0;
g_MRFI_Timer.isPeriodic=0;
}
}
DWORD WINAPI mrfi_TimerThread(LPVOID lpParameter)
{
DWORD TimerID = (DWORD)lpParameter;
DWORD dwObj;
if(TimerID >= MRFI_TIMER_COUNT)return 0;
while(TRUE)
{
if(g_MRFI_Timer.isStart & (1<<TimerID))
{
//Sleep(g_MRFI_Timer.dwTimeval[TimerID]);
//dwObj = WaitForSingleObject(g_MRFI_Timer.hTimerEvent[TimerID], g_MRFI_Timer.dwTimeval[TimerID]);
dwObj = WaitForMultipleObjects(2, g_MRFI_Timer.hTimerEvent[TimerID], FALSE, g_MRFI_Timer.dwTimeval[TimerID]);
if(dwObj == WAIT_OBJECT_0)
{
continue;
}
else if(dwObj == WAIT_OBJECT_0 + 1)
{
break;
}
else if(dwObj == WAIT_TIMEOUT)
{
if(g_MRFI_Timer.isStart & (1<<TimerID))
{
if(g_MRFI_Timer.pfun[TimerID])
{
g_MRFI_Timer.pfun[TimerID]();
}
if((g_MRFI_Timer.isPeriodic & (1<<TimerID)) == 0)
{
g_MRFI_Timer.isStart &= ~(1<<TimerID);
}
}
}
}
else
{
printf_4((_T("+++++Timer %d is stop,wait for waking up\n"),TimerID));
//WaitForSingleObject(g_MRFI_Timer.hTimerEvent[TimerID], INFINITE);
dwObj = WaitForMultipleObjects(2, g_MRFI_Timer.hTimerEvent[TimerID], FALSE, INFINITE);
if(dwObj == WAIT_OBJECT_0)
{
printf_4((_T("-----Timer %d wake up\n"),TimerID));
continue;
}
else if(dwObj == WAIT_OBJECT_0 + 1)
{
printf_4((_T("-----Timer %d delete\n"),TimerID));
break;
}
printf_4((_T("-----Timer %d Error\n"),TimerID));
}
}
return 0;
}
int mrfi_CreateTimer(void (*pfun)(void), DWORD dwMilliSec, BOOL isPeriodic, BOOL isStart)
{
DWORD TimerBit,TimerID;
TimerID = 0;
TimerBit = 0x01;
for(;TimerID < MRFI_TIMER_COUNT;TimerID ++, TimerBit <<= 1)
{
if((g_MRFI_Timer.isCreate & TimerBit) == 0)
{
g_MRFI_Timer.isCreate |= TimerBit;
if(isPeriodic)g_MRFI_Timer.isPeriodic |= TimerBit;
else g_MRFI_Timer.isPeriodic &= ~TimerBit;
if(isStart)g_MRFI_Timer.isStart |= TimerBit;
else g_MRFI_Timer.isStart &= ~TimerBit;
g_MRFI_Timer.pfun[TimerID] = pfun;
g_MRFI_Timer.dwTimeval[TimerID] = dwMilliSec;
if((g_MRFI_Timer.isThreadCreat & TimerBit) == 0)
{
g_MRFI_Timer.isThreadCreat |= TimerBit;
g_MRFI_Timer.hTimerEvent[TimerID][0]=CreateEvent(NULL, FALSE, FALSE, NULL);
g_MRFI_Timer.hTimerEvent[TimerID][1]=CreateEvent(NULL, FALSE, FALSE, NULL);
g_MRFI_Timer.hThreadHandle[TimerID] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)mrfi_TimerThread, (LPVOID)TimerID, 0, (LPDWORD)(g_MRFI_Timer.dwThreadID+TimerID));
}
else
{
SetEvent(g_MRFI_Timer.hTimerEvent[TimerID][0]);
}
return (int)TimerID;
}
}
return -1;
}
void mrfi_DeleteTimer(int TimerID)
{
DWORD dwObj;
if(TimerID <MRFI_TIMER_COUNT && g_MRFI_Timer.isCreate & (1<<TimerID))
{
if(g_MRFI_Timer.isThreadCreat & (1<<TimerID))
{
if(g_MRFI_Timer.hThreadHandle[TimerID])
{
SetEvent(g_MRFI_Timer.hTimerEvent[TimerID][1]);
dwObj = WaitForSingleObject(g_MRFI_Timer.hThreadHandle[TimerID],1000);
if(dwObj == WAIT_OBJECT_0)
{
CloseHandle(g_MRFI_Timer.hThreadHandle[TimerID]);
g_MRFI_Timer.hThreadHandle[TimerID] = NULL;
CloseHandle(g_MRFI_Timer.hTimerEvent[TimerID][0]);
CloseHandle(g_MRFI_Timer.hTimerEvent[TimerID][1]);
g_MRFI_Timer.isThreadCreat &= ~(1<<TimerID);
}
}
}
g_MRFI_Timer.isCreate &= ~(1<<TimerID);
g_MRFI_Timer.isStart &= ~(1<<TimerID);
}
}
void mrfi_TimerStart(int TimerID)
{
if(TimerID <MRFI_TIMER_COUNT && g_MRFI_Timer.isCreate & (1<<TimerID))
{
g_MRFI_Timer.isStart |= (1<<TimerID);
SetEvent(g_MRFI_Timer.hTimerEvent[TimerID][0]);
}
}
void mrfi_TimerStop(int TimerID)
{
if(TimerID <MRFI_TIMER_COUNT && g_MRFI_Timer.isCreate & (1<<TimerID))
{
g_MRFI_Timer.isStart &= ~(1<<TimerID);
SetEvent(g_MRFI_Timer.hTimerEvent[TimerID][0]);
}
}
void mrfi_TimerRestart(int TimerID)
{
if(TimerID <MRFI_TIMER_COUNT && g_MRFI_Timer.isCreate & (1<<TimerID))
{
g_MRFI_Timer.isStart |= (1<<TimerID);
SetEvent(g_MRFI_Timer.hTimerEvent[TimerID][0]);
}
}
BOOL mrfi_TimerIsRunning(int TimerID)
{
if(TimerID <MRFI_TIMER_COUNT && g_MRFI_Timer.isCreate & (1<<TimerID))
{
return g_MRFI_Timer.isStart & (1<<TimerID)?TRUE:FALSE;
}
return FALSE;
}
- 1
- 2
前往页