Skip to content

Commit 89d53e2

Browse files
committed
Code cleanups:
- Remove better-enums (better standard c++ compatibiity) - Remove unnecessary pragma message directives (lots of noise) - Remove unnecessary logs
1 parent 1b405a1 commit 89d53e2

12 files changed

Lines changed: 87 additions & 39 deletions

.gitmodules

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +0,0 @@
1-
[submodule "lib/better-enums"]
2-
path = lib/better-enums
3-
url = https://github.com/aantron/better-enums

lib/better-enums

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/configuration_lolin_c3_mini.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma message "Using config for ESP32 C3 Supermini"
1+
// #pragma message "Using config for ESP32 C3 Supermini"
22
#define I2C_SDA_PIN 10
33
#define I2C_SCL_PIN 9
44
#define APB_STATUS_LED_PIN 8

src/configuration_lolin_s2_mini.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#pragma message "Using config for ESP32 S2 Mini"
1+
// #pragma message "Using config for ESP32 S2 Mini"
22

33
#define I2C_SDA_PIN 12
44
#define I2C_SCL_PIN 13

src/heater.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,19 @@ struct APB::Heater::Private {
4545
NTC_Thermistor *ntcThermistor;
4646
std::unique_ptr<SmoothThermistor> smoothThermistor;
4747
#endif
48+
49+
static std::unordered_map<Heater::Mode, String> modesToString;
50+
};
51+
52+
std::unordered_map<APB::Heater::Mode, String> APB::Heater::Private::modesToString = {
53+
{ APB::Heater::Mode::off, "off" },
54+
{ APB::Heater::Mode::dewpoint, "dewpoint" },
55+
{ APB::Heater::Mode::fixed, "fixed" },
56+
{ APB::Heater::Mode::target_temperature, "target_temperature" },
4857
};
4958

59+
60+
5061
APB::Heater::Heater() : d{std::make_shared<Private>()} {
5162
d->q = this;
5263
}
@@ -67,6 +78,25 @@ void APB::Heater::setup(uint8_t index, Scheduler &scheduler) {
6778
Log.infoln("%s Heater initialised", d->log_scope);
6879

6980
}
81+
std::forward_list<String> APB::Heater::validModes() {
82+
static std::forward_list<String> keys;
83+
if(keys.empty())
84+
std::transform(Private::modesToString.begin(), Private::modesToString.end(), std::front_inserter(keys), [](const auto &i) { return i.second; });
85+
return keys;
86+
}
87+
88+
APB::Heater::Mode APB::Heater::modeFromString(const String &mode) {
89+
const auto found = std::find_if(Private::modesToString.begin(), Private::modesToString.end(), [&mode](const auto item){ return mode == item.second; });
90+
if(found == Private::modesToString.end()) {
91+
return Mode::off;
92+
}
93+
return found->first;
94+
}
95+
96+
const String APB::Heater::modeAsString() const
97+
{
98+
return Private::modesToString[mode()];
99+
}
70100

71101
float APB::Heater::duty() const {
72102
return d->pwm;
@@ -120,14 +150,14 @@ bool APB::Heater::setDewpoint(float offset, float maxDuty) {
120150
}
121151

122152
std::optional<float> APB::Heater::targetTemperature() const {
123-
if(d->mode != +Heater::Mode::target_temperature) {
153+
if(d->mode != Heater::Mode::target_temperature) {
124154
return {};
125155
}
126156
return {d->targetTemperature};
127157
}
128158

129159
std::optional<float> APB::Heater::dewpointOffset() const {
130-
if(d->mode != +Heater::Mode::dewpoint) {
160+
if(d->mode != Heater::Mode::dewpoint) {
131161
return {};
132162
}
133163
return {d->dewpointOffset};
@@ -150,17 +180,17 @@ void APB::Heater::Private::loop()
150180
if(temperature.has_value() && temperature.value() < -50) {
151181
Log.traceln("%s invalid temperature detected, discarding temperature", log_scope);
152182
temperature = {};
153-
if(mode == +Heater::Mode::dewpoint || mode == +Heater::Mode::target_temperature) {
183+
if(mode == Heater::Mode::dewpoint || mode == Heater::Mode::target_temperature) {
154184
Log.warningln("%s Lost temperature sensor, switching off.", log_scope);
155185
mode = Heater::Mode::off;
156186
}
157187
}
158188

159-
if(mode == +Heater::Mode::fixed) {
189+
if(mode == Heater::Mode::fixed) {
160190
setDuty(pwm);
161191
return;
162192
}
163-
if(mode == +Heater::Mode::off) {
193+
if(mode == Heater::Mode::off) {
164194
setDuty(0);
165195
return;
166196
}
@@ -172,10 +202,10 @@ void APB::Heater::Private::loop()
172202
}
173203

174204
float targetTemperature;
175-
if(mode == +Heater::Mode::target_temperature) {
205+
if(mode == Heater::Mode::target_temperature) {
176206
targetTemperature = this->targetTemperature;
177207
}
178-
if(mode == +Heater::Mode::dewpoint) {
208+
if(mode == Heater::Mode::dewpoint) {
179209
if(!Ambient::Instance.reading()) {
180210
Log.warningln("%s Unable to set target temperature, ambient sensor not found.", log_scope);
181211
q->setDuty(0);
@@ -221,9 +251,9 @@ void APB::Heater::Private::setup() {
221251

222252
void APB::Heater::Private::readTemperature() {
223253
auto rawValue = analogRead(pinout->thermistor);
224-
Log.infoln("Thermistor %d raw value for pin %d: %d", index, pinout->thermistor, rawValue);
254+
// Log.infoln("Thermistor %d raw value for pin %d: %d", index, pinout->thermistor, rawValue);
225255
temperature = smoothThermistor->temperature();
226-
Log.traceln("%s readThemperature from smoothThermistor: %F", log_scope, *temperature);
256+
// Log.traceln("%s readThemperature from smoothThermistor: %F", log_scope, *temperature);
227257
}
228258

229259
float APB::Heater::Private::getDuty() const {

src/heater.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
#define APB_HEATER_H
33

44
#include <optional>
5-
#include <enum.h>
65
#include <memory>
76
#include <TaskSchedulerDeclarations.h>
7+
#include <forward_list>
8+
#include <unordered_map>
89

910
#include "configuration.h"
1011
#include "ambient/ambient.h"
1112

1213
namespace APB {
13-
BETTER_ENUM(Heater_Mode, uint8_t, off, fixed, target_temperature, dewpoint)
14+
1415
class Heater;
1516
namespace Heaters {
1617
using Array = std::array<APB::Heater, APB_HEATERS_SIZE>;
@@ -23,8 +24,9 @@ class Heater {
2324
using GetTargetTemperature = std::function<std::optional<float>()>;
2425
Heater();
2526
~Heater();
26-
using Mode = Heater_Mode;
27+
enum Mode { off, fixed, target_temperature, dewpoint };
2728
void setup(uint8_t index, Scheduler &scheduler);
29+
2830
float duty() const;
2931
void setDuty(float duty);
3032
bool setTemperature(float targetTemperature, float maxDuty=1);
@@ -35,6 +37,9 @@ class Heater {
3537
bool active() const;
3638

3739
Mode mode() const;
40+
static std::forward_list<String> validModes();
41+
static Mode modeFromString(const String &mode);
42+
const String modeAsString() const;
3843
uint8_t index() const;
3944
private:
4045
struct Private;

src/powermonitor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void APB::PowerMonitor::setup(Scheduler &scheduler) {
4545
d->status.current = d->ina219.getCurrent();
4646
d->status.power = d->ina219.getPower();
4747
d->status.shuntVoltage = d->ina219.getShuntVoltage();
48-
if(d->status.power == 0 || d->status.current == 0) {
48+
if(d->status.power == 0 && d->status.current == 0) {
4949
Log.warningln("Powermonitor: Reporting power as 0. INA status: %d", d->ina219.isConnected());
5050
}
5151
});

src/powermonitor.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#define APB_POWERMONITOR_H
33

44
#include <optional>
5-
#include <enum.h>
65
#include <memory>
76
#include <TaskSchedulerDeclarations.h>
87

src/validation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ struct Validation {
6262
}
6363
return *this;
6464
}
65+
6566
Validation &notEmpty(const char *key) {
6667
if(valid() && json.containsKey(key) && json[key].as<String>().isEmpty()) {
6768
sprintf(errorMessage, "Parameter `%s` must not be empty", key);

src/webserver.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ void APB::WebServer::onPostWriteConfig(AsyncWebServerRequest *request) {
177177

178178
void APB::WebServer::onGetWiFiStatus(AsyncWebServerRequest *request) {
179179
JsonResponse response(request, 100);
180-
response.document["wifi"]["status"] = WiFiManager::Instance.status()._to_string();
180+
response.document["wifi"]["status"] = WiFiManager::Instance.statusAsString();
181181
response.document["wifi"]["essid"] = WiFiManager::Instance.essid();
182182
response.document["wifi"]["ip"] = WiFiManager::Instance.ipAddress();
183183
response.document["wifi"]["gateway"] = WiFiManager::Instance.gateway();
@@ -206,7 +206,7 @@ void APB::WebServer::onGetHeaters(AsyncWebServerRequest *request) {
206206

207207
void APB::WebServer::populateHeatersStatus(JsonArray heatersStatus) {
208208
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [heatersStatus](Heater &heater) {
209-
heatersStatus[heater.index()]["mode"] = heater.mode()._to_string();
209+
heatersStatus[heater.index()]["mode"] = heater.modeAsString(),
210210
heatersStatus[heater.index()]["duty"] = heater.duty();
211211
heatersStatus[heater.index()]["active"] = heater.active();
212212
heatersStatus[heater.index()]["has_temperature"] = heater.temperature().has_value();
@@ -261,21 +261,21 @@ void APB::WebServer::onGetMetrics(AsyncWebServerRequest *request) {
261261
metricsResponse.gauge("heater", heater.duty(), MetricsResponse::Labels()
262262
.add("index", String(heater.index()).c_str())
263263
.field("duty")
264-
.add("mode", heater.mode()._to_string()), nullptr, index++==0);
264+
.add("mode", heater.modeAsString().c_str()), nullptr, index++==0);
265265
});
266266
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [index=0, &metricsResponse](const Heater &heater) mutable {
267267
metricsResponse.gauge("heater", heater.active(), MetricsResponse::Labels()
268268
.add("index", String(heater.index()).c_str())
269269
.field("active")
270-
.add("mode", heater.mode()._to_string()), nullptr, false);
270+
.add("mode", heater.modeAsString().c_str()), nullptr, false);
271271
});
272272
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [index=0, &metricsResponse](const Heater &heater) mutable {
273273
if(heater.temperature().has_value()) {
274274
metricsResponse.gauge("heater", heater.temperature().value(), MetricsResponse::Labels()
275275
.add("index", String(heater.index()).c_str())
276276
.unit("°C")
277277
.field("temperature")
278-
.add("mode", heater.mode()._to_string()), nullptr, false);
278+
.add("mode", heater.modeAsString().c_str()), nullptr, false);
279279
}
280280
});
281281
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [index=0, &metricsResponse](const Heater &heater) mutable {
@@ -284,7 +284,7 @@ void APB::WebServer::onGetMetrics(AsyncWebServerRequest *request) {
284284
.add("index", String(heater.index()).c_str())
285285
.field("target_temperature")
286286
.unit("°C")
287-
.add("mode", heater.mode()._to_string()), nullptr, false);
287+
.add("mode", heater.modeAsString().c_str()), nullptr, false);
288288
}
289289
});
290290
std::for_each(Heaters::Instance.begin(), Heaters::Instance.end(), [index=0, &metricsResponse](const Heater &heater) mutable {
@@ -293,7 +293,7 @@ void APB::WebServer::onGetMetrics(AsyncWebServerRequest *request) {
293293
.add("index", String(heater.index()).c_str())
294294
.field("dewpoint_offset")
295295
.unit("°C")
296-
.add("mode", heater.mode()._to_string()), nullptr, false);
296+
.add("mode", heater.modeAsString().c_str()), nullptr, false);
297297
}
298298
});
299299

@@ -328,15 +328,13 @@ void APB::WebServer::onGetESPInfo(AsyncWebServerRequest *request) {
328328

329329
void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant &json) {
330330
Validation validation{request, json};
331-
std::forward_list<String> valid_modes;
332-
std::transform(Heater::Mode::_values().begin(), Heater::Mode::_values().end(), std::front_inserter(valid_modes), std::bind(&Heater::Mode::_to_string, _1));
333331
if(validation.required({"index", "mode"})
334332
.range("index", {0}, {Heaters::Instance.size()-1})
335333
.range("duty", {0}, {1})
336-
.choice("mode", valid_modes).invalid()) return;
334+
.choice("mode", Heater::validModes()).invalid()) return;
337335
Heater &heater = Heaters::Instance[json["index"]];
338-
Heater::Mode mode = Heater::Mode::_from_string(json["mode"]);
339-
if(mode == +Heater::Mode::off) {
336+
Heater::Mode mode = Heater::modeFromString(json["mode"]);
337+
if(mode == Heater::Mode::off) {
340338
heater.setDuty(0);
341339
onGetHeaters(request);
342340
return;
@@ -347,18 +345,18 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
347345
static const char *temperatureErrorMessage = "Unable to set target temperature. Heater probably doesn't have a temperature sensor.";
348346
static const char *dewpointTemperatureErrorMessage = "Unable to set target temperature. Either the heater doesn't have a temperature sensor, or you're missing an ambient sensor.";
349347

350-
if(mode == +Heater::Mode::fixed) {
348+
if(mode == Heater::Mode::fixed) {
351349
heater.setDuty(json["duty"]);
352350
}
353-
if(mode == +Heater::Mode::dewpoint) {
351+
if(mode == Heater::Mode::dewpoint) {
354352
if(validation.range("dewpoint_offset", {-30}, {30}).required("dewpoint_offset").invalid()) return;
355353
float dewpointOffset = json["dewpoint_offset"];
356354
if(!heater.setDewpoint(dewpointOffset, duty)) {
357355
JsonResponse::error(500, dewpointTemperatureErrorMessage, request);
358356
return;
359357
}
360358
}
361-
if(mode == +Heater::Mode::target_temperature) {
359+
if(mode == Heater::Mode::target_temperature) {
362360
if(validation.range("target_temperature", {-50}, {50}).required("target_temperature").invalid()) return;
363361
float targetTemperature = json["target_temperature"];
364362
if(!heater.setTemperature(targetTemperature, duty)) {

0 commit comments

Comments
 (0)