Switched to queues for webserver
Test project compilation / test (push) Successful in 3m44s

This commit is contained in:
2026-03-30 18:34:14 +02:00
parent 752cd86234
commit f1d9abc4c7
7 changed files with 231 additions and 24 deletions
+64 -12
View File
@@ -10,14 +10,17 @@
#include "AsyncJson.h"
#include <ArduinoJson.h>
#include <SPIFFS.h>
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include <freertos/queue.h>
#include "../global_data/global_data.h"
#include "../tools/tools.h"
#include "../tools/readers_writer_lock.h"
#include "../global_data/defines.h"
#include "json_builder.h"
extern Preferences prefs;
extern WaterData water_data;
extern DeviceTelemetry telemetry;
extern NetworkData wifi_data;
extern NetworkData ethernet_data;
@@ -27,6 +30,15 @@ extern OTAStatus ota_status;
AsyncWebSocket webSocket("/webSocket");
AsyncWebServer server(80);
// Local water data cache
WaterData local_water_data;
// Readers-writer lock for local_water_data
ReadersWriterLock waterDataLock;
// Queue to receive water data from the sensor task
QueueHandle_t webserverWaterDataQueue;
// ======================
// Webserver Setup
@@ -84,19 +96,26 @@ void setup_api_endpoints(){
request->send(200, "application/json", output); });
server.on("/water_data", HTTP_GET, [](AsyncWebServerRequest* request) {
rwLockAcquireRead(&waterDataLock);
String output;
serializeJson(build_water_data_json(water_data), output);
request->send(200, "application/json", output); });
serializeJson(build_water_data_json(local_water_data), output);
rwLockReleaseRead(&waterDataLock);
request->send(200, "application/json", output);
});
server.on("/raw_percent", HTTP_GET, [](AsyncWebServerRequest* request) {
String output;
output = water_data.percentage;
request->send(200, "text/raw", output); });
rwLockAcquireRead(&waterDataLock);
String output = String(local_water_data.percentage);
rwLockReleaseRead(&waterDataLock);
request->send(200, "text/raw", output);
});
server.on("/raw_level", HTTP_GET, [](AsyncWebServerRequest* request) {
String output;
output = water_data.level;
request->send(200, "text/raw", output); });
rwLockAcquireRead(&waterDataLock);
String output = String(local_water_data.level);
rwLockReleaseRead(&waterDataLock);
request->send(200, "text/raw", output);
});
server.on("/telemetry", HTTP_GET, [](AsyncWebServerRequest* request) {
String output;
@@ -215,18 +234,51 @@ void handle_update_sensor_settings(AsyncWebServerRequest* request) {
/**
* @brief Main task for the webserver.
*
* Initializes all routes and starts the webserver.
* Initializes all routes, starts the webserver, and sets up local water data.
* Receives water data from the sensor task via a queue and updates local_water_data.
* Runs indefinitely to keep the server active.
*
* @param pvParameters Task parameters (unused).
* @param pvParameters Task parameters (expected to be a QueueHandle_t for the water data queue).
*/
void webserver_task(void *pvParameters) {
// Extract the queue handle from the task parameters
webserverWaterDataQueue = (QueueHandle_t)pvParameters;
if (webserverWaterDataQueue == NULL) {
LOG(ELOG_LEVEL_ERROR, "Webserver water data queue is NULL");
vTaskDelete(NULL);
return;
}
LOG(ELOG_LEVEL_DEBUG, "Setting up routes");
setup_routes();
// Initialize the readers-writer lock
if (!rwLockInit(&waterDataLock)) {
LOG(ELOG_LEVEL_ERROR, "Failed to initialize readers-writer lock");
vTaskDelete(NULL);
return;
}
// Initialize local water data with static values
rwLockAcquireWrite(&waterDataLock);
local_water_data.level = 50.0f;
local_water_data.liters = 100.0f;
local_water_data.percentage = 50.0f;
rwLockReleaseWrite(&waterDataLock);
LOG(ELOG_LEVEL_DEBUG, "Starting webserver");
server.begin();
while (1) {
vTaskDelay(portMAX_DELAY);
// Check if there is new water data in the queue
WaterData newWaterData;
if (xQueueReceive(webserverWaterDataQueue, &newWaterData, 0) == pdTRUE) {
// Update local_water_data with the new data from the queue
rwLockAcquireWrite(&waterDataLock);
local_water_data = newWaterData;
rwLockReleaseWrite(&waterDataLock);
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Small delay to reduce CPU usage
}
}