Load prefs in sensor from queue
This commit is contained in:
+35
-8
@@ -59,6 +59,9 @@ QueueHandle_t stateForWebserverQueue = xQueueCreate(2, sizeof(CurrentState));
|
|||||||
// Queue for sending preferences from main to webserver
|
// Queue for sending preferences from main to webserver
|
||||||
QueueHandle_t prefsForWebserverQueue = xQueueCreate(2, sizeof(DataMessage));
|
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()
|
void setup()
|
||||||
{
|
{
|
||||||
Logger.registerSerial(MYLOG, ELOG_LEVEL_DEBUG, "Serial");
|
Logger.registerSerial(MYLOG, ELOG_LEVEL_DEBUG, "Serial");
|
||||||
@@ -66,8 +69,8 @@ void setup()
|
|||||||
prefs.begin("waterlevel", false);
|
prefs.begin("waterlevel", false);
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
|
||||||
// Read initial preferences and send to webserver
|
// Read initial preferences and send to webserver and sensor
|
||||||
if (prefsForWebserverQueue != NULL) {
|
if (prefsForWebserverQueue != NULL || prefsForSensorQueue != NULL) {
|
||||||
DataMessage prefsMessage;
|
DataMessage prefsMessage;
|
||||||
prefsMessage.type = DATA_TYPE_PREFERENCES;
|
prefsMessage.type = DATA_TYPE_PREFERENCES;
|
||||||
prefsMessage.data.preferencesData.level_sensor_range = prefs.getFloat(level_sensor_range_key, 200);
|
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);
|
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';
|
prefsMessage.data.preferencesData.wifi_password[sizeof(prefsMessage.data.preferencesData.wifi_password) - 1] = '\0';
|
||||||
|
|
||||||
if (xQueueSend(prefsForWebserverQueue, &prefsMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
|
// Send to webserver
|
||||||
LOG(ELOG_LEVEL_ERROR, "Failed to send initial preferences to webserver queue");
|
if (prefsForWebserverQueue != NULL) {
|
||||||
} else {
|
if (xQueueSend(prefsForWebserverQueue, &prefsMessage, 100 / portTICK_PERIOD_MS) != pdTRUE) {
|
||||||
LOG(ELOG_LEVEL_DEBUG, "Sent initial preferences to webserver");
|
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 {
|
} else {
|
||||||
xTaskCreate(ethernet_task, "EthernetTask", 1024 * 4, dataQueue, 1, NULL);
|
xTaskCreate(ethernet_task, "EthernetTask", 1024 * 4, dataQueue, 1, NULL);
|
||||||
xTaskCreate(wifi_task, "WiFiTask", 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(collect_internal_telemetry_task, "InternalTelemetryTask", 1024 * 2, dataQueue, 1, NULL);
|
||||||
xTaskCreate(display_task, "DisplayTask", 1024 * 2, NULL, 1, NULL);
|
xTaskCreate(display_task, "DisplayTask", 1024 * 2, NULL, 1, NULL);
|
||||||
xTaskCreate(get_time_task, "GetTimeTask", 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_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;
|
break;
|
||||||
default:
|
default:
|
||||||
LOG(ELOG_LEVEL_ERROR, "Unknown data type received");
|
LOG(ELOG_LEVEL_ERROR, "Unknown data type received");
|
||||||
|
|||||||
+37
-12
@@ -1,8 +1,8 @@
|
|||||||
#include "../global_data/defines.h"
|
#include "../global_data/defines.h"
|
||||||
#include <Preferences.h>
|
|
||||||
#include <Elog.h>
|
#include <Elog.h>
|
||||||
#include "Wire.h"
|
#include "Wire.h"
|
||||||
#include "../global_data/global_data.h"
|
#include "../global_data/global_data.h"
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_INA226
|
#ifdef USE_INA226
|
||||||
@@ -17,13 +17,20 @@ INA233 ina_sensor(0x40);
|
|||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
|
|
||||||
extern Preferences prefs;
|
|
||||||
|
|
||||||
WaterData water_data;
|
WaterData water_data;
|
||||||
|
|
||||||
// Calibration variables
|
// Calibration variables
|
||||||
float zero_value = 0.03; // Measured shunt voltage with nothing connected, used to fix measuring offset
|
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(){
|
void init_sensor(){
|
||||||
#ifdef USE_INA226
|
#ifdef USE_INA226
|
||||||
Wire.begin(33, 32);
|
Wire.begin(33, 32);
|
||||||
@@ -46,17 +53,35 @@ void init_sensor(){
|
|||||||
|
|
||||||
void read_sensor_task(void* parameter)
|
void read_sensor_task(void* parameter)
|
||||||
{
|
{
|
||||||
// Extract the queue handle from the task parameters
|
// Extract the queue handles from the task parameters
|
||||||
QueueHandle_t dataQueue = (QueueHandle_t)parameter;
|
SensorQueues* queues = (SensorQueues*)parameter;
|
||||||
if (dataQueue == NULL) {
|
if (queues == NULL || queues->dataQueue == NULL) {
|
||||||
LOG(ELOG_LEVEL_ERROR, "Data queue is NULL");
|
LOG(ELOG_LEVEL_ERROR, "Queue parameters are NULL");
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store queue handles
|
||||||
|
QueueHandle_t dataQueue = queues->dataQueue;
|
||||||
|
g_prefsQueue = queues->prefsQueue;
|
||||||
|
|
||||||
LOG(ELOG_LEVEL_DEBUG, "Starting read sensor tasks");
|
LOG(ELOG_LEVEL_DEBUG, "Starting read sensor tasks");
|
||||||
init_sensor();
|
init_sensor();
|
||||||
while (true) {
|
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
|
// Get Values from sensor
|
||||||
#ifndef USE_INA226
|
#ifndef USE_INA226
|
||||||
String chip_id = ina_sensor.get_device_model();
|
String chip_id = ina_sensor.get_device_model();
|
||||||
@@ -85,11 +110,11 @@ void read_sensor_task(void* parameter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Get values from storage
|
// Use locally stored preference values
|
||||||
float sensor_range = prefs.getFloat(level_sensor_range_key, 200);
|
float sensor_range = local_sensor_range;
|
||||||
float max_water_level = prefs.getFloat(water_level_max_key, sensor_range);
|
float max_water_level = local_water_level_max;
|
||||||
float min_water_level = prefs.getFloat(water_level_min_key, 0);
|
float min_water_level = local_water_level_min;
|
||||||
float max_liters = prefs.getFloat(water_volume_key, 10000.);
|
float max_liters = local_water_volume;
|
||||||
|
|
||||||
float mA_per_cm = (20. - 4.) / (sensor_range);
|
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();
|
void init_sensor();
|
||||||
Reference in New Issue
Block a user