43 lines
992 B
C++
43 lines
992 B
C++
#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<EventManager*>(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);
|
|
}
|
|
} |