light on/off via REST or GPIO
Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
6
firmware/components/message-manager/CMakeLists.txt
Normal file
6
firmware/components/message-manager/CMakeLists.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
idf_component_register(
|
||||
SRCS "src/message_manager.c"
|
||||
INCLUDE_DIRS "include"
|
||||
PRIV_REQUIRES
|
||||
persistence-manager
|
||||
)
|
||||
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MESSAGE_TYPE_SETTINGS,
|
||||
MESSAGE_TYPE_BUTTON
|
||||
} message_type_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BUTTON_EVENT_PRESS,
|
||||
BUTTON_EVENT_RELEASE
|
||||
} button_event_type_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
button_event_type_t event_type;
|
||||
uint8_t button_id;
|
||||
} button_message_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SETTINGS_TYPE_BOOL,
|
||||
SETTINGS_TYPE_INT,
|
||||
SETTINGS_TYPE_FLOAT,
|
||||
SETTINGS_TYPE_STRING
|
||||
} settings_type_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
settings_type_t type;
|
||||
char key[32];
|
||||
union {
|
||||
bool bool_value;
|
||||
int32_t int_value;
|
||||
float float_value;
|
||||
char string_value[64];
|
||||
} value;
|
||||
} settings_message_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
message_type_t type;
|
||||
union {
|
||||
settings_message_t settings;
|
||||
button_message_t button;
|
||||
} data;
|
||||
} message_t;
|
||||
|
||||
void message_manager_init(void);
|
||||
bool message_manager_post(const message_t *msg, TickType_t timeout);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
79
firmware/components/message-manager/src/message_manager.c
Normal file
79
firmware/components/message-manager/src/message_manager.c
Normal file
@@ -0,0 +1,79 @@
|
||||
#include "message_manager.h"
|
||||
#include <esp_log.h>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/queue.h>
|
||||
#include <freertos/task.h>
|
||||
#include <persistence_manager.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MESSAGE_QUEUE_LENGTH 16
|
||||
#define MESSAGE_QUEUE_ITEM_SIZE sizeof(message_t)
|
||||
|
||||
static const char *TAG = "message_manager";
|
||||
static QueueHandle_t message_queue = NULL;
|
||||
|
||||
static void message_manager_task(void *param)
|
||||
{
|
||||
message_t msg;
|
||||
persistence_manager_t pm;
|
||||
while (1)
|
||||
{
|
||||
if (xQueueReceive(message_queue, &msg, portMAX_DELAY) == pdTRUE)
|
||||
{
|
||||
switch (msg.type)
|
||||
{
|
||||
case MESSAGE_TYPE_SETTINGS:
|
||||
if (persistence_manager_init(&pm, "config") == ESP_OK)
|
||||
{
|
||||
switch (msg.data.settings.type)
|
||||
{
|
||||
case SETTINGS_TYPE_BOOL:
|
||||
persistence_manager_set_bool(&pm, msg.data.settings.key, msg.data.settings.value.bool_value);
|
||||
break;
|
||||
case SETTINGS_TYPE_INT:
|
||||
persistence_manager_set_int(&pm, msg.data.settings.key, msg.data.settings.value.int_value);
|
||||
break;
|
||||
case SETTINGS_TYPE_FLOAT:
|
||||
persistence_manager_set_float(&pm, msg.data.settings.key, msg.data.settings.value.float_value);
|
||||
break;
|
||||
case SETTINGS_TYPE_STRING:
|
||||
persistence_manager_set_string(&pm, msg.data.settings.key,
|
||||
msg.data.settings.value.string_value);
|
||||
break;
|
||||
}
|
||||
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:
|
||||
ESP_LOGI(TAG, "Button event: id=%d, type=%d", msg.data.button.button_id, msg.data.button.event_type);
|
||||
// TODO: Weiterverarbeitung/Callback für Button-Events
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void message_manager_init(void)
|
||||
{
|
||||
if (!message_queue)
|
||||
{
|
||||
message_queue = xQueueCreate(MESSAGE_QUEUE_LENGTH, MESSAGE_QUEUE_ITEM_SIZE);
|
||||
xTaskCreate(message_manager_task, "message_manager_task", 4096, NULL, 5, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
bool message_manager_post(const message_t *msg, TickType_t timeout)
|
||||
{
|
||||
if (!message_queue)
|
||||
return false;
|
||||
ESP_LOGI(TAG, "Post: type=%d", msg->type);
|
||||
return xQueueSend(message_queue, msg, timeout) == pdTRUE;
|
||||
}
|
||||
Reference in New Issue
Block a user