Files
tactility/tactility-core/src/dispatcher.c
T
Ken Van Hoeylandt b659d5b940 Added Dispatcher and fix sim (#54)
- Add dispatcher mechanism (a queue for function calls) and tests
- Added tests for MessageQueue
- Fix FreeRTOS config for simulator
- Explicit dependencies for touch-related libs, because minor version changes caused broken builds on CI.
2024-08-24 19:21:22 +02:00

49 lines
1.6 KiB
C

#include "dispatcher.h"
#include "tactility_core.h"
Dispatcher* tt_dispatcher_alloc(uint32_t message_count) {
Dispatcher* dispatcher = malloc(sizeof(Dispatcher));
*dispatcher = (Dispatcher) {
.queue = tt_message_queue_alloc(message_count, sizeof(DispatcherMessage)),
.mutex = tt_mutex_alloc(MutexTypeNormal),
.buffer = {
.callback = NULL,
.context = NULL
}
};
return dispatcher;
}
void tt_dispatcher_free(Dispatcher* dispatcher) {
tt_mutex_acquire(dispatcher->mutex, TtWaitForever);
tt_message_queue_reset(dispatcher->queue);
tt_message_queue_free(dispatcher->queue);
tt_mutex_release(dispatcher->mutex);
tt_mutex_free(dispatcher->mutex);
free(dispatcher);
}
void tt_dispatcher_dispatch(Dispatcher* dispatcher, Callback callback, void* context) {
DispatcherMessage message = {
.callback = callback,
.context = context
};
tt_mutex_acquire(dispatcher->mutex, TtWaitForever);
tt_message_queue_put(dispatcher->queue, &message, TtWaitForever);
tt_mutex_release(dispatcher->mutex);
}
bool tt_dispatcher_consume(Dispatcher* dispatcher, uint32_t timeout_ticks) {
tt_mutex_acquire(dispatcher->mutex, TtWaitForever);
if (tt_message_queue_get(dispatcher->queue, &(dispatcher->buffer), timeout_ticks) == TtStatusOk) {
DispatcherMessage* message = &(dispatcher->buffer);
message->callback(message->context);
tt_mutex_release(dispatcher->mutex);
return true;
} else {
tt_mutex_release(dispatcher->mutex);
return false;
}
}