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

Commit 06441a1

Browse files
committed
* Changed Serializer::Deserialize to a non-static method.
* Fixed default config initialization. * Added Firething call to delete stored config.
1 parent a3f2dd6 commit 06441a1

File tree

5 files changed

+52
-29
lines changed

5 files changed

+52
-29
lines changed

src/thing/Config.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace thing {
66

77
ConfigJsonSerializer::ConfigJsonSerializer(const Config& config) {
8-
JsonObject& root = json_.createObject();
8+
JsonObject& root = buffer_.createObject();
99
root_ = &root;
1010
root["host"] = config.host.c_str();
1111
root["auth"] = config.auth.c_str();
@@ -23,6 +23,10 @@ ConfigJsonSerializer::ConfigJsonSerializer(const Config& config) {
2323
pins_root["config_mode_button"] = config.pins.config_mode_button;
2424
}
2525

26+
ConfigJsonSerializer::ConfigJsonSerializer(char* serialized_config) {
27+
root_ = &(buffer_.parseObject(serialized_config));
28+
}
29+
2630
int ConfigJsonSerializer::content_length() const {
2731
return root_->measureLength();
2832
}
@@ -35,26 +39,20 @@ void ConfigJsonSerializer::SerializeTo(Stream* output) {
3539
output->print(buffer);
3640
}
3741

38-
Config ConfigJsonSerializer::Deserialize(char* string) {
39-
Config config;
40-
41-
DynamicJsonBuffer jsonBuffer;
42-
JsonObject& root = jsonBuffer.parseObject(string);
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;
42+
void ConfigJsonSerializer::DeserializeTo(Config* config) {
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"];
5856
}
5957

6058
};

src/thing/Config.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,18 @@ struct Config {
3535
class ConfigJsonSerializer {
3636
public:
3737
ConfigJsonSerializer(const Config& config);
38+
39+
// We need a mutable char array here, otherwise a copy will be made.
40+
ConfigJsonSerializer(char* config);
41+
3842
int content_length() const;
3943
void SerializeTo(Stream* output);
44+
void DeserializeTo(Config* config);
4045

41-
// We need a mutable char array here, otherwise a copy will be made.
42-
static Config Deserialize(char* string);
4346
private:
44-
DynamicJsonBuffer json_;
47+
JsonObject& root() {return *root_;}
48+
49+
DynamicJsonBuffer buffer_;
4550
JsonObject* root_;
4651
};
4752

src/thing/FireThing.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ Config kDefaultConfig = {
1212
"", // wifi ssid
1313
"", // wifi key
1414
0.1, // analog activation threshold
15+
2, // wifi connect attempts
16+
{
1517
D1, // digital in
1618
BUILTIN_LED, // digital out
1719
A0, // analog in
1820
D1, // analog out
1921
D0, // config mode button
22+
}
2023
};
2124

2225
const char kStorageFilename[] = "fthing.cfg";
@@ -32,8 +35,7 @@ bool FireThing::Setup() {
3235
return false;
3336
}
3437
SetPinModes(config);
35-
36-
if (digitalRead(config.pins.config_mode_button) || !ConnectToWiFi(config)) {
38+
if (digitalRead(config.pins.config_mode_button) == HIGH || !ConnectToWiFi(config)) {
3739
wifi_.StartAP();
3840
}
3941

@@ -54,9 +56,20 @@ void FireThing::Loop() {
5456
transcriber_.Loop();
5557
}
5658

59+
bool FireThing::DeleteStoredConfig() {
60+
if (!SPIFFS.begin()) {
61+
debug_("Failed to mount FS.");
62+
return false;
63+
}
64+
bool success = SPIFFS.remove(kStorageFilename);
65+
SPIFFS.end();
66+
return success;
67+
}
68+
5769
bool FireThing::ConnectToWiFi(const Config& config) {
5870
debug_("Connecting to wifi:");
5971
debug_(config.wifi_ssid.c_str());
72+
// TODO we should probably not print the key to serial.
6073
debug_(config.wifi_key.c_str());
6174
if (wifi_.Connect(config.wifi_ssid, config.wifi_key)) {
6275
debug_("Connected");
@@ -93,7 +106,8 @@ bool FireThing::ReadConfigFromStorage(Config* config) {
93106
}
94107
char buffer[cfg.size()];
95108
cfg.readBytes(buffer, cfg.size());
96-
*config = ConfigJsonSerializer::Deserialize(buffer);
109+
ConfigJsonSerializer serializer(buffer);
110+
serializer.DeserializeTo(config);
97111
debug_("Config read from disk.");
98112
}
99113

src/thing/FireThing.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ class FireThing {
1919

2020
void SetDebugHandler(std::function<void(const char* message)> debug);
2121

22+
// Called to delete the currently stored config from the filesystem.
23+
bool DeleteStoredConfig();
24+
2225
private:
2326
bool ReadConfigFromStorage(Config* config);
2427
bool WriteConfigToStorage(const Config& config);

src/thing/Portal.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,11 @@ 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_ = ConfigJsonSerializer::Deserialize(buffer);
136-
free(buffer);
135+
{ // Scoped because serializer is invalid after free().
136+
ConfigJsonSerializer serializer(buffer);
137+
serializer.DeserializeTo(&config_);
138+
free(buffer);
139+
}
137140

138141
callback_(config_);
139142
server_.send(200, "text/plain", "");

0 commit comments

Comments
 (0)