📄 jwl-gtf_timer.c
字号:
* 返回:RateInfo :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_AddTimer(jwl_gtf_void (*jwl_gtf_fun)(jwl_gtf_void *),jwl_gtf_void *jwl_gtf_Param,\
jwl_gtf_u32 TimeOut,jwl_gtf_u8 *jwl_gtf_TimerID,jwl_gtf_Timer *jwl_gtf_Timer,jwl_gtf_bool jwl_gtf_Status)
{
jwl_gtf_Timer *tmpTimer;
jwl_gtf_Timer *oldTimer;
if(jwl_gtf_TimerFree==jwl_gtf_NULL||jwl_gtf_UseableCount==0) /*定时器资源是否可用*/
return jwl_gtf_NoTimer; /*没有可用定时器*/
tmpTimer=jwl_gtf_TimerFree;
jwl_gtf_TimerFree=jwl_gtf_TimerFree->jwl_gtf_TLink->Next; /*调整空链表指针*/
jwl_gtf_TimerFree->jwl_gtf_Link->Pre=jwl_gtf_TimerFree;
jwl_gtf_UseableCount--; /*可用数递减*/
tmpTimer->jwl_gtf_TimeOut=jwl_gtf_TimeOut; /*定时时间,单位是滴答次*/
tmpTimer->jwl_gtf_InitCounter=jwl_gtf_TimeOut;
tmpTimer->jwl_gtf_TimerID=jwl_gtf_TimerID++; /*定时器ID号*/
tmpTimer->jwl_gtf_fun=(*jwl_gtf_fun)(); /*入口函数*/
tmpTimer->jwl_gtf_Param=jwl_gtf_Param; /*入口参数*/
jwl_gtf_TimerID=tmpTimer->jwl_gtf_TimerID;
if(jwl_gtf_Status==jwl_gtf_TimerContinue)
tmpTimer->jwl_gtf_Status=jwl_gtf_TimerContinue;
else if(jwl_gtf_Status==jwl_gtf_TimerKill)
tmpTimer->jwl_gtf_Status=jwl_gtf_TimerKill;
tmpTimer->jwl_gtf_InitCounter=TimeOut;
if(jwl_gtf_Useable==jwl_gtf_NULL) /*链表表头部*/
jwl_gtf_InserTimerHead(jwl_gtf_Useable,tmpTimer);
else
{
oldTimer=jwl_gtf_Useable;
if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
else
for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_FindTimer *
* 描述:查找定时器 *
* 参数: TimerID :给定的时间ID号 *
* 返回:jwl_gtf_Timer :系统返回的时间定时器指针 *
*********************************************************************************************************/
jwl_gtf_Timer *jwl_gtf_FindTimer(jwl_gtf_u8 TimerID)
{
jwl_gtf_Timer *tmpTimer;
tmpTimer=jwl_gtf_Useable;
for(;tmpTimer->jwl_gtf_Timer=TimerID&&tmpTimer!=jwl_gtf_NULL;\
tmpTimer=tmpTimer->jwl_gtf_Link->Pre)
return tmpTimer;
}
/********************************************************************************************************
* jwl_gtf_DeleteTimerHead *
* 描述:系统定时器删除链表头 *
*参数: a:要被删除的链表头 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Timer,jwl_gtf_Timer)
/********************************************************************************************************
* jwl_gtf_DeleteTimerTail *
* 描述:系统定时器删除链表尾 *
*参数: a:要被删除的链表尾 *
* 返回: :jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkTail(Timer,jwl_gtf_Timer)
/********************************************************************************************************
* jwl_gtf_DelTimer *
* 描述:取消定时器 *
* 参数: jwl_gtf_TimerID :给定的时间ID号 *
* jwl_gtf_Timer :给定的时间定时器指针 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_u8 jwl_gtf_delTimer(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID)
{
jwl_gtf_Timer *tmpTimer;
if(jwl_gtf_Timer==jwl_gtf_NULL) /*是否用ID查找*/
{
if(tmpTimer=jwl_gtf_FindTimer(jwl_gtf_Timer)!=jwl_gtf_Noerror)
return jwl_gtf_NoTimerID; /*ID不存在*/
}
if(tmpTimer->jwl_gtf_Link->pre==jwl_gtf_Useable)
jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
else
jwl_gtf_DeleteTimerTail(tmpTimer);
jwl_gtf_InserTimerHead(jwl_gtf_TimerFree,tmpTimer);
jwl_gtf_UseableCount++;
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_SetTimerInfo *
* 描述:取消定时器 *
* 参数: TimerID :给定的时间ID号 *
* Timer :给定的时间定时器指针 *
* TimerInfo :定时器设定信息 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_SetTimerInfo(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID,jwl_gtf_TimerInfo *TimerInfo)
{
jwl_gtf_Timer *tmpTimer;
jwl_gtf_Timer *oldTimer;
if(TimerInfo->jwl_gtf_TimeOut<0)||(TimerInfo->jwl_gtf_Status<0&&\
TimerInfo->jwl_gtf_Status>1))
return jwl_gtf_ParaError; /*参数无效*/
if(Timer==jwl_gtf_NULL)
{
if(tmpTimer=jwl_gtf_FindTimer(TimerID)==jwl_gtf_NULL) /*时间ID号不存在*/
return jwl_gtf_FindTimer;
}
else
tmpTimer=Timer;
if(TimerInfo->jwl_gtf_TimeOut==tmpTimer->jwl_gtf_TimeOut)
tmpTimer->jwl_gtf_Status=TimerInfo->jwl_gtf_Status;
else
{
if(tmpTimer->jwl_gtf_Link->Pre==jwl_gtf_Useable)
jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
else
jwl_gtf_DeleteTimerHead(tmpTimer);
tmpTimer->jwl_gtf_TimeOut=TimerInfo->jwl_gtf_TimeOut;
tmpTimer->jwl_gtf_InitCounter=TimerInfo->jwl_gtf_TimeOut;
tmpTimer->jwl_gtf_Status=TimerInfo->jwl_gtf_Stauts;
oldTimer=jwl_gtf_Useable;
if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
else
for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_GetTimerInfo *
* 描述:获得指定定时器相关信息 *
* 参数: TimerID :给定的时间ID号 *
* Timer :给定的时间定时器指针 *
* 返回: :jwl_gtf_TimerInfo *
*********************************************************************************************************/
jwl_gtf_Info *jwl_gtf_GetTimerInfo(jwl_gtf_Timer *Timer,jwl_gtf_u8 TimerID)
{
jwl_gtf_Timer *tmpTimer;
jwl_gtf_Info *tmpInfo;
if(Timer==jwl_gtf_NULL)
{
if(tmpTimer=jwl_gtf_FindTimer(TimerID)==jwl_gtf_NULL) /*时间ID号不存在*/
return jwl_gtf_NULL;
}
else
tmpTimer=Timer;
tmpInfo->jwl_gtf_TimeOut=tmpTimer->jwl_gtf_InitCounter;
tmpInfo->jwl_gtf_InitCounter=tmpTimer->jwl_gtf_InitCounter;
tmpInfo->jwl_gtf_Stauts=tmpTimer->jwl_gtf_Status;
return tmpInfo;
}
/********************************************************************************************************
* jwl_gtf_RunTimerList *
* 描述:执行定时任务 *
* 参数: *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_RunTimerList()
{
jwl_gtf_Timer *tmpTimer;
jf(jwl_gtf_Timer==jwl_gtf_NULL)
return;
tmpTimer=jwl_gtf_Useable;
for(;tmpTimer!=jwl_gtf_NULL;tmpTimer->jwl_gtf_Link->Next)
{
if(--tmpTimer->jwl_gtf_TimeOut==0)
{
jwl_gtf_void(*tmpTimer->jwl_gtf_fun)(tmpTimer->jwl_gtf_Param);
if(tmpTimer->jwl_gtf_Stauts==jwl_gtf_TimerContinue) /*任务定时完则继续定时*/
{
if(tmpTimer->jwl_gtf_Link->Pre==jwl_gtf_Useable)
jwl_gtf_DeleteTimerHead(jwl_gtf_Useable);
else
jwl_gtf_DeleteTimerHead(tmpTimer);
if(jwl_gtf_TimerRunmethod==jwl_gtf_TimerFIFO)
for(;oldTimer->jwl_gtf_TimeOut<=TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
else
for(;oldTimer->jwl_gtf_TimeOut<TimeOut&&oldTimer!=jwl_gtf_NULL;\
oldTimer->jwl_gtf_Link->Next)
jwl_gtf_InserTimerTail(oldTimer->jwl_gtf_Link->Pre,tmpTimer);
tmpTimer->jwl_gtf_TimeOut=tmpTimer->jwl_gtf_InitCounter
}
else
jwl_gtf_delTimer(tmpTimer,0); /*任务执行完则删除*/
}
}
return;
}
/********************************************************************************************************
* jwl_gtf_TimerCounter *
* 描述:更新时钟 *
* 参数: *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_TimerCounter()
{
jwl_gtf_u8 rMonth[3];
#if jwl_gtf_Counter<1000000
jwl_gtf_nSec+=jwl_gtf_Counter;
if(jwl_gtf_nSec<1000000)
return;
else
{
jwl_gtf_nSec-=1000000;
jwl_gtf_mSec++;
}
#else
jwl_gtf_mSec+=jwl_gtf_Counter/1000000;
jwl_gtf_nSec+=jwl_gtf_Counter-(jwl_gtf_Counter/1000000)*1000000;
if(jwl_gtf_nSec>1000000)
{
jwl_gtf_nSec-=1000000;
jwl_gtf_mSec++;
}
#endif
if(jwl_gtf_mSec<1000)
return;
jwl_gtf_mSec-=1000;
if(++jwl_gtf_Sec<59)
return;
jwl_gtf_Sec-=60;
if(++jwl_gtf_Min<59)
return;
jwl_gtf_Min-=60;
if(++jwl_gtf_Hour<23)
return;
jwl_gtf_Hour-=24;
if(++jwl_gtf_Day<29)
return;
else
{
if(jwl_gtf_Month!=2) /*不是月份*/
{
sprintf(rMonth,"%d\n",jwl_gtf_Month);
switch(rMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(jwl_gtf_Day<31)
return;
else
{
jwl_gtf_Day-=31;
break;
}
case 4:
case 6:
case 9:
case 11:
if(jwl_gtf_Day<30)
return;
else
{
jwl_gtf_Day-=30;
break;
}
}
}
else
{
if((jwl_gtf_Year/4)*4==jwl_gtf_Year)
{
if((jwl_gtf_Year/100)*100!=jwl_gtf_Year)
{
if(jwl_gtf_Day<29)
return;
else
{
jwl_gtf_Day-=29;
break;
}
}
else
{
if((jwl_gtf_Year/400)*400==jwl_gtf_Year)
{
if(jwl_gtf_day<29)
return;
else
{
jwl_gtf_Day-=29;
break;
}
}
else
{
if(jwl_gtf_Day<28)
return;
else
{
jwl_gtf_Day-=28;
break;
}
}
}
}
else
{
if(jwl_gtf_Day<29)
return;
else
{
jwl_gtf_Day-=29;
break;
}
}
}
}
if(++jwl_gtf_Month<12)
return;
jwl_gtf_Mont-=12;
jwl_gtf_Year++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -