Minor synchronizing
This commit is contained in:
@@ -16,7 +16,7 @@
|
|||||||
#define TINY_GSM_RX_BUFFER 64
|
#define TINY_GSM_RX_BUFFER 64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TINY_GSM_MUX_COUNT 5
|
#define TINY_GSM_MUX_COUNT 8
|
||||||
|
|
||||||
#include <TinyGsmCommon.h>
|
#include <TinyGsmCommon.h>
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ enum TinyGSMDateTimeFormat {
|
|||||||
DATE_DATE = 2
|
DATE_DATE = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
class TinyGsmSim7000
|
class TinyGsmSim7000 : public TinyGsmModem
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -98,10 +98,21 @@ public:
|
|||||||
|
|
||||||
virtual void stop() {
|
virtual void stop() {
|
||||||
TINY_GSM_YIELD();
|
TINY_GSM_YIELD();
|
||||||
|
// Read and dump anything remaining in the modem's internal buffer.
|
||||||
|
// The socket will appear open in response to connected() even after it
|
||||||
|
// closes until all data is read from the buffer.
|
||||||
|
// Doing it this way allows the external mcu to find and get all of the data
|
||||||
|
// that it wants from the socket even if it was closed externally.
|
||||||
|
rx.clear();
|
||||||
|
at->maintain();
|
||||||
|
while (sock_available > 0) {
|
||||||
|
sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux);
|
||||||
|
rx.clear();
|
||||||
|
at->maintain();
|
||||||
|
}
|
||||||
at->sendAT(GF("+CIPCLOSE="), mux);
|
at->sendAT(GF("+CIPCLOSE="), mux);
|
||||||
sock_connected = false;
|
sock_connected = false;
|
||||||
at->waitResponse();
|
at->waitResponse();
|
||||||
rx.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual size_t write(const uint8_t *buf, size_t size) {
|
virtual size_t write(const uint8_t *buf, size_t size) {
|
||||||
@@ -121,11 +132,12 @@ public:
|
|||||||
|
|
||||||
virtual int available() {
|
virtual int available() {
|
||||||
TINY_GSM_YIELD();
|
TINY_GSM_YIELD();
|
||||||
if (!rx.size() && sock_connected) {
|
if (!rx.size()) {
|
||||||
|
// TODO: Is this needed for SIM7000?
|
||||||
// Workaround: sometimes SIM7000 forgets to notify about data arrival.
|
// Workaround: sometimes SIM7000 forgets to notify about data arrival.
|
||||||
// TODO: Currently we ping the module periodically,
|
// TODO: Currently we ping the module periodically,
|
||||||
// but maybe there's a better indicator that we need to poll
|
// but maybe there's a better indicator that we need to poll
|
||||||
if (millis() - prev_check > 500) {
|
if (millis() - prev_check > 250) {
|
||||||
got_data = true;
|
got_data = true;
|
||||||
prev_check = millis();
|
prev_check = millis();
|
||||||
}
|
}
|
||||||
@@ -138,7 +150,7 @@ public:
|
|||||||
TINY_GSM_YIELD();
|
TINY_GSM_YIELD();
|
||||||
at->maintain();
|
at->maintain();
|
||||||
size_t cnt = 0;
|
size_t cnt = 0;
|
||||||
while (cnt < size && sock_connected) {
|
while (cnt < size) {
|
||||||
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);
|
||||||
@@ -146,10 +158,18 @@ public:
|
|||||||
cnt += chunk;
|
cnt += chunk;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// TODO: Read directly into user buffer?
|
// TODO: Is this needed for SIM7000?
|
||||||
|
// Workaround: sometimes SIM7000 forgets to notify about data arrival.
|
||||||
|
// TODO: Currently we ping the module periodically,
|
||||||
|
// but maybe there's a better indicator that we need to poll
|
||||||
|
if (millis() - prev_check > 250) {
|
||||||
|
got_data = true;
|
||||||
|
prev_check = millis();
|
||||||
|
}
|
||||||
at->maintain();
|
at->maintain();
|
||||||
|
// TODO: Read directly into user buffer?
|
||||||
if (sock_available > 0) {
|
if (sock_available > 0) {
|
||||||
at->modemRead(rx.free(), mux);
|
sock_available -= at->modemRead(TinyGsmMin((uint16_t)rx.free(), sock_available), mux);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -192,6 +212,7 @@ private:
|
|||||||
RxFifo rx;
|
RxFifo rx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class GsmClientSecure : public GsmClient
|
class GsmClientSecure : public GsmClient
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -211,10 +232,11 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TinyGsmSim7000(Stream& stream)
|
TinyGsmSim7000(Stream& stream)
|
||||||
: stream(stream)
|
: TinyGsmModem(stream), stream(stream)
|
||||||
{
|
{
|
||||||
memset(sockets, 0, sizeof(sockets));
|
memset(sockets, 0, sizeof(sockets));
|
||||||
}
|
}
|
||||||
@@ -222,11 +244,8 @@ public:
|
|||||||
/*
|
/*
|
||||||
* Basic functions
|
* Basic functions
|
||||||
*/
|
*/
|
||||||
bool begin() {
|
|
||||||
return init();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool init() {
|
bool init(const char* pin = NULL) {
|
||||||
if (!testAT()) {
|
if (!testAT()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -236,10 +255,15 @@ public:
|
|||||||
if (waitResponse() != 1) {
|
if (waitResponse() != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
DBG(GF("### Modem:"), getModemName());
|
||||||
getSimStatus();
|
getSimStatus();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getModemName() {
|
||||||
|
return "SIMCom SIM7000";
|
||||||
|
}
|
||||||
|
|
||||||
void setBaud(unsigned long baud) {
|
void setBaud(unsigned long baud) {
|
||||||
sendAT(GF("+IPR="), baud);
|
sendAT(GF("+IPR="), baud);
|
||||||
}
|
}
|
||||||
@@ -248,10 +272,7 @@ public:
|
|||||||
//streamWrite(GF("AAAAA" GSM_NL)); // TODO: extra A's to help detect the baud rate
|
//streamWrite(GF("AAAAA" GSM_NL)); // TODO: extra A's to help detect the baud rate
|
||||||
for (unsigned long start = millis(); millis() - start < timeout; ) {
|
for (unsigned long start = millis(); millis() - start < timeout; ) {
|
||||||
sendAT(GF(""));
|
sendAT(GF(""));
|
||||||
if (waitResponse(200) == 1) {
|
if (waitResponse(200) == 1) return true;
|
||||||
delay(100);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
delay(100);
|
delay(100);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -298,11 +319,15 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool hasSSL() {
|
bool hasSSL() {
|
||||||
sendAT(GF("+CIPSSL=?"));
|
return true;
|
||||||
if (waitResponse(GF(GSM_NL "+CIPSSL:")) != 1) {
|
}
|
||||||
return false;
|
|
||||||
}
|
bool hasWifi() {
|
||||||
return waitResponse() == 1;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasGPRS() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -319,8 +344,6 @@ public:
|
|||||||
if (waitResponse(10000L) != 1) {
|
if (waitResponse(10000L) != 1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sendAT(GF("&W"));
|
|
||||||
waitResponse();
|
|
||||||
sendAT(GF("+CFUN=0"));
|
sendAT(GF("+CFUN=0"));
|
||||||
if (waitResponse(10000L) != 1) {
|
if (waitResponse(10000L) != 1) {
|
||||||
return false;
|
return false;
|
||||||
@@ -398,18 +421,18 @@ public:
|
|||||||
int status = waitResponse(GF("READY"), GF("SIM PIN"), GF("SIM PUK"), GF("NOT INSERTED"));
|
int status = waitResponse(GF("READY"), GF("SIM PIN"), GF("SIM PUK"), GF("NOT INSERTED"));
|
||||||
waitResponse();
|
waitResponse();
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case 2:
|
case 2:
|
||||||
case 3: return SIM_LOCKED;
|
case 3: return SIM_LOCKED;
|
||||||
case 1: return SIM_READY;
|
case 1: return SIM_READY;
|
||||||
default: return SIM_ERROR;
|
default: return SIM_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return SIM_ERROR;
|
return SIM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
RegStatus getRegistrationStatus() {
|
RegStatus getRegistrationStatus() {
|
||||||
sendAT(GF("+CREG?"));
|
sendAT(GF("+CGREG?"));
|
||||||
if (waitResponse(GF(GSM_NL "+CREG:")) != 1) {
|
if (waitResponse(GF(GSM_NL "+CGREG:")) != 1) {
|
||||||
return REG_UNKNOWN;
|
return REG_UNKNOWN;
|
||||||
}
|
}
|
||||||
streamSkipUntil(','); // Skip format (0)
|
streamSkipUntil(','); // Skip format (0)
|
||||||
@@ -433,7 +456,7 @@ public:
|
|||||||
* Generic network functions
|
* Generic network functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int getSignalQuality() {
|
int16_t getSignalQuality() {
|
||||||
sendAT(GF("+CSQ"));
|
sendAT(GF("+CSQ"));
|
||||||
if (waitResponse(GF(GSM_NL "+CSQ:")) != 1) {
|
if (waitResponse(GF(GSM_NL "+CSQ:")) != 1) {
|
||||||
return 99;
|
return 99;
|
||||||
@@ -448,16 +471,6 @@ public:
|
|||||||
return (s == REG_OK_HOME || s == REG_OK_ROAMING);
|
return (s == REG_OK_HOME || s == REG_OK_ROAMING);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool waitForNetwork(unsigned long timeout = 60000L) {
|
|
||||||
for (unsigned long start = millis(); millis() - start < timeout; ) {
|
|
||||||
if (isNetworkConnected()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
delay(250);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -556,7 +569,6 @@ public:
|
|||||||
// get GPS informations
|
// get GPS informations
|
||||||
bool getGPS(float *lat, float *lon, float *speed=0, int *alt=0, int *vsat=0, int *usat=0) {
|
bool getGPS(float *lat, float *lon, float *speed=0, int *alt=0, int *vsat=0, int *usat=0) {
|
||||||
//String buffer = "";
|
//String buffer = "";
|
||||||
char chr_buffer[12];
|
|
||||||
bool fix = false;
|
bool fix = false;
|
||||||
|
|
||||||
sendAT(GF("+CGNSINF"));
|
sendAT(GF("+CGNSINF"));
|
||||||
@@ -754,6 +766,9 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IP Address functions
|
||||||
|
*/
|
||||||
|
|
||||||
String getLocalIP() {
|
String getLocalIP() {
|
||||||
sendAT(GF("+CIFSR;E0"));
|
sendAT(GF("+CIFSR;E0"));
|
||||||
@@ -767,9 +782,6 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
IPAddress localIP() {
|
|
||||||
return TinyGsmIpFromString(getLocalIP());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Phone Call functions
|
* Phone Call functions
|
||||||
@@ -916,7 +928,7 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getBattPercent() {
|
int8_t getBattPercent() {
|
||||||
sendAT(GF("+CBC"));
|
sendAT(GF("+CBC"));
|
||||||
if (waitResponse(GF(GSM_NL "+CBC:")) != 1) {
|
if (waitResponse(GF(GSM_NL "+CBC:")) != 1) {
|
||||||
return false;
|
return false;
|
||||||
@@ -927,6 +939,10 @@ public:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Client related functions
|
||||||
|
*/
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) {
|
bool modemConnect(const char* host, uint16_t port, uint8_t mux, bool ssl = false) {
|
||||||
@@ -942,7 +958,7 @@ protected:
|
|||||||
return (1 == rsp);
|
return (1 == rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int modemSend(const void* buff, size_t len, uint8_t mux) {
|
int16_t modemSend(const void* buff, size_t len, uint8_t mux) {
|
||||||
sendAT(GF("+CIPSEND="), mux, ',', len);
|
sendAT(GF("+CIPSEND="), mux, ',', len);
|
||||||
if (waitResponse(GF(">")) != 1) {
|
if (waitResponse(GF(">")) != 1) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1014,30 +1030,9 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/* Utilities */
|
/*
|
||||||
|
Utilities
|
||||||
template<typename T>
|
*/
|
||||||
void streamWrite(T last) {
|
|
||||||
stream.print(last);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
|
||||||
void streamWrite(T head, Args... tail) {
|
|
||||||
stream.print(head);
|
|
||||||
streamWrite(tail...);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool streamSkipUntil(const char c, const unsigned long timeout = 3000L) {
|
|
||||||
unsigned long startMillis = millis();
|
|
||||||
while (millis() - startMillis < timeout) {
|
|
||||||
while (millis() - startMillis < timeout && !stream.available()) {
|
|
||||||
TINY_GSM_YIELD();
|
|
||||||
}
|
|
||||||
if (stream.read() == c)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
void sendAT(Args... cmd) {
|
void sendAT(Args... cmd) {
|
||||||
@@ -1113,6 +1108,7 @@ finish:
|
|||||||
}
|
}
|
||||||
data = "";
|
data = "";
|
||||||
}
|
}
|
||||||
|
//DBG('<', index, '>');
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user