Skip to content

Commit da8b7c1

Browse files
lbernstoneme-no-dev
authored andcommitted
overload Preferences.getBytes similar to nvs so you can get size of t… (espressif#2498)
* 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
1 parent 9150803 commit da8b7c1

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
This example shows how to use Preferences (nvs) to store a
3+
structure. Note that the maximum size of a putBytes is 496K
4+
or 97% of the nvs partition size. nvs has signifcant overhead,
5+
so should not be used for data that will change often.
6+
*/
7+
#include <Preferences.h>
8+
Preferences prefs;
9+
10+
typedef struct {
11+
uint8_t hour;
12+
uint8_t minute;
13+
uint8_t setting1;
14+
uint8_t setting2;
15+
} schedule_t;
16+
17+
void setup() {
18+
Serial.begin(115200);
19+
prefs.begin("schedule"); // use "schedule" namespace
20+
uint8_t content[] = {9, 30, 235, 255, 20, 15, 0, 1}; // two entries
21+
prefs.putBytes("schedule", content, sizeof(content));
22+
size_t schLen = prefs.getBytesLength("schedule");
23+
char buffer[schLen]; // prepare a buffer for the data
24+
prefs.getBytes("schedule", buffer, schLen);
25+
if (schLen % sizeof(schedule_t)) { // simple check that data fits
26+
log_e("Data is not correct size!");
27+
return;
28+
}
29+
schedule_t *schedule = (schedule_t *) buffer; // cast the bytes into a struct ptr
30+
Serial.printf("%02d:%02d %d/%d\n",
31+
schedule[1].hour, schedule[1].minute,
32+
schedule[1].setting1, schedule[1].setting2);
33+
schedule[2] = {8, 30, 20, 21}; // add a third entry (unsafely)
34+
// force the struct array into a byte array
35+
prefs.putBytes("schedule", schedule, 3*sizeof(schedule_t));
36+
schLen = prefs.getBytesLength("schedule");
37+
char buffer2[schLen];
38+
prefs.getBytes("schedule", buffer2, schLen);
39+
for (int x=0; x<schLen; x++) Serial.printf("%02X ", buffer[x]);
40+
Serial.println();
41+
}
42+
43+
void loop() {}

Diff for: libraries/Preferences/src/Preferences.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -447,21 +447,29 @@ String Preferences::getString(const char* key, const String defaultValue){
447447
return String(buf);
448448
}
449449

450-
size_t Preferences::getBytes(const char* key, void * buf, size_t maxLen){
450+
size_t Preferences::getBytesLength(const char* key){
451451
size_t len = 0;
452-
if(!_started || !key || !buf || !maxLen){
452+
if(!_started || !key){
453453
return 0;
454454
}
455455
esp_err_t err = nvs_get_blob(_handle, key, NULL, &len);
456456
if(err){
457457
log_e("nvs_get_blob len fail: %s %s", key, nvs_error(err));
458458
return 0;
459459
}
460+
return len;
461+
}
462+
463+
size_t Preferences::getBytes(const char* key, void * buf, size_t maxLen){
464+
size_t len = getBytesLength(key);
465+
if(!len || !buf || !maxLen){
466+
return len;
467+
}
460468
if(len > maxLen){
461469
log_e("not enough space in buffer: %u < %u", maxLen, len);
462470
return 0;
463471
}
464-
err = nvs_get_blob(_handle, key, buf, &len);
472+
esp_err_t err = nvs_get_blob(_handle, key, buf, &len);
465473
if(err){
466474
log_e("nvs_get_blob fail: %s %s", key, nvs_error(err));
467475
return 0;

Diff for: libraries/Preferences/src/Preferences.h

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class Preferences {
6363
bool getBool(const char* key, bool defaultValue = false);
6464
size_t getString(const char* key, char* value, size_t maxLen);
6565
String getString(const char* key, String defaultValue = String());
66+
size_t getBytesLength(const char* key);
6667
size_t getBytes(const char* key, void * buf, size_t maxLen);
6768
size_t freeEntries();
6869
};

0 commit comments

Comments
 (0)