From e04832be88838493746ee6584f42d5671c358198 Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Sun, 7 Nov 2021 15:02:11 +1300 Subject: [PATCH 1/4] Use a hardcoded name on the SPIFFS so we can upload long filenames --- lib/WIFI/stmUpdateClass.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/WIFI/stmUpdateClass.cpp b/lib/WIFI/stmUpdateClass.cpp index b4bae15..47a1788 100644 --- a/lib/WIFI/stmUpdateClass.cpp +++ b/lib/WIFI/stmUpdateClass.cpp @@ -6,6 +6,8 @@ #include "logging.h" +static const char *spiffs_firmware_filename = "firmware.bin"; + void STMUpdateClass::setFilename(const String& filename) { this->filename = filename; @@ -16,8 +18,8 @@ bool STMUpdateClass::begin(size_t size) _error = UPDATE_ERROR_OK; /* Remove old file */ - if (SPIFFS.exists(filename.c_str())) - SPIFFS.remove(filename.c_str()); + if (SPIFFS.exists(spiffs_firmware_filename)) + SPIFFS.remove(spiffs_firmware_filename); FSInfo fs_info; if (SPIFFS.info(fs_info)) @@ -41,7 +43,7 @@ bool STMUpdateClass::begin(size_t size) _error = UPDATE_ERROR_READ; return false; } - fsUploadFile = SPIFFS.open(filename.c_str(), "w"); // Open the file for writing in SPIFFS (create if it doesn't exist) + fsUploadFile = SPIFFS.open(spiffs_firmware_filename, "w"); // Open the file for writing in SPIFFS (create if it doesn't exist) return true; } @@ -55,8 +57,8 @@ bool STMUpdateClass::end(bool evenIfRemaining) fsUploadFile.close(); // Close the file again _error = flashSTM32(BEGIN_ADDRESS); - if (SPIFFS.exists(filename.c_str())) - SPIFFS.remove(filename.c_str()); + if (SPIFFS.exists(spiffs_firmware_filename)) + SPIFFS.remove(spiffs_firmware_filename); return !hasError(); } @@ -78,9 +80,9 @@ void STMUpdateClass::printError(Print &out){ int8_t STMUpdateClass::flashSTM32(uint32_t flash_addr) { if (filename.endsWith(".elrs")) { - _errmsg = stk500_write_file(filename.c_str()); + _errmsg = stk500_write_file(spiffs_firmware_filename); } else if (filename.endsWith(".bin")) { - _errmsg = esp8266_spiffs_write_file(filename.c_str(), flash_addr); + _errmsg = esp8266_spiffs_write_file(spiffs_firmware_filename, flash_addr); } Serial.begin(460800); if (_errmsg != NULL) From 878e915a44c811707101c298c8fbf1bcf9548a7b Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Sat, 13 Nov 2021 20:31:29 +1300 Subject: [PATCH 2/4] Reset STM32 when finished uploading --- lib/WIFI/stmUpdateClass.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/WIFI/stmUpdateClass.cpp b/lib/WIFI/stmUpdateClass.cpp index 47a1788..bbecec4 100644 --- a/lib/WIFI/stmUpdateClass.cpp +++ b/lib/WIFI/stmUpdateClass.cpp @@ -81,6 +81,7 @@ int8_t STMUpdateClass::flashSTM32(uint32_t flash_addr) { if (filename.endsWith(".elrs")) { _errmsg = stk500_write_file(spiffs_firmware_filename); + reset_stm32_to_app_mode(); } else if (filename.endsWith(".bin")) { _errmsg = esp8266_spiffs_write_file(spiffs_firmware_filename, flash_addr); } From 339ff33244d99c1c3844da2abca2107b9cd62e75 Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Sat, 13 Nov 2021 21:32:35 +1300 Subject: [PATCH 3/4] Placebo flashing progress --- html/scan.js | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/html/scan.js b/html/scan.js index 69f38d5..a01399e 100644 --- a/html/scan.js +++ b/html/scan.js @@ -202,11 +202,26 @@ function completeHandler(type_suffix) { _("progressBar_" + type_suffix).value = 0; var data = JSON.parse(event.target.responseText); if (data.status === 'ok') { - cuteAlert({ - type: 'success', - title: "Update Succeeded", - message: data.msg - }); + function show_message() { + cuteAlert({ + type: 'success', + title: "Update Succeeded", + message: data.msg + }); + } + // This is basically a delayed display of the success dialog with a fake progress + var percent = 0; + var interval = setInterval(()=>{ + percent = percent + 1; + _("progressBar_" + type_suffix).value = percent; + _("status_" + type_suffix).innerHTML = percent + "% flashed... please wait"; + if (percent == 100) { + clearInterval(interval); + _("status_" + type_suffix).innerHTML = ""; + _("progressBar_" + type_suffix).value = 0; + show_message(); + } + }, 100); } else if (data.status === 'mismatch') { cuteAlert({ type: 'question', @@ -257,9 +272,9 @@ function errorHandler(type_suffix) { _("status_" + type_suffix).innerHTML = ""; _("progressBar_" + type_suffix).value = 0; cuteAlert({ - type: "error", - title: "Update Failed", - message: event.target.responseText + type: "error", + title: "Update Failed", + message: event.target.responseText }); } } @@ -269,9 +284,9 @@ function abortHandler(type_suffix) { _("status_" + type_suffix).innerHTML = ""; _("progressBar_" + type_suffix).value = 0; cuteAlert({ - type: "info", - title: "Update Aborted", - message: event.target.responseText + type: "info", + title: "Update Aborted", + message: event.target.responseText }); } } From a33654c3c5e913ed23424d5885676dc9c0001a91 Mon Sep 17 00:00:00 2001 From: Paul Kendall Date: Sat, 13 Nov 2021 21:45:31 +1300 Subject: [PATCH 4/4] Simplify reboot handling and allow the placebo in STM flashing --- lib/WIFI/devWIFI.cpp | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/lib/WIFI/devWIFI.cpp b/lib/WIFI/devWIFI.cpp index 64b8626..21bf3b6 100644 --- a/lib/WIFI/devWIFI.cpp +++ b/lib/WIFI/devWIFI.cpp @@ -76,6 +76,7 @@ static uint8_t target_pos = 0; static String target_found; static bool target_complete = false; static bool force_update = false; +static bool do_flash = false; static uint32_t totalSize; static UpdateWrapper updater = UpdateWrapper(); @@ -290,7 +291,7 @@ static void WebUploadResponseHandler(AsyncWebServerRequest *request) { response->addHeader("Connection", "close"); request->send(response); request->client()->close(); - rebootTime = millis() + 200; + do_flash = true; } else { String message = String("{\"status\": \"mismatch\", \"msg\": \"Current target: ") + (const char *)&target_name[4] + ".
"; if (target_found.length() != 0) { @@ -369,31 +370,11 @@ static void WebUploadDataHandler(AsyncWebServerRequest *request, const String& f totalSize += len; } } - if (final && !updater.hasError()) { - DBGVLN("finish"); - if (target_seen) { - if (updater.end(true)) { //true to set the size to the current progress - DBGLN("Upload Success: %ubytes\nPlease wait for LED to turn on before disconnecting power", totalSize); - } else { - updater.printError(Serial); - } - } else { - #if defined(PLATFORM_ESP32) - updater->abort(); - #endif - DBGLN("Wrong firmware uploaded, not %s, update aborted", &target_name[4]); - } - } } static void WebUploadForceUpdateHandler(AsyncWebServerRequest *request) { target_seen = true; if (request->arg("action").equals("confirm")) { - if (updater.end(true)) { //true to set the size to the current progress - DBGLN("Upload Success: %ubytes\nPlease wait for LED to turn on before disconnecting power", totalSize); - } else { - updater.printError(Serial); - } WebUploadResponseHandler(request); } else { #if defined(PLATFORM_ESP32) @@ -598,6 +579,15 @@ static void HandleWebUpdate() // In AP mode, it doesn't seem to make a measurable difference, but does not hurt if (!updater.isRunning()) delay(1); + if (do_flash) { + do_flash = false; + if (updater.end(true)) { //true to set the size to the current progress + DBGLN("Upload Success: %ubytes\nPlease wait for LED to turn on before disconnecting power", totalSize); + } else { + updater.printError(Serial); + } + rebootTime = millis() + 200; + } } }