From 205da33fe5a4e35f68d13ee8bab96b50b20429ea Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 1 Jan 2026 11:49:38 +0100 Subject: [PATCH] snapshot gpios in temporarly ram --- src/core/system.cpp | 25 ++++++------------------- src/core/system.h | 11 ++++------- src/web/WebSettingsService.cpp | 16 ++++------------ 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/core/system.cpp b/src/core/system.cpp index e6d152c13..cd0b4460c 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -107,8 +107,6 @@ bool System::led_flash_timer_ = false; // GPIOs std::vector> System::valid_system_gpios_; std::vector> System::used_gpios_; -std::vector> System::snapshot_used_gpios_; -std::vector> System::snapshot_valid_system_gpios_; // find the index of the language // 0 = EN, 1 = DE, etc... @@ -2923,37 +2921,26 @@ std::vector System::available_gpios() { } // make a snapshot of the current GPIOs -void System::make_snapshot_gpios() { - snapshot_used_gpios_.clear(); +void System::make_snapshot_gpios(std::vector & u_gpios, std::vector & s_gpios) { for (const auto & gpio : used_gpios_) { - snapshot_used_gpios_.push_back(gpio); + u_gpios.push_back(gpio); } - - snapshot_valid_system_gpios_.clear(); for (const auto & gpio : valid_system_gpios_) { - snapshot_valid_system_gpios_.push_back(gpio); + s_gpios.push_back(gpio); } } // restore the GPIOs from the snapshot -void System::restore_snapshot_gpios() { +void System::restore_snapshot_gpios(std::vector & u_gpios, std::vector & s_gpios) { used_gpios_.clear(); - for (const auto & gpio : snapshot_used_gpios_) { + for (const auto & gpio : u_gpios) { used_gpios_.push_back(gpio); } valid_system_gpios_.clear(); - for (const auto & gpio : snapshot_valid_system_gpios_) { + for (const auto & gpio : s_gpios) { valid_system_gpios_.push_back(gpio); } - - // clear the snapshot - clear_snapshot_gpios(); -} - -void System::clear_snapshot_gpios() { - snapshot_used_gpios_.clear(); - snapshot_valid_system_gpios_.clear(); } } // namespace emsesp diff --git a/src/core/system.h b/src/core/system.h index 3d2c9c6c4..88e09a9ee 100644 --- a/src/core/system.h +++ b/src/core/system.h @@ -163,9 +163,8 @@ class System { static bool add_gpio(uint8_t pin, const char * source_name); static std::vector available_gpios(); static bool load_board_profile(std::vector & data, const std::string & board_profile); - static void make_snapshot_gpios(); - static void restore_snapshot_gpios(); - static void clear_snapshot_gpios(); + static void make_snapshot_gpios(std::vector & u_gpios, std::vector & s_gpios); + static void restore_snapshot_gpios(std::vector & u_gpios, std::vector & s_gpios); static bool readCommand(const char * data); @@ -438,10 +437,8 @@ class System { static std::vector> string_range_to_vector(const std::string & range); // GPIOs - static std::vector> valid_system_gpios_; // list of valid GPIOs for the ESP32 board that can be used - static std::vector> used_gpios_; // list of GPIOs used by the application - static std::vector> snapshot_used_gpios_; // snapshot of the used GPIOs - static std::vector> snapshot_valid_system_gpios_; // snapshot of the valid GPIOs + static std::vector> valid_system_gpios_; // list of valid GPIOs for the ESP32 board that can be used + static std::vector> used_gpios_; // list of GPIOs used by the application int8_t wifi_quality(int8_t dBm); diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 3564feeda..7067516c9 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -92,7 +92,9 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) { const WebSettings original_settings(settings); // make a snapshot of the current GPIOs - EMSESP::system_.make_snapshot_gpios(); + std::vector used_gpios; + std::vector system_gpios; + EMSESP::system_.make_snapshot_gpios(used_gpios, system_gpios); reset_flags(); @@ -111,13 +113,6 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) { settings.eth_clock_mode = root["eth_clock_mode"]; settings.led_type = root["led_type"]; // 1 = RGB-LED -#if defined(EMSESP_DEBUG) - EMSESP::logger().debug("NVS boot value=[%s], current board_profile=[%s], new board_profile=[%s]", - EMSESP::nvs_.getString("boot").c_str(), - original_settings.board_profile.c_str(), - settings.board_profile.c_str()); -#endif - // see if the user has changed the board profile // this will set: led_gpio, dallas_gpio, rx_gpio, tx_gpio, pbutton_gpio, phy_type, eth_power, eth_phy_addr, eth_clock_mode, led_type // this will always run when EMS-ESP starts since original_settings{} is empty @@ -315,16 +310,13 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) { // replace settings with original settings settings = original_settings; // the original settings are still valid // restore the GPIOs from the snapshot - EMSESP::system_.restore_snapshot_gpios(); + EMSESP::system_.restore_snapshot_gpios(used_gpios, system_gpios); // report the error to WebUI EMSESP::system_.systemStatus(SYSTEM_STATUS::SYSTEM_STATUS_INVALID_GPIO); return StateUpdateResult::ERROR; // don't save the settings if the GPIOs are invalid } - // clean up snapshot of the GPIOs - EMSESP::system_.clear_snapshot_gpios(); - // save the setting internally, for reference later EMSESP::system_.store_settings(settings);