From 68c112d60c70f8d6fd0c16da9cf215168bdefb0f Mon Sep 17 00:00:00 2001 From: Andrew Yong Date: Mon, 14 Jul 2025 16:29:58 +0800 Subject: [PATCH 1/4] feat: Function to adjust SBD Session Timeout Signed-off-by: Andrew Yong --- src/IridiumSBD.cpp | 33 +++++++++++++++++++++++++++++++++ src/IridiumSBD.h | 5 +++++ 2 files changed, 38 insertions(+) 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; From 68136bcd0e959a172974ac3db7125d110a919483 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 30 Jul 2025 11:53:39 +0100 Subject: [PATCH 2/4] Update keywords.txt --- keywords.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/keywords.txt b/keywords.txt index bb5a4e9..b0770e7 100644 --- a/keywords.txt +++ b/keywords.txt @@ -23,6 +23,7 @@ sleep KEYWORD2 isAsleep KEYWORD2 setPowerProfile KEYWORD2 adjustATTimeout KEYWORD2 +adjustSBDSessionTimeout KEYWORD2 adjustSendReceiveTimeout KEYWORD2 adjustStartupTimeout KEYWORD2 useMSSTMWorkaround KEYWORD2 From cc6c2298b0bad199282df2b7e77eaced034327c3 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 30 Jul 2025 11:56:25 +0100 Subject: [PATCH 3/4] Update SendReceive examples --- .../Example6_SendReceive/Example6_SendReceive.ino | 6 ++++++ .../Example6_SendReceive/Example6_SendReceive.ino | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/examples/I2C_Examples__Qwiic_Iridium/Example6_SendReceive/Example6_SendReceive.ino b/examples/I2C_Examples__Qwiic_Iridium/Example6_SendReceive/Example6_SendReceive.ino index 181f108..d158235 100644 --- a/examples/I2C_Examples__Qwiic_Iridium/Example6_SendReceive/Example6_SendReceive.ino +++ b/examples/I2C_Examples__Qwiic_Iridium/Example6_SendReceive/Example6_SendReceive.ino @@ -47,6 +47,12 @@ void setup() //clean up while(Serial.available() > 0) Serial.read(); + // If desired, you can set the SBD session timeout to prevent unhelpful ISBD_PROTOCOL_ERRORs. + // The default is 0 (no timeout). + #define SATELLITE_TIMEOUT_SBDIX 30 + //modem.adjustATTimeout(SATELLITE_TIMEOUT_SBDIX + 2); // Set the AT timeout slightly longer + //modem.adjustSBDSessionTimeout(SATELLITE_TIMEOUT_SBDIX); // Set the SBD timeout to 30 seconds + // Start the I2C wire port connected to the satellite modem Wire.begin(); Wire.setClock(400000); //Set I2C clock speed to 400kHz diff --git a/examples/Serial_Examples__RockBLOCK/Example6_SendReceive/Example6_SendReceive.ino b/examples/Serial_Examples__RockBLOCK/Example6_SendReceive/Example6_SendReceive.ino index 673b0fd..2997eb2 100644 --- a/examples/Serial_Examples__RockBLOCK/Example6_SendReceive/Example6_SendReceive.ino +++ b/examples/Serial_Examples__RockBLOCK/Example6_SendReceive/Example6_SendReceive.ino @@ -36,6 +36,12 @@ void setup() while (!Serial); IridiumSerial.begin(19200); + // If desired, you can set the SBD session timeout to prevent unhelpful ISBD_PROTOCOL_ERRORs. + // The default is 0 (no timeout). + #define SATELLITE_TIMEOUT_SBDIX 30 + //modem.adjustATTimeout(SATELLITE_TIMEOUT_SBDIX + 2); // Set the AT timeout slightly longer + //modem.adjustSBDSessionTimeout(SATELLITE_TIMEOUT_SBDIX); // Set the SBD timeout to 30 seconds + // Setup the Iridium modem modem.setPowerProfile(IridiumSBD::USB_POWER_PROFILE); if (modem.begin() != ISBD_SUCCESS) From e124a745a184ef155f537020e224672f4f7a3b63 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 30 Jul 2025 11:56:39 +0100 Subject: [PATCH 4/4] v3.0.8 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index d403378..998f528 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=IridiumSBDi2c -version=3.0.7 +version=3.0.8 author=Mikal Hart and Paul Clark (PaulZC) maintainer=SparkFun Electronics sentence=This library supports satellite data transmissions from anywhere on earth using the RockBLOCK family of Iridium 9602 and 9603 modems.