fix(server): defer 0xFF OTA confirm to fix race condition
All checks were successful
CI / firmware (pull_request) Successful in 1m4s
CI / android (pull_request) Successful in 8s

This commit is contained in:
eddy 2026-08-02 18:42:07 +02:00
commit 84e6ca8100

View file

@ -70,6 +70,7 @@ bool otaShaStarted = false;
bool otaReady = false;
bool otaEnded = false;
bool otaConfirmed = false;
bool otaEarlyConfirm = false;
uint32_t otaEndedAt = 0;
#define OTA_CONFIRM_TIMEOUT_MS 10000
@ -191,6 +192,7 @@ static void otaReset() {
otaReady = false;
otaEnded = false;
otaConfirmed = false;
otaEarlyConfirm = false;
if (otaShaStarted) {
mbedtls_sha256_free(&otaShaCtx);
otaShaStarted = false;
@ -296,7 +298,8 @@ class OtaCharacteristicCallbacks : public NimBLECharacteristicCallbacks {
Serial.printf("OTA: 0xFF received — otaReady=%d, otaEnded=%d, otaConfirmed=%d, otaInProgress=%d\n",
otaReady, otaEnded, otaConfirmed, otaInProgress);
if (!otaEnded) {
Serial.println("OTA: 0xFF IGNORED — otaEnded is false (esp_ota_end not yet called or failed)");
Serial.println("OTA: 0xFF arrived early (esp_ota_end not yet called), deferring");
otaEarlyConfirm = true;
return;
}
Serial.println("OTA: 0xFF confirm accepted, setting otaConfirmed=true");
@ -550,6 +553,12 @@ void loop() {
otaReady, otaEnded, otaConfirmed, otaInProgress);
}
if (otaEnded && otaEarlyConfirm) {
Serial.println("OTA: processing deferred 0xFF confirm");
otaConfirmed = true;
otaEarlyConfirm = false;
}
if (otaEnded && !otaConfirmed && (millis() - otaEndedAt > OTA_CONFIRM_TIMEOUT_MS)) {
Serial.printf("OTA: 0xFF confirm timeout (%lu ms) — discarding update, resuming normal operation\n",
millis() - otaEndedAt);