Skip to content

Commit d5a13ba

Browse files
committed
Move objects serialization from webserver into their own classes
1 parent 280e03f commit d5a13ba

8 files changed

Lines changed: 55 additions & 50 deletions

File tree

src/ambient/ambient.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "ambient-p.h"
2+
#include "ambient.h"
23

34
APB::Ambient &APB::Ambient::Instance = *new APB::Ambient();
45

@@ -35,5 +36,10 @@ float APB::Ambient::calculateDewpoint(float temperature, float humidity) {
3536
static const float dewpointB = 243.12;
3637
const float a_t_rh = log(humidity / 100.0) + (dewpointA * temperature / (dewpointB + temperature));
3738
return (dewpointB * a_t_rh) / (dewpointA - a_t_rh);
39+
}
3840

41+
void APB::Ambient::toJson(JsonObject ambientStatus) {
42+
ambientStatus["temperature"] = _reading->temperature;
43+
ambientStatus["humidity"] = _reading->humidity;
44+
ambientStatus["dewpoint"] = _reading->dewpoint();
3945
}

src/ambient/ambient.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <TaskSchedulerDeclarations.h>
55
#include <optional>
6+
#include <ArduinoJson.h>
67

78
#include "configuration.h"
89

@@ -28,6 +29,7 @@ class Ambient {
2829
void readSensor();
2930
std::optional<Reading> _reading;
3031
static float calculateDewpoint(float temperature, float humidity);
32+
void toJson(JsonObject ambientStatus);
3133
};
3234

3335
}

src/heater.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <SmoothThermistor.h>
1010
#endif
1111

12+
#include "utils.h"
13+
1214

1315
static const char *TEMPERATURE_NOT_FOUND_WARNING_LOG = "%s Cannot set heater temperature without temperature sensor";
1416
static const char *AMBIENT_NOT_FOUND_WARNING_LOG = "%s Cannot set heater temperature without ambient sensor";
@@ -80,7 +82,21 @@ void APB::Heater::setup(uint8_t index, Scheduler &scheduler) {
8082
Log.infoln("%s Heater initialised", d->log_scope);
8183

8284
}
83-
std::forward_list<String> APB::Heater::validModes() {
85+
void APB::Heater::toJson(JsonObject heaterStatus) {
86+
heaterStatus["mode"] = modeAsString(),
87+
heaterStatus["max_duty"] = maxDuty();
88+
heaterStatus["duty"] = duty();
89+
heaterStatus["active"] = active();
90+
heaterStatus["has_temperature"] = temperature().has_value();
91+
optional::if_present(rampOffset(), [&](float v){ heaterStatus["ramp_offset"] = v; });
92+
optional::if_present(minDuty(), [&](float v){ heaterStatus["min_duty"] = v; });
93+
optional::if_present(temperature(), [&](float v){ heaterStatus["temperature"] = v; });
94+
optional::if_present(targetTemperature(), [&](float v){ heaterStatus["target_temperature"] = v; });
95+
optional::if_present(dewpointOffset(), [&](float v){ heaterStatus["dewpoint_offset"] = v; });
96+
}
97+
98+
std::forward_list<String> APB::Heater::validModes()
99+
{
84100
static std::forward_list<String> keys;
85101
if(keys.empty())
86102
std::transform(Private::modesToString.begin(), Private::modesToString.end(), std::front_inserter(keys), [](const auto &i) { return i.second; });
@@ -308,4 +324,10 @@ void APB::Heater::Private::writePinDuty(float pwm) {
308324
}
309325
}
310326

311-
#endif
327+
#endif
328+
329+
void APB::Heaters::toJson(JsonArray heatersStatus) {
330+
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [heatersStatus](Heater &heater) {
331+
heater.toJson(heatersStatus[heater.index()]);
332+
});
333+
}

src/heater.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <TaskSchedulerDeclarations.h>
77
#include <forward_list>
88
#include <unordered_map>
9+
#include <ArduinoJson.h>
910

1011
#include "configuration.h"
1112
#include "ambient/ambient.h"
@@ -16,6 +17,7 @@ class Heater;
1617
namespace Heaters {
1718
using Array = std::array<APB::Heater, APB_HEATERS_SIZE>;
1819
extern Array &Instance;
20+
void toJson(JsonArray heatersStatus);
1921
}
2022

2123

@@ -26,6 +28,8 @@ class Heater {
2628
~Heater();
2729
enum Mode { off, fixed, target_temperature, dewpoint };
2830
void setup(uint8_t index, Scheduler &scheduler);
31+
32+
void toJson(JsonObject heaterStatus);
2933

3034
float maxDuty() const;
3135
float duty() const;

src/powermonitor.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,16 @@ void APB::PowerMonitor::setup(Scheduler &scheduler) {
5050
}
5151
}
5252

53-
void APB::PowerMonitor::setCharge() {
53+
void APB::PowerMonitor::toJson(JsonObject powerStatus) {
54+
powerStatus["busVoltage"] = _status.busVoltage;
55+
powerStatus["current"] = _status.current;
56+
powerStatus["power"] = _status.power;
57+
powerStatus["shuntVoltage"] = _status.shuntVoltage;
58+
powerStatus["charge"] = _status.charge;
59+
}
60+
61+
void APB::PowerMonitor::setCharge()
62+
{
5463
switch (Settings::Instance.powerSource()) {
5564
case LipoBattery3C:
5665
_status.charge = lipoBatteryCharge(3, _status.busVoltage);
@@ -60,7 +69,6 @@ void APB::PowerMonitor::setCharge() {
6069
}
6170
}
6271

63-
6472
float lipoBatteryCharge(uint8_t cells, float voltage) {
6573
float singleCellVoltage = voltage / static_cast<float>(cells);
6674
using RefPair = std::pair<float, float>;

src/powermonitor.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <optional>
55
#include <memory>
66
#include <TaskSchedulerDeclarations.h>
7+
#include <ArduinoJson.h>
78

89
#include "configuration.h"
910
#include <INA219.h>
@@ -30,6 +31,7 @@ class PowerMonitor {
3031
LipoBattery3C = 1,
3132
};
3233
Status status() const { return _status; }
34+
void toJson(JsonObject powerStatus);
3335
private:
3436
INA219 _ina219{APB_INA1219_ADDRESS};
3537
PowerMonitor::Status _status;

src/webserver.cpp

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ using namespace GuLinux;
1919

2020
APB::WebServer::WebServer(Scheduler &scheduler) : AsyncWebServerBase{},
2121
events("/api/events"),
22-
scheduler(scheduler)
23-
{
22+
scheduler(scheduler) {
2423
}
2524

2625

@@ -69,13 +68,13 @@ void APB::WebServer::setup() {
6968
new Task(1000, TASK_FOREVER, [this](){
7069
eventsDocument.clear();
7170
if(Ambient::Instance.reading().has_value()) {
72-
populateAmbientStatus(eventsDocument["ambient"].to<JsonObject>());
71+
Ambient::Instance.toJson(eventsDocument["ambient"].to<JsonObject>());
7372
} else {
7473
eventsDocument["ambient"] = static_cast<char*>(0);
7574
}
7675

77-
populatePowerStatus(eventsDocument["power"].to<JsonObject>());
78-
populateHeatersStatus(eventsDocument["heaters"].to<JsonArray>());
76+
PowerMonitor::Instance.toJson(eventsDocument["power"].to<JsonObject>());
77+
Heaters::toJson(eventsDocument["heaters"].to<JsonArray>());
7978
eventsDocument["app"]["uptime"] = esp_timer_get_time() / 1000'000.0;
8079
serializeJson(eventsDocument, eventsString.data(), eventsString.size());
8180
this->events.send(eventsString.data(), "status", millis(), 5000);
@@ -135,55 +134,23 @@ void APB::WebServer::onGetAmbient(AsyncWebServerRequest *request) {
135134
return;
136135
}
137136
JsonResponse response(request);
138-
populateAmbientStatus(response.root().to<JsonObject>());
137+
Ambient::Instance.toJson(response.root().to<JsonObject>());
139138
}
140139

141140

142141

143142
void APB::WebServer::onGetHeaters(AsyncWebServerRequest *request) {
144143
JsonResponse response(request);
145-
populateHeatersStatus(response.root().to<JsonArray>());
144+
Heaters::toJson(response.root().to<JsonArray>());
146145
}
147146

148-
void APB::WebServer::populateHeatersStatus(JsonArray heatersStatus) {
149-
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [heatersStatus](Heater &heater) {
150-
heatersStatus[heater.index()]["mode"] = heater.modeAsString(),
151-
heatersStatus[heater.index()]["max_duty"] = heater.maxDuty();
152-
heatersStatus[heater.index()]["duty"] = heater.duty();
153-
heatersStatus[heater.index()]["active"] = heater.active();
154-
heatersStatus[heater.index()]["has_temperature"] = heater.temperature().has_value();
155-
optional::if_present(heater.rampOffset(), [&](float v){ heatersStatus[heater.index()]["ramp_offset"] = v; });
156-
optional::if_present(heater.minDuty(), [&](float v){ heatersStatus[heater.index()]["min_duty"] = v; });
157-
optional::if_present(heater.temperature(), [&](float v){ heatersStatus[heater.index()]["temperature"] = v; });
158-
optional::if_present(heater.targetTemperature(), [&](float v){ heatersStatus[heater.index()]["target_temperature"] = v; });
159-
optional::if_present(heater.dewpointOffset(), [&](float v){ heatersStatus[heater.index()]["dewpoint_offset"] = v; });
160-
});
161-
}
162-
163-
void APB::WebServer::populateAmbientStatus(JsonObject ambientStatus) {
164-
ambientStatus["temperature"] = Ambient::Instance.reading()->temperature;
165-
ambientStatus["humidity"] = Ambient::Instance.reading()->humidity;
166-
ambientStatus["dewpoint"] = Ambient::Instance.reading()->dewpoint();
167-
}
168-
169-
170-
void APB::WebServer::populatePowerStatus(JsonObject powerStatus) {
171-
powerStatus["busVoltage"] = PowerMonitor::Instance.status().busVoltage;
172-
powerStatus["current"] = PowerMonitor::Instance.status().current;
173-
powerStatus["power"] = PowerMonitor::Instance.status().power;
174-
powerStatus["shuntVoltage"] = PowerMonitor::Instance.status().shuntVoltage;
175-
powerStatus["charge"] = PowerMonitor::Instance.status().charge;
176-
}
177-
178-
179-
180147
void APB::WebServer::onGetPower(AsyncWebServerRequest *request) {
181148
if(!PowerMonitor::Instance.status().initialised) {
182149
JsonResponse::error(500, "Power reading not available", request);
183150
return;
184151
}
185152
JsonResponse response(request);
186-
populatePowerStatus(response.root().to<JsonObject>());
153+
PowerMonitor::Instance.toJson(response.root().to<JsonObject>());
187154
}
188155

189156
void APB::WebServer::onGetMetrics(AsyncWebServerRequest *request) {

src/webserver.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@ class WebServer : public AsyncWebServerBase {
4141
void onPostSetHeater(AsyncWebServerRequest *request, JsonVariant &json);
4242
void onConfigStatusLedDuty(AsyncWebServerRequest *request, JsonVariant &json);
4343
void onConfigPowerSourceType(AsyncWebServerRequest *request, JsonVariant &json);
44-
45-
46-
void populateHeatersStatus(JsonArray heatersStatus);
47-
void populateAmbientStatus(JsonObject ambientStatus);
48-
void populatePowerStatus(JsonObject powerStatus);
49-
5044
};
5145
}
5246

0 commit comments

Comments
 (0)