From a0240d744cb90f8ac6fc673371c35e18276d0d56 Mon Sep 17 00:00:00 2001 From: Tobias Maier Date: Wed, 25 Mar 2026 20:26:57 +0100 Subject: [PATCH] Switched waterlevel to queue --- .vscode/extensions.json | 2 ++ src/external_interfacing/leds.cpp | 2 +- src/global_data/global_data.cpp | 1 - src/global_data/water_data_queue.cpp | 30 ++++++++++++++++++++++++++++ src/global_data/water_data_queue.h | 12 +++++++++++ src/main.cpp | 5 ++++- src/networking/json_builder.cpp | 2 +- src/networking/responses.cpp | 11 ++++++---- src/sensor/sensor.cpp | 15 ++++++++++---- 9 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 src/global_data/water_data_queue.cpp create mode 100644 src/global_data/water_data_queue.h diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8057bc7..5c5735c 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,4 +1,6 @@ { + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format "recommendations": [ "pioarduino.pioarduino-ide", "platformio.platformio-ide" diff --git a/src/external_interfacing/leds.cpp b/src/external_interfacing/leds.cpp index 3d638b5..eaf81d8 100644 --- a/src/external_interfacing/leds.cpp +++ b/src/external_interfacing/leds.cpp @@ -3,9 +3,9 @@ #include #include "../tools/tools.h" #include +#include "../global_data/water_data_queue.h" extern ActiveErrors active_errors; -extern WaterData water_data; void display_task(void* parameter) { diff --git a/src/global_data/global_data.cpp b/src/global_data/global_data.cpp index 81ed409..5414be7 100644 --- a/src/global_data/global_data.cpp +++ b/src/global_data/global_data.cpp @@ -5,7 +5,6 @@ NetworkData ethernet_data; DeviceTelemetry telemetry; SensorData shunt_data; -WaterData water_data; OTAStatus ota_status; diff --git a/src/global_data/water_data_queue.cpp b/src/global_data/water_data_queue.cpp new file mode 100644 index 0000000..df79729 --- /dev/null +++ b/src/global_data/water_data_queue.cpp @@ -0,0 +1,30 @@ +#include "water_data_queue.h" +#include + +QueueHandle_t waterDataQueue = nullptr; + +void initWaterDataQueue() { + // Create queue that can hold 5 WaterData structures + waterDataQueue = xQueueCreate(5, sizeof(WaterData)); + + if (waterDataQueue == nullptr) { + Serial.println("Failed to create water data queue"); + } +} + +WaterData getLatestWaterData() { + WaterData latestData; + + // Try to receive the latest data without blocking + if (xQueueReceive(waterDataQueue, &latestData, 0) == pdPASS) { + // Put the data back in the queue so other consumers can get it too + xQueueSendToBack(waterDataQueue, &latestData, 0); + return latestData; + } + + // Return default values if queue is empty + latestData.level = 0.0f; + latestData.liters = 0.0f; + latestData.percentage = 0.0f; + return latestData; +} \ No newline at end of file diff --git a/src/global_data/water_data_queue.h b/src/global_data/water_data_queue.h new file mode 100644 index 0000000..e9ab5b6 --- /dev/null +++ b/src/global_data/water_data_queue.h @@ -0,0 +1,12 @@ +#pragma once +#include "global_data.h" +#include "freertos/queue.h" + +// Create a queue handle for WaterData +extern QueueHandle_t waterDataQueue; + +// Initialize the water data queue +void initWaterDataQueue(); + +// Helper function to get latest water data +WaterData getLatestWaterData(); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index bfd6baf..f293d34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ #include #include "global_data/defines.h" +#include "global_data/water_data_queue.h" #include "networking/networking.h" @@ -32,7 +33,6 @@ Preferences prefs; -extern WaterData water_data; extern DeviceTelemetry telemetry; extern NetworkData wifi_data; extern NetworkData ethernet_data; @@ -60,6 +60,9 @@ void setup() LOG(ELOG_LEVEL_DEBUG, "Init Sensor"); init_sensor(); + LOG(ELOG_LEVEL_DEBUG, "Init Water Data Queue"); + initWaterDataQueue(); + LOG(ELOG_LEVEL_DEBUG, "Beginning LittleFS"); LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED); diff --git a/src/networking/json_builder.cpp b/src/networking/json_builder.cpp index 55705ab..e009ebc 100644 --- a/src/networking/json_builder.cpp +++ b/src/networking/json_builder.cpp @@ -1,7 +1,7 @@ #include "json_builder.h" #include +#include "../global_data/water_data_queue.h" -extern WaterData water_data; extern DeviceTelemetry telemetry; extern NetworkData wifi_data; extern NetworkData ethernet_data; diff --git a/src/networking/responses.cpp b/src/networking/responses.cpp index d9b0278..1a599aa 100644 --- a/src/networking/responses.cpp +++ b/src/networking/responses.cpp @@ -8,8 +8,8 @@ #include "json_builder.h" #include "../tools/tools.h" #include +#include "../global_data/water_data_queue.h" -extern WaterData water_data; extern DeviceTelemetry telemetry; extern NetworkData wifi_data; extern NetworkData ethernet_data; @@ -25,18 +25,21 @@ void setup_api_endpoints(){ request->send(200, "application/json", output); }); server.on("/water_data", HTTP_GET, [](AsyncWebServerRequest* request) { + WaterData current_water_data = getLatestWaterData(); String output; - serializeJson(build_water_data_json(water_data), output); + serializeJson(build_water_data_json(current_water_data), output); request->send(200, "application/json", output); }); server.on("/raw_percent", HTTP_GET, [](AsyncWebServerRequest* request) { + WaterData current_water_data = getLatestWaterData(); String output; - output = water_data.percentage; + output = String(current_water_data.percentage); request->send(200, "text/raw", output); }); server.on("/raw_level", HTTP_GET, [](AsyncWebServerRequest* request) { + WaterData current_water_data = getLatestWaterData(); String output; - output = water_data.level; + output = String(current_water_data.level); request->send(200, "text/raw", output); }); diff --git a/src/sensor/sensor.cpp b/src/sensor/sensor.cpp index 2f42687..f974b3a 100644 --- a/src/sensor/sensor.cpp +++ b/src/sensor/sensor.cpp @@ -3,6 +3,7 @@ #include #include "Wire.h" #include "../global_data/global_data.h" +#include "../global_data/water_data_queue.h" #ifdef USE_INA226 @@ -18,7 +19,6 @@ INA233 ina_sensor(0x40); #include "freertos/task.h" extern Preferences prefs; -extern WaterData water_data; extern ActiveErrors active_errors; extern SensorData shunt_data; @@ -106,9 +106,16 @@ void read_sensor_task(void* parameter) shunt_data.shunt_voltage = shunt_voltage; shunt_data.shunt_current = shunt_current; - water_data.level = cm_over_zero; - water_data.liters = liters; - water_data.percentage = percentage_rounded; + // Create water data structure and send to queue + WaterData current_water_data; + current_water_data.level = cm_over_zero; + current_water_data.liters = liters; + current_water_data.percentage = percentage_rounded; + + // Send to queue, don't block if queue is full + if (waterDataQueue != nullptr) { + xQueueSendToBack(waterDataQueue, ¤t_water_data, 0); + } delay(20000); }