mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 08:55:22 +01:00
Correcting ESP32 flash save/load key calculation algorithm (#3416)
Co-authored-by: Otto Winter <otto@otto-winter.com> Co-authored-by: Dr. Zimmermann Zsolt <cina@storage1.cina.hu>
This commit is contained in:
parent
fb2467f6f0
commit
37b6d442bd
2 changed files with 16 additions and 7 deletions
|
@ -36,6 +36,7 @@ class ESP32PreferenceBackend : public ESPPreferenceBackend {
|
||||||
save.key = key;
|
save.key = key;
|
||||||
save.data.assign(data, data + len);
|
save.data.assign(data, data + len);
|
||||||
s_pending_save.emplace_back(save);
|
s_pending_save.emplace_back(save);
|
||||||
|
ESP_LOGVV(TAG, "s_pending_save: key: %s, len: %d", key.c_str(), len);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool load(uint8_t *data, size_t len) override {
|
bool load(uint8_t *data, size_t len) override {
|
||||||
|
@ -65,6 +66,8 @@ class ESP32PreferenceBackend : public ESPPreferenceBackend {
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", key.c_str(), esp_err_to_name(err));
|
ESP_LOGV(TAG, "nvs_get_blob('%s') failed: %s", key.c_str(), esp_err_to_name(err));
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
ESP_LOGVV(TAG, "nvs_get_blob: key: %s, len: %d", key.c_str(), len);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +76,6 @@ class ESP32PreferenceBackend : public ESPPreferenceBackend {
|
||||||
class ESP32Preferences : public ESPPreferences {
|
class ESP32Preferences : public ESPPreferences {
|
||||||
public:
|
public:
|
||||||
uint32_t nvs_handle;
|
uint32_t nvs_handle;
|
||||||
uint32_t current_offset = 0;
|
|
||||||
|
|
||||||
void open() {
|
void open() {
|
||||||
nvs_flash_init();
|
nvs_flash_init();
|
||||||
|
@ -97,12 +99,9 @@ class ESP32Preferences : public ESPPreferences {
|
||||||
ESPPreferenceObject make_preference(size_t length, uint32_t type) override {
|
ESPPreferenceObject make_preference(size_t length, uint32_t type) override {
|
||||||
auto *pref = new ESP32PreferenceBackend(); // NOLINT(cppcoreguidelines-owning-memory)
|
auto *pref = new ESP32PreferenceBackend(); // NOLINT(cppcoreguidelines-owning-memory)
|
||||||
pref->nvs_handle = nvs_handle;
|
pref->nvs_handle = nvs_handle;
|
||||||
current_offset += length;
|
|
||||||
|
|
||||||
uint32_t keyval = current_offset ^ type;
|
uint32_t keyval = type;
|
||||||
char keybuf[16];
|
pref->key = str_sprintf("%u", keyval);
|
||||||
snprintf(keybuf, sizeof(keybuf), "%d", keyval);
|
|
||||||
pref->key = keybuf; // copied to std::string
|
|
||||||
|
|
||||||
return ESPPreferenceObject(pref);
|
return ESPPreferenceObject(pref);
|
||||||
}
|
}
|
||||||
|
@ -121,6 +120,7 @@ class ESP32Preferences : public ESPPreferences {
|
||||||
ESP_LOGVV(TAG, "Checking if NVS data %s has changed", save.key.c_str());
|
ESP_LOGVV(TAG, "Checking if NVS data %s has changed", save.key.c_str());
|
||||||
if (is_changed(nvs_handle, save)) {
|
if (is_changed(nvs_handle, save)) {
|
||||||
esp_err_t err = nvs_set_blob(nvs_handle, save.key.c_str(), save.data.data(), save.data.size());
|
esp_err_t err = nvs_set_blob(nvs_handle, save.key.c_str(), save.data.data(), save.data.size());
|
||||||
|
ESP_LOGV(TAG, "sync: key: %s, len: %d", save.key.c_str(), save.data.size());
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
ESP_LOGV(TAG, "nvs_set_blob('%s', len=%u) failed: %s", save.key.c_str(), save.data.size(),
|
ESP_LOGV(TAG, "nvs_set_blob('%s', len=%u) failed: %s", save.key.c_str(), save.data.size(),
|
||||||
esp_err_to_name(err));
|
esp_err_to_name(err));
|
||||||
|
|
|
@ -6,8 +6,17 @@ namespace number {
|
||||||
|
|
||||||
static const char *const TAG = "number.automation";
|
static const char *const TAG = "number.automation";
|
||||||
|
|
||||||
|
union convert {
|
||||||
|
float from;
|
||||||
|
uint32_t to;
|
||||||
|
};
|
||||||
|
|
||||||
void ValueRangeTrigger::setup() {
|
void ValueRangeTrigger::setup() {
|
||||||
this->rtc_ = global_preferences->make_preference<bool>(this->parent_->get_object_id_hash());
|
float local_min = this->min_.value(0.0);
|
||||||
|
float local_max = this->max_.value(0.0);
|
||||||
|
convert hash = {.from = (local_max - local_min)};
|
||||||
|
uint32_t myhash = hash.to ^ this->parent_->get_object_id_hash();
|
||||||
|
this->rtc_ = global_preferences->make_preference<bool>(myhash);
|
||||||
bool initial_state;
|
bool initial_state;
|
||||||
if (this->rtc_.load(&initial_state)) {
|
if (this->rtc_.load(&initial_state)) {
|
||||||
this->previous_in_range_ = initial_state;
|
this->previous_in_range_ = initial_state;
|
||||||
|
|
Loading…
Reference in a new issue