Skip to content

Commit 714995d

Browse files
new callback functions for console and diags; fix compilation ambiguity on 32-bit compilers; fix minor power-on delay issue
1 parent a3cfd7f commit 714995d

File tree

2 files changed

+83
-114
lines changed

2 files changed

+83
-114
lines changed

IridiumSBD.cpp

+39-96
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ Private interface
191191

192192
int IridiumSBD::internalBegin()
193193
{
194-
dbg(F("Calling internalBegin\r\n"));
194+
diag.print(F("Calling internalBegin\r\n"));
195195

196196
if (!this->asleep)
197197
return ISBD_ALREADY_AWAKE;
@@ -216,7 +216,7 @@ int IridiumSBD::internalBegin()
216216

217217
if (!modemAlive)
218218
{
219-
dbg(F("No modem detected.\r\n"));
219+
diag.print(F("No modem detected.\r\n"));
220220
return ISBD_NO_MODEM_DETECTED;
221221
}
222222

@@ -228,13 +228,13 @@ int IridiumSBD::internalBegin()
228228
return cancelled() ? ISBD_CANCELLED : ISBD_PROTOCOL_ERROR;
229229
}
230230

231-
dbg(F("InternalBegin: success!\r\n"));
231+
diag.print(F("InternalBegin: success!\r\n"));
232232
return ISBD_SUCCESS;
233233
}
234234

235235
int IridiumSBD::internalSendReceiveSBD(const char *txTxtMessage, const uint8_t *txData, size_t txDataSize, uint8_t *rxBuffer, size_t *prxBufferSize)
236236
{
237-
dbg(F("internalSendReceive\r\n"));
237+
diag.print(F("internalSendReceive\r\n"));
238238

239239
if (this->asleep)
240240
return ISBD_IS_ASLEEP;
@@ -255,13 +255,14 @@ int IridiumSBD::internalSendReceiveSBD(const char *txTxtMessage, const uint8_t *
255255
checksum += (uint16_t)txData[i];
256256
}
257257

258-
console(F("["));
259-
console(txDataSize);
260-
console(F(" bytes]"));
258+
cons.print(F("["));
259+
cons.print(txDataSize);
260+
cons.print(F(" bytes]"));
261+
262+
diag.print(F("Checksum:"));
263+
diag.print(checksum);
264+
diag.print(F("\r\n"));
261265

262-
dbg(F("Checksum:"));
263-
dbg(checksum);
264-
dbg(F("\r\n"));
265266
stream.write(checksum >> 8);
266267
stream.write(checksum & 0xFF);
267268

@@ -303,18 +304,18 @@ int IridiumSBD::internalSendReceiveSBD(const char *txTxtMessage, const uint8_t *
303304
if (ret != ISBD_SUCCESS)
304305
return ret;
305306

306-
dbg(F("SBDIX MO code: "));
307-
dbg(moCode);
308-
dbg(F("\r\n"));
307+
diag.print(F("SBDIX MO code: "));
308+
diag.print(moCode);
309+
diag.print(F("\r\n"));
309310

310311
if (moCode >= 0 && moCode <= 4) // successful return!
311312
{
312-
dbg(F("SBDIX success!\r\n"));
313+
diag.print(F("SBDIX success!\r\n"));
313314

314315
this->remainingMessages = mtRemaining;
315316
if (mtCode == 1 && rxBuffer) // retrieved 1 message
316317
{
317-
dbg(F("Incoming message!\r\n"));
318+
diag.print(F("Incoming message!\r\n"));
318319
return doSBDRB(rxBuffer, prxBufferSize);
319320
}
320321

@@ -329,27 +330,27 @@ int IridiumSBD::internalSendReceiveSBD(const char *txTxtMessage, const uint8_t *
329330

330331
else if (moCode == 12 || moCode == 14 || moCode == 16) // fatal failure: no retry
331332
{
332-
dbg(F("SBDIX fatal!\r\n"));
333+
diag.print(F("SBDIX fatal!\r\n"));
333334
return ISBD_SBDIX_FATAL_ERROR;
334335
}
335336

336337
else // retry
337338
{
338-
dbg(F("Waiting for SBDIX retry...\r\n"));
339+
diag.print(F("Waiting for SBDIX retry...\r\n"));
339340
if (!smartWait(sbdixInterval))
340341
return ISBD_CANCELLED;
341342
}
342343
}
343344

344345
else // signal strength == 0
345346
{
346-
dbg(F("Waiting for CSQ retry...\r\n"));
347+
diag.print(F("Waiting for CSQ retry...\r\n"));
347348
if (!smartWait(csqInterval))
348349
return ISBD_CANCELLED;
349350
}
350351
} // big wait loop
351352

352-
dbg(F("SBDIX timeout!\r\n"));
353+
diag.print(F("SBDIX timeout!\r\n"));
353354
return ISBD_SENDRECEIVE_TIMEOUT;
354355
}
355356

@@ -432,9 +433,9 @@ bool IridiumSBD::smartWait(int seconds)
432433
// stored in response buffer for later parsing by caller.
433434
bool IridiumSBD::waitForATResponse(char *response, int responseSize, const char *prompt, const char *terminator)
434435
{
435-
dbg(F("Waiting for response "));
436-
dbg(terminator);
437-
dbg(F("\r\n"));
436+
diag.print(F("Waiting for response "));
437+
diag.print(terminator);
438+
diag.print(F("\r\n"));
438439

439440
if (response)
440441
memset(response, 0, responseSize);
@@ -444,7 +445,7 @@ bool IridiumSBD::waitForATResponse(char *response, int responseSize, const char
444445
int matchTerminatorPos = 0; // Matches chars in terminator
445446
enum {LOOKING_FOR_PROMPT, GATHERING_RESPONSE, LOOKING_FOR_TERMINATOR};
446447
int promptState = prompt ? LOOKING_FOR_PROMPT : LOOKING_FOR_TERMINATOR;
447-
console(F("<< "));
448+
cons.print(F("<< "));
448449
for (unsigned long start=millis(); millis() - start < 1000UL * atTimeout;)
449450
{
450451
if (cancelled())
@@ -453,7 +454,7 @@ bool IridiumSBD::waitForATResponse(char *response, int responseSize, const char
453454
while (stream.available() > 0)
454455
{
455456
char c = stream.read();
456-
console(c);
457+
cons.print(c);
457458
if (prompt)
458459
switch(promptState)
459460
{
@@ -510,62 +511,6 @@ bool IridiumSBD::cancelled()
510511
return false;
511512
}
512513

513-
void IridiumSBD::dbg(FlashString msg)
514-
{
515-
#if ISBD_DIAGS
516-
if (this->pDiagsStream)
517-
pDiagsStream->print(msg);
518-
#endif
519-
}
520-
521-
void IridiumSBD::dbg(const char *msg)
522-
{
523-
#if ISBD_DIAGS
524-
if (this->pDiagsStream)
525-
pDiagsStream->print(msg);
526-
#endif
527-
}
528-
529-
void IridiumSBD::dbg(uint16_t n)
530-
{
531-
#if ISBD_DIAGS
532-
if (this->pDiagsStream)
533-
pDiagsStream->print(n);
534-
#endif
535-
}
536-
537-
void IridiumSBD::dbg(char c)
538-
{
539-
#if ISBD_DIAGS
540-
if (this->pDiagsStream)
541-
pDiagsStream->print(c);
542-
#endif
543-
}
544-
545-
void IridiumSBD::console(FlashString msg)
546-
{
547-
if (this->pConsoleStream)
548-
pConsoleStream->print(msg);
549-
}
550-
551-
void IridiumSBD::console(const char *msg)
552-
{
553-
if (this->pConsoleStream)
554-
pConsoleStream->print(msg);
555-
}
556-
557-
void IridiumSBD::console(char c)
558-
{
559-
if (this->pConsoleStream)
560-
pConsoleStream->print(c);
561-
}
562-
563-
void IridiumSBD::console(uint16_t n)
564-
{
565-
if (this->pConsoleStream)
566-
pConsoleStream->print(n);
567-
}
568-
569514
int IridiumSBD::doSBDIX(uint16_t &moCode, uint16_t &moMSN, uint16_t &mtCode, uint16_t &mtMSN, uint16_t &mtLen, uint16_t &mtRemaining)
570515
{
571516
// xx, xxxxx, xx, xxxxx, xx, xxx
@@ -607,9 +552,9 @@ int IridiumSBD::doSBDRB(uint8_t *rxBuffer, size_t *prxBufferSize)
607552
return ISBD_SENDRECEIVE_TIMEOUT;
608553

609554
uint16_t size = 256 * stream.read() + stream.read();
610-
console(F("[Binary size:"));
611-
console(size);
612-
console(F("]"));
555+
cons.print(F("[Binary size:"));
556+
cons.print(size);
557+
cons.print(F("]"));
613558

614559
for (uint16_t bytesRead = 0; bytesRead < size;)
615560
{
@@ -648,9 +593,9 @@ int IridiumSBD::doSBDRB(uint8_t *rxBuffer, size_t *prxBufferSize)
648593
return ISBD_SENDRECEIVE_TIMEOUT;
649594

650595
uint16_t checksum = 256 * stream.read() + stream.read();
651-
console(F("[csum:"));
652-
console(checksum);
653-
console(F("]"));
596+
cons.print(F("[csum:"));
597+
cons.print(checksum);
598+
cons.print(F("]"));
654599

655600
// Return actual size of returned buffer
656601
if (prxBufferSize)
@@ -661,8 +606,6 @@ int IridiumSBD::doSBDRB(uint8_t *rxBuffer, size_t *prxBufferSize)
661606

662607
void IridiumSBD::power(bool on)
663608
{
664-
static unsigned long lastPowerOnTime = 0UL;
665-
666609
this->asleep = !on;
667610

668611
if (this->sleepPin == -1)
@@ -672,7 +615,7 @@ void IridiumSBD::power(bool on)
672615

673616
if (on)
674617
{
675-
dbg(F("Powering on RockBLOCK...!\r\n"));
618+
diag.print(F("Powering on RockBLOCK...!\r\n"));
676619
digitalWrite(this->sleepPin, HIGH); // HIGH = awake
677620
lastPowerOnTime = millis();
678621
}
@@ -683,31 +626,31 @@ void IridiumSBD::power(bool on)
683626
// before powering off again
684627
unsigned long elapsed = millis() - lastPowerOnTime;
685628
if (elapsed < 2000UL)
686-
delay(elapsed);
629+
delay(2000UL - elapsed);
687630

688-
dbg(F("Powering off RockBLOCK...!\r\n"));
631+
diag.print(F("Powering off RockBLOCK...!\r\n"));
689632
digitalWrite(this->sleepPin, LOW); // LOW = asleep
690633
}
691634
}
692635

693636
void IridiumSBD::send(FlashString str, bool beginLine, bool endLine)
694637
{
695638
if (beginLine)
696-
console(F(">> "));
697-
console(str);
639+
cons.print(F(">> "));
640+
cons.print(str);
698641
if (endLine)
699-
console(F("\r\n"));
642+
cons.print(F("\r\n"));
700643
stream.print(str);
701644
}
702645

703646
void IridiumSBD::send(const char *str)
704647
{
705-
console(str);
648+
cons.print(str);
706649
stream.print(str);
707650
}
708651

709652
void IridiumSBD::send(uint16_t n)
710653
{
711-
console(n);
654+
cons.print(n);
712655
stream.print(n);
713656
}

IridiumSBD.h

+44-18
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2626
#include <Stream.h> // for Stream
2727
#include "Arduino.h"
2828

29-
#define ISBD_LIBRARY_REVISION 1
29+
#define ISBD_LIBRARY_REVISION 2
3030

3131
#define ISBD_DIAGS 1
3232

@@ -52,7 +52,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
5252
#define ISBD_IS_ASLEEP 10
5353
#define ISBD_NO_SLEEP_PIN 11
5454

55-
extern bool ISBDCallback() __attribute__ ((weak));
55+
extern bool ISBDCallback() __attribute__((weak));
56+
extern void ConsoleCallback(uint8_t c) __attribute__((weak));
57+
extern void DiagsCallback(uint8_t c) __attribute__((weak));
5658
typedef const __FlashStringHelper *FlashString;
5759

5860
class IridiumSBD
@@ -80,7 +82,7 @@ class IridiumSBD
8082
void attachDiags(Stream &stream);
8183
#endif
8284

83-
IridiumSBD(Stream &str, int sleepPinNo = -1) :
85+
IridiumSBD(Stream &str, int sleepPinNo = -1) :
8486
stream(str),
8587
pConsoleStream(NULL),
8688
#if ISBD_DIAGS
@@ -95,17 +97,50 @@ class IridiumSBD
9597
reentrant(false),
9698
sleepPin(sleepPinNo),
9799
minimumCSQ(ISBD_DEFAULT_CSQ_MINIMUM),
98-
useWorkaround(true)
100+
useWorkaround(true),
101+
lastPowerOnTime(0UL),
102+
diag(this, true),
103+
cons(this, false)
99104
{
100-
pinMode(sleepPin, OUTPUT);
105+
if (sleepPin != -1)
106+
pinMode(sleepPin, OUTPUT);
101107
}
102108

103109
private:
104-
Stream &stream;
105-
Stream *pConsoleStream;
110+
Stream &stream; // Communicating with the Iridium
111+
Stream *pConsoleStream; // user provided; for debugging the serial stream
106112
#if ISBD_DIAGS
107-
Stream *pDiagsStream;
113+
Stream *pDiagsStream; // diagnostic messages
108114
#endif
115+
116+
class StreamShim : public Print
117+
{
118+
private:
119+
bool diags;
120+
IridiumSBD *isbd;
121+
public:
122+
// StreamShim(Stream *s, void(*f)(char c) __attribute__((weak))) : stream(s), callback(f) {}
123+
StreamShim(IridiumSBD *isbd, bool d) : isbd(isbd), diags(d) {}
124+
virtual size_t write(uint8_t b)
125+
{
126+
if (diags)
127+
{
128+
if (isbd->pDiagsStream)
129+
isbd->pDiagsStream->write(b);
130+
}
131+
else
132+
{
133+
if (isbd->pConsoleStream)
134+
isbd->pConsoleStream->write(b);
135+
}
136+
void(*f)(uint8_t b) = diags ? DiagsCallback : ConsoleCallback;
137+
if (f) f(b);
138+
return 1;
139+
}
140+
};
141+
142+
StreamShim diag;
143+
StreamShim cons;
109144

110145
// Timings
111146
int csqInterval;
@@ -120,6 +155,7 @@ class IridiumSBD
120155
int sleepPin;
121156
int minimumCSQ;
122157
bool useWorkaround;
158+
unsigned long lastPowerOnTime;
123159

124160
// Internal utilities
125161
bool smartWait(int seconds);
@@ -140,14 +176,4 @@ class IridiumSBD
140176
void send(uint16_t n);
141177

142178
bool cancelled();
143-
144-
void dbg(FlashString str);
145-
void dbg(const char *str);
146-
void dbg(uint16_t n);
147-
void dbg(char c);
148-
149-
void console(FlashString str);
150-
void console(const char *str);
151-
void console(uint16_t n);
152-
void console(char c);
153179
};

0 commit comments

Comments
 (0)