From e21a09cec94ef607eaa286c21b42af6998a66381 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sun, 23 Mar 2025 15:15:52 -0400 Subject: [PATCH] Separate FS write from serializeConfig Break the actual JSON assembly apart from the file writing code. This permits calling it in other contexts, allowing us to pull the live config data even if the filesystem is out of date. --- wled00/cfg.cpp | 24 ++++++++++++++---------- wled00/fcn_declare.h | 3 ++- wled00/improv.cpp | 2 +- wled00/wled.cpp | 2 +- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 11862f83f..194ef4fbf 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -671,7 +671,7 @@ void deserializeConfigFromFS() { // call readFromConfig() with an empty object so that usermods can initialize to defaults prior to saving JsonObject empty = JsonObject(); UsermodManager::readFromConfig(empty); - serializeConfig(); + serializeConfigToFS(); // init Ethernet (in case default type is set at compile time) #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET) initEthernet(); @@ -685,10 +685,10 @@ void deserializeConfigFromFS() { bool needsSave = deserializeConfig(root, true); releaseJSONBufferLock(); - if (needsSave) serializeConfig(); // usermods required new parameters + if (needsSave) serializeConfigToFS(); // usermods required new parameters } -void serializeConfig() { +void serializeConfigToFS() { serializeConfigSec(); DEBUG_PRINTLN(F("Writing settings to /cfg.json...")); @@ -697,6 +697,17 @@ void serializeConfig() { JsonObject root = pDoc->to(); + serializeConfig(root); + + File f = WLED_FS.open(FPSTR(s_cfg_json), "w"); + if (f) serializeJson(root, f); + f.close(); + releaseJSONBufferLock(); + + doSerializeConfig = false; +} + +void serializeConfig(JsonObject root) { JsonArray rev = root.createNestedArray("rev"); rev.add(1); //major settings revision rev.add(0); //minor settings revision @@ -1111,13 +1122,6 @@ void serializeConfig() { JsonObject usermods_settings = root.createNestedObject("um"); UsermodManager::addToConfig(usermods_settings); - - File f = WLED_FS.open(FPSTR(s_cfg_json), "w"); - if (f) serializeJson(root, f); - f.close(); - releaseJSONBufferLock(); - - doSerializeConfig = false; } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 497a775ee..0f4666b30 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -27,7 +27,8 @@ void IRAM_ATTR touchButtonISR(); bool deserializeConfig(JsonObject doc, bool fromFS = false); void deserializeConfigFromFS(); bool deserializeConfigSec(); -void serializeConfig(); +void serializeConfig(JsonObject doc); +void serializeConfigToFS(); void serializeConfigSec(); template diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 197148b2b..0bc7a6698 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -272,5 +272,5 @@ void parseWiFiCommand(char* rpcData) { improvActive = 2; forceReconnect = true; - serializeConfig(); + serializeConfigToFS(); } \ No newline at end of file diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 34caeefa3..b2cf26440 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -200,7 +200,7 @@ void WLED::loop() loadLedmap = -1; } yield(); - if (doSerializeConfig) serializeConfig(); + if (doSerializeConfig) serializeConfigToFS(); yield(); handleWs();