mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-12-28 14:01:54 +01:00
57 lines
1.2 KiB
C
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);
|
|
}
|