rework message manager
use of listener pattern instead of message queue Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
@@ -57,6 +57,10 @@ extern "C"
|
|||||||
} data;
|
} data;
|
||||||
} message_t;
|
} 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);
|
void message_manager_init(void);
|
||||||
bool message_manager_post(const message_t *msg, TickType_t timeout);
|
bool message_manager_post(const message_t *msg, TickType_t timeout);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,34 @@
|
|||||||
static const char *TAG = "message_manager";
|
static const char *TAG = "message_manager";
|
||||||
static QueueHandle_t message_queue = NULL;
|
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)
|
static void message_manager_task(void *param)
|
||||||
{
|
{
|
||||||
message_t msg;
|
message_t msg;
|
||||||
@@ -43,13 +71,6 @@ static void message_manager_task(void *param)
|
|||||||
}
|
}
|
||||||
persistence_manager_deinit(&pm);
|
persistence_manager_deinit(&pm);
|
||||||
ESP_LOGI(TAG, "Setting written: %s", msg.data.settings.key);
|
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;
|
break;
|
||||||
case MESSAGE_TYPE_BUTTON:
|
case MESSAGE_TYPE_BUTTON:
|
||||||
@@ -57,6 +78,12 @@ static void message_manager_task(void *param)
|
|||||||
// TODO: Weiterverarbeitung/Callback für Button-Events
|
// TODO: Weiterverarbeitung/Callback für Button-Events
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// Observer Pattern: Listener benachrichtigen
|
||||||
|
for (size_t i = 0; i < message_listener_count; ++i) {
|
||||||
|
if (message_listeners[i]) {
|
||||||
|
message_listeners[i](&msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include "ui/ScreenSaver.h"
|
#include "ui/ScreenSaver.h"
|
||||||
#include "ui/SplashScreen.h"
|
#include "ui/SplashScreen.h"
|
||||||
#include "wifi_manager.h"
|
#include "wifi_manager.h"
|
||||||
|
#include <cstring>
|
||||||
#include <driver/i2c.h>
|
#include <driver/i2c.h>
|
||||||
#include <esp_diagnostics.h>
|
#include <esp_diagnostics.h>
|
||||||
#include <esp_insights.h>
|
#include <esp_insights.h>
|
||||||
@@ -127,6 +128,15 @@ static void init_ui(void)
|
|||||||
u8g2_SendBuffer(&u8g2);
|
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)
|
static void handle_button(uint8_t button)
|
||||||
{
|
{
|
||||||
m_inactivityTracker->reset();
|
m_inactivityTracker->reset();
|
||||||
@@ -240,6 +250,8 @@ void app_task(void *args)
|
|||||||
|
|
||||||
wifi_manager_init();
|
wifi_manager_init();
|
||||||
|
|
||||||
|
message_manager_register_listener(on_message_received);
|
||||||
|
|
||||||
start_simulation();
|
start_simulation();
|
||||||
|
|
||||||
auto oldTime = esp_timer_get_time();
|
auto oldTime = esp_timer_get_time();
|
||||||
|
|||||||
Reference in New Issue
Block a user