Load prefs in sensor from queue
This commit is contained in:
+31
-4
@@ -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,6 +82,8 @@ 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';
|
||||
|
||||
// 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 {
|
||||
@@ -86,6 +91,16 @@ void setup()
|
||||
}
|
||||
}
|
||||
|
||||
// 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOG(ELOG_LEVEL_DEBUG, "Beginning LittleFS");
|
||||
LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED);
|
||||
|
||||
@@ -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
@@ -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
@@ -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();
|
||||
Reference in New Issue
Block a user