Gave the XBee a physical pin to use as a hard reset
This commit is contained in:
@@ -245,6 +245,16 @@ public:
|
||||
{
|
||||
beeType = XBEE_UNKNOWN; // Start not knowing what kind of bee it is
|
||||
guardTime = TINY_GSM_XBEE_GUARD_TIME; // Start with the default guard time of 1 second
|
||||
resetPin = -1;
|
||||
memset(sockets, 0, sizeof(sockets));
|
||||
}
|
||||
|
||||
TinyGsmXBee(Stream& stream, int8_t resetPin)
|
||||
: TinyGsmModem(stream), stream(stream)
|
||||
{
|
||||
beeType = XBEE_UNKNOWN; // Start not knowing what kind of bee it is
|
||||
guardTime = TINY_GSM_XBEE_GUARD_TIME; // Start with the default guard time of 1 second
|
||||
this->resetPin = resetPin;
|
||||
memset(sockets, 0, sizeof(sockets));
|
||||
}
|
||||
|
||||
@@ -254,6 +264,11 @@ public:
|
||||
|
||||
bool init(const char* pin = NULL) {
|
||||
|
||||
if (resetPin >= 0) {
|
||||
pinMode(resetPin, OUTPUT);
|
||||
digitalWrite(resetPin, HIGH);
|
||||
}
|
||||
|
||||
if (!commandMode(10)) return false; // Try up to 10 times for the init
|
||||
|
||||
sendAT(GF("AP0")); // Put in transparent mode
|
||||
@@ -383,6 +398,16 @@ public:
|
||||
* Power functions
|
||||
*/
|
||||
|
||||
// The XBee's have a bad habit of getting into an unresponsive funk
|
||||
// This uses the board's hardware reset pin to force it to reset
|
||||
void pinReset() {
|
||||
if (resetPin >= 0) {
|
||||
digitalWrite(resetPin, LOW);
|
||||
delay(1);
|
||||
digitalWrite(resetPin, HIGH);
|
||||
}
|
||||
}
|
||||
|
||||
bool restart() {
|
||||
if (!commandMode()) return false; // Return immediately
|
||||
if (beeType == XBEE_UNKNOWN) getSeries(); // how we restart depends on this
|
||||
@@ -874,7 +899,7 @@ finish:
|
||||
return waitResponse(1000, r1, r2, r3, r4, r5);
|
||||
}
|
||||
|
||||
bool commandMode(uint8_t retries = 2) {
|
||||
bool commandMode(uint8_t retries = 3) {
|
||||
uint8_t triesMade = 0;
|
||||
bool success = false;
|
||||
streamClear(); // Empty everything in the buffer before starting
|
||||
@@ -883,7 +908,12 @@ finish:
|
||||
// Default guard time is 1s, but the init fxn decreases it to 250 ms
|
||||
delay(guardTime);
|
||||
streamWrite(GF("+++")); // enter command mode
|
||||
success = (1 == waitResponse(guardTime*2));
|
||||
int res = waitResponse(guardTime*2);
|
||||
success = (1 == res);
|
||||
if (0 == res && triesMade > 2) {
|
||||
pinReset(); // if it's unresponsive, reset
|
||||
delay(100); // a short delay to allow it to come back up TODO-optimize this
|
||||
}
|
||||
triesMade ++;
|
||||
}
|
||||
return success;
|
||||
@@ -936,6 +966,7 @@ public:
|
||||
|
||||
protected:
|
||||
int16_t guardTime;
|
||||
int8_t resetPin;
|
||||
XBeeType beeType;
|
||||
GsmClient* sockets[TINY_GSM_MUX_COUNT];
|
||||
};
|
||||
|
Reference in New Issue
Block a user