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