diff --git a/Peripheral/Inc/led.h b/Peripheral/Inc/led.h index 2ca5903..17ef10a 100644 --- a/Peripheral/Inc/led.h +++ b/Peripheral/Inc/led.h @@ -11,10 +11,6 @@ void LED_Start(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] void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b); diff --git a/Service/Inc/timer.h b/Service/Inc/timer.h index 60f4dff..769404c 100644 --- a/Service/Inc/timer.h +++ b/Service/Inc/timer.h @@ -14,10 +14,7 @@ #define EVENT_MAX 8 void TIMER_Init(void); -int8_t TIMER_AddInfiniteLoopEvent(int8_t id, 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); -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); +void TIMER_AddLoopEvent(uint8_t type, void (*func)(void), uint16_t loop_time); +void TIMER_DelLoopEvent(uint8_t type); #endif diff --git a/Service/Src/timer.c b/Service/Src/timer.c index e9f695d..ecec7f7 100644 --- a/Service/Src/timer.c +++ b/Service/Src/timer.c @@ -1,35 +1,22 @@ #include "timer.h" - -#include - #include "tim.h" - -typedef enum -{ - INFINITE_LOOP_EVENT, // 无限循环事件 - FINITE_LOOP_EVENT, // 有限循环事件 - FINITE_LOOP_EVENT_WITH_PARAM, - DELAY_EVENT // 延迟事件 -} EventType; +#include typedef struct Event { - uint8_t id; void (*func)(void); - void (*param_func)(uint16_t); uint16_t time; - EventType type; uint8_t enabled; - uint16_t loop_cnt; - uint32_t begin_time; - uint16_t param; } Event; static Event event[EVENT_MAX]; -static int event_cnt; -static uint32_t current_time; +static uint32_t time_cnt; +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) { @@ -37,124 +24,41 @@ void TIMER_Init(void) HAL_TIM_Base_Start_IT(&htim4); } -/// @brief 注册无限循环定时回调事件 +/// @brief 注册定时回调事件 /// @param func 回调函数 void func(void) /// @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[event_id].type = INFINITE_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; - return event_id; + event[type].func = func; + event[type].time = loop_time; + event[type].enabled = 1; + time_lcm = lcm(time_lcm, loop_time); } -/// @brief 注册有限循环定时回调事件 -/// @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) +void TIMER_DelLoopEvent(uint8_t type) { - if (event_id == -1) event_id = event_cnt++; - event[event_id].type = FINITE_LOOP_EVENT_WITH_PARAM; - 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; + event[type].enabled = 0; + time_lcm /= event[type].time; } -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; + ++time_cnt; + for (uint8_t i = 0; i < EVENT_MAX; ++i) + if (event[i].enabled && time_cnt % event[i].time == 0) + event[i].func(); + if (time_cnt == time_lcm) + time_cnt = 0; } -/// @brief 注册延迟定时回调事件(单次) -/// @param func 回调函数 void func(void) -/// @param loop_time 定时时间,单位毫秒 -int8_t TIMER_AddDelayEvent(int8_t event_id, void (*func)(void), uint16_t delay_time) +uint32_t gcd(uint32_t a, uint32_t b) { - 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; + if (b == 0) + return a; + return gcd(b, a % b); } -void TIMER_DelLoopEvent(int8_t id) +uint32_t lcm(uint32_t a, uint32_t b) { - 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) - { - event[i].func(); - } - break; - case FINITE_LOOP_EVENT: // 有限循环事件 - if ((current_time - event[i].begin_time) % event[i].time == 0) - { - event[i].func(); - if (event[i].loop_cnt-- <= 0) - { - TIMER_DelLoopEvent(event[i].id); - } - } - 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; - } - } + return a / gcd(a, b) * b; }