Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit a3f2dd6

Browse files
committed
Create a ConfigJsonSerializer object to make interfacing with the serialization logic cleaner, fix bug where sometimes the connection would be closed while printing the config.
1 parent 2e2a87d commit a3f2dd6

File tree

4 files changed

+65
-42
lines changed

4 files changed

+65
-42
lines changed

src/thing/Config.cpp

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,57 @@
44

55
namespace thing {
66

7-
void Config::SerializeToJson(Stream* output, std::function<void(int size)> handle_size) const {
8-
DynamicJsonBuffer jsonBuffer;
9-
JsonObject& root = jsonBuffer.createObject();
10-
root["host"] = host.c_str();
11-
root["auth"] = auth.c_str();
12-
root["path"] = path.c_str();
13-
root["wifi_ssid"] = wifi_ssid.c_str();
14-
root["wifi_key"] = wifi_key.c_str();
15-
root["analog_activation"] = analog_activation_threshold;
16-
root["wifi_connect_attempts"] = wifi_connect_attempts;
7+
ConfigJsonSerializer::ConfigJsonSerializer(const Config& config) {
8+
JsonObject& root = json_.createObject();
9+
root_ = &root;
10+
root["host"] = config.host.c_str();
11+
root["auth"] = config.auth.c_str();
12+
root["path"] = config.path.c_str();
13+
root["wifi_ssid"] = config.wifi_ssid.c_str();
14+
root["wifi_key"] = config.wifi_key.c_str();
15+
root["analog_activation"] = config.analog_activation_threshold;
16+
root["wifi_connect_attempts"] = config.wifi_connect_attempts;
1717

1818
JsonObject& pins_root = root.createNestedObject("pins");
19-
pins_root["digital_in"] = pins.digital_in;
20-
pins_root["digital_out"] = pins.digital_out;
21-
pins_root["analog_in"] = pins.analog_in;
22-
pins_root["analog_out"] = pins.analog_out;
23-
pins_root["config_mode_button"] = pins.config_mode_button;
24-
25-
handle_size(root.measureLength());
26-
root.printTo(*output);
19+
pins_root["digital_in"] = config.pins.digital_in;
20+
pins_root["digital_out"] = config.pins.digital_out;
21+
pins_root["analog_in"] = config.pins.analog_in;
22+
pins_root["analog_out"] = config.pins.analog_out;
23+
pins_root["config_mode_button"] = config.pins.config_mode_button;
24+
}
25+
26+
int ConfigJsonSerializer::content_length() const {
27+
return root_->measureLength();
2728
}
2829

29-
void Config::ReadFromJson(char* string) {
30+
void ConfigJsonSerializer::SerializeTo(Stream* output) {
31+
// TODO: We "should" be able to have the root_ print directly to the stream
32+
// however it currently closes the connection half way through.
33+
String buffer;
34+
root_->printTo(buffer);
35+
output->print(buffer);
36+
}
37+
38+
Config ConfigJsonSerializer::Deserialize(char* string) {
39+
Config config;
40+
3041
DynamicJsonBuffer jsonBuffer;
3142
JsonObject& root = jsonBuffer.parseObject(string);
32-
host = root["host"].asString();
33-
auth = root["auth"].asString();
34-
path = root["path"].asString();
35-
wifi_ssid = root["wifi_ssid"].asString();
36-
wifi_key = root["wifi_key"].asString();
37-
analog_activation_threshold = root["activation_threshold"];
38-
wifi_connect_attempts = root["wifi_connect_attempts"];
39-
40-
pins.digital_in = root["pins"]["digital_in"];
41-
pins.digital_out = root["pins"]["digital_out"];
42-
pins.analog_in = root["pins"]["analog_in"];
43-
pins.analog_out = root["pins"]["analog_out"];
44-
pins.config_mode_button = root["pins"]["config_mode_button"];
43+
config.host = root["host"].asString();
44+
config.auth = root["auth"].asString();
45+
config.path = root["path"].asString();
46+
config.wifi_ssid = root["wifi_ssid"].asString();
47+
config.wifi_key = root["wifi_key"].asString();
48+
config.analog_activation_threshold = root["activation_threshold"];
49+
config.wifi_connect_attempts = root["wifi_connect_attempts"];
50+
51+
config.pins.digital_in = root["pins"]["digital_in"];
52+
config.pins.digital_out = root["pins"]["digital_out"];
53+
config.pins.analog_in = root["pins"]["analog_in"];
54+
config.pins.analog_out = root["pins"]["analog_out"];
55+
config.pins.config_mode_button = root["pins"]["config_mode_button"];
56+
57+
return config;
4558
}
4659

4760
};

src/thing/Config.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "Arduino.h"
55
#include <string>
66
#include <functional>
7+
#include "third-party/arduino-json-5.6.7/include/ArduinoJson.h"
78

89
namespace thing {
910

@@ -29,11 +30,19 @@ struct Config {
2930
int wifi_connect_attempts;
3031

3132
Pins pins;
33+
};
3234

33-
void SerializeToJson(Stream* output, std::function<void(int size)> handle_size) const;
35+
class ConfigJsonSerializer {
36+
public:
37+
ConfigJsonSerializer(const Config& config);
38+
int content_length() const;
39+
void SerializeTo(Stream* output);
3440

3541
// We need a mutable char array here, otherwise a copy will be made.
36-
void ReadFromJson(char* string);
42+
static Config Deserialize(char* string);
43+
private:
44+
DynamicJsonBuffer json_;
45+
JsonObject* root_;
3746
};
3847

3948
} // namespace thing

src/thing/FireThing.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ bool FireThing::ReadConfigFromStorage(Config* config) {
9393
}
9494
char buffer[cfg.size()];
9595
cfg.readBytes(buffer, cfg.size());
96-
config->ReadFromJson(buffer);
96+
*config = ConfigJsonSerializer::Deserialize(buffer);
9797
debug_("Config read from disk.");
9898
}
9999

@@ -113,7 +113,8 @@ bool FireThing::WriteConfigToStorage(const Config& config) {
113113
SPIFFS.end();
114114
return false;
115115
}
116-
config.SerializeToJson(&cfg, [](int){});
116+
ConfigJsonSerializer serializer(config);
117+
serializer.SerializeTo(&cfg);
117118

118119
SPIFFS.end();
119120
return true;

src/thing/Portal.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ void Portal::Start(const Config& config) {
111111
server_.on("/config", [&] () {
112112
if (server_.method() == HTTP_GET) {
113113
auto client = server_.client();
114-
config_.SerializeToJson(&client,
115-
[this](int size) {
116-
server_.setContentLength(size);
117-
server_.send(200, "application/json");
118-
});
114+
115+
ConfigJsonSerializer serializer(config_);
116+
server_.setContentLength(serializer.content_length());
117+
server_.send(200, "application/json");
118+
serializer.SerializeTo(&client);
119119

120120
debug_("config retrieved");
121121
} else if (server_.method() == HTTP_POST) {
@@ -132,7 +132,7 @@ void Portal::Start(const Config& config) {
132132
buffer = (char*)malloc(config.length()+1);
133133
memcpy(buffer, config.c_str(), config.length()+1);
134134
}
135-
config_.ReadFromJson(buffer);
135+
config_ = ConfigJsonSerializer::Deserialize(buffer);
136136
free(buffer);
137137

138138
callback_(config_);

0 commit comments

Comments
 (0)