diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 52006f15d..24c3a9cb1 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -6,6 +6,12 @@ For more details go to [emsesp.org](https://emsesp.org/). ## Added +- update time safed in nvs + ## Fixed +- selflowtemp [#2876](https://github.com/emsesp/EMS-ESP32/issues/2876) + ## Changed + +- snapshot gpios in temporarly ram diff --git a/src/core/system.cpp b/src/core/system.cpp index e6d152c13..6363a76da 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... @@ -319,12 +317,16 @@ void System::get_partition_info() { auto current_partition = (const char *)esp_ota_get_running_partition()->label; // update the current version and partition name in NVS if not already set (saves on flash wearing) - if (EMSESP::nvs_.isKey(current_partition)) { - if (EMSESP::nvs_.getString(current_partition) != EMSESP_APP_VERSION) { - EMSESP::nvs_.putString(current_partition, EMSESP_APP_VERSION); + if (EMSESP::nvs_.getString(current_partition) != EMSESP_APP_VERSION || emsesp::EMSESP::nvs_.getBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, false)) { + if (EMSESP::nvs_.getBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, false)) { + EMSESP::nvs_.putBool(emsesp::EMSESP_NVS_BOOT_NEW_FIRMWARE, false); } - } else { - EMSESP::nvs_.putString(current_partition, EMSESP_APP_VERSION); // create new entry + EMSESP::nvs_.putString(current_partition, EMSESP_APP_VERSION); + char c[20]; + snprintf(c, sizeof(c), "d_%s", current_partition); + auto t = time(nullptr); + // write timestamp always with new version, if clock is not set, this will be updated with ntp + EMSESP::nvs_.putULong(c, t); } // Loop through all available partitions and update map with the version info pulled from NVS @@ -347,16 +349,17 @@ void System::get_partition_info() { // get the version from the NVS store, and add to map if (is_valid) { PartitionInfo p_info; - p_info.version = ""; - p_info.install_date = ""; // this will be added later when NTP is connected + // if there is an entry for this partition in NVS, get it's version from NVS + p_info.version = EMSESP::nvs_.getString(part->label, "").c_str(); + char c[20]; + snprintf(c, sizeof(c), "d_%s", (const char *)part->label); + time_t d = EMSESP::nvs_.getULong(c, 0); + char time_string[25]; + strftime(time_string, sizeof(time_string), "%FT%T", localtime(&d)); + p_info.install_date = d > 1500000000L ? time_string : ""; p_info.size = part->size / 1024; // set size in KB - // if there is an entry for this partition in NVS, get it's version from NVS - if (EMSESP::nvs_.isKey(part->label)) { - p_info.version = EMSESP::nvs_.getString(part->label).c_str(); - } - partition_info_[part->label] = p_info; } @@ -368,36 +371,21 @@ void System::get_partition_info() { // set NTP install time/date for the current partition // assumes NTP is connected and working -void System::set_partition_install_date(bool override) { +void System::set_partition_install_date() { #ifndef EMSESP_STANDALONE auto current_partition = (const char *)esp_ota_get_running_partition()->label; if (current_partition == nullptr) { return; // fail-safe } - // skip if it already has an install date, unless override is true - if (!partition_info_[current_partition].install_date.empty() && !override) { - return; + char c[20]; + snprintf(c, sizeof(c), "d_%s", current_partition); + time_t d = EMSESP::nvs_.getULong(c, 0); + if (d < 1500000000L) { + LOG_INFO("Firmware is fresh, setting the new install date in partition %s", current_partition); + auto t = time(nullptr) - uuid::get_uptime_sec(); + EMSESP::nvs_.putULong(c, t); } - - // EMSESP_NVS_BOOT_NEW_FIRMWARE is set in UploadFileService::uploadComplete() - auto is_fresh_firmware = EMSESP::nvs_.getBool(EMSESP_NVS_BOOT_NEW_FIRMWARE); - // always reset flag after setting the install date - EMSESP::nvs_.putBool(EMSESP_NVS_BOOT_NEW_FIRMWARE, false); - - // check if the firmware is a new upload - if (is_fresh_firmware) { - LOG_DEBUG("Firmware is fresh, setting the new install date in partition %s", current_partition); - } else { - return; // skip, not new - } - - // set current date/time from NTP - char time_string[25]; - time_t now = time(nullptr); - strftime(time_string, sizeof(time_string), "%FT%T", localtime(&now)); - partition_info_[current_partition].install_date = time_string; - LOG_DEBUG("Adding NTP install date %s to partition %s", time_string, current_partition); #endif } @@ -1749,9 +1737,10 @@ void System::get_value_json(JsonObject output, const std::string & circuit, cons if (circuit.length()) { output["circuit"] = circuit; } - output["readable"] = true; - output["writeable"] = (name == "showerTimer" || name == "showerAlert" || name == "enabled" || name == "hideLed" || name == "analogEnabled"); - output["visible"] = true; + output["readable"] = true; + output["writeable"] = + (name == "txpause" || name == "showerTimer" || name == "showerAlert" || name == "enabled" || name == "hideLed" || name == "analogEnabled"); + output["visible"] = true; if (val.is()) { output["value"] = val.as(); output["type"] = "boolean"; @@ -2541,11 +2530,7 @@ void System::ntp_connected(bool b) { if (b != ntp_connected_) { if (b) { LOG_INFO("NTP connected"); -#ifdef EMSESP_DEBUG // reset the install date on startup if in debug mode - set_partition_install_date(true); -#else - set_partition_install_date(false); -#endif + set_partition_install_date(); } else { LOG_WARNING("NTP disconnected"); // if turned off report it } @@ -2923,37 +2908,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..1ed74833c 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); @@ -392,7 +391,7 @@ class System { uint8_t systemStatus_; // uses SYSTEM_STATUS enum - void set_partition_install_date(bool override = false); + void set_partition_install_date(); // button static PButton myPButton_; // PButton instance @@ -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/devices/boiler.cpp b/src/devices/boiler.cpp index 65a55cdff..474a9854c 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -2478,9 +2478,9 @@ bool Boiler::set_flow_temp(const char * value, const int8_t id) { uint8_t v1 = v; if (has_telegram_id(0xE4)) { EMSESP::txservice_.add(Telegram::Operation::TX_WRITE, device_id(), EMS_TYPE_UBASetPoints2, 1, &v1, 1, 0, false); - } else { - EMSESP::txservice_.add(Telegram::Operation::TX_WRITE, device_id(), EMS_TYPE_UBASetPoints, 0, &v1, 1, 0, false); } + // always write to 0x1A + EMSESP::txservice_.add(Telegram::Operation::TX_WRITE, device_id(), EMS_TYPE_UBASetPoints, 0, &v1, 1, 0, false); return true; } diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 013df086d..515d6895e 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.1-dev.1" +#define EMSESP_APP_VERSION "3.8.1-dev.2" 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);