134 lines
3.1 KiB
C
134 lines
3.1 KiB
C
#include <irda.h>
|
|
#include <irioctl.h>
|
|
#include <irlap.h>
|
|
#include <irlmp.h>
|
|
|
|
VOID
|
|
IrdaTimerExpFunc(struct CTEEvent *Event, void *Arg);
|
|
|
|
void
|
|
IrdaTimerInitialize(PIRDA_TIMER pTimer,
|
|
VOID (*ExpFunc)(PVOID Context),
|
|
UINT Timeout,
|
|
PVOID Context,
|
|
PIRDA_LINK_CB pIrdaLinkCb)
|
|
{
|
|
|
|
#if DBG
|
|
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer initialized, context %x\n"),
|
|
pTimer->pName, pTimer));
|
|
#endif
|
|
|
|
CTEInitTimer(&pTimer->CteTimer);
|
|
CTEInitEvent(&pTimer->CteEvent, IrdaTimerExpFunc);
|
|
|
|
pTimer->ExpFunc = ExpFunc;
|
|
pTimer->Context = Context;
|
|
pTimer->Timeout = Timeout;
|
|
pTimer->pIrdaLinkCb = pIrdaLinkCb;
|
|
}
|
|
|
|
void
|
|
TimerFuncAtDpcLevel(CTEEvent *Event, void *Arg)
|
|
{
|
|
PIRDA_TIMER pIrdaTimer = (PIRDA_TIMER) Arg;
|
|
|
|
#if DBG
|
|
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer expired at DPC, context %x\n"),
|
|
pIrdaTimer->pName, pIrdaTimer));
|
|
#endif
|
|
|
|
CTEScheduleEvent(&pIrdaTimer->CteEvent, Arg);
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
IrdaTimerExpFunc(struct CTEEvent *Event, void *Arg)
|
|
{
|
|
PIRDA_TIMER pIrdaTimer = (PIRDA_TIMER) Arg;
|
|
PIRDA_LINK_CB pIrdaLinkCb;
|
|
|
|
#if DBG
|
|
DEBUGMSG(DBG_TIMER, (TEXT("%hs timer expired, context %x\n"),
|
|
pIrdaTimer->pName, pIrdaTimer));
|
|
#endif
|
|
|
|
pIrdaLinkCb = pIrdaTimer->pIrdaLinkCb;
|
|
|
|
if (pIrdaLinkCb)
|
|
LOCK_LINK(pIrdaLinkCb);
|
|
|
|
if (pIrdaTimer->Late != TRUE)
|
|
pIrdaTimer->ExpFunc(pIrdaTimer->Context);
|
|
else
|
|
{
|
|
DEBUGMSG(DBG_WARN | DBG_TIMER,
|
|
(TEXT("IRDA TIMER LATE, ignoring\n")));
|
|
pIrdaTimer->Late = FALSE;
|
|
}
|
|
|
|
if (pIrdaLinkCb)
|
|
{
|
|
UNLOCK_LINK(pIrdaLinkCb);
|
|
|
|
REFDEL(&pIrdaLinkCb->RefCnt,'RMIT');
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
IrdaTimerStart(PIRDA_TIMER pIrdaTimer)
|
|
{
|
|
if (pIrdaTimer->pIrdaLinkCb)
|
|
REFADD(&pIrdaTimer->pIrdaLinkCb->RefCnt, 'RMIT');
|
|
|
|
pIrdaTimer->Late = FALSE;
|
|
CTEStartTimer(&pIrdaTimer->CteTimer, pIrdaTimer->Timeout,
|
|
TimerFuncAtDpcLevel, (PVOID) pIrdaTimer);
|
|
|
|
#if DBG
|
|
DEBUGMSG(DBG_TIMER, (TEXT("Start timer %hs (%dms) context %x\n"),
|
|
pIrdaTimer->pName,
|
|
pIrdaTimer->Timeout,
|
|
pIrdaTimer));
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
IrdaTimerStop(PIRDA_TIMER pIrdaTimer)
|
|
{
|
|
if (pIrdaTimer->pIrdaLinkCb)
|
|
LOCK_LINK(pIrdaTimer->pIrdaLinkCb);
|
|
|
|
if (CTEStopTimer(&pIrdaTimer->CteTimer) == 0)
|
|
{
|
|
pIrdaTimer->Late = TRUE;
|
|
}
|
|
else
|
|
{
|
|
if (pIrdaTimer->pIrdaLinkCb)
|
|
REFDEL(&pIrdaTimer->pIrdaLinkCb->RefCnt,'RMIT');
|
|
}
|
|
#if DBG
|
|
DEBUGMSG(DBG_TIMER, (TEXT("Timer %hs stopped, late %d\n"), pIrdaTimer->pName,
|
|
pIrdaTimer->Late));
|
|
#endif
|
|
|
|
if (pIrdaTimer->pIrdaLinkCb)
|
|
{
|
|
UNLOCK_LINK(pIrdaTimer->pIrdaLinkCb);
|
|
}
|
|
return;
|
|
}
|
|
|
|
VOID
|
|
IrdaTimerRestart(PIRDA_TIMER pIrdaTimer)
|
|
{
|
|
IrdaTimerStop(pIrdaTimer);
|
|
IrdaTimerStart(pIrdaTimer);
|
|
}
|
|
|