Load prefs in sensor from queue

This commit is contained in:
2026-05-24 16:43:52 +02:00
parent 31acd5d5ec
commit bc5986507a
3 changed files with 81 additions and 21 deletions
+35 -8
View File
@@ -59,6 +59,9 @@ QueueHandle_t stateForWebserverQueue = xQueueCreate(2, sizeof(CurrentState));
// Queue for sending preferences from main to webserver
QueueHandle_t prefsForWebserverQueue = xQueueCreate(2, sizeof(DataMessage));
// Queue for sending preferences from main to sensor task
QueueHandle_t prefsForSensorQueue = xQueueCreate(2, sizeof(DataMessage));
void setup()
{
Logger.registerSerial(MYLOG, ELOG_LEVEL_DEBUG, "Serial");
@@ -66,8 +69,8 @@ void setup()
prefs.begin("waterlevel", false);
Serial.begin(115200);
// Read initial preferences and send to webserver
if (prefsForWebserverQueue != NULL) {
// Read initial preferences and send to webserver and sensor
if (prefsForWebserverQueue != NULL || prefsForSensorQueue != NULL) {
DataMessage prefsMessage;
prefsMessage.type = DATA_TYPE_PREFERENCES;
prefsMessage.data.preferencesData.level_sensor_range = prefs.getFloat(level_sensor_range_key, 200);
@@ -79,10 +82,22 @@ void setup()
strncpy(prefsMessage.data.preferencesData.wifi_password, prefs.getString(wifi_password_key, "").c_str(), sizeof(prefsMessage.data.preferencesData.wifi_password) - 1);
prefsMessage.data.preferencesData.wifi_password[sizeof(prefsMessage.data.preferencesData.wifi_password) - 1] = '\0';
if (xQueueSend(prefsForWebserverQueue, &prefsMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
LOG(ELOG_LEVEL_ERROR, "Failed to send initial preferences to webserver queue");
} else {
LOG(ELOG_LEVEL_DEBUG, "Sent initial preferences to webserver");
// Send to webserver
if (prefsForWebserverQueue != NULL) {
if (xQueueSend(prefsForWebserverQueue, &prefsMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
LOG(ELOG_LEVEL_ERROR, "Failed to send initial preferences to webserver queue");
} else {
LOG(ELOG_LEVEL_DEBUG, "Sent initial preferences to webserver");
}
}
// Send to sensor task
if (prefsForSensorQueue != NULL) {
if (xQueueSend(prefsForSensorQueue, &prefsMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
LOG(ELOG_LEVEL_ERROR, "Failed to send initial preferences to sensor queue");
} else {
LOG(ELOG_LEVEL_DEBUG, "Sent initial preferences to sensor");
}
}
}
@@ -108,7 +123,12 @@ void setup()
} else {
xTaskCreate(ethernet_task, "EthernetTask", 1024 * 4, dataQueue, 1, NULL);
xTaskCreate(wifi_task, "WiFiTask", 1024 * 4, dataQueue, 1, NULL);
xTaskCreate(read_sensor_task, "ReadSensorTask", 1024 * 4, dataQueue, 1, NULL);
// Create sensor queues struct
SensorQueues sensorQueues = {
.dataQueue = dataQueue,
.prefsQueue = prefsForSensorQueue
};
xTaskCreate(read_sensor_task, "ReadSensorTask", 1024 * 4, &sensorQueues, 1, NULL);
xTaskCreate(collect_internal_telemetry_task, "InternalTelemetryTask", 1024 * 2, dataQueue, 1, NULL);
xTaskCreate(display_task, "DisplayTask", 1024 * 2, NULL, 1, NULL);
xTaskCreate(get_time_task, "GetTimeTask", 1024 * 2, NULL, 1, NULL);
@@ -187,7 +207,14 @@ void loop()
LOG(ELOG_LEVEL_ERROR, "Failed to forward preferences to webserver queue");
}
}
LOG(ELOG_LEVEL_DEBUG, "Stored preferences and forwarded to webserver");
// Forward to sensor task so it can update its local copy
if (prefsForSensorQueue != NULL) {
if (xQueueSend(prefsForSensorQueue, &dataMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
LOG(ELOG_LEVEL_ERROR, "Failed to forward preferences to sensor queue");
}
}
LOG(ELOG_LEVEL_DEBUG, "Stored preferences and forwarded to tasks");
break;
default:
LOG(ELOG_LEVEL_ERROR, "Unknown data type received");
+37 -12
View File
@@ -1,8 +1,8 @@
#include "../global_data/defines.h"
#include <Preferences.h>
#include <Elog.h>
#include "Wire.h"
#include "../global_data/global_data.h"
#include "sensor.h"
#ifdef USE_INA226
@@ -17,13 +17,20 @@ INA233 ina_sensor(0x40);
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
extern Preferences prefs;
WaterData water_data;
// Calibration variables
float zero_value = 0.03; // Measured shunt voltage with nothing connected, used to fix measuring offset
// Local preference storage
static float local_sensor_range = 200.0f;
static float local_water_level_min = 0.0f;
static float local_water_level_max = 200.0f;
static float local_water_volume = 10000.0f;
// Queue handle for receiving preference updates
static QueueHandle_t g_prefsQueue = NULL;
void init_sensor(){
#ifdef USE_INA226
Wire.begin(33, 32);
@@ -46,17 +53,35 @@ void init_sensor(){
void read_sensor_task(void* parameter)
{
// Extract the queue handle from the task parameters
QueueHandle_t dataQueue = (QueueHandle_t)parameter;
if (dataQueue == NULL) {
LOG(ELOG_LEVEL_ERROR, "Data queue is NULL");
// Extract the queue handles from the task parameters
SensorQueues* queues = (SensorQueues*)parameter;
if (queues == NULL || queues->dataQueue == NULL) {
LOG(ELOG_LEVEL_ERROR, "Queue parameters are NULL");
vTaskDelete(NULL);
return;
}
// Store queue handles
QueueHandle_t dataQueue = queues->dataQueue;
g_prefsQueue = queues->prefsQueue;
LOG(ELOG_LEVEL_DEBUG, "Starting read sensor tasks");
init_sensor();
while (true) {
// Check for preference updates first
DataMessage prefsMessage;
if (g_prefsQueue != NULL && xQueueReceive(g_prefsQueue, &prefsMessage, 0) == pdTRUE) {
if (prefsMessage.type == DATA_TYPE_PREFERENCES) {
// Update local preference values
local_sensor_range = prefsMessage.data.preferencesData.level_sensor_range;
local_water_level_min = prefsMessage.data.preferencesData.water_level_min;
local_water_level_max = prefsMessage.data.preferencesData.water_level_max;
local_water_volume = prefsMessage.data.preferencesData.water_volume;
LOG(ELOG_LEVEL_DEBUG, "Updated sensor preferences: range=%F, min=%F, max=%F, volume=%F",
local_sensor_range, local_water_level_min, local_water_level_max, local_water_volume);
}
}
// Get Values from sensor
#ifndef USE_INA226
String chip_id = ina_sensor.get_device_model();
@@ -85,11 +110,11 @@ void read_sensor_task(void* parameter)
}
// Get values from storage
float sensor_range = prefs.getFloat(level_sensor_range_key, 200);
float max_water_level = prefs.getFloat(water_level_max_key, sensor_range);
float min_water_level = prefs.getFloat(water_level_min_key, 0);
float max_liters = prefs.getFloat(water_volume_key, 10000.);
// Use locally stored preference values
float sensor_range = local_sensor_range;
float max_water_level = local_water_level_max;
float min_water_level = local_water_level_min;
float max_liters = local_water_volume;
float mA_per_cm = (20. - 4.) / (sensor_range);
+9 -1
View File
@@ -1,2 +1,10 @@
void read_sensor_task(void*);
#include <freertos/queue.h>
// Structure to hold queue handles for the sensor task
typedef struct {
QueueHandle_t dataQueue;
QueueHandle_t prefsQueue;
} SensorQueues;
void read_sensor_task(void* parameter);
void init_sensor();