Skip to content

Commit 0fb5e5c

Browse files
arcaome-no-dev
authored andcommitted
Improves in ESP32NVS library (#196)
* Improved ESP32NVS default value support for read* functions Fixed uninitialized NVS flash storage. Added example code. * Add methods for String and remove unnecessary nvs_flash_init() in ESP32NVS class + other minor declaration fixes * ESP32NVS function name renaming * read* -> get* * write* -> set* * erase -> clear / remove
1 parent 5de2429 commit 0fb5e5c

File tree

4 files changed

+147
-59
lines changed

4 files changed

+147
-59
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
ESP32 start counter example with Non-volatile storage
3+
4+
A simple example which use Non-volatile storage on ESP32 to store how many
5+
times ESP32 module was started.
6+
7+
created for arduino-esp32 09 Feb 2017
8+
by Martin Sloup (Arcao)
9+
*/
10+
11+
#include <ESP32NVS.h>
12+
13+
NVSClass keyStorage;
14+
15+
void setup() {
16+
Serial.begin(115200);
17+
Serial.println();
18+
19+
// Open NVS key storage with my-app namespace. Each application module (library, etc.)
20+
// have to use namespace name to prevent key name colisions. We will open storage in
21+
// RW-mode (second parameter has to be false).
22+
// Note: Namespace name is limited to 15 chars
23+
keyStorage.begin("my-app", false);
24+
25+
// Clear an opened key storage
26+
//keyStorage.clear();
27+
28+
// Or remove the counter key from key storage
29+
//keyStorage.remove("counter");
30+
31+
// Get a counter value, if key is not exist return default value 0
32+
// Note: Key name is limited to 15 chars too
33+
unsigned int counter = keyStorage.getUInt("counter", 0);
34+
35+
// Increase counter
36+
counter++;
37+
38+
// Print counter to a Serial
39+
Serial.printf("Current counter value: %u\n", counter);
40+
41+
// Store counter to the key storage
42+
keyStorage.setUInt("counter", counter);
43+
44+
// Close the key storage
45+
keyStorage.end();
46+
47+
Serial.println("Restarting in 10 seconds...");
48+
49+
// Wait 10 seconds
50+
delay(10000);
51+
52+
// Restart ESP
53+
ESP.restart();
54+
}
55+
56+
void loop() {}

libraries/ESP32NVS/library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ author=Hristo Gochkov
44
maintainer=Hristo Gochkov <hristo@espressif.com>
55
sentence=Provides frendly access to ESP32's Non-Volatile Storage
66
paragraph=
7-
category=Storage
7+
category=Data Storage
88
url=
99
architectures=esp32

libraries/ESP32NVS/src/ESP32NVS.cpp

+64-34
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ void NVSClass::end(){
5151
}
5252

5353
/*
54-
* Erase
54+
* Clear the storage
5555
* */
5656

57-
bool NVSClass::erase(){
57+
bool NVSClass::clear(){
5858
if(!_started || _readOnly){
5959
return false;
6060
}
@@ -66,7 +66,11 @@ bool NVSClass::erase(){
6666
return true;
6767
}
6868

69-
bool NVSClass::erase(const char * key){
69+
/*
70+
* Remove the key
71+
* */
72+
73+
bool NVSClass::remove(const char * key){
7074
if(!_started || !key || _readOnly){
7175
return false;
7276
}
@@ -82,7 +86,7 @@ bool NVSClass::erase(const char * key){
8286
* Write
8387
* */
8488

85-
size_t NVSClass::writeChar(const char* key, int8_t value){
89+
size_t NVSClass::setChar(const char* key, int8_t value){
8690
if(!_started || !key || _readOnly){
8791
return 0;
8892
}
@@ -99,7 +103,7 @@ size_t NVSClass::writeChar(const char* key, int8_t value){
99103
return 1;
100104
}
101105

102-
size_t NVSClass::writeUChar(const char* key, uint8_t value){
106+
size_t NVSClass::setUChar(const char* key, uint8_t value){
103107
if(!_started || !key || _readOnly){
104108
return 0;
105109
}
@@ -116,7 +120,7 @@ size_t NVSClass::writeUChar(const char* key, uint8_t value){
116120
return 1;
117121
}
118122

119-
size_t NVSClass::writeShort(const char* key, int16_t value){
123+
size_t NVSClass::setShort(const char* key, int16_t value){
120124
if(!_started || !key || _readOnly){
121125
return 0;
122126
}
@@ -133,7 +137,7 @@ size_t NVSClass::writeShort(const char* key, int16_t value){
133137
return 2;
134138
}
135139

136-
size_t NVSClass::writeUShort(const char* key, uint16_t value){
140+
size_t NVSClass::setUShort(const char* key, uint16_t value){
137141
if(!_started || !key || _readOnly){
138142
return 0;
139143
}
@@ -150,7 +154,7 @@ size_t NVSClass::writeUShort(const char* key, uint16_t value){
150154
return 2;
151155
}
152156

153-
size_t NVSClass::writeInt(const char* key, int32_t value){
157+
size_t NVSClass::setInt(const char* key, int32_t value){
154158
if(!_started || !key || _readOnly){
155159
return 0;
156160
}
@@ -167,7 +171,7 @@ size_t NVSClass::writeInt(const char* key, int32_t value){
167171
return 4;
168172
}
169173

170-
size_t NVSClass::writeUInt(const char* key, uint32_t value){
174+
size_t NVSClass::setUInt(const char* key, uint32_t value){
171175
if(!_started || !key || _readOnly){
172176
return 0;
173177
}
@@ -184,7 +188,7 @@ size_t NVSClass::writeUInt(const char* key, uint32_t value){
184188
return 4;
185189
}
186190

187-
size_t NVSClass::writeLong(const char* key, int64_t value){
191+
size_t NVSClass::setLong(const char* key, int64_t value){
188192
if(!_started || !key || _readOnly){
189193
return 0;
190194
}
@@ -201,7 +205,7 @@ size_t NVSClass::writeLong(const char* key, int64_t value){
201205
return 8;
202206
}
203207

204-
size_t NVSClass::writeULong(const char* key, uint64_t value){
208+
size_t NVSClass::setULong(const char* key, uint64_t value){
205209
if(!_started || !key || _readOnly){
206210
return 0;
207211
}
@@ -218,7 +222,7 @@ size_t NVSClass::writeULong(const char* key, uint64_t value){
218222
return 8;
219223
}
220224

221-
size_t NVSClass::writeString(const char* key, const char* value){
225+
size_t NVSClass::setString(const char* key, const char* value){
222226
if(!_started || !key || !value || _readOnly){
223227
return 0;
224228
}
@@ -235,7 +239,11 @@ size_t NVSClass::writeString(const char* key, const char* value){
235239
return strlen(value);
236240
}
237241

238-
size_t NVSClass::writeBytes(const char* key, const void* value, size_t len){
242+
size_t NVSClass::setString(const char* key, const String value){
243+
return setString(key, value.c_str());
244+
}
245+
246+
size_t NVSClass::setBytes(const char* key, const void* value, size_t len){
239247
if(!_started || !key || !value || !len || _readOnly){
240248
return 0;
241249
}
@@ -256,8 +264,8 @@ size_t NVSClass::writeBytes(const char* key, const void* value, size_t len){
256264
* Read
257265
* */
258266

259-
int8_t NVSClass::readChar(const char* key){
260-
int8_t value = 0;
267+
int8_t NVSClass::getChar(const char* key, const int8_t defaultValue){
268+
int8_t value = defaultValue;
261269
if(!_started || !key){
262270
return value;
263271
}
@@ -268,8 +276,8 @@ int8_t NVSClass::readChar(const char* key){
268276
return value;
269277
}
270278

271-
uint8_t NVSClass::readUChar(const char* key){
272-
uint8_t value = 0;
279+
uint8_t NVSClass::getUChar(const char* key, const uint8_t defaultValue){
280+
uint8_t value = defaultValue;
273281
if(!_started || !key){
274282
return value;
275283
}
@@ -280,8 +288,8 @@ uint8_t NVSClass::readUChar(const char* key){
280288
return value;
281289
}
282290

283-
int16_t NVSClass::readShort(const char* key){
284-
int16_t value = 0;
291+
int16_t NVSClass::getShort(const char* key, const int16_t defaultValue){
292+
int16_t value = defaultValue;
285293
if(!_started || !key){
286294
return value;
287295
}
@@ -292,8 +300,8 @@ int16_t NVSClass::readShort(const char* key){
292300
return value;
293301
}
294302

295-
uint16_t NVSClass::readUShort(const char* key){
296-
uint16_t value = 0;
303+
uint16_t NVSClass::getUShort(const char* key, const uint16_t defaultValue){
304+
uint16_t value = defaultValue;
297305
if(!_started || !key){
298306
return value;
299307
}
@@ -304,8 +312,8 @@ uint16_t NVSClass::readUShort(const char* key){
304312
return value;
305313
}
306314

307-
int32_t NVSClass::readInt(const char* key){
308-
int32_t value = 0;
315+
int32_t NVSClass::getInt(const char* key, const int32_t defaultValue){
316+
int32_t value = defaultValue;
309317
if(!_started || !key){
310318
return value;
311319
}
@@ -316,8 +324,8 @@ int32_t NVSClass::readInt(const char* key){
316324
return value;
317325
}
318326

319-
uint32_t NVSClass::readUInt(const char* key){
320-
uint32_t value = 0;
327+
uint32_t NVSClass::getUInt(const char* key, const uint32_t defaultValue){
328+
uint32_t value = defaultValue;
321329
if(!_started || !key){
322330
return value;
323331
}
@@ -328,8 +336,8 @@ uint32_t NVSClass::readUInt(const char* key){
328336
return value;
329337
}
330338

331-
int64_t NVSClass::readLong(const char* key){
332-
int64_t value = 0;
339+
int64_t NVSClass::getLong(const char* key, const int64_t defaultValue){
340+
int64_t value = defaultValue;
333341
if(!_started || !key){
334342
return value;
335343
}
@@ -340,8 +348,8 @@ int64_t NVSClass::readLong(const char* key){
340348
return value;
341349
}
342350

343-
uint64_t NVSClass::readULong(const char* key){
344-
uint64_t value = 0;
351+
uint64_t NVSClass::getULong(const char* key, const uint64_t defaultValue){
352+
uint64_t value = defaultValue;
345353
if(!_started || !key){
346354
return value;
347355
}
@@ -352,28 +360,50 @@ uint64_t NVSClass::readULong(const char* key){
352360
return value;
353361
}
354362

355-
String NVSClass::readString(const char* key){
363+
size_t NVSClass::getString(const char* key, char* value, const size_t maxLen){
364+
size_t len = 0;
365+
if(!_started || !key || !value || !maxLen){
366+
return 0;
367+
}
368+
esp_err_t err = nvs_get_str(_handle, key, NULL, &len);
369+
if(err){
370+
log_e("nvs_get_str len fail: %s %s", key, nvs_error(err));
371+
return 0;
372+
}
373+
if(len > maxLen){
374+
log_e("not enough space in value: %u < %u", maxLen, len);
375+
return 0;
376+
}
377+
err = nvs_get_str(_handle, key, value, &len);
378+
if(err){
379+
log_e("nvs_get_str fail: %s %s", key, nvs_error(err));
380+
return 0;
381+
}
382+
return len;
383+
}
384+
385+
String NVSClass::getString(const char* key, const String defaultValue){
356386
char * value = NULL;
357387
size_t len = 0;
358388
if(!_started || !key){
359-
return String();
389+
return String(defaultValue);
360390
}
361391
esp_err_t err = nvs_get_str(_handle, key, value, &len);
362392
if(err){
363393
log_e("nvs_get_str len fail: %s %s", key, nvs_error(err));
364-
return String();
394+
return String(defaultValue);
365395
}
366396
char buf[len];
367397
value = buf;
368398
err = nvs_get_str(_handle, key, value, &len);
369399
if(err){
370400
log_e("nvs_get_str fail: %s %s", key, nvs_error(err));
371-
return String();
401+
return String(defaultValue);
372402
}
373403
return String(buf);
374404
}
375405

376-
size_t NVSClass::readBytes(const char* key, void * buf, size_t maxLen){
406+
size_t NVSClass::getBytes(const char* key, void * buf, size_t maxLen){
377407
size_t len = 0;
378408
if(!_started || !key || !buf || !maxLen){
379409
return 0;

libraries/ESP32NVS/src/ESP32NVS.h

+26-24
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,32 @@ class NVSClass {
2828
bool begin(const char * name, bool readOnly=false);
2929
void end();
3030

31-
bool erase();
32-
bool erase(const char * key);
33-
34-
size_t writeChar(const char* key, int8_t value);
35-
size_t writeUChar(const char* key, uint8_t value);
36-
size_t writeShort(const char* key, int16_t value);
37-
size_t writeUShort(const char* key, uint16_t value);
38-
size_t writeInt(const char* key, int32_t value);
39-
size_t writeUInt(const char* key, uint32_t value);
40-
size_t writeLong(const char* key, int64_t value);
41-
size_t writeULong(const char* key, uint64_t value);
42-
size_t writeString(const char* key, const char* value);
43-
size_t writeBytes(const char* key, const void* value, size_t len);
44-
45-
int8_t readChar(const char* key);
46-
uint8_t readUChar(const char* key);
47-
int16_t readShort(const char* key);
48-
uint16_t readUShort(const char* key);
49-
int32_t readInt(const char* key);
50-
uint32_t readUInt(const char* key);
51-
int64_t readLong(const char* key);
52-
uint64_t readULong(const char* key);
53-
String readString(const char* key);
54-
size_t readBytes(const char* key, void * buf, size_t maxLen);
31+
bool clear();
32+
bool remove(const char * key);
33+
34+
size_t setChar(const char* key, int8_t value);
35+
size_t setUChar(const char* key, uint8_t value);
36+
size_t setShort(const char* key, int16_t value);
37+
size_t setUShort(const char* key, uint16_t value);
38+
size_t setInt(const char* key, int32_t value);
39+
size_t setUInt(const char* key, uint32_t value);
40+
size_t setLong(const char* key, int64_t value);
41+
size_t setULong(const char* key, uint64_t value);
42+
size_t setString(const char* key, const char* value);
43+
size_t setString(const char* key, String value);
44+
size_t setBytes(const char* key, const void* value, size_t len);
45+
46+
int8_t getChar(const char* key, int8_t defaultValue = 0);
47+
uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
48+
int16_t getShort(const char* key, int16_t defaultValue = 0);
49+
uint16_t getUShort(const char* key, uint16_t defaultValue = 0);
50+
int32_t getInt(const char* key, int32_t defaultValue = 0);
51+
uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
52+
int64_t getLong(const char* key, int64_t defaultValue = 0);
53+
uint64_t getULong(const char* key, uint64_t defaultValue = 0);
54+
size_t getString(const char* key, char* value, size_t maxLen);
55+
String getString(const char* key, String defaultValue = String());
56+
size_t getBytes(const char* key, void * buf, size_t maxLen);
5557
};
5658

5759
#endif

0 commit comments

Comments
 (0)