mirror of
https://github.com/esphome/esphome.git
synced 2025-09-02 03:12:20 +01:00
Merge branch 'integration' into memory_api
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace esp32 {
|
namespace esp32 {
|
||||||
@@ -156,20 +157,24 @@ class ESP32Preferences : public ESPPreferences {
|
|||||||
return failed == 0;
|
return failed == 0;
|
||||||
}
|
}
|
||||||
bool is_changed(const uint32_t nvs_handle, const NVSData &to_save) {
|
bool is_changed(const uint32_t nvs_handle, const NVSData &to_save) {
|
||||||
NVSData stored_data{};
|
|
||||||
size_t actual_len;
|
size_t actual_len;
|
||||||
esp_err_t err = nvs_get_blob(nvs_handle, to_save.key.c_str(), nullptr, &actual_len);
|
esp_err_t err = nvs_get_blob(nvs_handle, to_save.key.c_str(), nullptr, &actual_len);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
ESP_LOGV(TAG, "nvs_get_blob('%s'): %s - the key might not be set yet", to_save.key.c_str(), esp_err_to_name(err));
|
ESP_LOGV(TAG, "nvs_get_blob('%s'): %s - the key might not be set yet", to_save.key.c_str(), esp_err_to_name(err));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
stored_data.data.resize(actual_len);
|
// Check size first before allocating memory
|
||||||
err = nvs_get_blob(nvs_handle, to_save.key.c_str(), stored_data.data.data(), &actual_len);
|
if (actual_len != to_save.data.size()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Use unique_ptr to avoid vector overhead for temporary comparison
|
||||||
|
std::unique_ptr<uint8_t[]> stored_data(new uint8_t[actual_len]);
|
||||||
|
err = nvs_get_blob(nvs_handle, to_save.key.c_str(), stored_data.get(), &actual_len);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", to_save.key.c_str(), esp_err_to_name(err));
|
ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", to_save.key.c_str(), esp_err_to_name(err));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return to_save.data != stored_data.data;
|
return memcmp(to_save.data.data(), stored_data.get(), actual_len) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool reset() override {
|
bool reset() override {
|
||||||
|
Reference in New Issue
Block a user