Timer模块的实现比较复杂,需要结合前面的文章《AMPS:定时器管理》才能有所理解,下面看看AMPS中的定时器实现,有些细节方面我也没有想清楚。
AMPS_Timer.h
#ifndef __HEADER_AMPS_TIMER_H__ #define __HEADER_AMPS_TIMER_H__ #ifdef __cplusplus extern "C" { #endif #include "AMPS_Defines.h" #include "AMPS_Core.h" #include "AMPS_SystemAPI.h" #include "AMPS_TimerTicker.h" typedef struct _AMPSTimer t_AMPSTimer; typedef struct _AMPSTimerNodeData t_AMPSTimerNodeData; typedef struct _AMPSTimerSlot t_AMPSTimerSlot; typedef struct _AMPSTimerMessage t_AMPSTimerMessage; #define AMPS_TIMER_CURRENT_SLOT_MILLISECONDS 1 #define AMPS_TIMER_CURRENT_SLOT_SECONDS 2 #define AMPS_TIMER_CURRENT_SLOT_MINUTES 3 #define AMPS_TIMER_CURRENT_SLOT_HOURS 4 #define AMPS_TIMER_CURRENT_SLOT_DAYS 5 #define AMPS_TIMER_STATUS_ENABLE 1 #define AMPS_TIMER_STATUS_DISABLE 2 #define AMPS_TIMER_SERVER_MSG_PORT 5000 //#define AMPS_TIMER_NUM_OF_MILLI_SECOND_SLOTS 50 //#define AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME 20 //20 Milli Second #define AMPS_TIMER_NUM_OF_SECOND_SLOTS 60 #define AMPS_TIMER_MIN_SECOND_SLOT_TIME 1000 //1 Second #define AMPS_TIMER_NUM_OF_MINUTE_SLOTS 60 #define AMPS_TIMER_MIN_MINUTE_SLOT_TIME (AMPS_TIMER_MIN_SECOND_SLOT_TIME * AMPS_TIMER_NUM_OF_SECOND_SLOTS) //1 Minute #define AMPS_TIMER_NUM_OF_HOUR_SLOTS 24 #define AMPS_TIMER_MIN_HOUR_SLOT_TIME (AMPS_TIMER_MIN_MINUTE_SLOT_TIME * AMPS_TIMER_NUM_OF_MINUTE_SLOTS) //1 Hour #define AMPS_TIMER_NUM_OF_DAY_SLOTS 7 #define AMPS_TIMER_MIN_DAY_SLOT_TIME (AMPS_TIMER_MIN_HOUR_SLOT_TIME * AMPS_TIMER_NUM_OF_HOUR_SLOTS) //1 Day //#define AMPS_TIMER_MIN_SLOT_TIME AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME //Milli Seconds //#define AMPS_TIMER_SLOT_TIMEOUT_SEC 0 //#define AMPS_TIMER_SLOT_TIMEOUT_MSEC AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME //#define AMPS_TIMER_MIN_TIMER_VALUE AMPS_TIMER_MIN_MILLI_SECOND_SLOT_TIME //Milli Seconds //#define AMPS_TIMER_MAX_TIMER_VALUE (1000 * 60 * 60 * 24 * 7) //Milli Seconds it is 1 month now struct _AMPSTimerSlot { t_AMPSDList* poDList; }; /*定时器模块结构*/ struct _AMPSTimer { //int nTimerConnectionListenPort; //int nSlotTimeOutInMilliSeconds; //int nSlotTimeOutInSeconds; int nMinSlotTime; /*最小的结点个数*/ int nMinTimerValue; /*最小时间间隔*/ int nMaxTimerValue; /*最大时间间隔*/ /*毫秒链表*/ //t_AMPSTimerSlot poTimerSlotMilliSeconds[AMPS_TIMER_NUM_OF_MILLI_SECOND_SLOTS]; int nNoOfMilliSecondsSlots; /*毫秒链表中的结点总个数*/ int nMinMilliSecondsSlotTime;/*毫秒链表中的最小时间间隔*/ t_AMPSTimerSlot* poTimerSlotMilliSeconds; /*毫秒链表*/ unsigned int unIndexForMilliSecondsSlot;/*当前链表中结点个数*/ /*秒数组*/ t_AMPSTimerSlot poTimerSlotSeconds[AMPS_TIMER_NUM_OF_SECOND_SLOTS]; unsigned int unIndexForSecondsSlot; /*分数组*/ t_AMPSTimerSlot poTimerSlotMinutes[AMPS_TIMER_NUM_OF_MINUTE_SLOTS]; unsigned int unIndexForMinutesSlot; /*小时数组*/ t_AMPSTimerSlot poTimerSlotHours[AMPS_TIMER_NUM_OF_HOUR_SLOTS]; unsigned int unIndexForHoursSlot; /*天数组*/ t_AMPSTimerSlot poTimerSlotDays[AMPS_TIMER_NUM_OF_DAY_SLOTS]; unsigned int unIndexForDaysSlot; /*定时器线程句柄*/ t_AMPSThreads oTimerThread; /*ticker时间*/ t_AMPSTimerTicker* poAMPSTimerTicker; }; /*定时器结点结构*/ struct _AMPSTimerNodeData { AMPS_TimeOutNotifyCallBack pfAMPS_TimerCallBack; void* pvData; char chStatus; void* pvAMPSContext; void* pvSListNodePtr; unsigned int unCurrentTimerSlot; unsigned int unDaysSlotNo; unsigned int unHoursSlotNo; unsigned int unMinutesSlotNo; unsigned int unSecondsSlotNo; unsigned int unMilliSecondsSlotNo; }; struct _AMPSTimerMessage { unsigned int unTickCount; }; int Timer_Init(t_AMPSContext* r_poAMPSContext, e_AMPSTimerResolution r_oAMPSTimerResolution, int r_nTimerConnectionListenPort); void Timer_Cleanup(t_AMPSContext* r_poAMPSContext); int Timer_TickerThread(void* r_pvAMPSContext); int Timer_CreateTimerConnection(t_AMPSContext* r_poAMPSContext, void* r_pvAMPSTimer, int r_nTimerConnectionListenPort); int Timer_ProcessTimerEvent(void* r_pvAMPSContext); int Timer_RecvDataCallback(AMPS_HANDLE r_hAMPS_HANDLE, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE, AMPS_NET_HANDLE r_hAMPS_NET_HANDLE, unsigned char* r_puchBuff, int r_nBuffLength, int r_nPort, char* r_chIPAddress); void Timer_ProcessTimerSlot(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer); void* Timer_StartTimer(void* r_pvAMPSContext, unsigned int r_unTimerValue, AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack, void* r_pvData); int Timer_DeleteTimer(void* r_pvAMPSContext, void* r_pvLinkNode); int Timer_FreeNodeData(void** r_ppvAMPSTimerNodeData); void Timer_ProcessDaysTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForDaysTimer); void Timer_ProcessHoursTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForHoursTimer); void Timer_ProcessMinutesTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForMinutesTimer); void Timer_ProcessSecondsTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForSecondsTimer); int Timer_ProcessMilliSecondsNodeData(void** r_ppvAMPSTimerNodeData); #ifdef __cplusplus } #endif #endif /* __HEADER_AMPS_TIMER_H__ */
#include "AMPS_TCP.h" #include "AMPS_LinkList.h" #include "AMPS_Timer.h" #include "AMPS_MemMgt.h" #include "AMPS_Trace.h" /***************************************************************** 函数名称: Timer_Init 功能描述: Timer模块初始化 入参: t_AMPSContext* r_poAMPSContext AMPS应用上下文 e_AMPSTimerResolution r_oAMPSTimerResolution 定时器时长 int r_nTimerConnectionListenPort 出参: -- 返回值: int *****************************************************************/ int Timer_Init(t_AMPSContext* r_poAMPSContext, e_AMPSTimerResolution r_oAMPSTimerResolution, int r_nTimerConnectionListenPort) { t_AMPSTimer* poAMPSTimer = NULL; unsigned int unCurrentTime = 0; int nCounter = 0; /*分配Timer解句柄*/ r_poAMPSContext->pvTimerContext = AMPS_InternalMalloc(sizeof(t_AMPSTimer)); if (NULL == r_poAMPSContext->pvTimerContext) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for r_poAMPSContext->pvTimerContext.\n"); return AMPS_ERROR_FAILURE; } poAMPSTimer = r_poAMPSContext->pvTimerContext; /*根据不同的超时时间进行Timer内容初始化*/ if(AMPS_TIMER_RESOLUTION_20MS == r_oAMPSTimerResolution) { poAMPSTimer->nMinMilliSecondsSlotTime = 20; poAMPSTimer->nNoOfMilliSecondsSlots = 1000/20; } else if(AMPS_TIMER_RESOLUTION_25MS == r_oAMPSTimerResolution) { poAMPSTimer->nMinMilliSecondsSlotTime = 25; poAMPSTimer->nNoOfMilliSecondsSlots = 1000/25; } else if(AMPS_TIMER_RESOLUTION_50MS == r_oAMPSTimerResolution) { poAMPSTimer->nMinMilliSecondsSlotTime = 50; poAMPSTimer->nNoOfMilliSecondsSlots = 1000/50; } else if(AMPS_TIMER_RESOLUTION_100MS == r_oAMPSTimerResolution) { poAMPSTimer->nMinMilliSecondsSlotTime = 100; poAMPSTimer->nNoOfMilliSecondsSlots = 1000/100; } /*分配Timer中ticker指针内存*/ poAMPSTimer->poAMPSTimerTicker = AMPS_InternalMalloc(sizeof(t_AMPSTimerTicker)); if (NULL == poAMPSTimer->poAMPSTimerTicker) { TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poAMPSTimerTicker.\n"); return AMPS_ERROR_FAILURE; } /*初始化Ticker成员*/ poAMPSTimer->poAMPSTimerTicker->nTimerIsRunning = AMPS_TRUE; poAMPSTimer->poAMPSTimerTicker->nTimerTraceID = TIMER_TRACE_ID(r_poAMPSContext); poAMPSTimer->poAMPSTimerTicker->nTimerConnectionListenPort = r_nTimerConnectionListenPort; poAMPSTimer->poAMPSTimerTicker->nSlotTimeOutInMilliSeconds = poAMPSTimer->nMinMilliSecondsSlotTime; poAMPSTimer->poAMPSTimerTicker->nSlotTimeOutInSeconds = 0; //poAMPSTimer->nSlotTimeOutInMilliSeconds = poAMPSTimer->nMinMilliSecondsSlotTime; //poAMPSTimer->nSlotTimeOutInSeconds = 0; poAMPSTimer->nMinSlotTime = poAMPSTimer->nMinMilliSecondsSlotTime; poAMPSTimer->nMinTimerValue = poAMPSTimer->nMinMilliSecondsSlotTime; /*最大的定时器时长,一周*/ poAMPSTimer->nMaxTimerValue = AMPS_TIMER_NUM_OF_DAY_SLOTS * AMPS_TIMER_MIN_DAY_SLOT_TIME; //poAMPSTimer->nTimerConnectionListenPort = r_nTimerConnectionListenPort; poAMPSTimer->poTimerSlotMilliSeconds = AMPS_InternalMalloc(sizeof(t_AMPSTimerSlot) * poAMPSTimer->nNoOfMilliSecondsSlots); if (NULL == poAMPSTimer->poTimerSlotMilliSeconds) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poAMPSTimer->poTimerSlotMilliSeconds.\n"); return AMPS_ERROR_FAILURE; } //poAMPSTimer->poNetworkMessage = NULL; /*获取当前时长,单位:毫秒*/ unCurrentTime = SAPI_GetCurrentTimeInMilliSec(r_poAMPSContext) + poAMPSTimer->nMinSlotTime; // add min slot time for the first slot /*不同时长的定时器数组初始化*/ //For Milli-Seconds Slots poAMPSTimer->unIndexForMilliSecondsSlot = 0; for(nCounter = 0; nCounter < poAMPSTimer->nNoOfMilliSecondsSlots; nCounter++) { if(NULL == DList_Init(&poAMPSTimer->poTimerSlotMilliSeconds[nCounter].poDList)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n"); return AMPS_ERROR_FAILURE; } } //For Seconds Slots poAMPSTimer->unIndexForSecondsSlot = 0; for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_SECOND_SLOTS; nCounter++) { if(NULL == DList_Init(&poAMPSTimer->poTimerSlotSeconds[nCounter].poDList)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n"); return AMPS_ERROR_FAILURE; } } //For Minutes Slots poAMPSTimer->unIndexForMinutesSlot = 0; for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_MINUTE_SLOTS; nCounter++) { if(NULL == DList_Init(&poAMPSTimer->poTimerSlotMinutes[nCounter].poDList)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n"); return AMPS_ERROR_FAILURE; } } //For Hours Slots poAMPSTimer->unIndexForHoursSlot = 0; for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_HOUR_SLOTS; nCounter++) { if(NULL == DList_Init(&poAMPSTimer->poTimerSlotHours[nCounter].poDList)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n"); return AMPS_ERROR_FAILURE; } } //For Days Slots poAMPSTimer->unIndexForDaysSlot = 0; for(nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_DAY_SLOTS; nCounter++) { if(NULL == DList_Init(&poAMPSTimer->poTimerSlotDays[nCounter].poDList)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Init failed.\n"); return AMPS_ERROR_FAILURE; } } /*建立定时器服务器,用于接收事件通知,用来接收Ticker通知?*/ if(AMPS_ERROR_FAILURE == Timer_CreateTimerConnection(r_poAMPSContext, poAMPSTimer, r_nTimerConnectionListenPort)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Timer_CreateTimerConnection failed.\n"); return AMPS_ERROR_FAILURE; } return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_Cleanup 功能描述: Timer模块销毁 入参: t_AMPSContext* r_poAMPSContext AMPS应用上下文 出参: -- 返回值: void *****************************************************************/ void Timer_Cleanup(t_AMPSContext* r_poAMPSContext) { t_AMPSTimer* poAMPSTimer = (t_AMPSTimer*)r_poAMPSContext->pvTimerContext; t_AMPSThreads oTimerThread = poAMPSTimer->oTimerThread; int nCounter = 0; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*设置定时器工作模式为FALSE*/ poAMPSTimer->poAMPSTimerTicker->nTimerIsRunning = AMPS_FALSE; /*线程挂起,等待线程函数处理完成*/ if (AMPS_ERROR_FAILURE == SAPI_WaitForThread(r_poAMPSContext, &oTimerThread)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_WaitForThread failed.\n"); } for (nCounter = 0; nCounter < poAMPSTimer->nNoOfMilliSecondsSlots; nCounter++) { DList_Free(&poAMPSTimer->poTimerSlotMilliSeconds[nCounter].poDList, NULL); } for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_SECOND_SLOTS; nCounter++) { DList_Free(&poAMPSTimer->poTimerSlotSeconds[nCounter].poDList, NULL); } for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_MINUTE_SLOTS; nCounter++) { DList_Free(&poAMPSTimer->poTimerSlotMinutes[nCounter].poDList, NULL); } for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_HOUR_SLOTS; nCounter++) { DList_Free(&poAMPSTimer->poTimerSlotHours[nCounter].poDList, NULL); } for (nCounter = 0; nCounter < AMPS_TIMER_NUM_OF_DAY_SLOTS; nCounter++) { DList_Free(&poAMPSTimer->poTimerSlotDays[nCounter].poDList, NULL); } /*释放定时器句柄*/ AMPS_InternalFree(r_poAMPSContext->pvTimerContext); TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_FreeNodeData 功能描述: 释放定时器结点 入参: void** r_ppvAMPSTimerNodeData 定时器结点数据 出参: -- 返回值: int *****************************************************************/ int Timer_FreeNodeData(void** r_ppvAMPSTimerNodeData) { t_AMPSTimerNodeData* poAMPSTimerNodeData = *r_ppvAMPSTimerNodeData; if(NULL != poAMPSTimerNodeData) { AMPS_InternalFree(poAMPSTimerNodeData); } *r_ppvAMPSTimerNodeData = NULL; return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_FreeNodeData 功能描述: Timer连接事件回调 入参: void* r_pvAMPSContext void* r_pvAMPSTimer void* r_pvAMPSNetworkMsg int r_nPort char* r_chIPAddress 出参: -- 返回值: int *****************************************************************/ int Timer_ConnectEvtCallback(void* r_pvAMPSContext, void* r_pvAMPSTimer, void* r_pvAMPSNetworkMsg, int r_nPort, char* r_chIPAddress) { t_AMPSContext* poAMPSContext = r_pvAMPSContext; t_AMPSNetworkMsg* poAMPSNetworkMsg = r_pvAMPSNetworkMsg; TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if(NULL == poAMPSNetworkMsg) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "error in connection.\n"); } else { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Connected successfully.\n"); poAMPSContext->poAMPSNetworkTimerMsgForConnectedSocket = poAMPSNetworkMsg; TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Handle %d.\n", (int)poAMPSNetworkMsg->nHandle); } TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_CreateTimerConnection 功能描述: Timer创建连接 入参: t_AMPSContext* r_poAMPSContext void* r_pvAMPSTimer int r_nTimerConnectionListenPort 出参: -- 返回值: int *****************************************************************/ int Timer_CreateTimerConnection(t_AMPSContext* r_poAMPSContext, void* r_pvAMPSTimer, int r_nTimerConnectionListenPort) { t_AMPSTimer* poAMPSTimer = r_pvAMPSTimer; void* pvAMPSNetworkMsg = NULL; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); /*在环回地址上创建一个socket并绑定指定的port,做为一个非阻塞的时间服务器*/ //Listener socket to accept Timer connection TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Create listener socket to accept Timer connection.\n"); if(AMPS_SUCCESS != TCP_InternalCreateNonBlockingListener(r_poAMPSContext, AMPS_MEMORY_SCHEME_STATIC, NULL, NULL, NULL, AMPS_CONNECTION_TYPE_TCP, r_nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, 0, sizeof(t_AMPSTimerMessage), Timer_ConnectEvtCallback, poAMPSTimer, Timer_RecvDataCallback, &pvAMPSNetworkMsg, NULL)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateNonBlockingListener failed for timer.\n"); return AMPS_ERROR_FAILURE; } /*设置定时器线程优先级为最高*/ if(AMPS_SUCCESS != SAPI_SetThreadSchedFIFOWithPriority(r_poAMPSContext, &poAMPSTimer->oTimerThread, AMPS_PRIORITY_TYPE_MANUAL, 10)) { TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_SetThreadSchedRRWithPriority failed.\n"); return AMPS_ERROR_FAILURE; } /*创建线程*/ if(AMPS_SUCCESS != SAPI_ThreadCreate(r_poAMPSContext, &poAMPSTimer->oTimerThread, Timer_TickerThread, poAMPSTimer->poAMPSTimerTicker)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_ThreadCreate failed.\n"); return AMPS_ERROR_FAILURE; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_StartTimer 功能描述: 启动定时器 入参: void* r_pvAMPSContext unsigned int r_unTimerValue 定时器时长 AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack 超时处理函数 void* r_pvData 出参: -- 返回值: int *****************************************************************/ void* Timer_StartTimer(void* r_pvAMPSContext, unsigned int r_unTimerValue, AMPS_TimeOutNotifyCallBack r_pfAMPS_TimerCallBack, void* r_pvData) { t_AMPSContext* poAMPSContext = r_pvAMPSContext; t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext; t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL; t_AMPSDList* poDListForTimerSlot = NULL; if ((unsigned int)poAMPSTimer->nMinTimerValue > r_unTimerValue || (unsigned int)poAMPSTimer->nMaxTimerValue <= r_unTimerValue) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Invalid Timer Value = %ul.\n", r_unTimerValue); return NULL; } /*分配定时器结点*/ poAMPSTimerNodeData = (t_AMPSTimerNodeData*)AMPS_InternalMalloc(sizeof(t_AMPSTimerNodeData)); if (NULL == poAMPSTimerNodeData) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc is failed for Timer Node.\n"); return NULL; } /*超时处理函数*/ poAMPSTimerNodeData->pfAMPS_TimerCallBack = r_pfAMPS_TimerCallBack; poAMPSTimerNodeData->pvData = r_pvData; poAMPSTimerNodeData->chStatus = AMPS_TIMER_STATUS_ENABLE; poAMPSTimerNodeData->pvAMPSContext = r_pvAMPSContext; TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer value is %d.\n", r_unTimerValue); /*时长大于1天*/ if(AMPS_TIMER_MIN_DAY_SLOT_TIME <= r_unTimerValue) { /*定时器结点中从天到毫秒各链表结点赋值,用来表示当前时长*/ poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_DAYS; poAMPSTimerNodeData->unDaysSlotNo = ((poAMPSTimer->unIndexForDaysSlot + (r_unTimerValue/AMPS_TIMER_MIN_DAY_SLOT_TIME)) % AMPS_TIMER_NUM_OF_DAY_SLOTS); poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimer->unIndexForHoursSlot + (r_unTimerValue/AMPS_TIMER_MIN_HOUR_SLOT_TIME)) % AMPS_TIMER_NUM_OF_HOUR_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Hour Slot # %d.\n", poAMPSTimerNodeData->unHoursSlotNo); if(poAMPSTimerNodeData->unHoursSlotNo < poAMPSTimer->unIndexForHoursSlot) { poAMPSTimerNodeData->unDaysSlotNo= ((poAMPSTimerNodeData->unDaysSlotNo+ 1) % AMPS_TIMER_NUM_OF_DAY_SLOTS); } poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Minute Slot # %d.\n", poAMPSTimerNodeData->unMinutesSlotNo); if(poAMPSTimerNodeData->unMinutesSlotNo < poAMPSTimer->unIndexForMinutesSlot) { poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimerNodeData->unHoursSlotNo + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS); } poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot) { poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); } poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots); if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ) { poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); } poDListForTimerSlot = poAMPSTimer->poTimerSlotDays[poAMPSTimerNodeData->unDaysSlotNo].poDList; } else if(AMPS_TIMER_MIN_HOUR_SLOT_TIME <= r_unTimerValue) { poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_HOURS; poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimer->unIndexForHoursSlot + (r_unTimerValue/AMPS_TIMER_MIN_HOUR_SLOT_TIME)) % AMPS_TIMER_NUM_OF_HOUR_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Hour Slot # %d.\n", poAMPSTimerNodeData->unHoursSlotNo); poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Minute Slot # %d.\n", poAMPSTimerNodeData->unMinutesSlotNo); if(poAMPSTimerNodeData->unMinutesSlotNo < poAMPSTimer->unIndexForMinutesSlot) { poAMPSTimerNodeData->unHoursSlotNo = ((poAMPSTimerNodeData->unHoursSlotNo + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS); } poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot) { poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); } poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots); if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ) { poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); } poDListForTimerSlot = poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList; } else if(AMPS_TIMER_MIN_MINUTE_SLOT_TIME <= r_unTimerValue) { poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MINUTES; poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimer->unIndexForMinutesSlot + (r_unTimerValue/AMPS_TIMER_MIN_MINUTE_SLOT_TIME)) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Minute Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMinutesSlotNo, poAMPSTimer->unIndexForMinutesSlot); poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With Second Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unSecondsSlotNo, poAMPSTimer->unIndexForSecondsSlot); if(poAMPSTimerNodeData->unSecondsSlotNo < poAMPSTimer->unIndexForSecondsSlot) { poAMPSTimerNodeData->unMinutesSlotNo = ((poAMPSTimerNodeData->unMinutesSlotNo + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS); } poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots); if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ) { poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); } TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot); poDListForTimerSlot = poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList; } else if(AMPS_TIMER_MIN_SECOND_SLOT_TIME <= r_unTimerValue) { poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_SECONDS; poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimer->unIndexForSecondsSlot + (r_unTimerValue/AMPS_TIMER_MIN_SECOND_SLOT_TIME)) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in Second Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unSecondsSlotNo, poAMPSTimer->unIndexForSecondsSlot); poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "With MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot); if(poAMPSTimerNodeData->unMilliSecondsSlotNo < poAMPSTimer->unIndexForMilliSecondsSlot ) { poAMPSTimerNodeData->unSecondsSlotNo = ((poAMPSTimerNodeData->unSecondsSlotNo+ 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS); } poDListForTimerSlot = poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList; } else { poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MILLISECONDS; poAMPSTimerNodeData->unMilliSecondsSlotNo = ((poAMPSTimer->unIndexForMilliSecondsSlot + (r_unTimerValue/poAMPSTimer->nMinMilliSecondsSlotTime)) % poAMPSTimer->nNoOfMilliSecondsSlots); TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Timer is in MilliSecond Slot # %d, where current Slot is %d.\n", poAMPSTimerNodeData->unMilliSecondsSlotNo, poAMPSTimer->unIndexForMilliSecondsSlot); poDListForTimerSlot = poAMPSTimer->poTimerSlotMilliSeconds[poAMPSTimerNodeData->unMilliSecondsSlotNo].poDList; } /*增加结点*/ poAMPSTimerNodeData->pvSListNodePtr = DList_Prepend(poDListForTimerSlot, poAMPSTimerNodeData); if (NULL == poAMPSTimerNodeData->pvSListNodePtr) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SList_Prepend is failed.\n"); AMPS_InternalFree(poAMPSTimerNodeData); } return poAMPSTimerNodeData->pvSListNodePtr; } /***************************************************************** 函数名称: Timer_DeleteTimer 功能描述: 删除定时器 入参: void* r_pvAMPSContext void* r_pvLinkNode 出参: -- 返回值: int *****************************************************************/ int Timer_DeleteTimer(void* r_pvAMPSContext, void* r_pvLinkNode) { t_AMPSContext* poAMPSContext = r_pvAMPSContext; t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext; t_AMPSSList* poLinkNode = (t_AMPSSList*)r_pvLinkNode; t_AMPSTimerNodeData* poAMPSTimerNodeData = (t_AMPSTimerNodeData*)poLinkNode->pvData; /*根据不同时长从不同的定时器链表中删除指定的定时器结点*/ if(AMPS_TIMER_CURRENT_SLOT_DAYS == poAMPSTimerNodeData->unCurrentTimerSlot) { if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotDays[poAMPSTimerNodeData->unDaysSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n"); return AMPS_ERROR_FAILURE; } } else if(AMPS_TIMER_CURRENT_SLOT_HOURS == poAMPSTimerNodeData->unCurrentTimerSlot) { if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n"); return AMPS_ERROR_FAILURE; } } else if(AMPS_TIMER_CURRENT_SLOT_MINUTES == poAMPSTimerNodeData->unCurrentTimerSlot) { if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n"); return AMPS_ERROR_FAILURE; } } else if(AMPS_TIMER_CURRENT_SLOT_SECONDS == poAMPSTimerNodeData->unCurrentTimerSlot) { if(AMPS_SUCCESS != DList_Remove(&poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList, r_pvLinkNode, Timer_FreeNodeData)) { TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_Remove failed.\n"); return AMPS_ERROR_FAILURE; } } else if(AMPS_TIMER_CURRENT_SLOT_MILLISECONDS == poAMPSTimerNodeData->unCurrentTimerSlot) { //Timer is in MilliSeconds Slot, so wait for deletion poAMPSTimerNodeData->chStatus = AMPS_TIMER_STATUS_DISABLE; } return AMPS_SUCCESS; } /* int Timer_TickerThread(void* r_poAMPSContext) { t_AMPSContext* poAMPSContext = r_poAMPSContext; t_AMPSTimer* poAMPSTimer = poAMPSContext->pvTimerContext; t_AMPSTimerMessage oAMPSTimerMessage = {0}; int nReturnValue = AMPS_ERROR_FAILURE; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); //Connected socket to send Timer ticks TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Create connected socket to send Timer ticks.\n"); if(AMPS_SUCCESS != AMPS_InternalCreateBlockingConn(r_poAMPSContext, AMPS_LOOP_BACK_IP_ADDRESS, poAMPSTimer->nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, NULL, (void**)&poAMPSTimer->poNetworkMessage, NULL)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateBlockingConn failed.\n"); return AMPS_ERROR_FAILURE; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Handle %d.\n", (int)poAMPSTimer->poNetworkMessage->nHandle); while (poAMPSTimer->nTimerIsRunning == AMPS_TRUE) { oAMPSTimerMessage.unTickCount += 1; if(AMPS_TIMER_EVENT_TIMEOUT == SAPI_GetNextEvent(r_poAMPSContext, poAMPSTimer->poNetworkMessage->nHandle, poAMPSTimer->nSlotTimeOutInSeconds, poAMPSTimer->nSlotTimeOutInMilliSeconds)) { TRACE(TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Send Msg to Main Thread.\n"); nReturnValue = SAPI_SocketWriteBlocking(poAMPSContext, poAMPSTimer->poNetworkMessage, &oAMPSTimerMessage, sizeof(t_AMPSTimerMessage), NULL); if(AMPS_SUCCESS != nReturnValue) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SAPI_SocketWriteBlocking failed.\n"); continue; } else if(AMPS_ERROR_SOCKET_CLOSED == nReturnValue) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Connection is closed from remote side\n"); printf("Connection is closed from remote side .... Connect again .....\n"); if(AMPS_SUCCESS != AMPS_InternalCreateBlockingConn(r_poAMPSContext, AMPS_LOOP_BACK_IP_ADDRESS, poAMPSTimer->nTimerConnectionListenPort, AMPS_LOOP_BACK_IP_ADDRESS, NULL, (void**)&poAMPSTimer->poNetworkMessage, NULL)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalCreateBlockingConn failed.\n"); return AMPS_ERROR_FAILURE; } } else { oAMPSTimerMessage.unTickCount = 0; } } } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_SUCCESS; } */ /***************************************************************** 函数名称: Timer_ProcessTimerEvent 功能描述: 处理定时器事件 入参: void* r_pvAMPSContext 出参: -- 返回值: int *****************************************************************/ int Timer_ProcessTimerEvent(void* r_pvAMPSContext) { t_AMPSContext* poAMPSContext = r_pvAMPSContext; t_AMPSNetworkMsg* poAMPSNetworkMsg = poAMPSContext->poAMPSNetworkTimerMsgForConnectedSocket; TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if((NULL != poAMPSNetworkMsg) && (AMPS_FALSE == poAMPSNetworkMsg->bLastOperationPending)) { poAMPSNetworkMsg->pfAMPS_SNMReadEvtHandler(poAMPSContext, NULL, poAMPSNetworkMsg); } TRACE( TIMER_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_ProcessTimerEvent 功能描述: 定时器服务器接收数据后处理函数 入参: AMPS_HANDLE r_hAMPS_HANDLE AMPS_APP_HANDLE r_hAMPS_APP_HANDLE AMPS_NET_HANDLE r_hAMPS_NET_HANDLE unsigned char* r_puchBuff int r_nBuffLength int r_nPort char* r_chIPAddress 出参: -- 返回值: int *****************************************************************/ int Timer_RecvDataCallback(AMPS_HANDLE r_hAMPS_HANDLE, AMPS_APP_HANDLE r_hAMPS_APP_HANDLE, AMPS_NET_HANDLE r_hAMPS_NET_HANDLE, unsigned char* r_puchBuff, int r_nBuffLength, int r_nPort, char* r_chIPAddress) { t_AMPSTimerMessage* poAMPSTimerMessage = (t_AMPSTimerMessage*)r_puchBuff; TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); if(sizeof(t_AMPSTimerMessage) != r_nBuffLength) { TRACE(TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_WARNING, "Invalid AMPSTimerMessage size %d.\n", r_nBuffLength); } TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_DEBUG_2, "Timer event is received of size %d and uchCount %d.\n", r_nBuffLength, poAMPSTimerMessage->unTickCount); for( ; 0 < poAMPSTimerMessage->unTickCount; poAMPSTimerMessage->unTickCount--) { Timer_ProcessTimerSlot(r_hAMPS_HANDLE, r_hAMPS_APP_HANDLE); } TRACE( TIMER_TRACE_ID(r_hAMPS_HANDLE), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); return AMPS_SUCCESS; } /***************************************************************** 函数名称: Timer_ProcessTimerEvent 功能描述: 定时器服务器接收数据后处理函数 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer 出参: -- 返回值: int *****************************************************************/ void Timer_ProcessTimerSlot(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); //process all the slots TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Process all the slots.\n"); /*处理并释放毫秒定时器链表中的所有结点*/ DList_FreeNodes(&r_poAMPSTimer->poTimerSlotMilliSeconds[r_poAMPSTimer->unIndexForMilliSecondsSlot].poDList, Timer_ProcessMilliSecondsNodeData); // set all the counters TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Set all the counters.\n"); r_poAMPSTimer->unIndexForMilliSecondsSlot = (r_poAMPSTimer->unIndexForMilliSecondsSlot + 1) % r_poAMPSTimer->nNoOfMilliSecondsSlots; /*毫秒定时器链表结点已使用完*/ if(r_poAMPSTimer->nNoOfMilliSecondsSlots == (r_poAMPSTimer->unIndexForMilliSecondsSlot + 1)) { r_poAMPSTimer->unIndexForSecondsSlot = (r_poAMPSTimer->unIndexForSecondsSlot + 1) % AMPS_TIMER_NUM_OF_SECOND_SLOTS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Seconds Slot %d.\n", r_poAMPSTimer->unIndexForSecondsSlot); Timer_ProcessSecondsTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotSeconds[r_poAMPSTimer->unIndexForSecondsSlot].poDList); if(AMPS_TIMER_NUM_OF_SECOND_SLOTS == (r_poAMPSTimer->unIndexForSecondsSlot + 1)) { r_poAMPSTimer->unIndexForMinutesSlot = (r_poAMPSTimer->unIndexForMinutesSlot + 1) % AMPS_TIMER_NUM_OF_MINUTE_SLOTS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Minutes Slot %d.\n", r_poAMPSTimer->unIndexForMinutesSlot); Timer_ProcessMinutesTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotMinutes[r_poAMPSTimer->unIndexForMinutesSlot].poDList); if(AMPS_TIMER_NUM_OF_MINUTE_SLOTS == (r_poAMPSTimer->unIndexForMinutesSlot + 1)) { r_poAMPSTimer->unIndexForHoursSlot = (r_poAMPSTimer->unIndexForHoursSlot + 1) % AMPS_TIMER_NUM_OF_HOUR_SLOTS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Hours Slot %d.\n", r_poAMPSTimer->unIndexForHoursSlot); Timer_ProcessHoursTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotHours[r_poAMPSTimer->unIndexForHoursSlot].poDList); if(AMPS_TIMER_NUM_OF_HOUR_SLOTS == (r_poAMPSTimer->unIndexForHoursSlot + 1)) { r_poAMPSTimer->unIndexForDaysSlot = (r_poAMPSTimer->unIndexForDaysSlot + 1) % AMPS_TIMER_NUM_OF_DAY_SLOTS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Current Index for Days Slot %d.\n", r_poAMPSTimer->unIndexForDaysSlot); Timer_ProcessDaysTimer(r_poAMPSContext, r_poAMPSTimer, r_poAMPSTimer->poTimerSlotDays[r_poAMPSTimer->unIndexForDaysSlot].poDList); } } } } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_ProcessDaysTimer 功能描述: 处理天定时器 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer t_AMPSDList* r_poAMPSDListForDaysTimer 出参: -- 返回值: void *****************************************************************/ void Timer_ProcessDaysTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForDaysTimer) { void* pvAMPSSListCurrentNode = r_poAMPSDListForDaysTimer->poAMPSSListHead; t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); while(pvAMPSSListCurrentNode) { poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode); TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n"); if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForDaysTimer, pvAMPSSListCurrentNode)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n"); } poAMPSTimerNodeData->unDaysSlotNo = 0; poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_HOURS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n"); DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotHours[poAMPSTimerNodeData->unHoursSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode); pvAMPSSListCurrentNode = r_poAMPSDListForDaysTimer->poAMPSSListHead; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_ProcessDaysTimer 功能描述: 处理小时定时器 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer t_AMPSDList* r_poAMPSDListForDaysTimer 出参: -- 返回值: void *****************************************************************/ void Timer_ProcessHoursTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForHoursTimer) { void* pvAMPSSListCurrentNode = r_poAMPSDListForHoursTimer->poAMPSSListHead; t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); while(pvAMPSSListCurrentNode) { poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode); TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n"); if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForHoursTimer, pvAMPSSListCurrentNode)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n"); } poAMPSTimerNodeData->unHoursSlotNo = 0; poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MINUTES; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n"); DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotMinutes[poAMPSTimerNodeData->unMinutesSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode); pvAMPSSListCurrentNode = r_poAMPSDListForHoursTimer->poAMPSSListHead; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_ProcessDaysTimer 功能描述: 处理分定时器 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer t_AMPSDList* r_poAMPSDListForDaysTimer 出参: -- 返回值: void *****************************************************************/ void Timer_ProcessMinutesTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForMinutesTimer) { void* pvAMPSSListCurrentNode = r_poAMPSDListForMinutesTimer->poAMPSSListHead; t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); while(pvAMPSSListCurrentNode) { poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode); TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n"); if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForMinutesTimer, pvAMPSSListCurrentNode)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n"); } poAMPSTimerNodeData->unMinutesSlotNo = 0; poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_SECONDS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n"); DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotSeconds[poAMPSTimerNodeData->unSecondsSlotNo].poDList, poAMPSTimerNodeData, pvAMPSSListCurrentNode); pvAMPSSListCurrentNode = r_poAMPSDListForMinutesTimer->poAMPSSListHead; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_ProcessDaysTimer 功能描述: 处理秒定时器 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer t_AMPSDList* r_poAMPSDListForDaysTimer 出参: -- 返回值: void *****************************************************************/ void Timer_ProcessSecondsTimer(t_AMPSContext* r_poAMPSContext, t_AMPSTimer* r_poAMPSTimer, t_AMPSDList* r_poAMPSDListForSecondsTimer) { void* pvAMPSSListCurrentNode = r_poAMPSDListForSecondsTimer->poAMPSSListHead; t_AMPSTimerNodeData* poAMPSTimerNodeData = NULL; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n"); while(pvAMPSSListCurrentNode) { poAMPSTimerNodeData = SList_GetNodeData(pvAMPSSListCurrentNode); TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_RemoveWithOutFree called.\n"); if(AMPS_SUCCESS != DList_RemoveWithOutFree(r_poAMPSDListForSecondsTimer, pvAMPSSListCurrentNode)) { TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "DList_RemoveWithOutFree failed.\n"); } poAMPSTimerNodeData->unSecondsSlotNo = 0; poAMPSTimerNodeData->unCurrentTimerSlot = AMPS_TIMER_CURRENT_SLOT_MILLISECONDS; TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "DList_PrependGivenNode called.\n"); DList_PrependGivenNode(r_poAMPSTimer->poTimerSlotMilliSeconds[poAMPSTimerNodeData->unMilliSecondsSlotNo].poDList, poAMPSTimerNodeData, poAMPSTimerNodeData->pvSListNodePtr); pvAMPSSListCurrentNode = r_poAMPSDListForSecondsTimer->poAMPSSListHead; } TRACE( TIMER_TRACE_ID(r_poAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n"); } /***************************************************************** 函数名称: Timer_ProcessDaysTimer 功能描述: 处理毫秒定时器 入参: t_AMPSContext* r_poAMPSContext t_AMPSTimer* r_poAMPSTimer t_AMPSDList* r_poAMPSDListForDaysTimer 出参: -- 返回值: void *****************************************************************/ int Timer_ProcessMilliSecondsNodeData(void** r_ppvAMPSTimerNodeData) { t_AMPSTimerNodeData* poAMPSTimerNodeData = *r_ppvAMPSTimerNodeData; t_AMPSContext* poAMPSContext = poAMPSTimerNodeData->pvAMPSContext; if((NULL != poAMPSTimerNodeData->pfAMPS_TimerCallBack) && (AMPS_TIMER_STATUS_ENABLE == poAMPSTimerNodeData->chStatus)) { TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "poTimerNode->m_pfTimer_TimeoutFunction is called.\n"); //printf("poTimerNode->m_pfTimer_TimeoutFunction is called.\n"); /*执行定时器超时函数*/ if (AMPS_SUCCESS != poAMPSTimerNodeData->pfAMPS_TimerCallBack(poAMPSContext, poAMPSTimerNodeData->pvData)) { TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Timer CallBack is failed.\n"); } //printf("Leaving.\n"); } else { TRACE( TIMER_TRACE_ID(poAMPSContext), AMPS_TRACE_LEVEL_WARNING, "Either Timer is disabled or callback funtion is NULL.\n"); } AMPS_InternalFree(*r_ppvAMPSTimerNodeData); *r_ppvAMPSTimerNodeData = NULL; return AMPS_SUCCESS; }