diff --git a/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino b/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino new file mode 100644 index 00000000000..7ed2a73bcbe --- /dev/null +++ b/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino @@ -0,0 +1,43 @@ +/* +This example shows how to use Preferences (nvs) to store a +structure. Note that the maximum size of a putBytes is 496K +or 97% of the nvs partition size. nvs has signifcant overhead, +so should not be used for data that will change often. +*/ +#include +Preferences prefs; + +typedef struct { + uint8_t hour; + uint8_t minute; + uint8_t setting1; + uint8_t setting2; +} schedule_t; + +void setup() { + Serial.begin(115200); + prefs.begin("schedule"); // use "schedule" namespace + uint8_t content[] = {9, 30, 235, 255, 20, 15, 0, 1}; // two entries + prefs.putBytes("schedule", content, sizeof(content)); + size_t schLen = prefs.getBytesLength("schedule"); + char buffer[schLen]; // prepare a buffer for the data + prefs.getBytes("schedule", buffer, schLen); + if (schLen % sizeof(schedule_t)) { // simple check that data fits + log_e("Data is not correct size!"); + return; + } + schedule_t *schedule = (schedule_t *) buffer; // cast the bytes into a struct ptr + Serial.printf("%02d:%02d %d/%d\n", + schedule[1].hour, schedule[1].minute, + schedule[1].setting1, schedule[1].setting2); + schedule[2] = {8, 30, 20, 21}; // add a third entry (unsafely) +// force the struct array into a byte array + prefs.putBytes("schedule", schedule, 3*sizeof(schedule_t)); + schLen = prefs.getBytesLength("schedule"); + char buffer2[schLen]; + prefs.getBytes("schedule", buffer2, schLen); + for (int x=0; x maxLen){ log_e("not enough space in buffer: %u < %u", maxLen, len); return 0; } - err = nvs_get_blob(_handle, key, buf, &len); + esp_err_t err = nvs_get_blob(_handle, key, buf, &len); if(err){ log_e("nvs_get_blob fail: %s %s", key, nvs_error(err)); return 0; diff --git a/libraries/Preferences/src/Preferences.h b/libraries/Preferences/src/Preferences.h index e4872693209..0ad94afbbad 100644 --- a/libraries/Preferences/src/Preferences.h +++ b/libraries/Preferences/src/Preferences.h @@ -63,6 +63,7 @@ class Preferences { bool getBool(const char* key, bool defaultValue = false); size_t getString(const char* key, char* value, size_t maxLen); String getString(const char* key, String defaultValue = String()); + size_t getBytesLength(const char* key); size_t getBytes(const char* key, void * buf, size_t maxLen); size_t freeEntries(); };