diff --git a/platformio.ini b/platformio.ini index 8cd5000..14dc327 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,6 +19,6 @@ lib_deps = bblanchon/ArduinoJson@^6.21.3 ArduinoLog upload_protocol = espota -upload_port = 192.168.5.242 +upload_port = 192.168.5.181 lib_extra_dirs = libs build_flags = -Wall -Wextra \ No newline at end of file diff --git a/src/global_data/global_data.h b/src/global_data/global_data.h index e9cb5ef..7bab410 100644 --- a/src/global_data/global_data.h +++ b/src/global_data/global_data.h @@ -1,5 +1,7 @@ #include +#pragma once + struct SensorData { float bus_voltage; float shunt_voltage; diff --git a/src/main.cpp b/src/main.cpp index 9c73bd2..286929a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,12 +18,13 @@ #include "networking/networking.h" - -#include -#include "sensor/sensor.h" #include "external_interfacing/leds.h" +#include "sensor/sensor.h" #include "telemetry/telemetry.h" #include "tools/tools.h" +#include +#include "networking/json_builder.h" +#include "networking/responses.h" Preferences prefs; @@ -35,11 +36,9 @@ extern SensorData shunt_data; extern "C" int rom_phy_get_vdd33(); - AsyncWebServer server(80); #define FORMAT_LITTLEFS_IF_FAILED true - void setup() { prefs.begin("waterlevel", false); @@ -67,12 +66,13 @@ void setup() display_error_code(19); Log.verbose("Begin INA"); - display_error_code(22); /////////////////////////////// ROUTES /////////////////////////////// Log.verbose("Route Setup"); + + // Normal HTML stuff server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/status.html", "text/html", false, processor); }); server.on("/settings", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/settings.html", "text/html", false, processor); }); @@ -81,6 +81,7 @@ void setup() server.on("/logic.js", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/logic.js", "application/javascript", false, processor); }); + // API stuff - internal server.on("/update_wifi_credentials", HTTP_POST, [](AsyncWebServerRequest* request) { int params = request->params(); @@ -92,17 +93,7 @@ void setup() prefs.putString(ssid_key, ssid_param->value().c_str()); prefs.putString(wifi_password_key, password_param->value().c_str()); - }else { - for (int i = 0; i < params; i++) { - AsyncWebParameter* p = request->getParam(i); - if (p->isFile()) { // p->isPost() is also true - Log.verbose("POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); - } else if (p->isPost()) { - Log.verbose("POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); - } else { - Log.verbose("GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); - } - } + } else { request->send(400, "text/plain", "Missing parameters"); // TODO add proper error messages } request->send(SPIFFS, "/settings.html", "text/html", false); // TODO add proper return templating @@ -159,55 +150,12 @@ void setup() request->send(SPIFFS, "/settings.html", "text/html", false); // TODO add proper return templating }); - server.on("/sensor_data", HTTP_GET, [](AsyncWebServerRequest* request) { - StaticJsonDocument<128> doc; - doc["bus_voltage"] = shunt_data.bus_voltage; - doc["shunt_voltage"] = shunt_data.shunt_voltage; - doc["current"] = shunt_data.shunt_current; - - String output; - serializeJson(doc, output); - request->send(200, "application/json", output); }); - server.on("/water_data", HTTP_GET, [](AsyncWebServerRequest* request) { - StaticJsonDocument<128> doc; - doc["percentage"] = water_data.percentage; - doc["water_height"] = water_data.level; - doc["liters"] = water_data.liters; - - String output; - serializeJson(doc, output); - request->send(200, "application/json", output); }); - - server.on("/telemetry", HTTP_GET, [](AsyncWebServerRequest* request) { - StaticJsonDocument<128> doc; - doc["uptime_seconds"] = telemetry.uptime_seconds; - doc["heap_percent"] = telemetry.heap_used_percent; - - String output; - serializeJson(doc, output); - request->send(200, "application/json", output); }); - - server.on("/network_info", HTTP_GET, [](AsyncWebServerRequest* request) { - StaticJsonDocument<256> doc; - doc["wifi"]["ip"] = wifi_data.ip_address; - doc["wifi"]["rssi"] = wifi_data.rssi; - doc["wifi"]["link"] = wifi_data.link; - doc["wifi"]["ssid"] = wifi_data.network_name; - - doc["ethernet"]["ip"] = ethernet_data.ip_address; - doc["ethernet"]["rssi"] = ethernet_data.rssi; - doc["ethernet"]["link"] = ethernet_data.link; - - String output; - serializeJson(doc, output); - request->send(200, "application/json", output); - }); + setup_api_endpoints(); server.on("/chota.css", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/chota.css", "text/css", false); }); server.on("/gauge.js", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/gauge.js", "application/javascript", false); }); - display_error_code(23); display_error_code(24); @@ -245,14 +193,10 @@ void setup() server.begin(); ArduinoOTA.begin(); display_error_code(25); - xTaskCreate(display_task, "DisplayTask", 10000, NULL, 1, NULL); xTaskCreate(read_sensor_task, "ReadSensorTask", 2048, NULL, 1, NULL); xTaskCreate(collect_internal_telemetry_task, "InternalTelemetryTask", 2048, NULL, 1, NULL); - - - } void loop() diff --git a/src/networking/json_builder.cpp b/src/networking/json_builder.cpp new file mode 100644 index 0000000..809f292 --- /dev/null +++ b/src/networking/json_builder.cpp @@ -0,0 +1,44 @@ +#include "json_builder.h" + +extern WaterData water_data; +extern DeviceTelemetry telemetry; +extern NetworkData wifi_data; +extern NetworkData ethernet_data; +extern SensorData shunt_data; + +StaticJsonDocument<128> build_shunt_data_json(SensorData data) { + StaticJsonDocument<128> doc; + doc["bus_voltage"] = data.bus_voltage; + doc["shunt_voltage"] = data.shunt_voltage; + doc["current"] = data.shunt_current; + return doc; +} + +StaticJsonDocument<128> build_water_data_json(WaterData data) { + StaticJsonDocument<128> doc; + doc["percentage"] = data.percentage; + doc["water_height"] = data.level; + doc["liters"] = data.liters; + return doc; +} + +StaticJsonDocument<128> build_telemetry_json(DeviceTelemetry data) { + StaticJsonDocument<128> doc; + doc["uptime_seconds"] = data.uptime_seconds; + doc["heap_percent"] = data.heap_used_percent; + return doc; +} + +StaticJsonDocument<128> build_network_json(NetworkData wired, NetworkData wireless) { + StaticJsonDocument<256> doc; + doc["wifi"]["ip"] = wireless.ip_address; + doc["wifi"]["rssi"] = wireless.rssi; + doc["wifi"]["link"] = wireless.link; + doc["wifi"]["ssid"] = wireless.network_name; + + doc["ethernet"]["ip"] = wired.ip_address; + doc["ethernet"]["rssi"] = wired.rssi; + doc["ethernet"]["link"] = wired.link; + + return doc; +} \ No newline at end of file diff --git a/src/networking/json_builder.h b/src/networking/json_builder.h new file mode 100644 index 0000000..8aa5726 --- /dev/null +++ b/src/networking/json_builder.h @@ -0,0 +1,7 @@ +#include +#include "../global_data/global_data.h" + +StaticJsonDocument<128> build_shunt_data_json(SensorData data); +StaticJsonDocument<128> build_water_data_json(WaterData data); +StaticJsonDocument<128> build_telemetry_json(DeviceTelemetry data); +StaticJsonDocument<128> build_network_json(NetworkData wired, NetworkData wireless); \ No newline at end of file diff --git a/src/networking/responses.cpp b/src/networking/responses.cpp new file mode 100644 index 0000000..3554047 --- /dev/null +++ b/src/networking/responses.cpp @@ -0,0 +1,39 @@ +#include "responses.h" + +#include +#include +#include "AsyncJson.h" +#include +#include +#include "json_builder.h" + +extern WaterData water_data; +extern DeviceTelemetry telemetry; +extern NetworkData wifi_data; +extern NetworkData ethernet_data; +extern SensorData shunt_data; + +extern AsyncWebServer server; + +void setup_api_endpoints(){ + server.on("/sensor_data", HTTP_GET, [](AsyncWebServerRequest* request) { + String output; + serializeJson(build_shunt_data_json(shunt_data), output); + request->send(200, "application/json", output); }); + + server.on("/water_data", HTTP_GET, [](AsyncWebServerRequest* request) { + String output; + serializeJson(build_water_data_json(water_data), output); + request->send(200, "application/json", output); }); + + server.on("/telemetry", HTTP_GET, [](AsyncWebServerRequest* request) { + String output; + serializeJson(build_telemetry_json(telemetry), output); + request->send(200, "application/json", output); }); + + server.on("/network_info", HTTP_GET, [](AsyncWebServerRequest* request) { + String output; + serializeJson(build_network_json(ethernet_data, wifi_data), output); + request->send(200, "application/json", output); + }); +} \ No newline at end of file diff --git a/src/networking/responses.h b/src/networking/responses.h new file mode 100644 index 0000000..82055b7 --- /dev/null +++ b/src/networking/responses.h @@ -0,0 +1,3 @@ +#include + +void setup_api_endpoints(); \ No newline at end of file