SummerCart64/sw/controller/src/timer.c
2024-01-13 07:48:42 +01:00

57 lines
1.2 KiB
C

#include "hw.h"
#include "timer.h"
#define TIMER_PERIOD_MS (50)
typedef struct {
volatile bool pending;
volatile bool running;
volatile uint32_t value;
} timer_t;
static timer_t timer[__TIMER_ID_COUNT];
static void timer_update (void) {
for (timer_id_t id = 0; id < __TIMER_ID_COUNT; id++) {
if (timer[id].value > 0) {
timer[id].value -= 1;
}
if (timer[id].pending) {
timer[id].pending = false;
} else if(timer[id].value == 0) {
timer[id].running = false;
}
}
}
void timer_countdown_start (timer_id_t id, uint32_t value_ms) {
hw_enter_critical();
if (value_ms > 0) {
timer[id].pending = true;
timer[id].running = true;
timer[id].value = ((value_ms + (TIMER_PERIOD_MS - 1)) / TIMER_PERIOD_MS);
}
hw_exit_critical();
}
void timer_countdown_abort (timer_id_t id) {
hw_enter_critical();
timer[id].pending = false;
timer[id].running = false;
timer[id].value = 0;
hw_exit_critical();
}
bool timer_countdown_elapsed (timer_id_t id) {
return (!timer[id].running);
}
void timer_init (void) {
hw_systick_config(TIMER_PERIOD_MS, timer_update);
}