From da8b7c1b80f1375be564674565c609aaa054e41c Mon Sep 17 00:00:00 2001 From: lbernstone Date: Tue, 9 Apr 2019 18:45:38 -0600 Subject: [PATCH] =?UTF-8?q?overload=20Preferences.getBytes=20similar=20to?= =?UTF-8?q?=20nvs=20so=20you=20can=20get=20size=20of=20t=E2=80=A6=20(#2498?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * overload Preferences.getBytes similar to nvs so you can get size of the array. * Cleaner implentation, with a separate function to get length. Added an example --- .../examples/Prefs2Struct/Prefs2Struct.ino | 43 +++++++++++++++++++ libraries/Preferences/src/Preferences.cpp | 14 ++++-- libraries/Preferences/src/Preferences.h | 1 + 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino diff --git a/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino b/libraries/Preferences/examples/Prefs2Struct/Prefs2Struct.ino new file mode 100644 index 00000000..7ed2a73b --- /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 e4872693..0ad94afb 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(); };