You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.4 KiB

#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;
void* pSW_Timer_Patameter;
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;
}
}
}
}
}