45 for (
auto &obj : s_pending_save) {
46 if (obj.key == this->key) {
47 if (obj.data.size() !=
len) {
51 memcpy(data, obj.data.data(),
len);
56 char key_str[UINT32_MAX_STR_SIZE];
59 esp_err_t err = nvs_get_blob(this->
nvs_handle, key_str,
nullptr, &actual_len);
61 ESP_LOGV(TAG,
"nvs_get_blob('%s'): %s - the key might not be set yet", key_str, esp_err_to_name(err));
64 if (actual_len !=
len) {
65 ESP_LOGVV(TAG,
"NVS length does not match (%zu!=%zu)", actual_len,
len);
70 ESP_LOGV(TAG,
"nvs_get_blob('%s') failed: %s", key_str, esp_err_to_name(err));
73 ESP_LOGVV(TAG,
"nvs_get_blob: key: %s, len: %zu", key_str,
len);
114 if (s_pending_save.empty())
117 ESP_LOGV(TAG,
"Saving %zu items...", s_pending_save.size());
118 int cached = 0,
written = 0, failed = 0;
119 esp_err_t last_err = ESP_OK;
122 for (
const auto &save : s_pending_save) {
123 char key_str[UINT32_MAX_STR_SIZE];
125 ESP_LOGVV(TAG,
"Checking if NVS data %s has changed", key_str);
127 esp_err_t err = nvs_set_blob(this->
nvs_handle, key_str, save.data.data(), save.data.size());
128 ESP_LOGV(TAG,
"sync: key: %s, len: %zu", key_str, save.data.size());
130 ESP_LOGV(TAG,
"nvs_set_blob('%s', len=%zu) failed: %s", key_str, save.data.size(), esp_err_to_name(err));
138 ESP_LOGV(TAG,
"NVS data not changed skipping %" PRIu32
" len=%zu", save.key, save.data.size());
142 s_pending_save.clear();
145 ESP_LOGE(TAG,
"Writing %d items: %d cached, %d written, %d failed. Last error=%s for key=%" PRIu32,
146 cached +
written + failed, cached,
written, failed, esp_err_to_name(last_err), last_key);
148 ESP_LOGD(TAG,
"Writing %d items: %d cached, %d written, %d failed", cached +
written + failed, cached,
written,
151 ESP_LOGV(TAG,
"Writing %d items: %d cached, %d written, %d failed", cached +
written + failed, cached,
written,
158 ESP_LOGV(TAG,
"nvs_commit() failed: %s", esp_err_to_name(err));
167 esp_err_t err = nvs_get_blob(
nvs_handle, key_str,
nullptr, &actual_len);
169 ESP_LOGV(TAG,
"nvs_get_blob('%s'): %s - the key might not be set yet", key_str, esp_err_to_name(err));
173 if (actual_len != to_save.data.size()) {
178 err = nvs_get_blob(
nvs_handle, key_str, stored_data.
get(), &actual_len);
180 ESP_LOGV(TAG,
"nvs_get_blob('%s') failed: %s", key_str, esp_err_to_name(err));
183 return memcmp(to_save.data.data(), stored_data.
get(), to_save.data.size()) != 0;
size_t uint32_to_str(std::span< char, UINT32_MAX_STR_SIZE > buf, uint32_t val)
Write unsigned 32-bit integer to buffer with compile-time size check.