@@ -235,101 +235,75 @@ STATIC mp_obj_t mod_pycom_pulses_get (mp_obj_t gpio, mp_obj_t timeout) {
235
235
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_pulses_get_obj , mod_pycom_pulses_get );
236
236
237
237
238
+ STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key , mp_obj_t _value ) {
238
239
239
- /*
240
- * nvs_setstring/nvs_getstring: support for NVS string storage and,
241
- * thanks to JSON/other serializers, pretty much any datastructure.
242
- */
243
- STATIC mp_obj_t mod_pycom_nvs_setstring (mp_obj_t _key , mp_obj_t _value ) {
244
240
const char * key = mp_obj_str_get_str (_key );
245
- const char * value = mp_obj_str_get_str (_value );
246
- if (strlen (value ) >= 1984 ) {
247
- // orwell error: maximum length (including null character) is 1984 bytes
248
- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "value too long (max: 1984)" ));
249
- return mp_const_none ;
250
- }
251
- esp_err_t esp_err = nvs_set_str (pycom_nvs_handle , key , value );
252
- if (ESP_OK == esp_err ) {
253
- nvs_commit (pycom_nvs_handle );
254
- } 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 ) {
255
- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "no space available" ));
256
- } else if (ESP_ERR_NVS_INVALID_NAME == esp_err || ESP_ERR_NVS_KEY_TOO_LONG == esp_err ) {
257
- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "invalid key (or too long)" ));
258
- } else {
259
- // not ESP_OK, but not reporting? TODO:check this...
260
- }
261
- return mp_const_none ;
262
- }
263
- STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_nvs_setstring_obj , mod_pycom_nvs_setstring );
264
-
241
+ esp_err_t esp_err = ESP_OK ;
265
242
266
- STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key , mp_obj_t _value ) {
267
- const char * key = mp_obj_str_get_str (_key );
268
243
if (MP_OBJ_IS_STR_OR_BYTES (_value )) {
269
- // not certain how to differentiate between string and bytes, here... TODO
270
- return mod_pycom_nvs_setstring (_key , _value );
244
+ const char * value = mp_obj_str_get_str (_value );
245
+ if (strlen (value ) >= 1984 ) {
246
+ // Maximum length (including null character) can be 1984 bytes
247
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "value too long (max: 1984)" ));
248
+ }
249
+ esp_err = nvs_set_str (pycom_nvs_handle , key , value );
250
+ } else if (MP_OBJ_IS_INT (_value )) {
251
+ uint32_t value = mp_obj_get_int_truncated (_value );
252
+ esp_err = nvs_set_u32 (pycom_nvs_handle , key , value );
253
+ } else {
254
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Value must be string, bytes or integer" ));
271
255
}
272
- uint32_t value = mp_obj_get_int_truncated (_value );
273
256
274
- esp_err_t esp_err = nvs_set_u32 (pycom_nvs_handle , key , value );
275
257
if (ESP_OK == esp_err ) {
276
258
nvs_commit (pycom_nvs_handle );
277
259
} 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 ) {
278
- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "no space available" ));
260
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "No free space available" ));
279
261
} else if (ESP_ERR_NVS_INVALID_NAME == esp_err || ESP_ERR_NVS_KEY_TOO_LONG == esp_err ) {
280
- nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "invalid key (or too long)" ));
262
+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Key is invalid" ));
263
+ } else {
264
+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_Exception , "Error occurred while storing value, code: %d" , esp_err ));
281
265
}
282
266
return mp_const_none ;
283
267
}
284
268
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_nvs_set_obj , mod_pycom_nvs_set );
285
269
270
+ STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key ) {
286
271
287
-
288
- STATIC mp_obj_t mod_pycom_nvs_getstring (mp_obj_t _key ) {
289
- vstr_t vstr ;
290
272
const char * key = mp_obj_str_get_str (_key );
291
- size_t required_size = 0 ;
292
- if (ESP_ERR_NVS_NOT_FOUND == nvs_get_str (pycom_nvs_handle , key , NULL , & required_size )) {
293
- return mp_const_none ;
294
- }
295
- vstr_init_len (& vstr , required_size );
296
- if (ESP_OK != nvs_get_str (pycom_nvs_handle , key , vstr .buf , & required_size )) {
297
- vstr_clear (& vstr );
298
- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "can't get string" ));
299
- return mp_const_none ;
300
- }
301
- if (vstr .len && vstr .buf [vstr .len - 1 ] == '\0' ) {
302
- /* bit of a hack to get rid of trailing null terminator required by the
303
- * nvs backend to figure out string length... must be a better way, TODO.
304
- */
305
- vstr .len = vstr .len - 1 ;
306
- }
307
- return mp_obj_new_str_from_vstr (& mp_type_str , & vstr );
273
+ esp_err_t esp_err = ESP_OK ;
274
+ mp_obj_t ret = mp_const_none ;
275
+ uint32_t value ;
308
276
309
- }
310
- STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mod_pycom_nvs_getstring_obj , mod_pycom_nvs_getstring );
277
+ esp_err = nvs_get_u32 (pycom_nvs_handle , key , & value );
278
+ if (esp_err == ESP_OK ) {
279
+ ret = mp_obj_new_int (value );
280
+ }
281
+ else {
282
+ esp_err = nvs_get_str (pycom_nvs_handle , key , NULL , & value );
283
+ if (esp_err == ESP_OK ) {
284
+ char * value_string = (char * )m_malloc (value );
311
285
286
+ esp_err = nvs_get_str (pycom_nvs_handle , key , value_string , & value );
312
287
313
- STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key ) {
314
- const char * key = mp_obj_str_get_str (_key );
315
- uint32_t value ;
316
- esp_err_t esp_err = nvs_get_u32 (pycom_nvs_handle , key , & value );
317
- if (ESP_OK == esp_err ) {
318
- return mp_obj_new_int (value );
288
+ if (esp_err == ESP_OK ) {
289
+ //do not count the terminating \0
290
+ ret = mp_obj_new_str (value_string , value - 1 );
291
+ m_free (value_string );
292
+ }
293
+ m_free (value_string );
294
+ }
319
295
}
320
- if ( ESP_ERR_NVS_NOT_FOUND == esp_err || ESP_ERR_NVS_TYPE_MISMATCH == esp_err ) {
321
- /* you would expect it to return TYPE_MISMATCH if it's been
322
- stored as a string, but it's actually returning NOT_FOUND...
323
- so: try string */
324
- return mod_pycom_nvs_getstring ( _key );
296
+
297
+ if ( esp_err == ESP_ERR_NVS_NOT_FOUND ) {
298
+ nlr_raise ( mp_obj_new_exception_msg ( & mp_type_ValueError , "No matching object for the provided key" ));
299
+ } else if ( esp_err != ESP_OK ) {
300
+ nlr_raise ( mp_obj_new_exception_msg_varg ( & mp_type_Exception , "Error occurred while fetching value, code: %d" , esp_err ) );
325
301
}
326
- nlr_raise ( mp_obj_new_exception_msg_varg ( & mp_type_ValueError , "Error doing nvs_get: %d" , esp_err ));
327
- return mp_const_none ;
302
+
303
+ return ret ;
328
304
}
329
305
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mod_pycom_nvs_get_obj , mod_pycom_nvs_get );
330
306
331
-
332
-
333
307
STATIC mp_obj_t mod_pycom_nvs_erase (mp_obj_t _key ) {
334
308
const char * key = mp_obj_str_get_str (_key );
335
309
@@ -548,9 +522,7 @@ STATIC const mp_map_elem_t pycom_module_globals_table[] = {
548
522
{ MP_OBJ_NEW_QSTR (MP_QSTR_ota_slot ), (mp_obj_t )& mod_pycom_ota_slot_obj },
549
523
{ MP_OBJ_NEW_QSTR (MP_QSTR_pulses_get ), (mp_obj_t )& mod_pycom_pulses_get_obj },
550
524
{ MP_OBJ_NEW_QSTR (MP_QSTR_nvs_set ), (mp_obj_t )& mod_pycom_nvs_set_obj },
551
- { MP_OBJ_NEW_QSTR (MP_QSTR_nvs_setstring ), (mp_obj_t )& mod_pycom_nvs_setstring_obj },
552
525
{ MP_OBJ_NEW_QSTR (MP_QSTR_nvs_get ), (mp_obj_t )& mod_pycom_nvs_get_obj },
553
- { MP_OBJ_NEW_QSTR (MP_QSTR_nvs_getstring ), (mp_obj_t )& mod_pycom_nvs_getstring_obj },
554
526
{ MP_OBJ_NEW_QSTR (MP_QSTR_nvs_erase ), (mp_obj_t )& mod_pycom_nvs_erase_obj },
555
527
{ MP_OBJ_NEW_QSTR (MP_QSTR_nvs_erase_all ), (mp_obj_t )& mod_pycom_nvs_erase_all_obj },
556
528
{ MP_OBJ_NEW_QSTR (MP_QSTR_wifi_on_boot ), (mp_obj_t )& mod_pycom_wifi_on_boot_obj },
0 commit comments