Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit b636bd7

Browse files
committed
Simplified API for NVS support--now u32 and str work through standard
nvs_get/nvs_set.
1 parent 45acafe commit b636bd7

File tree

1 file changed

+38
-20
lines changed

1 file changed

+38
-20
lines changed

esp32/mods/modpycom.c

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "py/mpconfig.h"
1111
#include "py/obj.h"
12+
#include "py/objstr.h"
1213
#include "py/runtime.h"
1314
#include "mperror.h"
1415
#include "updater.h"
@@ -162,21 +163,7 @@ STATIC mp_obj_t mod_pycom_pulses_get (mp_obj_t gpio, mp_obj_t timeout) {
162163
}
163164
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_pulses_get_obj, mod_pycom_pulses_get);
164165

165-
STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key, mp_obj_t _value) {
166-
const char *key = mp_obj_str_get_str(_key);
167-
uint32_t value = mp_obj_get_int_truncated(_value);
168166

169-
esp_err_t esp_err = nvs_set_u32(pycom_nvs_handle, key, value);
170-
if (ESP_OK == esp_err) {
171-
nvs_commit(pycom_nvs_handle);
172-
} else if (ESP_ERR_NVS_NOT_ENOUGH_SPACE == esp_err || ESP_ERR_NVS_PAGE_FULL == esp_err || ESP_ERR_NVS_NO_FREE_PAGES == esp_err) {
173-
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no space available"));
174-
} else if (ESP_ERR_NVS_INVALID_NAME == esp_err || ESP_ERR_NVS_KEY_TOO_LONG == esp_err) {
175-
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid key (or too long)"));
176-
}
177-
return mp_const_none;
178-
}
179-
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_nvs_set_obj, mod_pycom_nvs_set);
180167

181168
/*
182169
* nvs_setstring/nvs_getstring: support for NVS string storage and,
@@ -204,16 +191,27 @@ STATIC mp_obj_t mod_pycom_nvs_setstring (mp_obj_t _key, mp_obj_t _value) {
204191
}
205192
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_nvs_setstring_obj, mod_pycom_nvs_setstring);
206193

207-
STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key) {
194+
195+
STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key, mp_obj_t _value) {
208196
const char *key = mp_obj_str_get_str(_key);
209-
uint32_t value;
197+
if (MP_OBJ_IS_STR_OR_BYTES(_value)) {
198+
// not certain how to differentiate between string and bytes, here... TODO
199+
return mod_pycom_nvs_setstring(_key, _value);
200+
}
201+
uint32_t value = mp_obj_get_int_truncated(_value);
210202

211-
if (ESP_ERR_NVS_NOT_FOUND == nvs_get_u32(pycom_nvs_handle, key, &value)) {
212-
return mp_const_none;
203+
esp_err_t esp_err = nvs_set_u32(pycom_nvs_handle, key, value);
204+
if (ESP_OK == esp_err) {
205+
nvs_commit(pycom_nvs_handle);
206+
} else if (ESP_ERR_NVS_NOT_ENOUGH_SPACE == esp_err || ESP_ERR_NVS_PAGE_FULL == esp_err || ESP_ERR_NVS_NO_FREE_PAGES == esp_err) {
207+
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "no space available"));
208+
} else if (ESP_ERR_NVS_INVALID_NAME == esp_err || ESP_ERR_NVS_KEY_TOO_LONG == esp_err) {
209+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "invalid key (or too long)"));
213210
}
214-
return mp_obj_new_int(value);
211+
return mp_const_none;
215212
}
216-
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_pycom_nvs_get_obj, mod_pycom_nvs_get);
213+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_nvs_set_obj, mod_pycom_nvs_set);
214+
217215

218216

219217
STATIC mp_obj_t mod_pycom_nvs_getstring (mp_obj_t _key) {
@@ -241,6 +239,26 @@ STATIC mp_obj_t mod_pycom_nvs_getstring (mp_obj_t _key) {
241239
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_pycom_nvs_getstring_obj, mod_pycom_nvs_getstring);
242240

243241

242+
STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key) {
243+
const char *key = mp_obj_str_get_str(_key);
244+
uint32_t value;
245+
esp_err_t esp_err = nvs_get_u32(pycom_nvs_handle, key, &value);
246+
if (ESP_OK == esp_err) {
247+
return mp_obj_new_int(value);
248+
}
249+
if (ESP_ERR_NVS_NOT_FOUND == esp_err || ESP_ERR_NVS_TYPE_MISMATCH == esp_err) {
250+
/* you would expect it to return TYPE_MISMATCH if it's been
251+
stored as a string, but it's actually returning NOT_FOUND...
252+
so: try string */
253+
return mod_pycom_nvs_getstring(_key);
254+
}
255+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Error doing nvs_get: %d", esp_err));
256+
return mp_const_none;
257+
}
258+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_pycom_nvs_get_obj, mod_pycom_nvs_get);
259+
260+
261+
244262
STATIC mp_obj_t mod_pycom_nvs_erase (mp_obj_t _key) {
245263
const char *key = mp_obj_str_get_str(_key);
246264

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy