Read timeout for modules that immediately spit out data (no buffer)

They do need a millis() based timeout so that data left in the buffer after the socket closes can still be read in but the maintain doesn't sit and wait forever.
This commit is contained in:
Sara Damiano
2018-10-02 15:32:38 -04:00
parent 312d486a43
commit e68ea1db12
3 changed files with 8 additions and 5 deletions

View File

@@ -121,7 +121,8 @@ public:
virtual int read(uint8_t *buf, size_t size) { virtual int read(uint8_t *buf, size_t size) {
TINY_GSM_YIELD(); TINY_GSM_YIELD();
size_t cnt = 0; size_t cnt = 0;
while (cnt < size && sock_connected) { uint32_t _startMillis = millis();
while (cnt < size && millis() - _startMillis < _timeout) {
size_t chunk = TinyGsmMin(size-cnt, rx.size()); size_t chunk = TinyGsmMin(size-cnt, rx.size());
if (chunk > 0) { if (chunk > 0) {
rx.get(buf, chunk); rx.get(buf, chunk);
@@ -130,7 +131,7 @@ public:
continue; continue;
} }
// TODO: Read directly into user buffer? // TODO: Read directly into user buffer?
if (!rx.size()) { if (!rx.size() && sock_connected) {
at->maintain(); at->maintain();
} }
} }

View File

@@ -118,7 +118,8 @@ public:
virtual int read(uint8_t *buf, size_t size) { virtual int read(uint8_t *buf, size_t size) {
TINY_GSM_YIELD(); TINY_GSM_YIELD();
size_t cnt = 0; size_t cnt = 0;
while (cnt < size && sock_connected) { uint32_t _startMillis = millis();
while (cnt < size && millis() - _startMillis < _timeout) {
size_t chunk = TinyGsmMin(size-cnt, rx.size()); size_t chunk = TinyGsmMin(size-cnt, rx.size());
if (chunk > 0) { if (chunk > 0) {
rx.get(buf, chunk); rx.get(buf, chunk);
@@ -127,7 +128,7 @@ public:
continue; continue;
} }
// TODO: Read directly into user buffer? // TODO: Read directly into user buffer?
if (!rx.size()) { if (!rx.size() && sock_connected) {
at->maintain(); at->maintain();
} }
} }

View File

@@ -118,7 +118,8 @@ public:
virtual int read(uint8_t *buf, size_t size) { virtual int read(uint8_t *buf, size_t size) {
TINY_GSM_YIELD(); TINY_GSM_YIELD();
size_t cnt = 0; size_t cnt = 0;
while (cnt < size && sock_connected) { uint32_t _startMillis = millis();
while (cnt < size && millis() - _startMillis < _timeout) {
size_t chunk = TinyGsmMin(size-cnt, rx.size()); size_t chunk = TinyGsmMin(size-cnt, rx.size());
if (chunk > 0) { if (chunk > 0) {
rx.get(buf, chunk); rx.get(buf, chunk);