typedef void * (*pfnTimerCallbk)(void);
typedef struct{
int timeout; //timeout seconds
pfnTimerCallbk pfnCallBk;
}Timer_A;
#define MAX_TIMERS 30
Timer_A TimerR40[MAX_TIMERS];
void CallbackTimer(void)
{
printf("hello hello\n");
}
int TIMER_Full()
{
int iCount = 0;
for(iCount = 0; iCount < MAX_TIMERS; iCount++)
{
if(TimerR40[iCount].timeout == -1)
{
return 0;
}
}
return 1;
}
int TIMER_IsEmpty()
{
int iCount = 0;
for(iCount = 0; iCount < MAX_TIMERS; iCount++)
{
if(TimerR40[iCount].timeout != -1)
{
return 0;
}
}
return 1;
}
int TIMER_GetFreeEntry()
{
int iCount = 0;
for(iCount = 0; iCount < MAX_TIMERS; iCount++)
{
if(TimerR40[iCount].timeout == -1)
{
return iCount;
}
}
return -1;
}
void TimerStop(int timerid)
{
if(TimerR40[timerid].timeout != -1)
{
TimerR40[timerid].timeout = -1;
}
return;
}
void TimerStart(){
struct itimerval value,old_timer_val;
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;// sends timer signal every 1 seconds
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL,&value,&old_timer_val);
}
void timer_callback(int sig)
{
int iCount = 0;
for(iCount = 0; iCount < MAX_TIMERS; iCount++)
{
if(TimerR40[iCount].timeout > 0)
{
TimerR40[iCount].timeout--;
}
if(TimerR40[iCount].timeout == 0)
{
TimerR40[iCount].pfnCallBk();
TimerR40[iCount].timeout = -1;
}
}
if(TIMER_IsEmpty())
{
struct itimerval value,old_timer_val;
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 0;// sends timer signal every 1 seconds
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL,&value,&old_timer_val);
}
}
int ADD_Timer(int timeout, pfnTimerCallbk pfnCallBk)
{
if(TIMER_Full()){
printf("TIMER Full cannot add timers\n");
return -1;
}
else{
if(TIMER_IsEmpty()){
TimerStart();
}
int timeid = TIMER_GetFreeEntry();
TimerR40[timeid].timeout = timeout;
TimerR40[timeid].pfnCallBk =pfnCallBk;
return timeid;
}
}
void test()
{
ADD_Timer(5, (pfnTimerCallbk)CallbackTimer);
}
void TimerInit()
{
int iCount=0;
signal(SIGALRM, timer_callback);
memset(TimerR40, 0, sizeof(TimerR40));
for(iCount = 0; iCount < MAX_TIMERS; iCount++)
{
TimerR40[iCount].timeout = -1;
}
}