diff --git a/firmware/components/message-manager/include/message_manager.h b/firmware/components/message-manager/include/message_manager.h index 6274aa3..df32389 100644 --- a/firmware/components/message-manager/include/message_manager.h +++ b/firmware/components/message-manager/include/message_manager.h @@ -57,6 +57,10 @@ extern "C" } data; } message_t; + // Observer Pattern: Listener-Typ und Registrierungsfunktionen + typedef void (*message_listener_t)(const message_t *msg); + void message_manager_register_listener(message_listener_t listener); + void message_manager_unregister_listener(message_listener_t listener); void message_manager_init(void); bool message_manager_post(const message_t *msg, TickType_t timeout); diff --git a/firmware/components/message-manager/src/message_manager.c b/firmware/components/message-manager/src/message_manager.c index b3bc810..b628138 100644 --- a/firmware/components/message-manager/src/message_manager.c +++ b/firmware/components/message-manager/src/message_manager.c @@ -12,6 +12,34 @@ static const char *TAG = "message_manager"; static QueueHandle_t message_queue = NULL; +// Observer Pattern: Listener-Liste +#define MAX_MESSAGE_LISTENERS 8 +static message_listener_t message_listeners[MAX_MESSAGE_LISTENERS] = {0}; +static size_t message_listener_count = 0; + +void message_manager_register_listener(message_listener_t listener) { + if (listener && message_listener_count < MAX_MESSAGE_LISTENERS) { + // Doppelte Registrierung vermeiden + for (size_t i = 0; i < message_listener_count; ++i) { + if (message_listeners[i] == listener) return; + } + message_listeners[message_listener_count++] = listener; + } +} + +void message_manager_unregister_listener(message_listener_t listener) { + for (size_t i = 0; i < message_listener_count; ++i) { + if (message_listeners[i] == listener) { + // Nachfolgende Listener nach vorne schieben + for (size_t j = i; j < message_listener_count - 1; ++j) { + message_listeners[j] = message_listeners[j + 1]; + } + message_listeners[--message_listener_count] = NULL; + break; + } + } +} + static void message_manager_task(void *param) { message_t msg; @@ -43,13 +71,6 @@ static void message_manager_task(void *param) } persistence_manager_deinit(&pm); ESP_LOGI(TAG, "Setting written: %s", msg.data.settings.key); - - // Reagiere auf Änderung von light_active - if (strcmp(msg.data.settings.key, "light_active") == 0) - { - extern void start_simulation(void); - start_simulation(); - } } break; case MESSAGE_TYPE_BUTTON: @@ -57,6 +78,12 @@ static void message_manager_task(void *param) // TODO: Weiterverarbeitung/Callback für Button-Events break; } + // Observer Pattern: Listener benachrichtigen + for (size_t i = 0; i < message_listener_count; ++i) { + if (message_listeners[i]) { + message_listeners[i](&msg); + } + } } } } diff --git a/firmware/main/app_task.cpp b/firmware/main/app_task.cpp index 4ead0ce..59165c6 100644 --- a/firmware/main/app_task.cpp +++ b/firmware/main/app_task.cpp @@ -14,6 +14,7 @@ #include "ui/ScreenSaver.h" #include "ui/SplashScreen.h" #include "wifi_manager.h" +#include #include #include #include @@ -127,6 +128,15 @@ static void init_ui(void) u8g2_SendBuffer(&u8g2); } +static void on_message_received(const message_t *msg) +{ + if (msg && msg->type == MESSAGE_TYPE_SETTINGS && msg->data.settings.type == SETTINGS_TYPE_BOOL && + std::strcmp(msg->data.settings.key, "light_active") == 0) + { + start_simulation(); + } +} + static void handle_button(uint8_t button) { m_inactivityTracker->reset(); @@ -240,6 +250,8 @@ void app_task(void *args) wifi_manager_init(); + message_manager_register_listener(on_message_received); + start_simulation(); auto oldTime = esp_timer_get_time();