[zephyr] Fix preference log levels and report settings read/save errors (#20810)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
rwrozelle
2026-10-17 03:02:54 +00:00
committed by GitHub
co-authored by Claude Opus 5.5 J. Nick Koston
parent a5a883fd19
commit d2a1f7ee31
+23 -6
View File
@@ -5,6 +5,7 @@
#include "preferences.h"
#include "esphome/core/log.h"
#include <zephyr/settings/settings.h>
#include <sys/types.h>
#include <cinttypes>
#include <cstring>
@@ -23,7 +24,11 @@ bool ZephyrPreferenceBackend::load(uint8_t *data, size_t len) {
if (len != this->data.size()) {
char key_buf[KEY_BUFFER_SIZE];
this->format_key(key_buf, sizeof(key_buf));
ESP_LOGE(TAG, "size of setting key %s changed, from: %zu, to: %zu", key_buf, this->data.size(), len);
if (this->data.empty()) {
ESP_LOGV(TAG, "setting key %s not found", key_buf);
} else {
ESP_LOGE(TAG, "size of setting key %s changed, from: %zu, to: %zu", key_buf, this->data.size(), len);
}
return false;
}
std::memcpy(data, this->data.data(), len);
@@ -87,7 +92,7 @@ bool ZephyrPreferences::load_from_key(uint32_t type, uint8_t *data, size_t len)
}
bool ZephyrPreferences::sync() {
ESP_LOGD(TAG, "Save settings");
ESP_LOGV(TAG, "Save settings");
int err = settings_save();
if (err) {
ESP_LOGE(TAG, "Cannot save settings, err: %d", err);
@@ -117,22 +122,34 @@ int ZephyrPreferences::load_setting(const char *name, size_t len, settings_read_
return 1;
}
std::vector<uint8_t> data(len);
int err = read_cb(cb_arg, data.data(), len);
ssize_t read_len = read_cb(cb_arg, data.data(), len);
if (read_len != static_cast<ssize_t>(len)) {
ESP_LOGE(TAG, "Cannot read setting %s, got %d of %zu", name, static_cast<int>(read_len), len);
return 0;
}
ESP_LOGD(TAG, "load setting, name: %s(%" PRIu32 "), len %zu, err %d", name, *type, len, err);
ESP_LOGD(TAG, "load setting, name: %s(%" PRIu32 "), len %zu", name, *type, len);
auto *pref = new ZephyrPreferenceBackend(*type, std::move(data)); // NOLINT(cppcoreguidelines-owning-memory)
get_preferences()->backends_.push_back(pref);
return 0;
}
int ZephyrPreferences::export_settings(int (*cb)(const char *name, const void *value, size_t val_len)) {
int first_err = 0;
for (auto *backend : get_preferences()->backends_) {
char name[KEY_BUFFER_SIZE];
backend->format_key(name, sizeof(name));
int err = cb(name, backend->data.data(), backend->data.size());
ESP_LOGD(TAG, "save in flash, name %s, len %zu, err %d", name, backend->data.size(), err);
if (err) {
ESP_LOGE(TAG, "Cannot save setting %s, err %d", name, err);
if (first_err == 0) {
first_err = err;
}
continue;
}
ESP_LOGV(TAG, "save in flash, name %s, len %zu", name, backend->data.size());
}
return 0;
return first_err;
}
static ZephyrPreferences s_preferences; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)