diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 7e59d2aa3f3..1fe89da4492 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -479,6 +479,34 @@ int NetworkClient::read(uint8_t *buf, size_t size) { return res; } +size_t NetworkClient::readBytes(char *buffer, size_t length) { + size_t left = length, sofar = 0; + int r = 0, to = millis() + getTimeout(); + while (left) { + r = read((uint8_t *)buffer + sofar, left); + if (r < 0) { + // Error has occurred + break; + } + if (r > 0) { + // We got some data + left -= r; + sofar += r; + to = millis() + getTimeout(); + } else { + // We got no data + if (millis() >= to) { + // We have waited for data enough + log_w("Timeout waiting for data on fd %d", fd()); + break; + } + // Allow other tasks to run + delay(2); + } + } + return sofar; +} + int NetworkClient::peek() { int res = -1; if (fd() >= 0 && _rxBuffer) { diff --git a/libraries/Network/src/NetworkClient.h b/libraries/Network/src/NetworkClient.h index cb92a805900..572292a7a99 100644 --- a/libraries/Network/src/NetworkClient.h +++ b/libraries/Network/src/NetworkClient.h @@ -60,6 +60,10 @@ class NetworkClient : public ESPLwIPClient { int available(); int read(); int read(uint8_t *buf, size_t size); + size_t readBytes(char *buffer, size_t length); + size_t readBytes(uint8_t *buffer, size_t length) { + return readBytes((char *)buffer, length); + } int peek(); void clear(); // clear rx void stop();