Skip to content

Commit 00653ff

Browse files
committed
Upgrade to ArduinoJson 7
1 parent 2948034 commit 00653ff

8 files changed

Lines changed: 40 additions & 40 deletions

File tree

platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ lib_deps =
2020
https://github.com/mathieucarbou/ESPAsyncWebServer.git#v3.1.5
2121
https://github.com/GuLinux/AsyncBufferedTcpLogger#v0.0.2
2222
ayushsharma82/ElegantOTA @ 3.1.1
23-
bblanchon/ArduinoJson@^6.21.3
23+
bblanchon/ArduinoJson@^7.2.0
2424
adafruit/Adafruit Unified Sensor@^1.1.14
2525
adafruit/Adafruit BusIO@^1.14.5
2626
adafruit/Adafruit BME280 Library@^2.2.4

src/history.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class History {
6969
bool footerCreated = false;
7070
bool firstEntrySent = false;
7171
Entries::iterator it;
72-
StaticJsonDocument<512> jsonDocument;
72+
JsonDocument jsonDocument;
7373
size_t currentIndex = 0;
7474
std::unique_ptr<OverflowPrint> overflowPrint;
7575
};

src/jsonresponse.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
namespace APB {
1010
struct JsonResponse {
11-
JsonResponse(AsyncWebServerRequest *request, size_t bufferSize=512, int statusCode=200)
12-
: document(bufferSize), request{request}, statusCode{statusCode} {
11+
JsonResponse(AsyncWebServerRequest *request, int statusCode=200)
12+
: document{}, request{request}, statusCode{statusCode} {
1313
}
1414

1515
~JsonResponse() {
@@ -19,12 +19,12 @@ namespace APB {
1919
request->send(response);
2020
}
2121

22-
ArduinoJson::DynamicJsonDocument document;
22+
ArduinoJson::JsonDocument document;
2323
AsyncWebServerRequest *request;
2424
int statusCode;
2525

26-
static JsonResponse error(int statusCode, const String &errorMessage, AsyncWebServerRequest *request, size_t bufferSize=512) {
27-
JsonResponse response(request, bufferSize, statusCode);
26+
static JsonResponse error(int statusCode, const String &errorMessage, AsyncWebServerRequest *request) {
27+
JsonResponse response(request, statusCode);
2828
response.document["error"] = errorMessage;
2929
return response;
3030
}

src/settings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void APB::Settings::loadDefaults() {
9898
void APB::Settings::loadDefaultStations() {
9999
if(LittleFS.exists("/wifi.json")) {
100100
fs::File wifiJson = LittleFS.open("/wifi.json");
101-
StaticJsonDocument<512> doc;
101+
JsonDocument doc;
102102
DeserializationError error = deserializeJson(doc, wifiJson);
103103
if (error) {
104104
Log.warningln(F("Failed to read file \"/wifi.json\", using empty wifi configuration"));

src/validation.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,20 @@ struct Validation {
2020
bool invalid() const { return !valid(); }
2121
void clear() { errorMessage[0] = 0; }
2222

23-
Validation &required(const char *key) {
24-
if(valid() && !json.containsKey(key)) {
23+
template<typename T> Validation &required(const char *key) {
24+
if(valid() && !json[key].is<T>()) {
2525
sprintf(errorMessage, "Missing required parameter: `%s`", key);
2626
}
2727
return *this;
2828
}
2929

30-
Validation &required(const std::forward_list<String> &keys) {
31-
std::for_each(keys.begin(), keys.end(), [this](const String &key) { required(key.c_str()); });
30+
template<typename T> Validation &required(const std::forward_list<String> &keys) {
31+
std::for_each(keys.begin(), keys.end(), [this](const String &key) { required<T>(key.c_str()); });
3232
return *this;
3333
}
3434

3535
Validation &number(const char *key) {
36-
if(valid() && json.containsKey(key)) {
36+
if(valid()) {
3737
if(!json[key].is<float>()) sprintf(errorMessage, "Value for `%s` is not a number", key);
3838
}
3939
return *this;
@@ -43,15 +43,15 @@ struct Validation {
4343
if(max) Log.traceln(VALIDATION_LOG_SCOPE "min=%F", *min); else Log.traceln(VALIDATION_LOG_SCOPE "min missing");
4444
if(max) Log.traceln(VALIDATION_LOG_SCOPE "max=%F", *max); else Log.traceln(VALIDATION_LOG_SCOPE "max missing");
4545
number(key);
46-
if(valid() && json.containsKey(key)) {
46+
if(valid() && json[key].is<float>()) {
4747
if(max && json[key] > *max) sprintf(errorMessage, "Value for `%s` greater than allowed max `%f`", key, *max);
4848
if(min && json[key] < *min) sprintf(errorMessage, "Value for `%s` lower than allowed max `%f`", key, *min);
4949
}
5050
return *this;
5151
}
5252
Validation &choice(const char *key, const std::forward_list<String> &choices) {
5353
if(valid() &&
54-
json.containsKey(key) &&
54+
json[key].is<const char*>() &&
5555
std::none_of(choices.begin(), choices.end(), [&key, this](const String &choice){ return choice == json[key]; })) {
5656
String choicesMessage;
5757
std::for_each(choices.begin(), choices.end(), [&choicesMessage](const String &choice) {
@@ -64,7 +64,7 @@ struct Validation {
6464
}
6565

6666
Validation &notEmpty(const char *key) {
67-
if(valid() && json.containsKey(key) && json[key].as<String>().isEmpty()) {
67+
if(valid() && json[key].is<const char*>() && json[key].as<String>().isEmpty()) {
6868
sprintf(errorMessage, "Parameter `%s` must not be empty", key);
6969
}
7070
return *this;

src/webserver.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void APB::WebServer::setup() {
4949
#ifdef CONFIGURATION_FOR_PROTOTYPE
5050
server.on("/api/wifi", HTTP_DELETE, [this](AsyncWebServerRequest *request){
5151
new Task(1'000, TASK_ONCE, [](){WiFi.disconnect();}, &scheduler, true);
52-
JsonResponse response(request, 100);
52+
JsonResponse response(request);
5353
response.document["status"] = "Dropping WiFi";
5454
});
5555
#endif
@@ -71,13 +71,13 @@ void APB::WebServer::setup() {
7171
new Task(1000, TASK_FOREVER, [this](){
7272
eventsDocument.clear();
7373
if(Ambient::Instance.reading().has_value()) {
74-
populateAmbientStatus(eventsDocument.createNestedObject("ambient"));
74+
populateAmbientStatus(eventsDocument["ambient"].to<JsonObject>());
7575
} else {
7676
eventsDocument["ambient"] = static_cast<char*>(0);
7777
}
7878

79-
populatePowerStatus(eventsDocument.createNestedObject("power"));
80-
populateHeatersStatus(eventsDocument.createNestedArray("heaters"));
79+
populatePowerStatus(eventsDocument["power"].to<JsonObject>());
80+
populateHeatersStatus(eventsDocument["heaters"].to<JsonArray>());
8181
eventsDocument["app"]["uptime"] = esp_timer_get_time() / 1000'000.0;
8282
serializeJson(eventsDocument, eventsString.data(), eventsString.size());
8383
this->events.send(eventsString.data(), "status", millis(), 5000);
@@ -86,13 +86,13 @@ void APB::WebServer::setup() {
8686

8787

8888
void APB::WebServer::onRestart(AsyncWebServerRequest *request) {
89-
JsonResponse response(request, 100);
89+
JsonResponse response(request);
9090
response.document["status"] = "restarting";
9191
new Task(1000, TASK_ONCE, [](){ esp_restart(); }, &scheduler, true);
9292
}
9393

9494
void APB::WebServer::onGetStatus(AsyncWebServerRequest *request) {
95-
JsonResponse response(request, 500);
95+
JsonResponse response(request);
9696
response.document["status"] = "ok";
9797
response.document["uptime"] = esp_timer_get_time() / 1000'000.0;
9898

@@ -102,7 +102,7 @@ void APB::WebServer::onGetStatus(AsyncWebServerRequest *request) {
102102
}
103103

104104
void APB::WebServer::onGetConfig(AsyncWebServerRequest *request) {
105-
JsonResponse response(request, 600);
105+
JsonResponse response(request);
106106
response.document["accessPoint"]["essid"] = Settings::Instance.apConfiguration().essid;
107107
response.document["accessPoint"]["psk"] = Settings::Instance.apConfiguration().psk;
108108
for(uint8_t i=0; i<APB_MAX_STATIONS; i++) {
@@ -124,7 +124,7 @@ void APB::WebServer::onGetHistory(AsyncWebServerRequest *request) {
124124
}
125125

126126
void APB::WebServer::onNotFound(AsyncWebServerRequest *request) {
127-
JsonResponse response(request, 500, 404);
127+
JsonResponse response(request, 404);
128128
response.document["error"] = "NotFound";
129129
response.document["url"] = request->url();
130130
}
@@ -135,7 +135,7 @@ void APB::WebServer::onConfigAccessPoint(AsyncWebServerRequest *request, JsonVar
135135
Settings::Instance.setAPConfiguration("", "");
136136
}
137137
if(request->method() == HTTP_POST) {
138-
if(Validation{request, json}.required({"essid", "psk"}).notEmpty("essid").invalid()) return;
138+
if(Validation{request, json}.required<const char*>({"essid", "psk"}).notEmpty("essid").invalid()) return;
139139

140140
String essid = json["essid"];
141141
String psk = json["psk"];
@@ -151,10 +151,10 @@ void APB::WebServer::onConfigAccessPoint(AsyncWebServerRequest *request, JsonVar
151151

152152
void APB::WebServer::onConfigStation(AsyncWebServerRequest *request, JsonVariant &json) {
153153
Validation validation{request, json};
154-
validation.required("index").range("index", {0}, {APB_MAX_STATIONS-1});
154+
validation.required<int>("index").range("index", {0}, {APB_MAX_STATIONS-1});
155155

156156
if(request->method() == HTTP_POST) {
157-
validation.required({"essid", "psk"}).notEmpty("essid");
157+
validation.required<const char*>({"essid", "psk"}).notEmpty("essid");
158158
}
159159
if(validation.invalid()) return;
160160
int stationIndex = json["index"];
@@ -176,7 +176,7 @@ void APB::WebServer::onPostWriteConfig(AsyncWebServerRequest *request) {
176176
}
177177

178178
void APB::WebServer::onGetWiFiStatus(AsyncWebServerRequest *request) {
179-
JsonResponse response(request, 100);
179+
JsonResponse response(request);
180180
response.document["wifi"]["status"] = WiFiManager::Instance.statusAsString();
181181
response.document["wifi"]["essid"] = WiFiManager::Instance.essid();
182182
response.document["wifi"]["ip"] = WiFiManager::Instance.ipAddress();
@@ -193,14 +193,14 @@ void APB::WebServer::onGetAmbient(AsyncWebServerRequest *request) {
193193
JsonResponse::error(500, "Ambient reading not available", request);
194194
return;
195195
}
196-
JsonResponse response(request, 100);
196+
JsonResponse response(request);
197197
populateAmbientStatus(response.document.to<JsonObject>());
198198
}
199199

200200

201201

202202
void APB::WebServer::onGetHeaters(AsyncWebServerRequest *request) {
203-
JsonResponse response(request, Heaters::Instance.size() * 100);
203+
JsonResponse response(request);
204204
populateHeatersStatus(response.document.to<JsonArray>());
205205
}
206206

@@ -237,7 +237,7 @@ void APB::WebServer::onGetPower(AsyncWebServerRequest *request) {
237237
JsonResponse::error(500, "Power reading not available", request);
238238
return;
239239
}
240-
JsonResponse response(request, 200);
240+
JsonResponse response(request);
241241
populatePowerStatus(response.document.to<JsonObject>());
242242
}
243243

@@ -308,7 +308,7 @@ void APB::WebServer::onGetMetrics(AsyncWebServerRequest *request) {
308308

309309

310310
void APB::WebServer::onGetESPInfo(AsyncWebServerRequest *request) {
311-
JsonResponse response(request, 500);
311+
JsonResponse response(request);
312312
response.document["mem"]["freeHeap"] = ESP.getFreeHeap();
313313
response.document["mem"]["freePsRam"] = ESP.getFreePsram();
314314
response.document["mem"]["heapSize"] = ESP.getHeapSize();
@@ -328,7 +328,7 @@ void APB::WebServer::onGetESPInfo(AsyncWebServerRequest *request) {
328328

329329
void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant &json) {
330330
Validation validation{request, json};
331-
if(validation.required({"index", "mode"})
331+
if(validation.required<int>("index").required<const char*>("mode")
332332
.range("index", {0}, {Heaters::Instance.size()-1})
333333
.range("duty", {0}, {1})
334334
.choice("mode", Heater::validModes()).invalid()) return;
@@ -340,7 +340,7 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
340340
return;
341341
}
342342

343-
if(validation.range("duty", {0}, {1}).required("duty").invalid()) return;
343+
if(validation.range("duty", {0}, {1}).required<float>("duty").invalid()) return;
344344
float duty = json["duty"];
345345
static const char *temperatureErrorMessage = "Unable to set target temperature. Heater probably doesn't have a temperature sensor.";
346346
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.";
@@ -349,15 +349,15 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
349349
heater.setDuty(json["duty"]);
350350
}
351351
if(mode == Heater::Mode::dewpoint) {
352-
if(validation.range("dewpoint_offset", {-30}, {30}).required("dewpoint_offset").invalid()) return;
352+
if(validation.range("dewpoint_offset", {-30}, {30}).required<float>("dewpoint_offset").invalid()) return;
353353
float dewpointOffset = json["dewpoint_offset"];
354354
if(!heater.setDewpoint(dewpointOffset, duty)) {
355355
JsonResponse::error(500, dewpointTemperatureErrorMessage, request);
356356
return;
357357
}
358358
}
359359
if(mode == Heater::Mode::target_temperature) {
360-
if(validation.range("target_temperature", {-50}, {50}).required("target_temperature").invalid()) return;
360+
if(validation.range("target_temperature", {-50}, {50}).required<float>("target_temperature").invalid()) return;
361361
float targetTemperature = json["target_temperature"];
362362
if(!heater.setTemperature(targetTemperature, duty)) {
363363
JsonResponse::error(500, temperatureErrorMessage, request);
@@ -369,11 +369,11 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
369369

370370
void APB::WebServer::onConfigStatusLedDuty(AsyncWebServerRequest *request, JsonVariant &json) {
371371
Validation validation{request, json};
372-
if(validation.required({"duty"})
372+
if(validation.required<float>("duty")
373373
.range("duty", {0}, {1})
374374
.invalid()) return;
375375
StatusLed::Instance.setDuty(json["duty"]);
376-
JsonResponse response(request, 100);
376+
JsonResponse response(request);
377377
response.document["duty"] = StatusLed::Instance.duty();
378378
}
379379

src/webserver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class WebServer {
2424
AsyncWebServer server;
2525
AsyncEventSource events;
2626
Scheduler &scheduler;
27-
StaticJsonDocument<800> eventsDocument;
27+
JsonDocument eventsDocument;
2828
std::array<char, 800> eventsString;
2929

3030
void onGetStatus(AsyncWebServerRequest *request);

src/wifimanager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <ArduinoLog.h>
33
#include <WiFi.h>
44

5-
#define LOG_SCOPE "APB::WiFiManager:"
5+
#define LOG_SCOPE "WiFiManager:"
66

77
using namespace std::placeholders;
88

0 commit comments

Comments
 (0)