@@ -218,6 +218,130 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(esp32_partition_mark_app_valid_cancel_rollback_
218
218
STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_partition_mark_app_valid_cancel_rollback_obj ,
219
219
MP_ROM_PTR (& esp32_partition_mark_app_valid_cancel_rollback_fun_obj ));
220
220
221
+ STATIC mp_obj_t esp32_partition_mark_app_invalid_rollback_and_reboot (mp_obj_t cls_in ) {
222
+ check_esp_err (esp_ota_mark_app_invalid_rollback_and_reboot ());
223
+ return mp_const_none ;
224
+ }
225
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_partition_mark_app_invalid_rollback_and_reboot_fun_obj ,
226
+ esp32_partition_mark_app_invalid_rollback_and_reboot );
227
+ STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_mark_app_invalid_rollback_and_reboot_obj ,
228
+ MP_ROM_PTR (& esp32_partition_mark_app_invalid_rollback_and_reboot_fun_obj ));
229
+
230
+ STATIC mp_obj_t esp32_check_rollback_is_possible (mp_obj_t cls_in ) {
231
+ return mp_obj_new_bool (esp_ota_check_rollback_is_possible ());
232
+ }
233
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_check_rollback_is_possible_fun_obj , esp32_check_rollback_is_possible );
234
+ STATIC MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_check_rollback_is_possible_obj , MP_ROM_PTR (& esp32_check_rollback_is_possible_fun_obj ));
235
+
236
+ STATIC mp_obj_t esp32_app_description (mp_obj_t self_in ) {
237
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (self_in );
238
+ esp_app_desc_t app ;
239
+
240
+ check_esp_err (esp_ota_get_partition_description (self -> part , & app ));
241
+
242
+ mp_obj_t tuple [] = {
243
+ mp_obj_new_int_from_uint (app .secure_version ),
244
+ mp_obj_new_str (app .version , strlen (app .version )),
245
+ mp_obj_new_str (app .project_name , strlen (app .project_name )),
246
+ mp_obj_new_str (app .time , strlen (app .time )),
247
+ mp_obj_new_str (app .date , strlen (app .date )),
248
+ mp_obj_new_str (app .idf_ver , strlen (app .idf_ver )),
249
+ mp_obj_new_bytes (app .app_elf_sha256 , 32 )
250
+ };
251
+ return mp_obj_new_tuple (7 , tuple );
252
+ }
253
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_app_description_obj , esp32_app_description );
254
+
255
+ STATIC mp_obj_t esp32_app_get_state (mp_obj_t self_in ) {
256
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (self_in );
257
+ char * ret = NULL ;
258
+ esp_ota_img_states_t state ;
259
+
260
+ check_esp_err (esp_ota_get_state_partition (self -> part , & state ));
261
+
262
+ switch (state ) {
263
+ // Monitor the first boot. In bootloader this state is changed to ESP_OTA_IMG_PENDING_VERIFY.
264
+ case ESP_OTA_IMG_NEW :
265
+ ret = "new" ;
266
+ break ;
267
+ // First boot for this app. If this state persists during second boot, then it will be changed to ABORTED.
268
+ case ESP_OTA_IMG_PENDING_VERIFY :
269
+ ret = "verify" ;
270
+ break ;
271
+ // App was confirmed as workable. App can boot and work without limits.
272
+ case ESP_OTA_IMG_VALID :
273
+ ret = "valid" ;
274
+ break ;
275
+ // App was confirmed as non-workable. This app will not be selected to boot at all.
276
+ case ESP_OTA_IMG_INVALID :
277
+ ret = "invalid" ;
278
+ break ;
279
+ // App could not confirmed as workable or non-workable. In bootloader IMG_PENDING_VERIFY state will be changed to IMG_ABORTED. This app will not be selected to boot at all.
280
+ case ESP_OTA_IMG_ABORTED :
281
+ ret = "aborted" ;
282
+ break ;
283
+ // App can boot and work without limits.
284
+ default :
285
+ ret = "undefined" ;
286
+ }
287
+ return mp_obj_new_str (ret , strlen (ret ));
288
+ }
289
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (esp32_app_get_state_obj , esp32_app_get_state );
290
+
291
+ STATIC mp_obj_t esp32_ota_begin (size_t n_args , const mp_obj_t * args ) {
292
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
293
+ esp_ota_handle_t handle ;
294
+ size_t image_size = 0 ;
295
+
296
+ if (n_args == 2 ) {
297
+ image_size = mp_obj_get_int (args [1 ]);
298
+ }
299
+ check_esp_err (esp_ota_begin (self -> part , image_size , & handle ));
300
+ return mp_obj_new_int_from_uint (handle );
301
+ }
302
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_ota_begin_obj , 1 , 2 , esp32_ota_begin );
303
+
304
+ STATIC mp_obj_t esp32_ota_write (mp_obj_t self_in , const mp_obj_t handle_in , const mp_obj_t data_in ) {
305
+ const esp_ota_handle_t handle = mp_obj_get_int (handle_in );
306
+ mp_buffer_info_t bufinfo ;
307
+ mp_get_buffer_raise (data_in , & bufinfo , MP_BUFFER_READ );
308
+
309
+ check_esp_err (esp_ota_write (handle , bufinfo .buf , bufinfo .len ));
310
+ return mp_const_none ;
311
+ }
312
+ STATIC MP_DEFINE_CONST_FUN_OBJ_3 (esp32_ota_write_obj , esp32_ota_write );
313
+
314
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 2 , 0 )
315
+ STATIC mp_obj_t esp32_ota_write_with_offset (size_t n_args , const mp_obj_t * args ) {
316
+ esp_ota_handle_t handle = mp_obj_get_int (args [1 ]);
317
+ mp_buffer_info_t bufinfo ;
318
+ mp_get_buffer_raise (args [2 ], & bufinfo , MP_BUFFER_READ );
319
+ const uint32_t offset = mp_obj_get_int (args [3 ]);
320
+
321
+ check_esp_err (esp_ota_write_with_offset (handle , bufinfo .buf , bufinfo .len , offset ));
322
+ return mp_const_none ;
323
+ }
324
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_ota_write_with_offset_obj , 4 , 4 , esp32_ota_write_with_offset );
325
+ #endif
326
+
327
+ STATIC mp_obj_t esp32_ota_end (mp_obj_t self_in , const mp_obj_t handle_in ) {
328
+ const esp_ota_handle_t handle = mp_obj_get_int (handle_in );
329
+
330
+ check_esp_err (esp_ota_end (handle ));
331
+ return mp_const_none ;
332
+ }
333
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (esp32_ota_end_obj , esp32_ota_end );
334
+
335
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 3 , 0 )
336
+ STATIC mp_obj_t esp32_ota_abort (mp_obj_t self_in , const mp_obj_t handle_in ) {
337
+ esp_ota_handle_t handle = mp_obj_get_int (handle_in );
338
+
339
+ check_esp_err (esp_ota_abort (handle ));
340
+ return mp_const_none ;
341
+ }
342
+ STATIC MP_DEFINE_CONST_FUN_OBJ_2 (esp32_ota_abort_obj , esp32_ota_abort );
343
+ #endif
344
+
221
345
STATIC const mp_rom_map_elem_t esp32_partition_locals_dict_table [] = {
222
346
{ MP_ROM_QSTR (MP_QSTR_find ), MP_ROM_PTR (& esp32_partition_find_obj ) },
223
347
@@ -228,8 +352,22 @@ STATIC const mp_rom_map_elem_t esp32_partition_locals_dict_table[] = {
228
352
229
353
{ MP_ROM_QSTR (MP_QSTR_set_boot ), MP_ROM_PTR (& esp32_partition_set_boot_obj ) },
230
354
{ MP_ROM_QSTR (MP_QSTR_mark_app_valid_cancel_rollback ), MP_ROM_PTR (& esp32_partition_mark_app_valid_cancel_rollback_obj ) },
355
+ { MP_ROM_QSTR (MP_QSTR_mark_app_invalid_rollback_and_reboot ), MP_ROM_PTR (& esp32_mark_app_invalid_rollback_and_reboot_obj ) },
356
+ { MP_ROM_QSTR (MP_QSTR_check_rollback_is_possible ), MP_ROM_PTR (& esp32_check_rollback_is_possible_obj ) },
231
357
{ MP_ROM_QSTR (MP_QSTR_get_next_update ), MP_ROM_PTR (& esp32_partition_get_next_update_obj ) },
232
358
359
+ { MP_ROM_QSTR (MP_QSTR_app_description ), MP_ROM_PTR (& esp32_app_description_obj ) },
360
+ { MP_ROM_QSTR (MP_QSTR_app_state ), MP_ROM_PTR (& esp32_app_get_state_obj ) },
361
+ { MP_ROM_QSTR (MP_QSTR_ota_begin ), MP_ROM_PTR (& esp32_ota_begin_obj ) },
362
+ { MP_ROM_QSTR (MP_QSTR_ota_write ), MP_ROM_PTR (& esp32_ota_write_obj ) },
363
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 2 , 0 )
364
+ { MP_ROM_QSTR (MP_QSTR_ota_write_with_offset ), MP_ROM_PTR (& esp32_ota_write_with_offset_obj ) },
365
+ #endif
366
+ { MP_ROM_QSTR (MP_QSTR_ota_end ), MP_ROM_PTR (& esp32_ota_end_obj ) },
367
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 3 , 0 )
368
+ { MP_ROM_QSTR (MP_QSTR_ota_abort ), MP_ROM_PTR (& esp32_ota_abort_obj ) },
369
+ #endif
370
+
233
371
{ MP_ROM_QSTR (MP_QSTR_BOOT ), MP_ROM_INT (ESP32_PARTITION_BOOT ) },
234
372
{ MP_ROM_QSTR (MP_QSTR_RUNNING ), MP_ROM_INT (ESP32_PARTITION_RUNNING ) },
235
373
{ MP_ROM_QSTR (MP_QSTR_TYPE_APP ), MP_ROM_INT (ESP_PARTITION_TYPE_APP ) },
0 commit comments