#include "sw_timer.h" typedef struct _timer_callback_info { SW_TIMER_CALLBACK_TYPE SW_Callback_Type; uint32_t SW_Timer_StartTick; uint32_t SW_Timer_PeriodCount; SW_TIMER_CALLBACK_FN SW_Timer_CallbackFunction; }SW_TIMER_INFO; static SW_TIMER_INFO SW_Timer_Info[MAX_SW_TIMER_REGISTER_COUNT]; bool SW_Timer_Callback_Register(SW_TIMER_CALLBACK_TYPE type, uint32_t PeriodTime, SW_TIMER_CALLBACK_FN pTimerCallback) { uint8_t i; bool ret = false; for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++) { if(SW_Timer_Info[i].SW_Timer_CallbackFunction == NULL) { SW_Timer_Info[i].SW_Callback_Type = type; SW_Timer_Info[i].SW_Timer_StartTick = millis(); SW_Timer_Info[i].SW_Timer_PeriodCount = PeriodTime; SW_Timer_Info[i].SW_Timer_CallbackFunction = pTimerCallback; ret = true; break; } } return ret; } bool SW_Timer_Callback_UnRegister(SW_TIMER_CALLBACK_FN pSwTimerCallbackFunc) { uint8_t i; bool ret = false; for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++) { if(SW_Timer_Info[i].SW_Timer_CallbackFunction == pSwTimerCallbackFunc) { SW_Timer_Info[i].SW_Callback_Type = SW_TIMER_RUN_NONE; SW_Timer_Info[i].SW_Timer_CallbackFunction = NULL; ret = true; } } return ret; } void SW_Timer_Callback_Process(void) { uint8_t i; uint32_t nowTickCount = millis(); for(i = 0 ; i < MAX_SW_TIMER_REGISTER_COUNT ; i++) { if(SW_Timer_Info[i].SW_Timer_CallbackFunction != NULL && SW_Timer_Info[i].SW_Callback_Type != SW_TIMER_RUN_NONE) { if((nowTickCount - SW_Timer_Info[i].SW_Timer_StartTick) >= SW_Timer_Info[i].SW_Timer_PeriodCount) { if(SW_Timer_Info[i].SW_Callback_Type == SW_TIMER_RUN_ONNY_ONCE) { SW_Timer_Info[i].SW_Timer_StartTick = 0xFFFFFFFF; SW_Timer_Info[i].SW_Callback_Type = SW_TIMER_RUN_NONE; SW_Timer_Info[i].SW_Timer_CallbackFunction(); SW_Timer_Info[i].SW_Timer_CallbackFunction = NULL; } else { SW_Timer_Info[i].SW_Timer_CallbackFunction(); SW_Timer_Info[i].SW_Timer_StartTick = nowTickCount; } } } } }