From ed02f66ca25d87185d187e5a7f94df83c6ebb942 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Thu, 16 May 2024 21:12:02 +0700 Subject: [PATCH 1/6] Correct OTA update process show message on display --- examples/OneOpenAir/OneOpenAir.ino | 20 ++++++++++++++++++++ examples/OneOpenAir/OtaHandler.h | 21 ++++++++++++++++----- src/AgOledDisplay.cpp | 27 ++++++++++++++++++++++++++- src/AgOledDisplay.h | 2 ++ 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index ed911d5..35bcaeb 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -519,6 +519,26 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { delay(2500); break; } + case OtaState::OTA_STATE_SKIP: { + if (ag->isOne()) { + oledDisplay.showNewFirmwareSkipped(); + } else { + Serial.println("Firmware update: Skipped"); + } + + delay(2500); + break; + } + case OtaState::OTA_STATE_UP_TO_DATE: { + if (ag->isOne()) { + oledDisplay.showNewFirmwareUpToDate(); + } else { + Serial.println("Firmware update: up to date"); + } + + delay(2500); + break; + } case OtaState::OTA_STATE_PROCESSING: { if (ag->isOne()) { oledDisplay.showNewFirmwareUpdating(String(processing)); diff --git a/examples/OneOpenAir/OtaHandler.h b/examples/OneOpenAir/OtaHandler.h index 3dc4242..33fa233 100644 --- a/examples/OneOpenAir/OtaHandler.h +++ b/examples/OneOpenAir/OtaHandler.h @@ -18,6 +18,8 @@ enum OtaUpdateOutcome { enum OtaState { OTA_STATE_BEGIN, OTA_STATE_FAIL, + OTA_STATE_SKIP, + OTA_STATE_UP_TO_DATE, OTA_STATE_PROCESSING, OTA_STATE_SUCCESS }; @@ -40,13 +42,22 @@ class OtaHandler { config.url = urlAsChar; OtaUpdateOutcome ret = attemptToPerformOta(&config); Serial.println(ret); - if (ret == OtaUpdateOutcome::UPDATE_PERFORMED) { - if (this->callback) { + if (this->callback) { + switch (ret) { + case OtaUpdateOutcome::UPDATE_PERFORMED: this->callback(OtaState::OTA_STATE_SUCCESS, ""); - } - } else { - if(this->callback) { + break; + case OtaUpdateOutcome::UDPATE_SKIPPED: + this->callback(OtaState::OTA_STATE_SKIP, ""); + break; + case OtaUpdateOutcome::ALREADY_UP_TO_DATE: + this->callback(OtaState::OTA_STATE_UP_TO_DATE, ""); + break; + case OtaUpdateOutcome::UPDATE_FAILED: this->callback(OtaState::OTA_STATE_FAIL, ""); + break; + default: + break; } } } diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index d5164e2..125c887 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -381,6 +381,31 @@ void OledDisplay::showNewFirmwareFailed(void) { DISP()->setFont(u8g2_font_t0_16_tf); setCentralText(20, "Firmware Update"); setCentralText(40, "Failed"); - setCentralText(60, String("Retry after 24h")); + } while (DISP()->nextPage()); +} + +void OledDisplay::showNewFirmwareSkipped(void) { + if (isDisplayOff) { + return; + } + + DISP()->firstPage(); + do { + DISP()->setFont(u8g2_font_t0_16_tf); + setCentralText(20, "Firmware Update"); + setCentralText(40, "skipped"); + } while (DISP()->nextPage()); +} + +void OledDisplay::showNewFirmwareUpToDate(void) { + if (isDisplayOff) { + return; + } + + DISP()->firstPage(); + do { + DISP()->setFont(u8g2_font_t0_16_tf); + setCentralText(20, "Firmware Update"); + setCentralText(40, "up to date"); } while (DISP()->nextPage()); } diff --git a/src/AgOledDisplay.h b/src/AgOledDisplay.h index 9d06354..7bd7614 100644 --- a/src/AgOledDisplay.h +++ b/src/AgOledDisplay.h @@ -40,6 +40,8 @@ class OledDisplay : public PrintLog { void showNewFirmwareUpdating(String percent); void showNewFirmwareSuccess(String count); void showNewFirmwareFailed(void); + void showNewFirmwareSkipped(void); + void showNewFirmwareUpToDate(void); }; #endif /** _AG_OLED_DISPLAY_H_ */ From c04ab90fd208f07d1a1baafd70ebe958f4c14591 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 17 May 2024 10:32:20 +0700 Subject: [PATCH 2/6] Update OTA processing message. Fix always retry of bootCount = 0 --- examples/OneOpenAir/OneOpenAir.ino | 11 +++++++++-- src/AgOledDisplay.cpp | 3 ++- src/AgValue.h | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 35bcaeb..67ea2e0 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -549,6 +549,11 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { break; } case OtaState::OTA_STATE_SUCCESS: { + if (ag->isOne()) { + oledDisplay.showNewFirmwareUpdating(String(100)); + delay(250); + } + int i = 6; while(i != 0) { i = i - 1; @@ -564,6 +569,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { delay(1000); } + oledDisplay.setBrightness(0); esp_restart(); } break; @@ -877,11 +883,12 @@ static void configUpdateHandle() { fwNewVersion = configuration.newFirmwareVersion(); if (fwNewVersion.length()) { bool doOta = false; - if (measurements.otaBootCount == 0) { + if (measurements.otaBootCount < 0) { doOta = true; Serial.println("First OTA"); } else { - if ((measurements.bootCount - measurements.otaBootCount) >= 30) { + int bootDiff = measurements.bootCount - measurements.otaBootCount; + if (bootDiff >= 30) { doOta = true; } else { Serial.println( diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index 125c887..5e6699d 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -380,7 +380,8 @@ void OledDisplay::showNewFirmwareFailed(void) { do { DISP()->setFont(u8g2_font_t0_16_tf); setCentralText(20, "Firmware Update"); - setCentralText(40, "Failed"); + setCentralText(40, "fail, will retry"); + // setCentralText(60, "will retry"); } while (DISP()->nextPage()); } diff --git a/src/AgValue.h b/src/AgValue.h index 7446411..a30857e 100644 --- a/src/AgValue.h +++ b/src/AgValue.h @@ -69,7 +69,7 @@ class Measurements { int countPosition; const int targetCount = 20; int bootCount; - int otaBootCount; + int otaBootCount = -1; String toString(bool isLocal, AgFirmwareMode fwMode, int rssi, void* _ag, void* _config); }; From 6e54409512d519bcf4dca0e2005a675c81fcaa5b Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 17 May 2024 20:17:49 +0700 Subject: [PATCH 3/6] rename function --- examples/OneOpenAir/OneOpenAir.ino | 17 ++++++----------- src/AgOledDisplay.cpp | 14 +++++++------- src/AgOledDisplay.h | 12 ++++++------ 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 67ea2e0..f52a394 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -502,7 +502,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { switch (state) { case OtaState::OTA_STATE_BEGIN: { if (ag->isOne()) { - oledDisplay.showNewFirmwareVersion(msg); + oledDisplay.showFirmwareUpdateVersion(msg); } else { Serial.println("New firmware: " + msg); } @@ -511,7 +511,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { } case OtaState::OTA_STATE_FAIL: { if (ag->isOne()) { - oledDisplay.showNewFirmwareFailed(); + oledDisplay.showFirmwareUpdateFailed(); } else { Serial.println("Error: Firmware update: failed"); } @@ -521,7 +521,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { } case OtaState::OTA_STATE_SKIP: { if (ag->isOne()) { - oledDisplay.showNewFirmwareSkipped(); + oledDisplay.showFirmwareUpdateSkipped(); } else { Serial.println("Firmware update: Skipped"); } @@ -531,7 +531,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { } case OtaState::OTA_STATE_UP_TO_DATE: { if (ag->isOne()) { - oledDisplay.showNewFirmwareUpToDate(); + oledDisplay.showFirmwareUpdateUpToDate(); } else { Serial.println("Firmware update: up to date"); } @@ -541,7 +541,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { } case OtaState::OTA_STATE_PROCESSING: { if (ag->isOne()) { - oledDisplay.showNewFirmwareUpdating(String(processing)); + oledDisplay.showFirmwareUpdateProgress(processing); } else { Serial.println("Firmware update: " + String(processing) + String("%")); } @@ -549,11 +549,6 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { break; } case OtaState::OTA_STATE_SUCCESS: { - if (ag->isOne()) { - oledDisplay.showNewFirmwareUpdating(String(100)); - delay(250); - } - int i = 6; while(i != 0) { i = i - 1; @@ -562,7 +557,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { while (i != 0) { i = i - 1; if (ag->isOne()) { - oledDisplay.showNewFirmwareSuccess(String(i)); + oledDisplay.showFirmwareUpdateSuccess(String(i)); } else { Serial.println("Rebooting... " + String(i)); } diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index 5e6699d..ccce42a 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -330,7 +330,7 @@ void OledDisplay::setBrightness(int percent) { } } -void OledDisplay::showNewFirmwareVersion(String version) { +void OledDisplay::showFirmwareUpdateVersion(String version) { if (isDisplayOff) { return; } @@ -344,7 +344,7 @@ void OledDisplay::showNewFirmwareVersion(String version) { } while (DISP()->nextPage()); } -void OledDisplay::showNewFirmwareUpdating(String percent) { +void OledDisplay::showFirmwareUpdateProgress(int percent) { if (isDisplayOff) { return; } @@ -353,11 +353,11 @@ void OledDisplay::showNewFirmwareUpdating(String percent) { do { DISP()->setFont(u8g2_font_t0_16_tf); setCentralText(20, "Firmware Update"); - setCentralText(50, String("Updating... ") + percent + String("%")); + setCentralText(50, String("Updating... ") + String(percent) + String("%")); } while (DISP()->nextPage()); } -void OledDisplay::showNewFirmwareSuccess(String count) { +void OledDisplay::showFirmwareUpdateSuccess(String count) { if (isDisplayOff) { return; } @@ -371,7 +371,7 @@ void OledDisplay::showNewFirmwareSuccess(String count) { } while (DISP()->nextPage()); } -void OledDisplay::showNewFirmwareFailed(void) { +void OledDisplay::showFirmwareUpdateFailed(void) { if (isDisplayOff) { return; } @@ -385,7 +385,7 @@ void OledDisplay::showNewFirmwareFailed(void) { } while (DISP()->nextPage()); } -void OledDisplay::showNewFirmwareSkipped(void) { +void OledDisplay::showFirmwareUpdateSkipped(void) { if (isDisplayOff) { return; } @@ -398,7 +398,7 @@ void OledDisplay::showNewFirmwareSkipped(void) { } while (DISP()->nextPage()); } -void OledDisplay::showNewFirmwareUpToDate(void) { +void OledDisplay::showFirmwareUpdateUpToDate(void) { if (isDisplayOff) { return; } diff --git a/src/AgOledDisplay.h b/src/AgOledDisplay.h index 7bd7614..1013935 100644 --- a/src/AgOledDisplay.h +++ b/src/AgOledDisplay.h @@ -36,12 +36,12 @@ class OledDisplay : public PrintLog { void showDashboard(void); void showDashboard(const char *status); void setBrightness(int percent); - void showNewFirmwareVersion(String version); - void showNewFirmwareUpdating(String percent); - void showNewFirmwareSuccess(String count); - void showNewFirmwareFailed(void); - void showNewFirmwareSkipped(void); - void showNewFirmwareUpToDate(void); + void showFirmwareUpdateVersion(String version); + void showFirmwareUpdateProgress(int percent); + void showFirmwareUpdateSuccess(String count); + void showFirmwareUpdateFailed(void); + void showFirmwareUpdateSkipped(void); + void showFirmwareUpdateUpToDate(void); }; #endif /** _AG_OLED_DISPLAY_H_ */ From 6ea0ab9272607a1e254395044d7c72211b6ee1b8 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Fri, 17 May 2024 20:18:59 +0700 Subject: [PATCH 4/6] Set process 100% after received firmware file. --- examples/OneOpenAir/OtaHandler.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/OneOpenAir/OtaHandler.h b/examples/OneOpenAir/OtaHandler.h index 33fa233..a845f8b 100644 --- a/examples/OneOpenAir/OtaHandler.h +++ b/examples/OneOpenAir/OtaHandler.h @@ -138,6 +138,9 @@ class OtaHandler { int data_read = esp_http_client_read(client, upgrade_data_buf, OTA_BUF_SIZE); if (data_read == 0) { + if (this->callback) { + this->callback(OtaState::OTA_STATE_PROCESSING, String(100)); + } Serial.println("Connection closed, all data received"); break; } From 11ecea1493e89c9277e511b403d9816e5ebecf55 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 4 Jun 2024 18:01:28 +0700 Subject: [PATCH 5/6] Change `showFirmwareUpdateSuccess` input from`String` to `int` --- src/AgOledDisplay.cpp | 4 ++-- src/AgOledDisplay.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AgOledDisplay.cpp b/src/AgOledDisplay.cpp index ccce42a..bd8ee95 100644 --- a/src/AgOledDisplay.cpp +++ b/src/AgOledDisplay.cpp @@ -357,7 +357,7 @@ void OledDisplay::showFirmwareUpdateProgress(int percent) { } while (DISP()->nextPage()); } -void OledDisplay::showFirmwareUpdateSuccess(String count) { +void OledDisplay::showFirmwareUpdateSuccess(int count) { if (isDisplayOff) { return; } @@ -367,7 +367,7 @@ void OledDisplay::showFirmwareUpdateSuccess(String count) { DISP()->setFont(u8g2_font_t0_16_tf); setCentralText(20, "Firmware Update"); setCentralText(40, "Success"); - setCentralText(60, String("Rebooting... ") + count); + setCentralText(60, String("Rebooting... ") + String(count)); } while (DISP()->nextPage()); } diff --git a/src/AgOledDisplay.h b/src/AgOledDisplay.h index 1013935..4073f0f 100644 --- a/src/AgOledDisplay.h +++ b/src/AgOledDisplay.h @@ -38,7 +38,7 @@ class OledDisplay : public PrintLog { void setBrightness(int percent); void showFirmwareUpdateVersion(String version); void showFirmwareUpdateProgress(int percent); - void showFirmwareUpdateSuccess(String count); + void showFirmwareUpdateSuccess(int count); void showFirmwareUpdateFailed(void); void showFirmwareUpdateSkipped(void); void showFirmwareUpdateUpToDate(void); From ef6b0415290df29837c80ef44a0844823b07c262 Mon Sep 17 00:00:00 2001 From: Phat Nguyen Date: Tue, 4 Jun 2024 18:01:55 +0700 Subject: [PATCH 6/6] Fix: ota not callback on first powerup perform --- examples/OneOpenAir/OneOpenAir.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index e323b9a..d794795 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -219,6 +219,7 @@ void setup() { #ifdef ESP8266 // ota not supported #else + otaHandler.setHandlerCallback(otaHandlerCallback); otaHandler.updateFirmwareIfOutdated(ag->deviceId()); /** Update first OTA */ @@ -485,6 +486,7 @@ static bool sgp41Init(void) { } static void otaHandlerCallback(OtaState state, String mesasge) { + Serial.println("OTA message: " + mesasge); switch (state) { case OtaState::OTA_STATE_BEGIN: displayExecuteOta(state, fwNewVersion, 0); @@ -562,7 +564,7 @@ static void displayExecuteOta(OtaState state, String msg, int processing) { while (i != 0) { i = i - 1; if (ag->isOne()) { - oledDisplay.showFirmwareUpdateSuccess(String(i)); + oledDisplay.showFirmwareUpdateSuccess(i); } else { Serial.println("Rebooting... " + String(i)); }