/** * 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; }