81 lines
1.8 KiB
C
81 lines
1.8 KiB
C
/**
|
|
* Copyright (c) 2022 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "event.h"
|
|
|
|
void eventManagerInit(eventmanager_t *manager) {
|
|
uint8_t i;
|
|
|
|
ASSERT_NOT_NULL(manager);
|
|
|
|
for(i = 0; i < EVENT_LISTENER_COUNT_MAX; i++) {
|
|
manager->listeners[i].callback = NULL;
|
|
}
|
|
}
|
|
|
|
bool _eventManagerFindFree(int32_t i, void *item) {
|
|
return ((eventlistener_t *) item)->callback == NULL;
|
|
}
|
|
|
|
eventlistener_t * eventManagerSubscribe(
|
|
eventmanager_t *man, event_t event, void *user, eventcallback_t *callback
|
|
) {
|
|
int32_t first;
|
|
eventlistener_t *listener;
|
|
|
|
ASSERT_NOT_NULL(man);
|
|
ASSERT_NOT_NULL(callback);
|
|
|
|
// Find the first available space.
|
|
first = arrayFindCallback(
|
|
sizeof(eventmanager_t), man->listeners,
|
|
EVENT_LISTENER_COUNT_MAX, _eventManagerFindFree
|
|
);
|
|
|
|
ASSERT_LESS_THAN(first, EVENT_LISTENER_COUNT_MAX);
|
|
ASSERT_GREATER_THAN_EQUAL_TO(first, 0);
|
|
|
|
// Insert
|
|
listener = man->listeners + first;
|
|
listener->callback = callback;
|
|
listener->user = user;
|
|
listener->event = event;
|
|
|
|
return listener;
|
|
}
|
|
|
|
void eventManagerUnsubscribe(eventmanager_t *man, eventlistener_t *listener) {
|
|
ASSERT_NOT_NULL(man);
|
|
ASSERT_NOT_NULL(listener);
|
|
|
|
listener->callback = NULL;
|
|
}
|
|
|
|
bool eventManagerTrigger(
|
|
eventmanager_t *manager, event_t event, void *args[], int32_t argc
|
|
) {
|
|
uint8_t i;
|
|
eventlistener_t *listener;
|
|
bool result;
|
|
|
|
ASSERT_GREATER_THAN_EQUAL_TO(argc, 0);
|
|
ASSERT_IF(
|
|
argc > 0,
|
|
ASSERT_NOT_NULL(args)
|
|
);
|
|
|
|
for(i = 0; i < EVENT_LISTENER_COUNT_MAX; i++) {
|
|
listener = manager->listeners + i;
|
|
if(listener->callback == NULL) continue;
|
|
if(listener->event != event) continue;
|
|
|
|
result = listener->callback(listener->user, event, args, argc);
|
|
if(!result) return false;
|
|
}
|
|
|
|
return true;
|
|
} |