2 Commits

Author SHA1 Message Date
f5acbe35cf version bump
All checks were successful
Test project compilation / test (push) Successful in 3m30s
2026-03-25 20:53:39 +01:00
aebce5ac44 fix water 2026-03-25 20:52:23 +01:00
6 changed files with 44 additions and 33 deletions

View File

@@ -35,7 +35,7 @@ lib_deps =
${env:esp32_base.lib_deps} ${env:esp32_base.lib_deps}
INA233 INA233
upload_protocol = espota upload_protocol = espota
upload_port = 192.168.5.205 upload_port = 192.168.18.18
[env:ESP32_INA226] [env:ESP32_INA226]
extends = env:esp32_base extends = env:esp32_base

View File

@@ -7,7 +7,7 @@
#define water_level_min_key "water_level_min" #define water_level_min_key "water_level_min"
#define water_level_max_key "water_level_max" #define water_level_max_key "water_level_max"
#define water_volume_key "water_volume" #define water_volume_key "water_volume"
#define current_software_version Version{2, 2, 0} #define current_software_version Version{2, 5, 0}
#define REQUIRED_SPIFFS_VERSION Version{9, 0, 0} #define REQUIRED_SPIFFS_VERSION Version{9, 0, 0}
#define RESISTOR_VALUE 4 #define RESISTOR_VALUE 4

View File

@@ -1,30 +1,39 @@
#include "water_data_queue.h" #include "water_data_queue.h"
#include <Arduino.h> #include <Arduino.h>
QueueHandle_t waterDataQueue = nullptr; SemaphoreHandle_t waterDataMutex = nullptr;
WaterData latestWaterDataCache = {0.0f, 0.0f, 0.0f};
void initWaterDataQueue() { void initWaterDataSync() {
// Create queue that can hold 5 WaterData structures // Create mutex for thread-safe access to latest data cache
waterDataQueue = xQueueCreate(5, sizeof(WaterData)); waterDataMutex = xSemaphoreCreateMutex();
if (waterDataQueue == nullptr) { if (waterDataMutex == nullptr) {
Serial.println("Failed to create water data queue"); Serial.println("Failed to create water data mutex");
}
}
void updateLatestWaterData(const WaterData& newData) {
// Update the cache with new data (called by producer)
if (xSemaphoreTake(waterDataMutex, pdMS_TO_TICKS(10)) == pdTRUE) {
latestWaterDataCache = newData;
xSemaphoreGive(waterDataMutex);
} }
} }
WaterData getLatestWaterData() { WaterData getLatestWaterData() {
WaterData latestData; WaterData result;
// Try to receive the latest data without blocking // Always return the latest cached data
if (xQueueReceive(waterDataQueue, &latestData, 0) == pdPASS) { if (xSemaphoreTake(waterDataMutex, pdMS_TO_TICKS(10)) == pdTRUE) {
// Put the data back in the queue so other consumers can get it too result = latestWaterDataCache; // Copy the latest data
xQueueSendToBack(waterDataQueue, &latestData, 0); xSemaphoreGive(waterDataMutex);
return latestData; return result;
} }
// Return default values if queue is empty // Fallback: if mutex fails, return default values
latestData.level = 0.0f; result.level = 0.0f;
latestData.liters = 0.0f; result.liters = 0.0f;
latestData.percentage = 0.0f; result.percentage = 0.0f;
return latestData; return result;
} }

View File

@@ -1,12 +1,16 @@
#pragma once #pragma once
#include "global_data.h" #include "global_data.h"
#include "freertos/queue.h" #include "freertos/semphr.h"
// Create a queue handle for WaterData // Mutex and cache for thread-safe water data access
extern QueueHandle_t waterDataQueue; extern SemaphoreHandle_t waterDataMutex;
extern WaterData latestWaterDataCache;
// Initialize the water data queue // Initialize the water data synchronization
void initWaterDataQueue(); void initWaterDataSync();
// Helper function to get latest water data // Helper function to get latest water data (always returns most recent)
WaterData getLatestWaterData(); WaterData getLatestWaterData();
// Internal function for producer to update latest data
void updateLatestWaterData(const WaterData& newData);

View File

@@ -60,8 +60,8 @@ void setup()
LOG(ELOG_LEVEL_DEBUG, "Init Sensor"); LOG(ELOG_LEVEL_DEBUG, "Init Sensor");
init_sensor(); init_sensor();
LOG(ELOG_LEVEL_DEBUG, "Init Water Data Queue"); LOG(ELOG_LEVEL_DEBUG, "Init Water Data Sync");
initWaterDataQueue(); initWaterDataSync();
LOG(ELOG_LEVEL_DEBUG, "Beginning LittleFS"); LOG(ELOG_LEVEL_DEBUG, "Beginning LittleFS");
LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED); LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED);

View File

@@ -106,16 +106,14 @@ void read_sensor_task(void* parameter)
shunt_data.shunt_voltage = shunt_voltage; shunt_data.shunt_voltage = shunt_voltage;
shunt_data.shunt_current = shunt_current; shunt_data.shunt_current = shunt_current;
// Create water data structure and send to queue // Create water data structure and update latest data
WaterData current_water_data; WaterData current_water_data;
current_water_data.level = cm_over_zero; current_water_data.level = cm_over_zero;
current_water_data.liters = liters; current_water_data.liters = liters;
current_water_data.percentage = percentage_rounded; current_water_data.percentage = percentage_rounded;
// Send to queue, don't block if queue is full // Update the latest water data (thread-safe)
if (waterDataQueue != nullptr) { updateLatestWaterData(current_water_data);
xQueueSendToBack(waterDataQueue, &current_water_data, 0);
}
delay(20000); delay(20000);
} }