From e18c5dacbd8441c25621855e01a1f8e39ffa6741 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Mon, 6 May 2019 15:03:23 -0400 Subject: [PATCH] Fix https://github.com/vshymanskyy/TinyGSM/issues/266 --- src/TinyGsmClientBG96.h | 14 +++++++------- src/TinyGsmClientM590.h | 8 ++++---- src/TinyGsmClientM95.h | 14 +++++++------- src/TinyGsmClientMC60.h | 14 +++++++------- src/TinyGsmClientSIM7000.h | 33 ++++++++++++++++++++------------- src/TinyGsmClientSIM800.h | 37 +++++++++++++++++++++++-------------- src/TinyGsmClientUBLOX.h | 18 +++++++++--------- src/TinyGsmClientXBee.h | 8 ++++---- 8 files changed, 81 insertions(+), 65 deletions(-) diff --git a/src/TinyGsmClientBG96.h b/src/TinyGsmClientBG96.h index d75ba25..0131b81 100644 --- a/src/TinyGsmClientBG96.h +++ b/src/TinyGsmClientBG96.h @@ -144,7 +144,7 @@ public: // TODO: Read directly into user buffer? at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -178,12 +178,12 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmBG96* at; - uint8_t mux; - uint16_t sock_available; - bool sock_connected; - bool got_data; - RxFifo rx; + TinyGsmBG96* at; + uint8_t mux; + uint16_t sock_available; + bool sock_connected; + bool got_data; + RxFifo rx; }; diff --git a/src/TinyGsmClientM590.h b/src/TinyGsmClientM590.h index 1f5ea00..e138fa6 100644 --- a/src/TinyGsmClientM590.h +++ b/src/TinyGsmClientM590.h @@ -161,10 +161,10 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmM590* at; - uint8_t mux; - bool sock_connected; - RxFifo rx; + TinyGsmM590* at; + uint8_t mux; + bool sock_connected; + RxFifo rx; }; diff --git a/src/TinyGsmClientM95.h b/src/TinyGsmClientM95.h index a3818ce..669bd3b 100644 --- a/src/TinyGsmClientM95.h +++ b/src/TinyGsmClientM95.h @@ -144,7 +144,7 @@ public: // TODO: Read directly into user buffer? at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -178,12 +178,12 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmM95* at; - uint8_t mux; - uint16_t sock_available; - bool sock_connected; - bool got_data; - RxFifo rx; + TinyGsmM95* at; + uint8_t mux; + uint16_t sock_available; + bool sock_connected; + bool got_data; + RxFifo rx; }; diff --git a/src/TinyGsmClientMC60.h b/src/TinyGsmClientMC60.h index b3239b3..dbdc505 100644 --- a/src/TinyGsmClientMC60.h +++ b/src/TinyGsmClientMC60.h @@ -148,7 +148,7 @@ public: // TODO: Read directly into user buffer? at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -182,12 +182,12 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmMC60* at; - uint8_t mux; - uint16_t sock_available; - bool sock_connected; - bool got_data; - RxFifo rx; + TinyGsmMC60* at; + uint8_t mux; + uint16_t sock_available; + bool sock_connected; + bool got_data; + RxFifo rx; }; diff --git a/src/TinyGsmClientSIM7000.h b/src/TinyGsmClientSIM7000.h index ef64d5d..328141e 100644 --- a/src/TinyGsmClientSIM7000.h +++ b/src/TinyGsmClientSIM7000.h @@ -166,10 +166,10 @@ public: got_data = true; prev_check = millis(); } - at->maintain(); // TODO: Read directly into user buffer? + at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -204,12 +204,12 @@ public: private: TinyGsmSim7000* at; - uint8_t mux; - uint16_t sock_available; - uint32_t prev_check; - bool sock_connected; - bool got_data; - RxFifo rx; + uint8_t mux; + uint16_t sock_available; + uint32_t prev_check; + bool sock_connected; + bool got_data; + RxFifo rx; }; @@ -947,12 +947,19 @@ protected: return 0; } #endif - streamSkipUntil(','); // Skip mode 2/3 + streamSkipUntil(','); // Skip Rx mode 2/normal or 3/HEX streamSkipUntil(','); // Skip mux - size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = stream.readStringUntil('\n').toInt(); + size_t len_requested = stream.readStringUntil(',').toInt(); + // ^^ Requested number of data bytes (1-1460 bytes)to be read + size_t len_confirmed = stream.readStringUntil('\n').toInt(); + if (len_confirmed > len_requested) { + DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); + } + sockets[mux]->sock_available = len_confirmed; + // ^^ Confirmed number of data bytes to be read, which may be less than requested. + // 0 indicates that no data can be read. - for (size_t i=0; irx.put(c); } waitResponse(); - return len; + return len_confirmed; } size_t modemGetAvailable(uint8_t mux) { diff --git a/src/TinyGsmClientSIM800.h b/src/TinyGsmClientSIM800.h index 1e19928..764b411 100644 --- a/src/TinyGsmClientSIM800.h +++ b/src/TinyGsmClientSIM800.h @@ -161,10 +161,10 @@ public: got_data = true; prev_check = millis(); } - at->maintain(); // TODO: Read directly into user buffer? + at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -198,13 +198,13 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmSim800* at; - uint8_t mux; - uint16_t sock_available; - uint32_t prev_check; - bool sock_connected; - bool got_data; - RxFifo rx; + TinyGsmSim800* at; + uint8_t mux; + uint16_t sock_available; + uint32_t prev_check; + bool sock_connected; + bool got_data; + RxFifo rx; }; @@ -578,6 +578,7 @@ public: bool gprsDisconnect() { // Shut the TCP/IP connection + // CIPSHUT will close *all* open connections sendAT(GF("+CIPSHUT")); if (waitResponse(60000L) != 1) return false; @@ -791,6 +792,7 @@ public: /* * Battery functions */ + // Use: float vBatt = modem.getBattVoltage() / 1000.0; uint16_t getBattVoltage() { sendAT(GF("+CBC")); @@ -868,12 +870,19 @@ protected: return 0; } #endif - streamSkipUntil(','); // Skip mode 2/3 + streamSkipUntil(','); // Skip Rx mode 2/normal or 3/HEX streamSkipUntil(','); // Skip mux - size_t len = stream.readStringUntil(',').toInt(); - sockets[mux]->sock_available = stream.readStringUntil('\n').toInt(); + size_t len_requested = stream.readStringUntil(',').toInt(); + // ^^ Requested number of data bytes (1-1460 bytes)to be read + size_t len_confirmed = stream.readStringUntil('\n').toInt(); + if (len_confirmed > len_requested) { + DBG(len_requested - len_confirmed, "fewer bytes confirmed than requested!"); + } + sockets[mux]->sock_available = len_confirmed; + // ^^ Confirmed number of data bytes to be read, which may be less than requested. + // 0 indicates that no data can be read. - for (size_t i=0; irx.put(c); } waitResponse(); - return len; + return len_confirmed; } size_t modemGetAvailable(uint8_t mux) { diff --git a/src/TinyGsmClientUBLOX.h b/src/TinyGsmClientUBLOX.h index d5e4912..c5384d6 100644 --- a/src/TinyGsmClientUBLOX.h +++ b/src/TinyGsmClientUBLOX.h @@ -168,10 +168,10 @@ public: got_data = true; prev_check = millis(); } - at->maintain(); // TODO: Read directly into user buffer? + at->maintain(); if (sock_available > 0) { - sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); + at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -205,13 +205,13 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmUBLOX* at; - uint8_t mux; - uint16_t sock_available; - uint32_t prev_check; - bool sock_connected; - bool got_data; - RxFifo rx; + TinyGsmUBLOX* at; + uint8_t mux; + uint16_t sock_available; + uint32_t prev_check; + bool sock_connected; + bool got_data; + RxFifo rx; }; diff --git a/src/TinyGsmClientXBee.h b/src/TinyGsmClientXBee.h index 865139c..fcb6884 100644 --- a/src/TinyGsmClientXBee.h +++ b/src/TinyGsmClientXBee.h @@ -213,10 +213,10 @@ public: String remoteIP() TINY_GSM_ATTR_NOT_IMPLEMENTED; private: - TinyGsmXBee* at; - uint8_t mux; - bool sock_connected; - // RxFifo rx; + TinyGsmXBee* at; + uint8_t mux; + bool sock_connected; + // RxFifo rx; };