Sequans modifications after testing
This commit is contained in:
		@@ -16,11 +16,11 @@
 | 
			
		||||
  #define TINY_GSM_RX_BUFFER 64
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define TINY_GSM_MUX_COUNT 5
 | 
			
		||||
#define TINY_GSM_MUX_COUNT 6
 | 
			
		||||
 | 
			
		||||
#include <TinyGsmCommon.h>
 | 
			
		||||
 | 
			
		||||
#define GSM_NL "\r"
 | 
			
		||||
#define GSM_NL "\r\n"
 | 
			
		||||
static const char GSM_OK[] TINY_GSM_PROGMEM = "OK" GSM_NL;
 | 
			
		||||
static const char GSM_ERROR[] TINY_GSM_PROGMEM = "ERROR" GSM_NL;
 | 
			
		||||
 | 
			
		||||
@@ -39,8 +39,6 @@ enum RegStatus {
 | 
			
		||||
  REG_UNKNOWN      = 4,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define NUM_SOCKETS 6
 | 
			
		||||
 | 
			
		||||
enum SocketStatus {
 | 
			
		||||
  SOCK_CLOSED                 = 0,
 | 
			
		||||
  SOCK_ACTIVE_DATA            = 1,
 | 
			
		||||
@@ -77,7 +75,9 @@ public:
 | 
			
		||||
    sock_connected = false;
 | 
			
		||||
    got_data = false;
 | 
			
		||||
 | 
			
		||||
    at->sockets[mux] = this;
 | 
			
		||||
    // adjust for zero indexed socket array vs Sequans' 1 indexed mux numbers
 | 
			
		||||
    // using modulus will force 6 back to 0
 | 
			
		||||
    at->sockets[mux % TINY_GSM_MUX_COUNT] = this;
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
@@ -217,19 +217,22 @@ public:
 | 
			
		||||
 | 
			
		||||
TINY_GSM_MODEM_SET_BAUD_IPR()
 | 
			
		||||
 | 
			
		||||
  bool testAT(unsigned long timeout_ms = 10000L) {
 | 
			
		||||
    for (unsigned long start = millis(); millis() - start < timeout_ms; ) {
 | 
			
		||||
      sendAT(GF(""));
 | 
			
		||||
      if (waitResponse(200) == 1) {
 | 
			
		||||
          delay(100);
 | 
			
		||||
          return true;
 | 
			
		||||
      }
 | 
			
		||||
      delay(100);
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
TINY_GSM_MODEM_TEST_AT()
 | 
			
		||||
 | 
			
		||||
TINY_GSM_MODEM_MAINTAIN_CHECK_SOCKS()
 | 
			
		||||
  void maintain() {
 | 
			
		||||
    for (int mux = 1; mux <= TINY_GSM_MUX_COUNT; mux++) {
 | 
			
		||||
      GsmClient* sock = sockets[mux % TINY_GSM_MUX_COUNT];
 | 
			
		||||
      if (sock && sock->got_data) {
 | 
			
		||||
        sock->got_data = false;
 | 
			
		||||
        sock->sock_available = modemGetAvailable(mux);
 | 
			
		||||
        // modemGetConnected() always checks the state of ALL socks
 | 
			
		||||
        modemGetConnected();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    while (stream.available()) {
 | 
			
		||||
      waitResponse(15, NULL, NULL);
 | 
			
		||||
  }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool factoryDefault() {
 | 
			
		||||
    sendAT(GF("&FZE0&W"));  // Factory + Reset + Echo Off + Write
 | 
			
		||||
@@ -262,12 +265,14 @@ TINY_GSM_MODEM_GET_INFO_ATI()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sendAT(GF("+CFUN=0"));
 | 
			
		||||
    if (waitResponse(10000L) != 1) {
 | 
			
		||||
    int res = waitResponse(20000L, GFP(GSM_OK), GFP(GSM_ERROR), GF("+SYSSTART")) ;
 | 
			
		||||
    if (res != 1 && res != 3) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sendAT(GF("+CFUN=1,1"));
 | 
			
		||||
    if (waitResponse(60000L, GF("+SYSSTART")) != 1) {
 | 
			
		||||
    res = waitResponse(20000L, GF("+SYSSTART"), GFP(GSM_ERROR)) ;
 | 
			
		||||
    if (res != 1 && res != 3) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    delay(1000);
 | 
			
		||||
@@ -289,12 +294,14 @@ TINY_GSM_MODEM_GET_INFO_ATI()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
    During sleep, the SIM800 module has its serial communication disabled. In order to reestablish communication
 | 
			
		||||
    pull the DRT-pin of the SIM800 module LOW for at least 50ms. Then use this function to disable sleep mode.
 | 
			
		||||
    The DTR-pin can then be released again.
 | 
			
		||||
   When power saving is enabled, UART0 interface is activated with sleep mode support.
 | 
			
		||||
   Module power state is controlled by RTS0 line.  When no activity on UART, CTS line
 | 
			
		||||
   will be set to OFF state (driven high level) <timeout> milliseconds (100ms to 10s,
 | 
			
		||||
   default 5s) after the last sent character, then module will go to sleep mode as soon
 | 
			
		||||
   as DTE set RTS line to OFF state (driver high level).
 | 
			
		||||
  */
 | 
			
		||||
  bool sleepEnable(bool enable = true) {
 | 
			
		||||
    sendAT(GF("+CSCLK="), enable);
 | 
			
		||||
    sendAT(GF("+SQNIPSCFG="), enable);
 | 
			
		||||
    return waitResponse() == 1;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -349,7 +356,7 @@ TINY_GSM_MODEM_GET_CSQ()
 | 
			
		||||
  bool isNetworkConnected() {
 | 
			
		||||
    RegStatus s = getRegistrationStatus();
 | 
			
		||||
    if (s == REG_OK_HOME || s == REG_OK_ROAMING) {
 | 
			
		||||
      DBG(F("connected with status:"), s);
 | 
			
		||||
      // DBG(F("connected with status:"), s);
 | 
			
		||||
      return true;
 | 
			
		||||
    } else {
 | 
			
		||||
      return false;
 | 
			
		||||
@@ -365,10 +372,11 @@ TINY_GSM_MODEM_WAIT_FOR_NETWORK()
 | 
			
		||||
  bool gprsConnect(const char* apn, const char* user = NULL, const char* pwd = NULL) {
 | 
			
		||||
    gprsDisconnect();
 | 
			
		||||
 | 
			
		||||
    // Define the PDP context
 | 
			
		||||
    // Define the PDP context (This uses context #3!)
 | 
			
		||||
    sendAT(GF("+CGDCONT=3,\"IPV4V6\",\""), apn, '"');
 | 
			
		||||
    waitResponse();
 | 
			
		||||
 | 
			
		||||
    // Set authentication
 | 
			
		||||
    if (user && strlen(user) > 0) {
 | 
			
		||||
      sendAT(GF("+CGAUTH=3,1,\""), user, GF("\",\""), pwd, GF("\""));
 | 
			
		||||
      waitResponse();
 | 
			
		||||
@@ -486,27 +494,55 @@ protected:
 | 
			
		||||
 | 
			
		||||
    if (ssl) {
 | 
			
		||||
      // enable SSl and use security profile 1
 | 
			
		||||
      //AT+SQNSSCFG=<connId>,<enable>,<spId>
 | 
			
		||||
      sendAT(GF("+SQNSSCFG="), mux, GF(",1,1"));
 | 
			
		||||
      if (waitResponse() != 1) {
 | 
			
		||||
        DBG("failed to configure secure socket");
 | 
			
		||||
        DBG("### WARNING: failed to configure secure socket");
 | 
			
		||||
        return false;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Socket configuration
 | 
			
		||||
    //AT+SQNSCFG:<connId1>, <cid1>, <pktSz1>, <maxTo1>, <connTo1>, <txTo1>
 | 
			
		||||
    // <connId1> = Connection ID = mux
 | 
			
		||||
    // <cid1> = PDP context ID = 3 - this is number set up above in the GprsConnect function
 | 
			
		||||
    // <pktSz1> = Packet Size, used for online data mode only = 300 (default)
 | 
			
		||||
    // <maxTo1> = Max timeout in seconds = 90 (default)
 | 
			
		||||
    // <connTo1> = Connection timeout in hundreds of milliseconds = 600 (default)
 | 
			
		||||
    // <txTo1> = Data sending timeout in hundreds of milliseconds, used for online data mode only = 50 (default)
 | 
			
		||||
    sendAT(GF("+SQNSCFG="), mux, GF(",3,300,90,600,50"));
 | 
			
		||||
    waitResponse();
 | 
			
		||||
    waitResponse(5000L);
 | 
			
		||||
 | 
			
		||||
    // Socket configuration extended
 | 
			
		||||
    //AT+SQNSCFGEXT:<connId1>, <srMode1>, <recvDataMode1>, <keepalive1>, <listenAutoRsp1>, <sendDataMode1>
 | 
			
		||||
    // <connId1> = Connection ID = mux
 | 
			
		||||
    // <srMode1> = Send/Receive URC model = 1 - data amount mode
 | 
			
		||||
    // <recvDataMode1> = Receive data mode = 0  - data as text (1 would be as hex)
 | 
			
		||||
    // <keepalive1> = unused = 0
 | 
			
		||||
    // <listenAutoRsp1> = Listen auto-response mode = 0 - deactivated
 | 
			
		||||
    // <sendDataMode1> = Send data mode = 0  - data as text (1 would be as hex)
 | 
			
		||||
    sendAT(GF("+SQNSCFGEXT="), mux, GF(",1,0,0,0,0"));
 | 
			
		||||
    waitResponse();
 | 
			
		||||
    waitResponse(5000L);
 | 
			
		||||
 | 
			
		||||
    // Socket dial
 | 
			
		||||
    //AT+SQNSD=<connId>,<txProt>,<rPort>,<IPaddr>[,<closureType>[,<lPort>[,<connMode>[,acceptAnyRemote]]]]
 | 
			
		||||
    // <connId> = Connection ID = mux
 | 
			
		||||
    // <txProt> = Transmission protocol = 0 - TCP (1 for UDP)
 | 
			
		||||
    // <rPort> = Remote host port to contact
 | 
			
		||||
    // <IPaddr> = Any valid IP address in the format “xxx.xxx.xxx.xxx” or any host name solved with a DNS query
 | 
			
		||||
    // <closureType> = Socket closure behaviour for TCP, has no effect for UDP = 0 - local port closes when remote does (default)
 | 
			
		||||
    // <lPort> = UDP connection local port, has no effect for TCP connections.
 | 
			
		||||
    // <connMode> = Connection mode = 1 - command mode connection
 | 
			
		||||
    // <acceptAnyRemote> = Applies to UDP only
 | 
			
		||||
    sendAT(GF("+SQNSD="), mux, ",0,", port, ',', GF("\""), host, GF("\""), ",0,0,1");
 | 
			
		||||
    rsp = waitResponse((timeout_ms - (millis() - startMillis)),
 | 
			
		||||
                      GF("OK" GSM_NL),
 | 
			
		||||
                      GFP(GSM_OK),
 | 
			
		||||
                      GFP(GSM_ERROR),
 | 
			
		||||
                      GF("NO CARRIER" GSM_NL)
 | 
			
		||||
                      );
 | 
			
		||||
 | 
			
		||||
    // creation of socket failed immediately.
 | 
			
		||||
    if (rsp != 1) return rsp;
 | 
			
		||||
    if (rsp != 1) return false;
 | 
			
		||||
 | 
			
		||||
    // wait until we get a good status
 | 
			
		||||
    bool connected = false;
 | 
			
		||||
@@ -519,14 +555,17 @@ protected:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  int modemSend(const void* buff, size_t len, uint8_t mux) {
 | 
			
		||||
    sendAT(GF("+SQNSSENDEXT="), mux, ',', len);
 | 
			
		||||
    if (waitResponse(5000, GF(GSM_NL "> ")) != 1) {
 | 
			
		||||
    if (sockets[mux % TINY_GSM_MUX_COUNT]->sock_connected == false) {
 | 
			
		||||
      DBG("### Sock closed, cannot send data!");
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sendAT(GF("+SQNSSENDEXT="), mux, ',', len);
 | 
			
		||||
    waitResponse(10000L, GF(GSM_NL "> "));
 | 
			
		||||
    stream.write((uint8_t*)buff, len);
 | 
			
		||||
    stream.flush();
 | 
			
		||||
    if (waitResponse() != 1) {
 | 
			
		||||
      DBG("no OK after send");
 | 
			
		||||
      DBG("### no OK after send");
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return len;
 | 
			
		||||
@@ -541,10 +580,14 @@ protected:
 | 
			
		||||
    streamSkipUntil(','); // Skip mux
 | 
			
		||||
    size_t len = stream.readStringUntil('\n').toInt();
 | 
			
		||||
    for (size_t i=0; i<len; i++) {
 | 
			
		||||
      TINY_GSM_MODEM_STREAM_TO_MUX_FIFO_WITH_DOUBLE_TIMEOUT
 | 
			
		||||
      uint32_t startMillis = millis(); \
 | 
			
		||||
      while (!stream.available() && ((millis() - startMillis) < sockets[mux % TINY_GSM_MUX_COUNT]->_timeout)) { TINY_GSM_YIELD(); } \
 | 
			
		||||
      char c = stream.read(); \
 | 
			
		||||
      sockets[mux % TINY_GSM_MUX_COUNT]->rx.put(c);
 | 
			
		||||
    }
 | 
			
		||||
    // DBG("### Read:", len, "from", mux);
 | 
			
		||||
    waitResponse();
 | 
			
		||||
    sockets[mux]->sock_available = modemGetAvailable(mux);
 | 
			
		||||
    sockets[mux % TINY_GSM_MUX_COUNT]->sock_available = modemGetAvailable(mux);
 | 
			
		||||
    return len;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -553,34 +596,44 @@ protected:
 | 
			
		||||
    size_t result = 0;
 | 
			
		||||
    if (waitResponse(GF("+SQNSI:")) == 1) {
 | 
			
		||||
      streamSkipUntil(','); // Skip mux
 | 
			
		||||
      streamSkipUntil(','); // Skip sent
 | 
			
		||||
      streamSkipUntil(','); // Skip received
 | 
			
		||||
      result = stream.readStringUntil(',').toInt();
 | 
			
		||||
      streamSkipUntil(','); // Skip total sent
 | 
			
		||||
      streamSkipUntil(','); // Skip total received
 | 
			
		||||
      result = stream.readStringUntil(',').toInt();  // keep data not yet read
 | 
			
		||||
      waitResponse();
 | 
			
		||||
    }
 | 
			
		||||
    if (!result) {
 | 
			
		||||
      sockets[mux]->sock_connected = modemGetConnected(mux);
 | 
			
		||||
    }
 | 
			
		||||
    // DBG("### Available:", result, "on", mux);
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool modemGetConnected(uint8_t mux) {
 | 
			
		||||
  bool modemGetConnected(uint8_t mux = 1) {
 | 
			
		||||
    // This single command always returns the connection status of all
 | 
			
		||||
    // six possible sockets.
 | 
			
		||||
    sendAT(GF("+SQNSS"));
 | 
			
		||||
    uint8_t m = 0;
 | 
			
		||||
    uint8_t status = 0;
 | 
			
		||||
 | 
			
		||||
    while (true) {
 | 
			
		||||
    for (int muxNo = 1; muxNo <= TINY_GSM_MUX_COUNT; muxNo++) {
 | 
			
		||||
      if (waitResponse(GFP(GSM_OK), GF(GSM_NL "+SQNSS: ")) != 2) {
 | 
			
		||||
        break;
 | 
			
		||||
      };
 | 
			
		||||
      m = stream.readStringUntil(',').toInt();
 | 
			
		||||
      if (m == mux) {
 | 
			
		||||
        status = stream.readStringUntil(',').toInt();
 | 
			
		||||
      }
 | 
			
		||||
      streamSkipUntil('\n'); // Skip
 | 
			
		||||
      uint8_t status = 0;
 | 
			
		||||
      // if (stream.readStringUntil(',').toInt() != muxNo) { // check the mux no
 | 
			
		||||
      //   DBG("### Warning: misaligned mux numbers!");
 | 
			
		||||
      // }
 | 
			
		||||
      streamSkipUntil(',');  // skip mux [use muxNo]
 | 
			
		||||
      status = stream.parseInt();  // Read the status
 | 
			
		||||
      // if mux is in use, will have comma then other info after the status
 | 
			
		||||
      // if not, there will be new line immediately after status
 | 
			
		||||
      // streamSkipUntil('\n'); // Skip port and IP info
 | 
			
		||||
      // SOCK_CLOSED                 = 0,
 | 
			
		||||
      // SOCK_ACTIVE_DATA            = 1,
 | 
			
		||||
      // SOCK_SUSPENDED              = 2,
 | 
			
		||||
      // SOCK_SUSPENDED_PENDING_DATA = 3,
 | 
			
		||||
      // SOCK_LISTENING              = 4,
 | 
			
		||||
      // SOCK_INCOMING               = 5,
 | 
			
		||||
      // SOCK_OPENING                = 6,
 | 
			
		||||
      sockets[muxNo % TINY_GSM_MUX_COUNT]->sock_connected = \
 | 
			
		||||
        ((status != SOCK_CLOSED) && (status != SOCK_INCOMING) && (status != SOCK_OPENING));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ((status != SOCK_CLOSED) && (status != SOCK_INCOMING) && (status != SOCK_OPENING));
 | 
			
		||||
    waitResponse();  // Should be an OK at the end
 | 
			
		||||
    return sockets[mux % TINY_GSM_MUX_COUNT]->sock_connected;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
@@ -628,18 +681,20 @@ TINY_GSM_MODEM_STREAM_UTILITIES()
 | 
			
		||||
          goto finish;
 | 
			
		||||
        } else if (data.endsWith(GF(GSM_NL "+SQNSRING:"))) {
 | 
			
		||||
          int mux = stream.readStringUntil(',').toInt();
 | 
			
		||||
          if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) {
 | 
			
		||||
            sockets[mux]->got_data = true;
 | 
			
		||||
          int len = stream.readStringUntil('\n').toInt();
 | 
			
		||||
          if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux % TINY_GSM_MUX_COUNT]) {
 | 
			
		||||
            sockets[mux % TINY_GSM_MUX_COUNT]->got_data = true;
 | 
			
		||||
            sockets[mux % TINY_GSM_MUX_COUNT]->sock_available = len;
 | 
			
		||||
          }
 | 
			
		||||
          stream.readStringUntil('\n');
 | 
			
		||||
          data = "";
 | 
			
		||||
          DBG("### URC Data Received:", len, "on", mux);
 | 
			
		||||
        } else if (data.endsWith(GF("SQNSH: "))) {
 | 
			
		||||
          int mux = stream.readStringUntil('\n').toInt();
 | 
			
		||||
          if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) {
 | 
			
		||||
            sockets[mux]->sock_connected = false;
 | 
			
		||||
          if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux % TINY_GSM_MUX_COUNT]) {
 | 
			
		||||
            sockets[mux % TINY_GSM_MUX_COUNT]->sock_connected = false;
 | 
			
		||||
          }
 | 
			
		||||
          data = "";
 | 
			
		||||
          DBG("### Closed: ", mux);
 | 
			
		||||
          DBG("### URC Sock Closed: ", mux);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } while (millis() - startMillis < timeout_ms);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user