Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita3f2dd6

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 parent2e2a87d commita3f2dd6

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
namespacething {
66

7-
voidConfig::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+
intConfigJsonSerializer::content_length()const {
27+
return root_->measureLength();
2728
}
2829

29-
voidConfig::ReadFromJson(char* string) {
30+
voidConfigJsonSerializer::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+
ConfigConfigJsonSerializer::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
namespacething {
910

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

3132
Pins pins;
33+
};
3234

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

3541
// We need a mutable char array here, otherwise a copy will be made.
36-
voidReadFromJson(char* string);
42+
static ConfigDeserialize(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
returnfalse;
115115
}
116-
config.SerializeToJson(&cfg, [](int){});
116+
ConfigJsonSerializerserializer(config);
117+
serializer.SerializeTo(&cfg);
117118

118119
SPIFFS.end();
119120
returntrue;

‎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+
ConfigJsonSerializerserializer(config_);
116+
server_.setContentLength(serializer.content_length());
117+
server_.send(200,"application/json");
118+
serializer.SerializeTo(&client);
119119

120120
debug_("config retrieved");
121121
}elseif (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)

[8]ページ先頭

©2009-2025 Movatter.jp