@@ -297,6 +297,130 @@ static MP_DEFINE_CONST_FUN_OBJ_1(esp32_partition_mark_app_valid_cancel_rollback_
297
297
static MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_partition_mark_app_valid_cancel_rollback_obj ,
298
298
MP_ROM_PTR (& esp32_partition_mark_app_valid_cancel_rollback_fun_obj )) ;
299
299
300
+ static mp_obj_t esp32_partition_mark_app_invalid_rollback_and_reboot (mp_obj_t cls_in ) {
301
+ check_esp_err (esp_ota_mark_app_invalid_rollback_and_reboot ());
302
+ return mp_const_none ;
303
+ }
304
+ static MP_DEFINE_CONST_FUN_OBJ_1 (esp32_partition_mark_app_invalid_rollback_and_reboot_fun_obj ,
305
+ esp32_partition_mark_app_invalid_rollback_and_reboot ) ;
306
+ static MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_mark_app_invalid_rollback_and_reboot_obj ,
307
+ MP_ROM_PTR (& esp32_partition_mark_app_invalid_rollback_and_reboot_fun_obj )) ;
308
+
309
+ static mp_obj_t esp32_check_rollback_is_possible (mp_obj_t cls_in ) {
310
+ return mp_obj_new_bool (esp_ota_check_rollback_is_possible ());
311
+ }
312
+ static MP_DEFINE_CONST_FUN_OBJ_1 (esp32_check_rollback_is_possible_fun_obj , esp32_check_rollback_is_possible ) ;
313
+ static MP_DEFINE_CONST_CLASSMETHOD_OBJ (esp32_check_rollback_is_possible_obj , MP_ROM_PTR (& esp32_check_rollback_is_possible_fun_obj )) ;
314
+
315
+ static mp_obj_t esp32_app_description (mp_obj_t self_in ) {
316
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (self_in );
317
+ esp_app_desc_t app ;
318
+
319
+ check_esp_err (esp_ota_get_partition_description (self -> part , & app ));
320
+
321
+ mp_obj_t tuple [] = {
322
+ mp_obj_new_int_from_uint (app .secure_version ),
323
+ mp_obj_new_str (app .version , strlen (app .version )),
324
+ mp_obj_new_str (app .project_name , strlen (app .project_name )),
325
+ mp_obj_new_str (app .time , strlen (app .time )),
326
+ mp_obj_new_str (app .date , strlen (app .date )),
327
+ mp_obj_new_str (app .idf_ver , strlen (app .idf_ver )),
328
+ mp_obj_new_bytes (app .app_elf_sha256 , 32 )
329
+ };
330
+ return mp_obj_new_tuple (7 , tuple );
331
+ }
332
+ static MP_DEFINE_CONST_FUN_OBJ_1 (esp32_app_description_obj , esp32_app_description ) ;
333
+
334
+ static mp_obj_t esp32_app_get_state (mp_obj_t self_in ) {
335
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (self_in );
336
+ char * ret = NULL ;
337
+ esp_ota_img_states_t state ;
338
+
339
+ check_esp_err (esp_ota_get_state_partition (self -> part , & state ));
340
+
341
+ switch (state ) {
342
+ // Monitor the first boot. In bootloader this state is changed to ESP_OTA_IMG_PENDING_VERIFY.
343
+ case ESP_OTA_IMG_NEW :
344
+ ret = "new" ;
345
+ break ;
346
+ // First boot for this app. If this state persists during second boot, then it will be changed to ABORTED.
347
+ case ESP_OTA_IMG_PENDING_VERIFY :
348
+ ret = "verify" ;
349
+ break ;
350
+ // App was confirmed as workable. App can boot and work without limits.
351
+ case ESP_OTA_IMG_VALID :
352
+ ret = "valid" ;
353
+ break ;
354
+ // App was confirmed as non-workable. This app will not be selected to boot at all.
355
+ case ESP_OTA_IMG_INVALID :
356
+ ret = "invalid" ;
357
+ break ;
358
+ // 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.
359
+ case ESP_OTA_IMG_ABORTED :
360
+ ret = "aborted" ;
361
+ break ;
362
+ // App can boot and work without limits.
363
+ default :
364
+ ret = "undefined" ;
365
+ }
366
+ return mp_obj_new_str (ret , strlen (ret ));
367
+ }
368
+ static MP_DEFINE_CONST_FUN_OBJ_1 (esp32_app_get_state_obj , esp32_app_get_state ) ;
369
+
370
+ static mp_obj_t esp32_ota_begin (size_t n_args , const mp_obj_t * args ) {
371
+ esp32_partition_obj_t * self = MP_OBJ_TO_PTR (args [0 ]);
372
+ esp_ota_handle_t handle ;
373
+ size_t image_size = 0 ;
374
+
375
+ if (n_args == 2 ) {
376
+ image_size = mp_obj_get_int (args [1 ]);
377
+ }
378
+ check_esp_err (esp_ota_begin (self -> part , image_size , & handle ));
379
+ return mp_obj_new_int_from_uint (handle );
380
+ }
381
+ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_ota_begin_obj , 1 , 2 , esp32_ota_begin ) ;
382
+
383
+ static mp_obj_t esp32_ota_write (mp_obj_t self_in , const mp_obj_t handle_in , const mp_obj_t data_in ) {
384
+ const esp_ota_handle_t handle = mp_obj_get_int (handle_in );
385
+ mp_buffer_info_t bufinfo ;
386
+ mp_get_buffer_raise (data_in , & bufinfo , MP_BUFFER_READ );
387
+
388
+ check_esp_err (esp_ota_write (handle , bufinfo .buf , bufinfo .len ));
389
+ return mp_const_none ;
390
+ }
391
+ static MP_DEFINE_CONST_FUN_OBJ_3 (esp32_ota_write_obj , esp32_ota_write ) ;
392
+
393
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 2 , 0 )
394
+ static mp_obj_t esp32_ota_write_with_offset (size_t n_args , const mp_obj_t * args ) {
395
+ esp_ota_handle_t handle = mp_obj_get_int (args [1 ]);
396
+ mp_buffer_info_t bufinfo ;
397
+ mp_get_buffer_raise (args [2 ], & bufinfo , MP_BUFFER_READ );
398
+ const uint32_t offset = mp_obj_get_int (args [3 ]);
399
+
400
+ check_esp_err (esp_ota_write_with_offset (handle , bufinfo .buf , bufinfo .len , offset ));
401
+ return mp_const_none ;
402
+ }
403
+ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (esp32_ota_write_with_offset_obj , 4 , 4 , esp32_ota_write_with_offset ) ;
404
+ #endif
405
+
406
+ static mp_obj_t esp32_ota_end (mp_obj_t self_in , const mp_obj_t handle_in ) {
407
+ const esp_ota_handle_t handle = mp_obj_get_int (handle_in );
408
+
409
+ check_esp_err (esp_ota_end (handle ));
410
+ return mp_const_none ;
411
+ }
412
+ static MP_DEFINE_CONST_FUN_OBJ_2 (esp32_ota_end_obj , esp32_ota_end ) ;
413
+
414
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 3 , 0 )
415
+ static mp_obj_t esp32_ota_abort (mp_obj_t self_in , const mp_obj_t handle_in ) {
416
+ esp_ota_handle_t handle = mp_obj_get_int (handle_in );
417
+
418
+ check_esp_err (esp_ota_abort (handle ));
419
+ return mp_const_none ;
420
+ }
421
+ static MP_DEFINE_CONST_FUN_OBJ_2 (esp32_ota_abort_obj , esp32_ota_abort ) ;
422
+ #endif
423
+
300
424
static const mp_rom_map_elem_t esp32_partition_locals_dict_table [] = {
301
425
{ MP_ROM_QSTR (MP_QSTR_find ), MP_ROM_PTR (& esp32_partition_find_obj ) },
302
426
@@ -307,8 +431,22 @@ static const mp_rom_map_elem_t esp32_partition_locals_dict_table[] = {
307
431
308
432
{ MP_ROM_QSTR (MP_QSTR_set_boot ), MP_ROM_PTR (& esp32_partition_set_boot_obj ) },
309
433
{ MP_ROM_QSTR (MP_QSTR_mark_app_valid_cancel_rollback ), MP_ROM_PTR (& esp32_partition_mark_app_valid_cancel_rollback_obj ) },
434
+ { MP_ROM_QSTR (MP_QSTR_mark_app_invalid_rollback_and_reboot ), MP_ROM_PTR (& esp32_mark_app_invalid_rollback_and_reboot_obj ) },
435
+ { MP_ROM_QSTR (MP_QSTR_check_rollback_is_possible ), MP_ROM_PTR (& esp32_check_rollback_is_possible_obj ) },
310
436
{ MP_ROM_QSTR (MP_QSTR_get_next_update ), MP_ROM_PTR (& esp32_partition_get_next_update_obj ) },
311
437
438
+ { MP_ROM_QSTR (MP_QSTR_app_description ), MP_ROM_PTR (& esp32_app_description_obj ) },
439
+ { MP_ROM_QSTR (MP_QSTR_app_state ), MP_ROM_PTR (& esp32_app_get_state_obj ) },
440
+ { MP_ROM_QSTR (MP_QSTR_ota_begin ), MP_ROM_PTR (& esp32_ota_begin_obj ) },
441
+ { MP_ROM_QSTR (MP_QSTR_ota_write ), MP_ROM_PTR (& esp32_ota_write_obj ) },
442
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 2 , 0 )
443
+ { MP_ROM_QSTR (MP_QSTR_ota_write_with_offset ), MP_ROM_PTR (& esp32_ota_write_with_offset_obj ) },
444
+ #endif
445
+ { MP_ROM_QSTR (MP_QSTR_ota_end ), MP_ROM_PTR (& esp32_ota_end_obj ) },
446
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 3 , 0 )
447
+ { MP_ROM_QSTR (MP_QSTR_ota_abort ), MP_ROM_PTR (& esp32_ota_abort_obj ) },
448
+ #endif
449
+
312
450
{ MP_ROM_QSTR (MP_QSTR_BOOT ), MP_ROM_INT (ESP32_PARTITION_BOOT ) },
313
451
{ MP_ROM_QSTR (MP_QSTR_RUNNING ), MP_ROM_INT (ESP32_PARTITION_RUNNING ) },
314
452
{ MP_ROM_QSTR (MP_QSTR_TYPE_APP ), MP_ROM_INT (ESP_PARTITION_TYPE_APP ) },
0 commit comments