diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index 911ddf7784..a7dad96818 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -140,38 +140,24 @@ class UpdaterClass { */ template size_t write(T &data){ - size_t written = 0; if (hasError() || !isRunning()) return 0; - size_t available = data.available(); - while(available) { - if(_bufferLen + available > remaining()){ - available = remaining() - _bufferLen; - } - if(_bufferLen + available > _bufferSize) { - size_t toBuff = _bufferSize - _bufferLen; - data.read(_buffer + _bufferLen, toBuff); - _bufferLen += toBuff; - if(!_writeBuffer()) - return written; - written += toBuff; - } else { - data.read(_buffer + _bufferLen, available); - _bufferLen += available; - written += available; - if(_bufferLen == remaining()) { - if(!_writeBuffer()) { - return written; - } - } - } - if(remaining() == 0) - return written; - delay(1); - available = data.available(); + // load exactly one _bufSize before flashing it + // (the last one may be smaller) + size_t wantedBufSize = std::min(remaining(), _bufferSize); + size_t readThisTime = 0; + + while (data.available() && _bufferLen < wantedBufSize) { + size_t got = data.read(_buffer + _bufferLen, wantedBufSize - _bufferLen); + if (!got) + break; + _bufferLen += got; + readThisTime += got; } - return written; + if (_bufferLen == wantedBufSize && !_writeBuffer()) + return 0; + return readThisTime; } private: diff --git a/libraries/ArduinoOTA/ArduinoOTA.cpp b/libraries/ArduinoOTA/ArduinoOTA.cpp index 83cc5c7905..04f8b1026d 100644 --- a/libraries/ArduinoOTA/ArduinoOTA.cpp +++ b/libraries/ArduinoOTA/ArduinoOTA.cpp @@ -294,7 +294,7 @@ void ArduinoOTAClass::_runUpdate() { int waited = 1000; while (!client.available() && waited--) delay(1); - if (!waited){ + if (!client.available()){ #ifdef OTA_DEBUG OTA_DEBUG.printf("Receive Failed\n"); #endif @@ -303,6 +303,7 @@ void ArduinoOTAClass::_runUpdate() { _error_callback(OTA_RECEIVE_ERROR); } _state = OTA_IDLE; + break; } written = Update.write(client); if (written > 0) {