#include "event_manager.h" void EventManager::init() { xTaskCreatePinnedToCore( dispatch_task, "event_dispatch", 4096, this, 2, // Higher priority than input &_dispatcher_task, 0 ); } void EventManager::publish(const CLICK_EVENT& event) { xQueueSend(_event_queue, &event, 0); } void EventManager::subscribe(IEventListener* listener) { _listeners.push_back(listener); } void EventManager::unsubscribe(IEventListener* listener) { auto it = std::find(_listeners.begin(), _listeners.end(), listener); if (it != _listeners.end()) { _listeners.erase(it); } } void EventManager::dispatch_task(void* pvParameters) { EventManager* self = static_cast(pvParameters); CLICK_EVENT event; for (;;) { if (xQueueReceive(self->_event_queue, &event, portMAX_DELAY)) { // Dispatch to all listeners for (auto* listener : self->_listeners) { listener->on_click_event(event); } } vTaskDelay(1); } }