From e102f8e4e932ddc77356906b7d8a23d06c8f8bc6 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Thu, 27 Mar 2025 21:10:10 +0100 Subject: [PATCH] stability improvements in C6 flashing --- ESP32_AP-Flasher/data/www/index.html.gz | Bin 6568 -> 6642 bytes ESP32_AP-Flasher/data/www/main.css.gz | Bin 3480 -> 3525 bytes ESP32_AP-Flasher/data/www/main.js.gz | Bin 16258 -> 16281 bytes ESP32_AP-Flasher/data/www/ota.js.gz | Bin 6451 -> 6508 bytes ESP32_AP-Flasher/include/serialap.h | 17 ++- ESP32_AP-Flasher/include/tag_db.h | 2 +- ESP32_AP-Flasher/src/espflasher.cpp | 4 +- ESP32_AP-Flasher/src/ota.cpp | 41 ++++--- ESP32_AP-Flasher/src/serialap.cpp | 156 +++++++++++------------- ESP32_AP-Flasher/wwwroot/index.html | 1 + ESP32_AP-Flasher/wwwroot/main.css | 10 ++ ESP32_AP-Flasher/wwwroot/main.js | 7 +- ESP32_AP-Flasher/wwwroot/ota.js | 10 +- 13 files changed, 137 insertions(+), 111 deletions(-) diff --git a/ESP32_AP-Flasher/data/www/index.html.gz b/ESP32_AP-Flasher/data/www/index.html.gz index 8ae02dee1a4ff5eb1d67dd7f78455b555371ea41..e90b918061abb7a88151d73bb966f564a2d343ce 100644 GIT binary patch delta 4671 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 B{xtvq delta 4617 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 KEkga2H~;`{JjfLQ delta 3438 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 QN%8xC0G-ulcE~pX0DfGYApigX diff --git a/ESP32_AP-Flasher/data/www/main.js.gz b/ESP32_AP-Flasher/data/www/main.js.gz index 289da7c1fad4a3cea0a8598440ffe9bb54fc2622..8f86170003497b4012c5792bc436d2d4e941bf30 100644 GIT binary patch delta 16213 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 delta 16187 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 ZQcn~+WJhOj&KXk!`M+$mxT4$x0RYZfQRDys diff --git a/ESP32_AP-Flasher/data/www/ota.js.gz b/ESP32_AP-Flasher/data/www/ota.js.gz index b3894736d785b520c806ba7e1ab56018dd9ada06..c25b605084e5de3195bb0b47506ad766d18050af 100644 GIT binary patch delta 6487 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 literal 6451 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, "r"); if(!readfile) { - Serial.println("load " + JsonFilename + ": Failed to open file"); - break; + wsSerial("load " + JsonFilename + ": Failed to open file"); + return true; } DeserializationError jsonError = deserializeJson(jsonDoc, readfile); diff --git a/ESP32_AP-Flasher/src/ota.cpp b/ESP32_AP-Flasher/src/ota.cpp index 18f629e7..431efae8 100644 --- a/ESP32_AP-Flasher/src/ota.cpp +++ b/ESP32_AP-Flasher/src/ota.cpp @@ -306,22 +306,25 @@ void handleRollback(AsyncWebServerRequest* request) { #ifdef C6_OTA_FLASHING void C6firmwareUpdateTask(void* parameter) { - String *Url = reinterpret_cast(parameter); - LOG("C6firmwareUpdateTask: url '%s'\n",Url->c_str()); + char* urlPtr = reinterpret_cast(parameter); + + LOG("C6firmwareUpdateTask: url '%s'\n", urlPtr); wsSerial("Stopping AP service"); - setAPstate(false, AP_STATE_FLASHING); + gSerialTaskState = SERIAL_STATE_STOP; config.runStatus = RUNSTATUS_STOP; + setAPstate(false, AP_STATE_FLASHING); #ifndef FLASHER_DEBUG_SHARED extern bool rxSerialStopTask2; rxSerialStopTask2 = true; #endif vTaskDelay(500 / portTICK_PERIOD_MS); Serial1.end(); + setAPstate(false, AP_STATE_FLASHING); wsSerial(SHORT_CHIP_NAME " flash starting"); - bool result = FlashC6_H2(Url->c_str()); + bool result = FlashC6_H2(urlPtr); wsSerial(SHORT_CHIP_NAME " flash end"); @@ -340,15 +343,15 @@ void C6firmwareUpdateTask(void* parameter) { vTaskDelay(1000 / portTICK_PERIOD_MS); apInfo.version = 0; - wsSerial("resetting AP"); - APTagReset(); - vTaskDelay(1000 / portTICK_PERIOD_MS); - wsSerial("bringing AP online"); - if (bringAPOnline()) config.runStatus = RUNSTATUS_RUN; + // if (bringAPOnline(AP_STATE_REQUIRED_POWER_CYCLE)) config.runStatus = RUNSTATUS_STOP; + if (bringAPOnline(AP_STATE_ONLINE)) { + config.runStatus = RUNSTATUS_RUN; + setAPstate(true, AP_STATE_ONLINE); + } - // Wait for version info to arrive - vTaskDelay(50 / portTICK_PERIOD_MS); + // Wait for version info to arrive + vTaskDelay(500 / portTICK_PERIOD_MS); if(apInfo.version == 0) { result = false; } @@ -358,16 +361,19 @@ void C6firmwareUpdateTask(void* parameter) { wsSerial("Finished!"); char buffer[50]; snprintf(buffer,sizeof(buffer), - "ESP32-" SHORT_CHIP_NAME " version is now %04x",apInfo.version); + "ESP32-" SHORT_CHIP_NAME " version is now %04x", apInfo.version); wsSerial(String(buffer)); } else if(apInfo.version == 0) { - wsSerial("AP failed failed to come online. :-("); + wsSerial("AP failed to come online. :-("); } else { wsSerial("Flashing failed. :-("); } - delete Url; + // wsSerial("Reboot system now"); + // wsSerial("[reboot]"); + free(urlPtr); + vTaskDelay(30000 / portTICK_PERIOD_MS); vTaskDelete(NULL); } #endif @@ -376,9 +382,10 @@ void C6firmwareUpdateTask(void* parameter) { void handleUpdateC6(AsyncWebServerRequest* request) { #if defined C6_OTA_FLASHING if (request->hasParam("url",true)) { - String *Url = new String(request->getParam("url",true)->value()); - xTaskCreate(C6firmwareUpdateTask, "OTAUpdateTask", 6400, Url, 10, NULL); - request->send(200, "Ok"); + const char* urlStr = request->getParam("url", true)->value().c_str(); + char* urlCopy = strdup(urlStr); + xTaskCreate(C6firmwareUpdateTask, "OTAUpdateTask", 6400, urlCopy, 10, NULL); + request->send(200, "Ok"); } else { LOG("Sending bad request"); diff --git a/ESP32_AP-Flasher/src/serialap.cpp b/ESP32_AP-Flasher/src/serialap.cpp index 4e63e8a3..b564ddee 100644 --- a/ESP32_AP-Flasher/src/serialap.cpp +++ b/ESP32_AP-Flasher/src/serialap.cpp @@ -15,7 +15,7 @@ #include "web.h" #include "zbs_interface.h" -#define LOG(format, ... ) printf(format,## __VA_ARGS__) +#define LOG(format, ...) printf(format, ##__VA_ARGS__) QueueHandle_t rxCmdQueue; SemaphoreHandle_t txActive; @@ -47,15 +47,6 @@ struct espSetChannelPower curChannel = {0, 11, 10}; volatile uint32_t lastAPActivity = 0; struct APInfoS apInfo; -enum ApSerialState { - SERIAL_STATE_NONE, - SERIAL_STATE_INITIALIZED, - SERIAL_STATE_STARTING, - SERIAL_STATE_RUNNING, - SERIAL_STATE_STOP, - SERIAL_STATE_STOPPED -}; - volatile ApSerialState gSerialTaskState; struct rxCmd { @@ -166,27 +157,28 @@ void setAPstate(bool isOnline, uint8_t state) { CRGB::Red, CRGB::YellowGreen}; rgbIdleColor = colorMap[state]; - #ifdef BLE_ONLY - rgbIdleColor = CRGB::Green; - #endif +#ifdef BLE_ONLY + rgbIdleColor = CRGB::Green; +#endif rgbIdlePeriod = (isOnline ? 767 : 255); if (isOnline) rgbIdle(); #endif #ifdef FLASHER_DEBUG_SHARED -// Flasher shares port with AP comms - if(state == AP_STATE_FLASHING) { - LOG("Shared COM port, gSerialTaskState %d\n",gSerialTaskState); + // Flasher shares port with AP comms + if (state == AP_STATE_FLASHING) { + LOG("Shared COM port, gSerialTaskState %d\n", gSerialTaskState); gSerialTaskState = SERIAL_STATE_STOP; - for(int i = 0; i < 100; i++) { + for (int i = 0; i < 100; i++) { vTaskDelay(1 / portTICK_RATE_MS); - if(gSerialTaskState == SERIAL_STATE_STOPPED) { + if (gSerialTaskState == SERIAL_STATE_STOPPED) { gSerialTaskState = SERIAL_STATE_NONE; break; } } - LOG("gSerialTaskState %d\n",gSerialTaskState); + LOG("gSerialTaskState %d\n", gSerialTaskState); } #endif + wsSendSysteminfo(); } // Reset the tag @@ -415,46 +407,49 @@ void rxCmdProcessor(void* parameter) { txActive = xSemaphoreCreateBinary(); xSemaphoreGive(txActive); while (1) { - struct rxCmd* rxcmd = nullptr; - BaseType_t q = xQueueReceive(rxCmdQueue, &rxcmd, 10); - if (q == pdTRUE) { - switch (rxcmd->type) { - case RX_CMD_RQB: - processBlockRequest((struct espBlockRequest*)rxcmd->data); + if (apInfo.isOnline) { + struct rxCmd* rxcmd = nullptr; + BaseType_t q = xQueueReceive(rxCmdQueue, &rxcmd, 10); + if (q == pdTRUE) { + switch (rxcmd->type) { + case RX_CMD_RQB: + processBlockRequest((struct espBlockRequest*)rxcmd->data); #ifdef HAS_RGB_LED - // shortBlink(CRGB::Blue); + // shortBlink(CRGB::Blue); #endif - quickBlink(3); - break; - case RX_CMD_ADR: - processDataReq((struct espAvailDataReq*)rxcmd->data, true); + quickBlink(3); + break; + case RX_CMD_ADR: + processDataReq((struct espAvailDataReq*)rxcmd->data, true); #ifdef HAS_RGB_LED - // shortBlink(CRGB::Aqua); + // shortBlink(CRGB::Aqua); #endif - quickBlink(1); - break; - case RX_CMD_XFC: - processXferComplete((struct espXferComplete*)rxcmd->data, true); + quickBlink(1); + break; + case RX_CMD_XFC: + processXferComplete((struct espXferComplete*)rxcmd->data, true); #ifdef HAS_RGB_LED - // shortBlink(CRGB::Purple); + // shortBlink(CRGB::Purple); #endif - break; - case RX_CMD_XTO: - processXferTimeout((struct espXferComplete*)rxcmd->data, true); - break; - case RX_CMD_RSET: - Serial.println("AP did reset, resending pending\r\n"); - refreshAllPending(); - sendChannelPower(&curChannel); - break; - case RX_CMD_TRD: - // received tag return data - processTagReturnData((struct espTagReturnData*)rxcmd->data, rxcmd->len, true); - break; + break; + case RX_CMD_XTO: + processXferTimeout((struct espXferComplete*)rxcmd->data, true); + break; + case RX_CMD_RSET: + Serial.println("AP did reset, resending pending\r\n"); + refreshAllPending(); + sendChannelPower(&curChannel); + break; + case RX_CMD_TRD: + // received tag return data + processTagReturnData((struct espTagReturnData*)rxcmd->data, rxcmd->len, true); + break; + } + if (rxcmd->data) free(rxcmd->data); + if (rxcmd) free(rxcmd); } - if (rxcmd->data) free(rxcmd->data); - if (rxcmd) free(rxcmd); } + vTaskDelay(1 / portTICK_PERIOD_MS); } } void rxSerialTask(void* parameter) { @@ -539,8 +534,8 @@ void rxSerialTask(void* parameter) { packetp = (uint8_t*)calloc(sizeof(struct espBlockRequest) + 8, 1); memset(cmdbuffer, 0x00, 4); lastAPActivity = millis(); - if (apInfo.isOnline == false) - setAPstate(true, AP_STATE_ONLINE); + // don't set APstate heree, as it interferes with the flashing process + // if (apInfo.isOnline == false && config.runStatus == RUNSTATUS_RUN) setAPstate(true, AP_STATE_ONLINE); } if (strncmp(cmdbuffer, "ADR>", 4) == 0) { RXState = ZBS_RX_WAIT_DATA_REQ; @@ -549,8 +544,8 @@ void rxSerialTask(void* parameter) { packetp = (uint8_t*)calloc(sizeof(struct espAvailDataReq) + 8, 1); memset(cmdbuffer, 0x00, 4); lastAPActivity = millis(); - if (apInfo.isOnline == false) - setAPstate(true, AP_STATE_ONLINE); + // don't set APstate heree, as it interferes with the flashing process + // if (apInfo.isOnline == false && config.runStatus == RUNSTATUS_RUN) setAPstate(true, AP_STATE_ONLINE); } if (strncmp(cmdbuffer, "XFC>", 4) == 0) { RXState = ZBS_RX_WAIT_XFERCOMPLETE; @@ -573,8 +568,6 @@ void rxSerialTask(void* parameter) { packetp = (uint8_t*)calloc(sizeof(struct espTagReturnData) + 8, 1); memset(cmdbuffer, 0x00, 4); lastAPActivity = millis(); - if (apInfo.isOnline == false) - setAPstate(true, AP_STATE_ONLINE); } break; case ZBS_RX_BLOCK_REQUEST: @@ -747,11 +740,11 @@ void rxSerialTask2(void* parameter) { } else { Serial.println("Failed!"); } - logLine("IEEE802.15.4 modem reset " + (config.runStatus == RUNSTATUS_RUN)?("ok"):("failed")); + logLine("IEEE802.15.4 modem reset " + (config.runStatus == RUNSTATUS_RUN) ? ("ok") : ("failed")); } rxStrCount = 0; memset(rxStr, 0, sizeof(rxStr)); - } else if(rxStrCount < sizeof(rxStr) - 2) { + } else if (rxStrCount < sizeof(rxStr) - 2) { rxStrCount++; } else { rxStrCount = 0; @@ -764,7 +757,7 @@ void rxSerialTask2(void* parameter) { if (currentTime - startTime >= 1000) { if (charCount > 6000) { rxSerialStopTask2 = true; - Serial.println("Serial monitor stopped because of flooding (" + String(charCount) + " characters per second"); + Serial.println("Serial monitor stopped because of flooding (" + String(charCount) + " characters per second)"); } startTime = currentTime; charCount = 0; @@ -822,35 +815,35 @@ void segmentedShowIp() { vTaskDelay(2000 / portTICK_PERIOD_MS); } -bool bringAPOnline() { +bool bringAPOnline(uint8_t newState) { #ifdef BLE_ONLY apInfo.state = AP_STATE_NORADIO; #endif if (apInfo.state == AP_STATE_NORADIO) return true; if (apInfo.state == AP_STATE_FLASHING) return false; - if(gSerialTaskState != SERIAL_STATE_INITIALIZED) { + if (gSerialTaskState != SERIAL_STATE_INITIALIZED) { #ifdef HAS_ELECROW_ADV_2_8 - // Set GPIO45 low to connect the wireless interface to the multiplexed pins - pinMode(45, OUTPUT); - digitalWrite(45, LOW); + // Set GPIO45 low to connect the wireless interface to the multiplexed pins + pinMode(45, OUTPUT); + digitalWrite(45, LOW); #endif #if (AP_PROCESS_PORT == FLASHER_AP_PORT) - AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); + AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); #elif defined(HAS_EXT_FLASHER) - #if (AP_PROCESS_PORT == FLASHER_EXT_PORT) - AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); - #elif (AP_PROCESS_PORT == FLASHER_ALTRADIO_PORT) - AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); - #endif +#if (AP_PROCESS_PORT == FLASHER_EXT_PORT) + AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_EXT_RXD, FLASHER_EXT_TXD); +#elif (AP_PROCESS_PORT == FLASHER_ALTRADIO_PORT) + AP_SERIAL_PORT.begin(115200, SERIAL_8N1, FLASHER_AP_RXD, FLASHER_AP_TXD); #endif - gSerialTaskState = SERIAL_STATE_INITIALIZED; +#endif + gSerialTaskState = SERIAL_STATE_INITIALIZED; } - if(gSerialTaskState != SERIAL_STATE_RUNNING) { - gSerialTaskState = SERIAL_STATE_STARTING; - xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, 11, NULL); - vTaskDelay(500 / portTICK_PERIOD_MS); + if (gSerialTaskState != SERIAL_STATE_RUNNING) { + gSerialTaskState = SERIAL_STATE_STARTING; + xTaskCreate(rxSerialTask, "rxSerialTask", 1750, NULL, 11, NULL); + vTaskDelay(500 / portTICK_PERIOD_MS); } setAPstate(false, AP_STATE_OFFLINE); // try without rebooting @@ -888,18 +881,18 @@ bool bringAPOnline() { } vTaskDelay(200 / portTICK_PERIOD_MS); - setAPstate(true, AP_STATE_ONLINE); + setAPstate(newState == AP_STATE_ONLINE ? true : false, newState); return true; } } bool checkRadio() { - #ifdef BLE_ONLY +#ifdef BLE_ONLY return false; - #endif - #ifndef C6_OTA_FLASHING +#endif +#ifndef C6_OTA_FLASHING return true; - #endif +#endif // make a short between FLASHER_AP_TXD and FLASHER_AP_RXD to indicate that no radio is present // e.g. for flasher only, or just to use the S3 to generate images for smaller AP's pinMode(FLASHER_AP_TXD, OUTPUT); @@ -923,7 +916,6 @@ void APTask(void* parameter) { return; } - xTaskCreate(rxCmdProcessor, "rxCmdProcessor", 6000, NULL, 15, NULL); #if defined(FLASHER_DEBUG_RXD) && !defined(FLASHER_DEBUG_SHARED) xTaskCreate(rxSerialTask2, "rxSerialTask2", 1850, NULL, 2, NULL); diff --git a/ESP32_AP-Flasher/wwwroot/index.html b/ESP32_AP-Flasher/wwwroot/index.html index 8f5438b3..c92e86a6 100644 --- a/ESP32_AP-Flasher/wwwroot/index.html +++ b/ESP32_AP-Flasher/wwwroot/index.html @@ -182,6 +182,7 @@
+
diff --git a/ESP32_AP-Flasher/wwwroot/main.css b/ESP32_AP-Flasher/wwwroot/main.css index 314a50d9..306f2efd 100644 --- a/ESP32_AP-Flasher/wwwroot/main.css +++ b/ESP32_AP-Flasher/wwwroot/main.css @@ -651,6 +651,16 @@ select { text-align: center; } +.waitingicon { + display: none; + font-size: 1.2em; + background-color: lightgreen; + color: black; + height: 20px; + width: 20px; + vertical-align: top; + text-align: center; +} ul.messages { padding: 5px; } diff --git a/ESP32_AP-Flasher/wwwroot/main.js b/ESP32_AP-Flasher/wwwroot/main.js index 9d2d942d..803e9298 100644 --- a/ESP32_AP-Flasher/wwwroot/main.js +++ b/ESP32_AP-Flasher/wwwroot/main.js @@ -21,7 +21,7 @@ const apstate = [ { state: "online", color: "green", icon: "check_circle" }, { state: "flashing", color: "orange", icon: "flash_on" }, { state: "wait for reset", color: "blue", icon: "hourglass" }, - { state: "AP requires power cycle", color: "purple", icon: "refresh" }, + { state: "AP requires reboot", color: "purple", icon: "refresh" }, { state: "failed", color: "red", icon: "error" }, { state: "coming online...", color: "orange", icon: "hourglass" }, { state: "AP without radio", color: "green", icon: "wifi_off" } @@ -371,6 +371,11 @@ function processTags(tagArray) { } else { $('#tag' + tagmac + ' .nextupdate').innerHTML = ""; } + if (element.nextupdate < (Date.now() / 1000) - servertimediff) { + $('#tag' + tagmac + ' .waitingicon').style.display = 'inline-block'; + } else { + $('#tag' + tagmac + ' .waitingicon').style.display = 'none'; + } if (element.nextcheckin > 1672531200) { div.dataset.nextcheckin = element.nextcheckin; diff --git a/ESP32_AP-Flasher/wwwroot/ota.js b/ESP32_AP-Flasher/wwwroot/ota.js index 459bf91f..4ecfde0c 100644 --- a/ESP32_AP-Flasher/wwwroot/ota.js +++ b/ESP32_AP-Flasher/wwwroot/ota.js @@ -185,13 +185,13 @@ export async function initUpdate() { if(firmwareVer != 'unknown') { let Ver = Number('0x' + firmwareVer); if(Ver > gCurrentRfVer) { - tablerow += 'Newer'; + tablerow += 'newer'; } else if (Ver < gCurrentRfVer) { - tablerow += 'Older'; + tablerow += 'older'; } else if(!Number.isNaN(Ver)){ - tablerow += 'Same'; + tablerow += 'current version'; } } tablerow += ''; @@ -211,7 +211,7 @@ export async function initUpdate() { tableHeader2.innerHTML = 'Firmware
Update
'; table2.appendChild(tableHeader2); const tableRow = document.createElement('tr'); - tablerow = 'Last uploaded version'; + tablerow = 'Binaries from file system'; tablerow += ``; tableRow.innerHTML = tablerow; table2.appendChild(tableRow); @@ -222,7 +222,7 @@ export async function initUpdate() { "/master/binaries/ESP32-" + gShortName + "/firmware_" + gShortName + ".json"; - tablerow = `Latest version from repo`; + tablerow = `Latest version from repo`; tablerow += ``; tableRow.innerHTML = tablerow; table2.appendChild(tableRow);