mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/esp_ota_cancel' into 'master'
Feature/esp ota abort Closes IDFGH-3353 and IDFGH-3355 See merge request espressif/esp-idf!10563
This commit is contained in:
commit
aa58297458
@ -302,16 +302,33 @@ esp_err_t esp_ota_write_with_offset(esp_ota_handle_t handle, const void *data, s
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
esp_err_t esp_ota_end(esp_ota_handle_t handle)
|
||||
static ota_ops_entry_t *get_ota_ops_entry(esp_ota_handle_t handle)
|
||||
{
|
||||
ota_ops_entry_t *it;
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
ota_ops_entry_t *it = NULL;
|
||||
for (it = LIST_FIRST(&s_ota_ops_entries_head); it != NULL; it = LIST_NEXT(it, entries)) {
|
||||
if (it->handle == handle) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return it;
|
||||
}
|
||||
|
||||
esp_err_t esp_ota_abort(esp_ota_handle_t handle)
|
||||
{
|
||||
ota_ops_entry_t *it = get_ota_ops_entry(handle);
|
||||
|
||||
if (it == NULL) {
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
}
|
||||
LIST_REMOVE(it, entries);
|
||||
free(it);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t esp_ota_end(esp_ota_handle_t handle)
|
||||
{
|
||||
ota_ops_entry_t *it = get_ota_ops_entry(handle);
|
||||
esp_err_t ret = ESP_OK;
|
||||
|
||||
if (it == NULL) {
|
||||
return ESP_ERR_NOT_FOUND;
|
||||
|
@ -157,6 +157,18 @@ esp_err_t esp_ota_write_with_offset(esp_ota_handle_t handle, const void *data, s
|
||||
*/
|
||||
esp_err_t esp_ota_end(esp_ota_handle_t handle);
|
||||
|
||||
/**
|
||||
* @brief Abort OTA update, free the handle and memory associated with it.
|
||||
*
|
||||
* @param handle obtained from esp_ota_begin().
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Handle and its associated memory is freed successfully.
|
||||
* - ESP_ERR_NOT_FOUND: OTA handle was not found.
|
||||
*/
|
||||
esp_err_t esp_ota_abort(esp_ota_handle_t handle);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Configure OTA data for a new boot partition
|
||||
*
|
||||
|
@ -135,6 +135,7 @@ bool esp_https_ota_is_complete_data_received(esp_https_ota_handle_t https_ota_ha
|
||||
*
|
||||
* @note If this API returns successfully, esp_restart() must be called to
|
||||
* boot from the new firmware image
|
||||
* esp_https_ota_finish should not be called after calling esp_https_ota_abort
|
||||
*
|
||||
* @param[in] https_ota_handle pointer to esp_https_ota_handle_t structure
|
||||
*
|
||||
@ -147,6 +148,25 @@ bool esp_https_ota_is_complete_data_received(esp_https_ota_handle_t https_ota_ha
|
||||
esp_err_t esp_https_ota_finish(esp_https_ota_handle_t https_ota_handle);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Clean-up HTTPS OTA Firmware upgrade and close HTTPS connection
|
||||
*
|
||||
* This function closes the HTTP connection and frees the ESP HTTPS OTA context.
|
||||
*
|
||||
* @note esp_https_ota_abort should not be called after calling esp_https_ota_finish
|
||||
*
|
||||
* @param[in] https_ota_handle pointer to esp_https_ota_handle_t structure
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: Clean-up successful
|
||||
* - ESP_ERR_INVALID_STATE: Invalid ESP HTTPS OTA state
|
||||
* - ESP_FAIL: OTA not started
|
||||
* - ESP_ERR_NOT_FOUND: OTA handle not found
|
||||
* - ESP_ERR_INVALID_ARG: Invalid argument
|
||||
*/
|
||||
esp_err_t esp_https_ota_abort(esp_https_ota_handle_t https_ota_handle);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Reads app description from image header. The app description provides information
|
||||
* like the "Firmware version" of the image.
|
||||
|
@ -381,6 +381,40 @@ esp_err_t esp_https_ota_finish(esp_https_ota_handle_t https_ota_handle)
|
||||
return err;
|
||||
}
|
||||
|
||||
esp_err_t esp_https_ota_abort(esp_https_ota_handle_t https_ota_handle)
|
||||
{
|
||||
esp_https_ota_t *handle = (esp_https_ota_t *)https_ota_handle;
|
||||
if (handle == NULL) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
|
||||
if (handle->state < ESP_HTTPS_OTA_BEGIN) {
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
esp_err_t err = ESP_OK;
|
||||
switch (handle->state) {
|
||||
case ESP_HTTPS_OTA_SUCCESS:
|
||||
case ESP_HTTPS_OTA_IN_PROGRESS:
|
||||
err = esp_ota_abort(handle->update_handle);
|
||||
/* falls through */
|
||||
case ESP_HTTPS_OTA_BEGIN:
|
||||
if (handle->ota_upgrade_buf) {
|
||||
free(handle->ota_upgrade_buf);
|
||||
}
|
||||
if (handle->http_client) {
|
||||
_http_cleanup(handle->http_client);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
err = ESP_ERR_INVALID_STATE;
|
||||
ESP_LOGE(TAG, "Invalid ESP HTTPS OTA State");
|
||||
break;
|
||||
}
|
||||
free(handle);
|
||||
return err;
|
||||
}
|
||||
|
||||
int esp_https_ota_get_image_len_read(esp_https_ota_handle_t https_ota_handle)
|
||||
{
|
||||
esp_https_ota_t *handle = (esp_https_ota_t *)https_ota_handle;
|
||||
@ -417,13 +451,13 @@ esp_err_t esp_https_ota(const esp_http_client_config_t *config)
|
||||
}
|
||||
}
|
||||
|
||||
esp_err_t ota_finish_err = esp_https_ota_finish(https_ota_handle);
|
||||
if (err != ESP_OK) {
|
||||
/* If there was an error in esp_https_ota_perform(),
|
||||
then it is given more precedence than error in esp_https_ota_finish()
|
||||
*/
|
||||
esp_https_ota_abort(https_ota_handle);
|
||||
return err;
|
||||
} else if (ota_finish_err != ESP_OK) {
|
||||
}
|
||||
|
||||
esp_err_t ota_finish_err = esp_https_ota_finish(https_ota_handle);
|
||||
if (ota_finish_err != ESP_OK) {
|
||||
return ota_finish_err;
|
||||
}
|
||||
return ESP_OK;
|
||||
|
@ -144,21 +144,25 @@ void advanced_ota_example_task(void *pvParameter)
|
||||
if (esp_https_ota_is_complete_data_received(https_ota_handle) != true) {
|
||||
// the OTA image was not completely received and user can customise the response to this situation.
|
||||
ESP_LOGE(TAG, "Complete data was not received.");
|
||||
} else {
|
||||
ota_finish_err = esp_https_ota_finish(https_ota_handle);
|
||||
if ((err == ESP_OK) && (ota_finish_err == ESP_OK)) {
|
||||
ESP_LOGI(TAG, "ESP_HTTPS_OTA upgrade successful. Rebooting ...");
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
} else {
|
||||
if (ota_finish_err == ESP_ERR_OTA_VALIDATE_FAILED) {
|
||||
ESP_LOGE(TAG, "Image validation failed, image is corrupted");
|
||||
}
|
||||
ESP_LOGE(TAG, "ESP_HTTPS_OTA upgrade failed 0x%x", ota_finish_err);
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
ota_end:
|
||||
ota_finish_err = esp_https_ota_finish(https_ota_handle);
|
||||
if ((err == ESP_OK) && (ota_finish_err == ESP_OK)) {
|
||||
ESP_LOGI(TAG, "ESP_HTTPS_OTA upgrade successful. Rebooting ...");
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
} else {
|
||||
if (ota_finish_err == ESP_ERR_OTA_VALIDATE_FAILED) {
|
||||
ESP_LOGE(TAG, "Image validation failed, image is corrupted");
|
||||
}
|
||||
ESP_LOGE(TAG, "ESP_HTTPS_OTA upgrade failed %d", ota_finish_err);
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
esp_https_ota_abort(https_ota_handle);
|
||||
ESP_LOGE(TAG, "ESP_HTTPS_OTA upgrade failed");
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void app_main(void)
|
||||
|
@ -187,18 +187,21 @@ static void ota_example_task(void *pvParameter)
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err));
|
||||
http_cleanup(client);
|
||||
esp_ota_abort(update_handle);
|
||||
task_fatal_error();
|
||||
}
|
||||
ESP_LOGI(TAG, "esp_ota_begin succeeded");
|
||||
} else {
|
||||
ESP_LOGE(TAG, "received package is not fit len");
|
||||
http_cleanup(client);
|
||||
esp_ota_abort(update_handle);
|
||||
task_fatal_error();
|
||||
}
|
||||
}
|
||||
err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read);
|
||||
if (err != ESP_OK) {
|
||||
http_cleanup(client);
|
||||
esp_ota_abort(update_handle);
|
||||
task_fatal_error();
|
||||
}
|
||||
binary_file_length += data_read;
|
||||
@ -222,6 +225,7 @@ static void ota_example_task(void *pvParameter)
|
||||
if (esp_http_client_is_complete_data_received(client) != true) {
|
||||
ESP_LOGE(TAG, "Error in receiving complete file");
|
||||
http_cleanup(client);
|
||||
esp_ota_abort(update_handle);
|
||||
task_fatal_error();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user