@@ -162,30 +162,73 @@ STATIC mp_obj_t mod_pycom_pulses_get (mp_obj_t gpio, mp_obj_t timeout) {
162
162
}
163
163
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_pulses_get_obj , mod_pycom_pulses_get );
164
164
165
+
165
166
STATIC mp_obj_t mod_pycom_nvs_set (mp_obj_t _key , mp_obj_t _value ) {
167
+
166
168
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
+ }
168
184
169
- esp_err_t esp_err = nvs_set_u32 (pycom_nvs_handle , key , value );
170
185
if (ESP_OK == esp_err ) {
171
186
nvs_commit (pycom_nvs_handle );
172
187
} 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<
10000
/span>(& mp_type_OSError , "No free space available" ));
174
189
} 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 ));
176
193
}
177
194
return mp_const_none ;
178
195
}
179
196
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (mod_pycom_nvs_set_obj , mod_pycom_nvs_set );
180
197
181
198
STATIC mp_obj_t mod_pycom_nvs_get (mp_obj_t _key ) {
199
+
182
200
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 ;
183
203
uint32_t value ;
184
204
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 ));
187
229
}
188
- return mp_obj_new_int (value );
230
+
231
+ return ret ;
189
232
}
190
233
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mod_pycom_nvs_get_obj , mod_pycom_nvs_get );
191
234
0 commit comments