@@ -162,30 +162,73 @@ STATIC mp_obj_t mod_pycom_pulses_get (mp_obj_t gpio, mp_obj_t timeout) {
162162}
163163STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_pulses_get_obj , mod_pycom_pulses_get );
164164
165+
165166STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key , mp_obj_t _value ) {
167+
166168 const char * key = mp_obj_str_get_str (_key );
167- uint32_t value = mp_obj_get_int_truncated (_value );
169+ esp_err_t esp_err = ESP_OK ;
170+
171+ if (MP_OBJ_IS_STR_OR_BYTES (_value )) {
172+ const char * value = mp_obj_str_get_str (_value );
173+ if (strlen (value ) >= 1984 ) {
174+ // Maximum length (including null character) can be 1984 bytes
175+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "value too long (max: 1984)" ));
176+ }
177+ esp_err = nvs_set_str (pycom_nvs_handle , key , value );
178+ } else if (MP_OBJ_IS_INT (_value )) {
179+ uint32_t value = mp_obj_get_int_truncated (_value );
180+ esp_err = nvs_set_u32 (pycom_nvs_handle , key , value );
181+ } else {
182+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Value must be string, bytes or integer" ));
183+ }
168184
169- esp_err_t esp_err = nvs_set_u32 (pycom_nvs_handle , key , value );
170185 if (ESP_OK == esp_err ) {
171186 nvs_commit (pycom_nvs_handle );
172187 } 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" ));
188+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "No free space available" ));
174189 } 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)" ));
190+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "Key is invalid" ));
191+ } else {
192+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_Exception , "Error occurred while storing value, code: %d" , esp_err ));
176193 }
177194 return mp_const_none ;
178195}
179196STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_nvs_set_obj , mod_pycom_nvs_set );
180197
181198STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key ) {
199+
182200 const char * key = mp_obj_str_get_str (_key );
201+ esp_err_t esp_err = ESP_OK ;
202+ mp_obj_t ret = mp_const_none ;
183203 uint32_t value ;
184204
185- if (ESP_ERR_NVS_NOT_FOUND == nvs_get_u32 (pycom_nvs_handle , key , & value )) {
186- return mp_const_none ;
205+ esp_err = nvs_get_u32 (pycom_nvs_handle , key , & value );
206+ if (esp_err == ESP_OK ) {
207+ ret = mp_obj_new_int (value );
208+ }
209+ else {
210+ esp_err = nvs_get_str (pycom_nvs_handle , key , NULL , & value );
211+ if (esp_err == ESP_OK ) {
212+ char * value_string = (char * )m_malloc (value );
213+
214+ esp_err = nvs_get_str (pycom_nvs_handle , key , value_string , & value );
215+
216+ if (esp_err == ESP_OK ) {
217+ //do not count the terminating \0
218+ ret = mp_obj_new_str (value_string , value - 1 );
219+ m_free (value_string );
220+ }
221+ m_free (value_string );
222+ }
223+ }
224+
225+ if (esp_err == ESP_ERR_NVS_NOT_FOUND ) {
226+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError , "No matching object for the provided key" ));
227+ } else if (esp_err != ESP_OK ) {
228+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_Exception , "Error occurred while fetching value, code: %d" , esp_err ));
187229 }
188- return mp_obj_new_int (value );
230+
231+ return ret ;
189232}
190233STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mod_pycom_nvs_get_obj , mod_pycom_nvs_get );
191234
0 commit comments