diff --git a/src/TinyGsmClientU201.h b/src/TinyGsmClientU201.h index 4466058..91e42f9 100644 --- a/src/TinyGsmClientU201.h +++ b/src/TinyGsmClientU201.h @@ -108,7 +108,7 @@ public: virtual int available() { TINY_GSM_YIELD(); - if (!rx.size() && sock_connected) { + if (!rx.size()) { at->maintain(); } return rx.size() + sock_available; @@ -129,7 +129,7 @@ public: // TODO: Read directly into user buffer? at->maintain(); if (sock_available > 0) { - at->modemRead(rx.free(), mux); + sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux); } else { break; } @@ -233,8 +233,8 @@ public: for (unsigned long start = millis(); millis() - start < timeout; ) { sendAT(GF("")); if (waitResponse(200) == 1) { - delay(100); - return true; + delay(100); + return true; } delay(100); } @@ -261,7 +261,17 @@ public: return waitResponse() == 1; } - String getModemInfo() TINY_GSM_ATTR_NOT_IMPLEMENTED; + String getModemInfo() { + sendAT(GF("I")); + String res; + if (waitResponse(1000L, res) != 1) { + return ""; + } + res.replace(GSM_NL "OK" GSM_NL, ""); + res.replace(GSM_NL, " "); + res.trim(); + return res; + } bool hasSSL() { return true; @@ -285,6 +295,15 @@ public: bool poweroff() TINY_GSM_ATTR_NOT_IMPLEMENTED; + bool radioOff() { + sendAT(GF("+CFUN=0")); + if (waitResponse(10000L) != 1) { + return false; + } + delay(3000); + return true; + } + /* * SIM card functions */ @@ -393,7 +412,7 @@ public: gprsDisconnect(); sendAT(GF("+CGATT=1")); - waitResponse(5000L); + waitResponse(60000L); sendAT(GF("+UPSD=0,1,\""), apn, '"'); waitResponse(); @@ -411,13 +430,14 @@ public: waitResponse(); sendAT(GF("+UPSDA=0,3")); - waitResponse(6000L); + waitResponse(60000L); // Open a GPRS context sendAT(GF("+UPSND=0,8")); if (waitResponse(GF(",8,1")) != 1) { return false; } + waitResponse(); return true; } @@ -443,20 +463,20 @@ public: if (res != 1) return false; - sendAT(GF("+CIFSR")); - if (waitResponse() != 1) - return false; - - return true; + return localIP() != 0; } String getLocalIP() { - sendAT(GF("+CIFSR;E0")); - String res; - if (waitResponse(10000L, res) != 1) { + sendAT(GF("+UPSND=0,0")); + if (waitResponse(GF(GSM_NL "+UPSND:")) != 1) { + return ""; + } + streamSkipUntil(','); // Skip PSD profile + streamSkipUntil('\"'); // Skip request type + String res = stream.readStringUntil('\"'); + if (waitResponse() != 1) { return ""; } - res.trim(); return res; } @@ -468,7 +488,7 @@ public: * Phone Call functions */ - bool setGsmBusy(bool busy = true) TINY_GSM_ATTR_NOT_IMPLEMENTED; + bool setGsmBusy(bool busy = true) TINY_GSM_ATTR_NOT_AVAILABLE; bool callAnswer() TINY_GSM_ATTR_NOT_IMPLEMENTED; @@ -493,7 +513,7 @@ public: String getGsmLocation() { sendAT(GF("+ULOC=2,3,0,120,1")); - if (waitResponse(GF(GSM_NL "+UULOC:")) != 1) { + if (waitResponse(30000L, GF(GSM_NL "+UULOC:")) != 1) { return ""; } String res = stream.readStringUntil('\n'); @@ -505,20 +525,19 @@ public: /* * Battery functions */ - // Use: float vBatt = modem.getBattVoltage() / 1000.0; - uint16_t getBattVoltage() { - sendAT(GF("+CIND")); + uint16_t getBattVoltage() TINY_GSM_ATTR_NOT_AVAILABLE; + + int getBattPercent() { + sendAT(GF("+CIND?")); if (waitResponse(GF(GSM_NL "+CIND:")) != 1) { return 0; } - uint16_t res = stream.readStringUntil(',').toInt(); + int res = stream.readStringUntil(',').toInt(); waitResponse(); return res; } - int getBattPercent() TINY_GSM_ATTR_NOT_IMPLEMENTED; - protected: bool modemConnect(const char* host, uint16_t port, uint8_t* mux, bool ssl = false) { @@ -542,14 +561,14 @@ protected: int modemSend(const void* buff, size_t len, uint8_t mux) { sendAT(GF("+USOWR="), mux, ',', len); if (waitResponse(GF("@")) != 1) { - return -1; + return 0; } // 50ms delay, see AT manual section 25.10.4 delay(50); stream.write((uint8_t*)buff, len); stream.flush(); if (waitResponse(GF(GSM_NL "+USOWR:")) != 1) { - return -1; + return 0; } streamSkipUntil(','); // Skip mux return stream.readStringUntil('\n').toInt();