Files
firmware/src/input/InputBroker.cpp

68 lines
2.0 KiB
C++
Raw Normal View History

2022-01-11 16:02:55 +01:00
#include "InputBroker.h"
#include "PowerFSM.h" // needed for event trigger
#include "configuration.h"
#include "modules/ExternalNotificationModule.h"
2022-01-11 16:02:55 +01:00
2024-06-17 20:17:56 +02:00
InputBroker *inputBroker = nullptr;
2022-01-11 16:02:55 +01:00
2026-01-03 21:19:24 +01:00
InputBroker::InputBroker() {
#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040)
2026-01-03 21:19:24 +01:00
inputEventQueue = xQueueCreate(5, sizeof(InputEvent));
pollSoonQueue = xQueueCreate(5, sizeof(InputPollable *));
xTaskCreate(pollSoonWorker, "input-pollSoon", 2 * 1024, this, 10, &pollSoonTask);
#endif
}
2022-01-11 16:02:55 +01:00
2026-01-03 21:19:24 +01:00
void InputBroker::registerSource(Observable<const InputEvent *> *source) { this->inputEventObserver.observe(source); }
2022-01-11 16:02:55 +01:00
#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040)
2026-01-03 21:19:24 +01:00
void InputBroker::requestPollSoon(InputPollable *pollable) {
if (xPortInIsrContext() == pdTRUE) {
xQueueSendFromISR(pollSoonQueue, &pollable, NULL);
} else {
xQueueSend(pollSoonQueue, &pollable, 0);
}
}
2026-01-03 21:19:24 +01:00
void InputBroker::queueInputEvent(const InputEvent *event) {
if (xPortInIsrContext() == pdTRUE) {
xQueueSendFromISR(inputEventQueue, event, NULL);
} else {
xQueueSend(inputEventQueue, event, portMAX_DELAY);
}
}
2026-01-03 21:19:24 +01:00
void InputBroker::processInputEventQueue() {
InputEvent event;
while (xQueueReceive(inputEventQueue, &event, 0)) {
handleInputEvent(&event);
}
}
#endif
2026-01-03 21:19:24 +01:00
int InputBroker::handleInputEvent(const InputEvent *event) {
powerFSM.trigger(EVENT_INPUT); // todo: not every input should wake, like long hold release
2026-01-03 21:19:24 +01:00
if (event && event->inputEvent != INPUT_BROKER_NONE && externalNotificationModule && moduleConfig.external_notification.enabled &&
externalNotificationModule->nagging()) {
externalNotificationModule->stopNow();
}
2026-01-03 21:19:24 +01:00
this->notifyObservers(event);
return 0;
}
#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040)
2026-01-03 21:19:24 +01:00
void InputBroker::pollSoonWorker(void *p) {
InputBroker *instance = (InputBroker *)p;
while (true) {
InputPollable *pollable = NULL;
xQueueReceive(instance->pollSoonQueue, &pollable, portMAX_DELAY);
if (pollable) {
pollable->pollOnce();
}
2026-01-03 21:19:24 +01:00
}
vTaskDelete(NULL);
}
#endif