b659d5b940
- 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.
49 lines
1.6 KiB
C
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;
|
|
}
|
|
}
|