steering-wheel-stm/Core/Src/events.c

67 lines
1.6 KiB
C
Raw Normal View History

2022-05-28 02:00:50 +02:00
#include "events.h"
2022-05-29 00:47:46 +02:00
2022-05-28 02:00:50 +02:00
#include "main.h"
#include "user_inputs.h"
2022-05-29 00:47:46 +02:00
2022-05-28 02:00:50 +02:00
#include <stdint.h>
static volatile EventQueue event_queue = {.read_idx = 0, .write_idx = 0};
2022-05-29 00:47:46 +02:00
void event_push(Event* ev) {
2022-05-28 02:00:50 +02:00
if (event_num_free() == 0) {
// TODO: How do we handle this?
return;
}
event_queue.ring_buffer[event_queue.write_idx] = *ev;
event_queue.write_idx = (event_queue.write_idx + 1) % EVENT_QUEUE_SIZE;
}
Event event_pop() {
if (event_num_pending() == 0) {
// TODO: How do we handle this?
Error_Handler();
}
Event result = event_queue.ring_buffer[event_queue.read_idx];
event_queue.read_idx = (event_queue.read_idx + 1) % EVENT_QUEUE_SIZE;
return result;
}
uint16_t event_num_pending() {
// Copy the values so we can be sure they don't change while we're computing
// this
uint16_t read_idx = event_queue.read_idx;
uint16_t write_idx = event_queue.write_idx;
if (write_idx >= read_idx) {
return write_idx - read_idx;
} else {
return write_idx + (EVENT_QUEUE_SIZE - read_idx);
}
}
uint16_t event_num_free() {
// Copy the values so we can be sure they don't change while we're computing
// this
uint16_t read_idx = event_queue.read_idx;
uint16_t write_idx = event_queue.write_idx;
if (read_idx > write_idx) {
return read_idx - write_idx;
} else {
return read_idx + (EVENT_QUEUE_SIZE - write_idx);
}
}
void handle_events() {
while (event_num_pending() > 0) {
Event ev = event_pop();
switch (ev.type) {
case EV_BTN_PRESS:
handle_button_press(&ev.btn_press);
break;
default:
Error_Handler();
}
}
2022-05-29 00:47:46 +02:00
}