diff --git a/src/espasyncota.cpp b/src/espasyncota.cpp index bf4de2c..de5540e 100644 --- a/src/espasyncota.cpp +++ b/src/espasyncota.cpp @@ -24,11 +24,12 @@ constexpr const char * const TAG = "ASYNC_OTA"; constexpr int TASK_RUNNING_BIT = BIT0; constexpr int START_REQUEST_BIT = BIT1; constexpr int REQUEST_RUNNING_BIT = BIT2; -constexpr int REQUEST_FINISHED_BIT = BIT3; -constexpr int REQUEST_SUCCEEDED_BIT = BIT4; -constexpr int END_TASK_BIT = BIT5; -constexpr int TASK_ENDED_BIT = BIT6; -constexpr int ABORT_REQUEST_BIT = BIT7; +constexpr int REQUEST_VERIFYING_BIT = BIT3; +constexpr int REQUEST_FINISHED_BIT = BIT4; +constexpr int REQUEST_SUCCEEDED_BIT = BIT5; +constexpr int END_TASK_BIT = BIT6; +constexpr int TASK_ENDED_BIT = BIT7; +constexpr int ABORT_REQUEST_BIT = BIT8; } // namespace EspAsyncOta::EspAsyncOta(const char *taskName, uint32_t stackSize, espcpputils::CoreAffinity coreAffinity) : @@ -60,7 +61,7 @@ tl::expected EspAsyncOta::startTask() return tl::make_unexpected(msg); } - m_eventGroup.clearBits(TASK_RUNNING_BIT | START_REQUEST_BIT | REQUEST_RUNNING_BIT | REQUEST_FINISHED_BIT | REQUEST_SUCCEEDED_BIT | END_TASK_BIT | TASK_ENDED_BIT | ABORT_REQUEST_BIT); + m_eventGroup.clearBits(TASK_RUNNING_BIT | START_REQUEST_BIT | REQUEST_RUNNING_BIT | REQUEST_VERIFYING_BIT | REQUEST_FINISHED_BIT | REQUEST_SUCCEEDED_BIT | END_TASK_BIT | TASK_ENDED_BIT | ABORT_REQUEST_BIT); const auto result = espcpputils::createTask(otaTask, m_taskName, m_stackSize, this, 10, &m_taskHandle, m_coreAffinity); if (result != pdPASS) @@ -132,6 +133,10 @@ OtaCloudUpdateStatus EspAsyncOta::status() const { return OtaCloudUpdateStatus::Idle; } + else if (bits & REQUEST_VERIFYING_BIT) + { + return OtaCloudUpdateStatus::Verifying; + } else if (bits & (START_REQUEST_BIT | REQUEST_RUNNING_BIT)) { return OtaCloudUpdateStatus::Updating; @@ -211,7 +216,10 @@ void EspAsyncOta::update() if (!m_lastInfo || espchrono::ago(*m_lastInfo) >= 1s) { m_lastInfo = espchrono::millis_clock::now(); - if (m_totalSize) + + if (bits & REQUEST_VERIFYING_BIT) + ESP_LOGI(TAG, "OTA Verifying"); + else if (m_totalSize) ESP_LOGI(TAG, "OTA Progress %i of %i (%.2f%%)", m_progress, *m_totalSize, 100.f*m_progress / *m_totalSize); else ESP_LOGI(TAG, "OTA Progress %i of unknown", m_progress); @@ -275,6 +283,7 @@ void EspAsyncOta::otaTask() const auto bits = m_eventGroup.getBits(); assert(!(bits & START_REQUEST_BIT)); assert(!(bits & REQUEST_RUNNING_BIT)); + assert(!(bits & REQUEST_VERIFYING_BIT)); assert(!(bits & REQUEST_FINISHED_BIT)); assert(!(bits & REQUEST_SUCCEEDED_BIT)); } @@ -284,7 +293,7 @@ void EspAsyncOta::otaTask() m_eventGroup.setBits(REQUEST_RUNNING_BIT); auto helper2 = cpputils::makeCleanupHelper([&](){ - m_eventGroup.clearBits(REQUEST_RUNNING_BIT | ABORT_REQUEST_BIT); + m_eventGroup.clearBits(REQUEST_RUNNING_BIT | REQUEST_VERIFYING_BIT | ABORT_REQUEST_BIT); m_eventGroup.setBits(REQUEST_FINISHED_BIT); }); @@ -385,6 +394,9 @@ void EspAsyncOta::otaTask() } ESP_LOG_LEVEL_LOCAL((ota_perform_err == ESP_OK ? ESP_LOG_INFO : ESP_LOG_ERROR), TAG, "esp_https_ota_perform() returned: %s", esp_err_to_name(ota_perform_err)); + if (ota_perform_err == ESP_OK) + m_eventGroup.setBits(REQUEST_VERIFYING_BIT); + ESP_LOGI(TAG, "esp_https_ota_finish()..."); const auto ota_finish_err = esp_https_ota_finish(https_ota_handle); ESP_LOG_LEVEL_LOCAL((ota_finish_err == ESP_OK ? ESP_LOG_INFO : ESP_LOG_ERROR), TAG, "esp_https_ota_finish() returned: %s", esp_err_to_name(ota_finish_err)); diff --git a/src/espasyncota.h b/src/espasyncota.h index 660ea37..e1c7325 100644 --- a/src/espasyncota.h +++ b/src/espasyncota.h @@ -21,7 +21,8 @@ x(Updating) \ x(Failed) \ x(Succeeded) \ - x(NotReady) + x(NotReady) \ + x(Verifying) DECLARE_TYPESAFE_ENUM(OtaCloudUpdateStatus, : uint8_t, OtaCloudUpdateStatusValues) class EspAsyncOta