diff --git a/src/IridiumSBD.cpp b/src/IridiumSBD.cpp index f7b1c8b..b02ef28 100644 --- a/src/IridiumSBD.cpp +++ b/src/IridiumSBD.cpp @@ -171,6 +171,24 @@ void IridiumSBD::adjustATTimeout(int seconds) this->atTimeout = seconds; } +// Tweak SBD Session Timeout +int IridiumSBD::adjustSBDSessionTimeout(int seconds) +{ + if ((seconds >= this->atTimeout) || seconds == 0) + diagprint(F("SBD commands that do not complete before AT timeout will return ISBD_PROTOCOL_ERROR\r\n")); + + if (!this->asleep) + { + send(F("AT+SBDST="), true, false); + send(seconds); + send(F("\r"), false); + if (!waitForATResponse()) + return cancelled() ? ISBD_CANCELLED : ISBD_PROTOCOL_ERROR; + } + this->sbdSessionTimeout = seconds; + return ISBD_SUCCESS; +} + // Tweak Send/Receive SBDIX process timeout void IridiumSBD::adjustSendReceiveTimeout(int seconds) { @@ -614,6 +632,21 @@ int IridiumSBD::internalBegin() } diagprint(F("MSSTM workaround is")); diagprint(msstmWorkaroundRequested ? F("") : F(" NOT")); diagprint(F(" enforced.\r\n")); + // Set SBD session timeout only if it has been changed from the default (to avoid regressions) + // ISU AT Command Reference: "The setting is stored only while the SBD Modem is powered up, and defaults to zero (meaning infinite timeout) after a power-cycle." + if (this->sbdSessionTimeout != ISBD_DEFAULT_SBDSESSION_TIMEOUT) + { + ret = adjustSBDSessionTimeout(this->sbdSessionTimeout); + if (ret != ISBD_SUCCESS) + { + diagprint(F("adjustSBDSessionTimeout: failed\r\n")); + } + else + { + diagprint(F("adjustSBDSessionTimeout: success!\r\n")); + } + } + // Done! diagprint(F("InternalBegin: success!\r\n")); return ISBD_SUCCESS; diff --git a/src/IridiumSBD.h b/src/IridiumSBD.h index ebfce06..b2268c2 100644 --- a/src/IridiumSBD.h +++ b/src/IridiumSBD.h @@ -67,6 +67,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define ISBD_DEFAULT_AT_TIMEOUT 30 #define ISBD_MSSTM_RETRY_INTERVAL 10 #define ISBD_DEFAULT_SBDIX_INTERVAL 10 +#define ISBD_DEFAULT_SBDSESSION_TIMEOUT 0 #define ISBD_USB_SBDIX_INTERVAL 30 #define ISBD_DEFAULT_SENDRECEIVE_TIME 300 #define ISBD_STARTUP_MAX_TIME 240 @@ -113,6 +114,7 @@ class IridiumSBD typedef enum { DEFAULT_POWER_PROFILE = 0, USB_POWER_PROFILE = 1 } POWERPROFILE; void setPowerProfile(POWERPROFILE profile); // 0 = direct connect (default), 1 = USB void adjustATTimeout(int seconds); // default value = 30 seconds + int adjustSBDSessionTimeout(int seconds); // 0 = infinite (default) void adjustSendReceiveTimeout(int seconds); // default value = 300 seconds void adjustStartupTimeout(int seconds); // default value = 240 seconds void useMSSTMWorkaround(bool useMSSTMWorkAround); // true to use workaround from Iridium Alert 5/7/13 @@ -147,6 +149,7 @@ class IridiumSBD useSerial = true; stream = &str; sbdixInterval = ISBD_USB_SBDIX_INTERVAL; + sbdSessionTimeout = ISBD_DEFAULT_SBDSESSION_TIMEOUT; atTimeout = ISBD_DEFAULT_AT_TIMEOUT; sendReceiveTimeout = ISBD_DEFAULT_SENDRECEIVE_TIME; startupTimeout = ISBD_STARTUP_MAX_TIME; @@ -177,6 +180,7 @@ class IridiumSBD wireport = &wirePort; deviceaddress = deviceAddress; sbdixInterval = ISBD_USB_SBDIX_INTERVAL; + sbdSessionTimeout = ISBD_DEFAULT_SBDSESSION_TIMEOUT; atTimeout = ISBD_DEFAULT_AT_TIMEOUT; sendReceiveTimeout = ISBD_DEFAULT_SENDRECEIVE_TIME; startupTimeout = ISBD_STARTUP_MAX_TIME; @@ -217,6 +221,7 @@ class IridiumSBD // Timings int sbdixInterval; + int sbdSessionTimeout; int atTimeout; int sendReceiveTimeout; int startupTimeout;