This commit is contained in:
@@ -19,6 +19,6 @@ lib_deps =
|
|||||||
bblanchon/ArduinoJson@^6.21.3
|
bblanchon/ArduinoJson@^6.21.3
|
||||||
ArduinoLog
|
ArduinoLog
|
||||||
upload_protocol = espota
|
upload_protocol = espota
|
||||||
upload_port = 192.168.5.242
|
upload_port = 192.168.5.181
|
||||||
lib_extra_dirs = libs
|
lib_extra_dirs = libs
|
||||||
build_flags = -Wall -Wextra
|
build_flags = -Wall -Wextra
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
struct SensorData {
|
struct SensorData {
|
||||||
float bus_voltage;
|
float bus_voltage;
|
||||||
float shunt_voltage;
|
float shunt_voltage;
|
||||||
|
|||||||
74
src/main.cpp
74
src/main.cpp
@@ -18,12 +18,13 @@
|
|||||||
|
|
||||||
#include "networking/networking.h"
|
#include "networking/networking.h"
|
||||||
|
|
||||||
|
|
||||||
#include <Preferences.h>
|
|
||||||
#include "sensor/sensor.h"
|
|
||||||
#include "external_interfacing/leds.h"
|
#include "external_interfacing/leds.h"
|
||||||
|
#include "sensor/sensor.h"
|
||||||
#include "telemetry/telemetry.h"
|
#include "telemetry/telemetry.h"
|
||||||
#include "tools/tools.h"
|
#include "tools/tools.h"
|
||||||
|
#include <Preferences.h>
|
||||||
|
#include "networking/json_builder.h"
|
||||||
|
#include "networking/responses.h"
|
||||||
|
|
||||||
Preferences prefs;
|
Preferences prefs;
|
||||||
|
|
||||||
@@ -35,11 +36,9 @@ extern SensorData shunt_data;
|
|||||||
|
|
||||||
extern "C" int rom_phy_get_vdd33();
|
extern "C" int rom_phy_get_vdd33();
|
||||||
|
|
||||||
|
|
||||||
AsyncWebServer server(80);
|
AsyncWebServer server(80);
|
||||||
#define FORMAT_LITTLEFS_IF_FAILED true
|
#define FORMAT_LITTLEFS_IF_FAILED true
|
||||||
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
prefs.begin("waterlevel", false);
|
prefs.begin("waterlevel", false);
|
||||||
@@ -67,12 +66,13 @@ void setup()
|
|||||||
display_error_code(19);
|
display_error_code(19);
|
||||||
|
|
||||||
Log.verbose("Begin INA");
|
Log.verbose("Begin INA");
|
||||||
|
|
||||||
|
|
||||||
display_error_code(22);
|
display_error_code(22);
|
||||||
|
|
||||||
/////////////////////////////// ROUTES ///////////////////////////////
|
/////////////////////////////// ROUTES ///////////////////////////////
|
||||||
Log.verbose("Route Setup");
|
Log.verbose("Route Setup");
|
||||||
|
|
||||||
|
// Normal HTML stuff
|
||||||
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/status.html", "text/html", false, processor); });
|
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); });
|
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); });
|
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) {
|
server.on("/update_wifi_credentials", HTTP_POST, [](AsyncWebServerRequest* request) {
|
||||||
int params = request->params();
|
int params = request->params();
|
||||||
|
|
||||||
@@ -92,17 +93,7 @@ void setup()
|
|||||||
prefs.putString(ssid_key, ssid_param->value().c_str());
|
prefs.putString(ssid_key, ssid_param->value().c_str());
|
||||||
prefs.putString(wifi_password_key, password_param->value().c_str());
|
prefs.putString(wifi_password_key, password_param->value().c_str());
|
||||||
|
|
||||||
}else {
|
} 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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
request->send(400, "text/plain", "Missing parameters"); // TODO add proper error messages
|
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
|
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
|
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) {
|
setup_api_endpoints();
|
||||||
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);
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("/chota.css", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/chota.css", "text/css", false); });
|
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); });
|
server.on("/gauge.js", HTTP_GET, [](AsyncWebServerRequest* request) { request->send(SPIFFS, "/gauge.js", "application/javascript", false); });
|
||||||
|
|
||||||
|
|
||||||
display_error_code(23);
|
display_error_code(23);
|
||||||
|
|
||||||
display_error_code(24);
|
display_error_code(24);
|
||||||
@@ -245,14 +193,10 @@ void setup()
|
|||||||
server.begin();
|
server.begin();
|
||||||
ArduinoOTA.begin();
|
ArduinoOTA.begin();
|
||||||
display_error_code(25);
|
display_error_code(25);
|
||||||
|
|
||||||
|
|
||||||
xTaskCreate(display_task, "DisplayTask", 10000, NULL, 1, NULL);
|
xTaskCreate(display_task, "DisplayTask", 10000, NULL, 1, NULL);
|
||||||
xTaskCreate(read_sensor_task, "ReadSensorTask", 2048, NULL, 1, NULL);
|
xTaskCreate(read_sensor_task, "ReadSensorTask", 2048, NULL, 1, NULL);
|
||||||
xTaskCreate(collect_internal_telemetry_task, "InternalTelemetryTask", 2048, NULL, 1, NULL);
|
xTaskCreate(collect_internal_telemetry_task, "InternalTelemetryTask", 2048, NULL, 1, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
|
|||||||
44
src/networking/json_builder.cpp
Normal file
44
src/networking/json_builder.cpp
Normal file
@@ -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;
|
||||||
|
}
|
||||||
7
src/networking/json_builder.h
Normal file
7
src/networking/json_builder.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#include <ArduinoJson.h>
|
||||||
|
#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);
|
||||||
39
src/networking/responses.cpp
Normal file
39
src/networking/responses.cpp
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#include "responses.h"
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
#include "AsyncJson.h"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <ArduinoLog.h>
|
||||||
|
#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);
|
||||||
|
});
|
||||||
|
}
|
||||||
3
src/networking/responses.h
Normal file
3
src/networking/responses.h
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
|
void setup_api_endpoints();
|
||||||
Reference in New Issue
Block a user