修改timer.h

This commit is contained in:
JasonChen 2024-07-21 08:19:42 +08:00
parent 3aeeec2c00
commit 5e9e2d9378
3 changed files with 31 additions and 134 deletions

View File

@ -11,10 +11,6 @@
void LED_Start(uint8_t led); void LED_Start(uint8_t led);
void LED_Stop(uint8_t led); void LED_Stop(uint8_t led);
void LED_StartTimed(uint8_t led, uint16_t time);
void LED_StartNTimes(uint8_t led, uint16_t on_time, uint16_t off_time);
// duty in [0, 255] // duty in [0, 255]
void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b); void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b);

View File

@ -14,10 +14,7 @@
#define EVENT_MAX 8 #define EVENT_MAX 8
void TIMER_Init(void); void TIMER_Init(void);
int8_t TIMER_AddInfiniteLoopEvent(int8_t id, void (*func)(void), uint16_t loop_time); void TIMER_AddLoopEvent(uint8_t type, void (*func)(void), uint16_t loop_time);
int8_t TIMER_AddFiniteLoopEvent(int8_t id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt); void TIMER_DelLoopEvent(uint8_t type);
int8_t TIMER_AddFiniteLoopEventWithParam(int8_t event_id, void (*func)(uint16_t param), uint16_t loop_time, uint16_t loop_cnt, uint16_t param);
int8_t TIMER_AddDelayEvent(int8_t id, void (*func)(void), uint16_t delay_time);
void TIMER_DelLoopEvent(int8_t id);
#endif #endif

View File

@ -1,35 +1,22 @@
#include "timer.h" #include "timer.h"
#include <math.h>
#include "tim.h" #include "tim.h"
#include <math.h>
typedef enum
{
INFINITE_LOOP_EVENT, // 无限循环事件
FINITE_LOOP_EVENT, // 有限循环事件
FINITE_LOOP_EVENT_WITH_PARAM,
DELAY_EVENT // 延迟事件
} EventType;
typedef struct Event typedef struct Event
{ {
uint8_t id;
void (*func)(void); void (*func)(void);
void (*param_func)(uint16_t);
uint16_t time; uint16_t time;
EventType type;
uint8_t enabled; uint8_t enabled;
uint16_t loop_cnt;
uint32_t begin_time;
uint16_t param;
} Event; } Event;
static Event event[EVENT_MAX]; static Event event[EVENT_MAX];
static int event_cnt; static uint32_t time_cnt;
static uint32_t current_time; static uint32_t time_lcm = 1;
void TIMER_Count(TIM_HandleTypeDef *htim); uint32_t gcd(uint32_t a, uint32_t b);
uint32_t lcm(uint32_t a, uint32_t b);
void TIMER_Count(void);
void TIMER_Init(void) void TIMER_Init(void)
{ {
@ -37,124 +24,41 @@ void TIMER_Init(void)
HAL_TIM_Base_Start_IT(&htim4); HAL_TIM_Base_Start_IT(&htim4);
} }
/// @brief 注册无限循环定时回调事件 /// @brief 注册定时回调事件
/// @param func 回调函数 void func(void) /// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒 /// @param loop_time 定时时间,单位毫秒
int8_t TIMER_AddInfiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time) void TIMER_AddLoopEvent(uint8_t type, void (*func)(void), uint16_t loop_time)
{ {
if (event_id == -1) event_id = event_cnt++; event[type].func = func;
event[event_id].type = INFINITE_LOOP_EVENT; event[type].time = loop_time;
event[event_id].id = event_id; event[type].enabled = 1;
event[event_id].func = func; time_lcm = lcm(time_lcm, loop_time);
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
return event_id;
} }
/// @brief 注册有限循环定时回调事件 void TIMER_DelLoopEvent(uint8_t type)
/// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒
/// @param loop_cnt 循环次数
int8_t TIMER_AddFiniteLoopEventWithParam(int8_t event_id, void (*func)(uint16_t param), uint16_t loop_time, uint16_t loop_cnt, uint16_t param)
{ {
if (event_id == -1) event_id = event_cnt++; event[type].enabled = 0;
event[event_id].type = FINITE_LOOP_EVENT_WITH_PARAM; time_lcm /= event[type].time;
event[event_id].id = event_id;
event[event_id].param_func = func;
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
event[event_id].param = param;
event[event_id].loop_cnt = loop_cnt;
return event_id;
} }
int8_t TIMER_AddFiniteLoopEvent(int8_t event_id, void (*func)(void), uint16_t loop_time, uint16_t loop_cnt) void TIMER_Count(void)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = FINITE_LOOP_EVENT;
event[event_id].id = event_id;
event[event_id].func = func;
event[event_id].time = loop_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
event[event_id].loop_cnt = loop_cnt;
return event_id;
}
/// @brief 注册延迟定时回调事件(单次)
/// @param func 回调函数 void func(void)
/// @param loop_time 定时时间,单位毫秒
int8_t TIMER_AddDelayEvent(int8_t event_id, void (*func)(void), uint16_t delay_time)
{
if (event_id == -1) event_id = event_cnt++;
event[event_id].type = DELAY_EVENT;
event[event_id].id = event_id;
event[event_id].func = func;
event[event_id].time = delay_time;
event[event_id].begin_time = current_time;
event[event_id].enabled = 1;
return event_id;
}
void TIMER_DelLoopEvent(int8_t id)
{
event[id].enabled = 0;
}
void TIMER_Count(TIM_HandleTypeDef *htim)
{
++current_time;
for (uint8_t i = 0; i < event_cnt; ++i)
{
if (event[i].enabled == 0)
continue;
switch (event[i].type)
{
case INFINITE_LOOP_EVENT: // 无限循环事件
if ((current_time - event[i].begin_time) % event[i].time == 0)
{ {
++time_cnt;
for (uint8_t i = 0; i < EVENT_MAX; ++i)
if (event[i].enabled && time_cnt % event[i].time == 0)
event[i].func(); event[i].func();
if (time_cnt == time_lcm)
time_cnt = 0;
} }
break;
case FINITE_LOOP_EVENT: // 有限循环事件 uint32_t gcd(uint32_t a, uint32_t b)
if ((current_time - event[i].begin_time) % event[i].time == 0)
{ {
event[i].func(); if (b == 0)
if (event[i].loop_cnt-- <= 0) return a;
return gcd(b, a % b);
}
uint32_t lcm(uint32_t a, uint32_t b)
{ {
TIMER_DelLoopEvent(event[i].id); return a / gcd(a, b) * b;
}
}
break;
case FINITE_LOOP_EVENT_WITH_PARAM:
if ((current_time - event[i].begin_time) % event[i].time == 0)
{
printf("FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
event[i].param_func(event[i].param);
if (--event[i].loop_cnt <= 0)
{
printf("remove FINITE_LOOP_EVENT_WITH_PARAM %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
TIMER_DelLoopEvent(event[i].id);
}
}
break;
case DELAY_EVENT: // 延迟事件
if (current_time > event[i].begin_time &&
(current_time - event[i].begin_time) % event[i].time == 0)
{
event[i].func();
printf("DELAY_EVENT %d, %d, %d\n",
current_time, event[i].begin_time, event[i].time);
TIMER_DelLoopEvent(event[i].id);
}
break;
default:
break;
}
}
} }