diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index d9d468765..3528a324a 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -1,6 +1,7 @@ #include "Updater.h" #include "eboot_command.h" #include +#include #include "StackThunk.h" //#define DEBUG_UPDATER Serial @@ -476,7 +477,7 @@ bool UpdaterClass::_verifyEnd() { return false; } -size_t UpdaterClass::writeStream(Stream &data) { +size_t UpdaterClass::writeStream(Stream &data, uint16_t streamTimeout) { size_t written = 0; size_t toRead = 0; if(hasError() || !isRunning()) @@ -489,6 +490,7 @@ size_t UpdaterClass::writeStream(Stream &data) { _reset(); return 0; } + esp8266::polledTimeout::oneShotMs timeOut(streamTimeout); if (_progress_callback) { _progress_callback(0, _size); } @@ -506,13 +508,15 @@ size_t UpdaterClass::writeStream(Stream &data) { } toRead = data.readBytes(_buffer + _bufferLen, bytesToRead); if(toRead == 0) { //Timeout - delay(100); - toRead = data.readBytes(_buffer + _bufferLen, bytesToRead); - if(toRead == 0) { //Timeout - _currentAddress = (_startAddress + _size); - _setError(UPDATE_ERROR_STREAM); - return written; - } + if (timeOut) { + _currentAddress = (_startAddress + _size); + _setError(UPDATE_ERROR_STREAM); + _reset(); + return written; + } + delay(100); + } else { + timeOut.reset(); } if(_ledPin != -1) { digitalWrite(_ledPin, !_ledOn); // Switch LED off diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index 14a4a3baa..0dcb86666 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -83,7 +83,7 @@ class UpdaterClass { Should be equal to the remaining bytes when called Usable for slow streams like Serial */ - size_t writeStream(Stream &data); + size_t writeStream(Stream &data, uint16_t streamTimeout = 60000); /* If all bytes are written