[an error occurred while processing this directive]
|
// структура с информацией о таймере
typedef struct
{
UINT uiTime;
UINT uiID;
PTIMERPROC pTimerProc;
void *pvParam;
} TIMERSTRUCT;// массив таймеров
TIMERSTRUCT aTimers[MAXTIMERS];void InitTimers(void)
{
char i;
for (i = 0; i < MAXTIMERS; i++) {
aTimers[i].uiID = 0;
}
}
void SetTimer (PTIMERPROC CallBackProc, UINT uiTimeout, UINT uiID, void *pvParam)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if ((pTimer->uiID) == 0) {
// свободен
pTimer->uiID = uiID;
pTimer->pvParam = pvParam;
pTimer->uiTime = uiTimeout;
pTimer->pTimerProc = CallBackProc;
LEAVE_CRITICAL();
return;
}} while (++pTimer < &aTimers[MAXTIMERS]);
// если дошли до сюда - таймеров больше нет
LEAVE_CRITICAL();}
void KillGroupTimers(UCHAR ucID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (((pTimer->uiID >> 8) & 0xff) == ucID) {
// ID совпал, чистим
pTimer->uiID = 0;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();}
void KillTimer(UINT uiID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (pTimer->uiID == uiID) {
// ID совпал, чистим
pTimer->uiID = 0;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();
}
BOOL IsTimerActive (UINT uiID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (pTimer->uiID == uiID) {
// ID совпал
LEAVE_CRITICAL();
return TRUE;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();
return FALSE;
}
void TimersOnInterrupt()
{TIMERSTRUCT *pTimer = aTimers;
//ENTER_CRITICAL();
do {
if (pTimer->uiID != 0) {
// uid != 0 ->работает
if (pTimer->uiTime-- == 0) {
// досчитал
pTimer->pTimerProc(pTimer->pvParam);
pTimer->uiID = 0;
}
}} while (++pTimer <= &aTimers[MAXTIMERS-1]);
//LEAVE_CRITICAL();
}
E-mail: info@telesys.ru