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

Commit cf9be59

Browse files
committed
PYFW-334: Optimizing code, removing not needed mod_pycom_nvs_setstring and mod_pycom_nvs_getstring functions
1 parent c0a343c commit cf9be59

File tree

1 file changed

+44
-72
lines changed

1 file changed

+44
-72
lines changed

esp32/mods/modpycom.c

Lines changed: 44 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -235,101 +235,75 @@ STATIC mp_obj_t mod_pycom_pulses_get (mp_obj_t gpio, mp_obj_t timeout) {
235235
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_pulses_get_obj, mod_pycom_pulses_get);
236236

237237

238+
STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key, mp_obj_t _value) {
238239

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) {
244240
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;
265242

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);
268243
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"));
271255
}
272-
uint32_t value = mp_obj_get_int_truncated(_value);
273256

274-
esp_err_t esp_err = nvs_set_u32(pycom_nvs_handle, key, value);
275257
if (ESP_OK == esp_err) {
276258
nvs_commit(pycom_nvs_handle);
277259
} 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"));
279261
} 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));
281265
}
282266
return mp_const_none;
283267
}
284268
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_pycom_nvs_set_obj, mod_pycom_nvs_set);
285269

270+
STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key) {
286271

287-
288-
STATIC mp_obj_t mod_pycom_nvs_getstring (mp_obj_t _key) {
289-
vstr_t vstr;
290272
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;
308276

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);
311285

286+
esp_err = nvs_get_str(pycom_nvs_handle, key, value_string, &value);
312287

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+
}
319295
}
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));
325301
}
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;
328304
}
329305
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_pycom_nvs_get_obj, mod_pycom_nvs_get);
330306

331-
332-
333307
STATIC mp_obj_t mod_pycom_nvs_erase (mp_obj_t _key) {
334308
const char *key = mp_obj_str_get_str(_key);
335309

@@ -548,9 +522,7 @@ STATIC const mp_map_elem_t pycom_module_globals_table[] = {
548522
{ MP_OBJ_NEW_QSTR(MP_QSTR_ota_slot), (mp_obj_t)&mod_pycom_ota_slot_obj },
549523
{ MP_OBJ_NEW_QSTR(MP_QSTR_pulses_get), (mp_obj_t)&mod_pycom_pulses_get_obj },
550524
{ 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 },
552525
{ 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 },
554526
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvs_erase), (mp_obj_t)&mod_pycom_nvs_erase_obj },
555527
{ MP_OBJ_NEW_QSTR(MP_QSTR_nvs_erase_all), (mp_obj_t)&mod_pycom_nvs_erase_all_obj },
556528
{ MP_OBJ_NEW_QSTR(MP_QSTR_wifi_on_boot), (mp_obj_t)&mod_pycom_wifi_on_boot_obj },

0 commit comments

Comments
 (0)