4#include <zephyr/kernel.h>
7#include <zephyr/settings/settings.h>
17 this->data.resize(
len);
18 std::memcpy(this->data.data(),
data,
len);
19 ESP_LOGVV(TAG,
"save key: %" PRIu32
", len: %zu", this->
type_, len);
24 if (
len != this->data.size()) {
25 char key_buf[KEY_BUFFER_SIZE];
27 if (this->data.empty()) {
28 ESP_LOGV(TAG,
"setting key %s not found", key_buf);
30 ESP_LOGE(TAG,
"size of setting key %s changed, from: %zu, to: %zu", key_buf, this->data.size(),
len);
34 std::memcpy(
data, this->data.data(),
len);
35 ESP_LOGVV(TAG,
"load key: %" PRIu32
", len: %zu", this->
type_, len);
40 int err = settings_subsys_init();
42 ESP_LOGE(TAG,
"Failed to initialize settings subsystem, err: %d", err);
46 static struct settings_handler settings_cb = {
47 .name = ESPHOME_SETTINGS_KEY,
52 err = settings_register(&settings_cb);
54 ESP_LOGE(TAG,
"setting_register failed, err, %d", err);
58 err = settings_load_subtree(ESPHOME_SETTINGS_KEY);
60 ESP_LOGE(TAG,
"Cannot load settings, err: %d", err);
63 ESP_LOGD(TAG,
"Loaded %zu settings.", this->
backends_.size());
68 if (backend->get_type() ==
type) {
80 char key_buf[KEY_BUFFER_SIZE];
81 pref->format_key(key_buf,
sizeof(key_buf));
82 ESP_LOGD(TAG,
"Add new setting %s.", key_buf);
91 return backend !=
nullptr && backend->load(data,
len);
95 ESP_LOGV(TAG,
"Save settings");
96 int err = settings_save();
98 ESP_LOGE(TAG,
"Cannot save settings, err: %d", err);
105 ESP_LOGD(TAG,
"Reset settings");
108 backend->data.clear();
116 if (!
type.has_value()) {
117 std::string full_name(ESPHOME_SETTINGS_KEY);
121 settings_delete(full_name.c_str());
124 std::vector<uint8_t> data(
len);
125 ssize_t read_len = read_cb(cb_arg, data.data(),
len);
127 ESP_LOGE(TAG,
"Cannot read setting %s, got %d of %zu", name,
static_cast<int>(read_len),
len);
131 ESP_LOGD(TAG,
"load setting, name: %s(%" PRIu32
"), len %zu", name, *
type,
len);
140 char name[KEY_BUFFER_SIZE];
141 backend->format_key(name,
sizeof(name));
142 int err = cb(name, backend->data.data(), backend->data.size());
144 ESP_LOGE(TAG,
"Cannot save setting %s, err %d", name, err);
145 if (first_err == 0) {
150 ESP_LOGV(TAG,
"save in flash, name %s, len %zu", name, backend->data.size());
161 s_preferences.
open();
std::vector< uint8_t > data
bool load(uint8_t *data, size_t len)
void format_key(char *buf, size_t size) const
bool save(const uint8_t *data, size_t len)
bool load_from_key(uint32_t type, uint8_t *data, size_t len)
One-shot read of a stored preference by key, without allocating or registering a backend.
ESPPreferenceObject make_preference(size_t length, uint32_t type, bool in_flash)
static int load_setting(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg)
std::vector< ZephyrPreferenceBackend * > backends_
ZephyrPreferenceBackend * find_backend_(uint32_t type)
static int export_settings(int(*cb)(const char *name, const void *value, size_t val_len))
ESPHOME_LOG_TAG(TAG, "zephyr")
ZephyrPreferences * get_preferences()
Preferences ESPPreferences
size_t parse_hex(const char *str, size_t length, uint8_t *data, size_t count)
Parse bytes from a hex-encoded string into a byte array.
ESPPreferences * global_preferences