diff --git a/src/main.cpp b/src/main.cpp index 14ba5a8..de79fce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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"); diff --git a/src/sensor/sensor.cpp b/src/sensor/sensor.cpp index afcd2aa..6509faa 100644 --- a/src/sensor/sensor.cpp +++ b/src/sensor/sensor.cpp @@ -1,8 +1,8 @@ #include "../global_data/defines.h" -#include #include #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); diff --git a/src/sensor/sensor.h b/src/sensor/sensor.h index 0b5cf03..1242a48 100644 --- a/src/sensor/sensor.h +++ b/src/sensor/sensor.h @@ -1,2 +1,10 @@ -void read_sensor_task(void*); +#include + +// 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(); \ No newline at end of file