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
|
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
|
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));
|
memset(sockets, 0, sizeof(sockets));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,6 +264,11 @@ public:
|
|||||||
|
|
||||||
bool init(const char* pin = NULL) {
|
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
|
if (!commandMode(10)) return false; // Try up to 10 times for the init
|
||||||
|
|
||||||
sendAT(GF("AP0")); // Put in transparent mode
|
sendAT(GF("AP0")); // Put in transparent mode
|
||||||
@@ -383,6 +398,16 @@ public:
|
|||||||
* Power functions
|
* 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() {
|
bool restart() {
|
||||||
if (!commandMode()) return false; // Return immediately
|
if (!commandMode()) return false; // Return immediately
|
||||||
if (beeType == XBEE_UNKNOWN) getSeries(); // how we restart depends on this
|
if (beeType == XBEE_UNKNOWN) getSeries(); // how we restart depends on this
|
||||||
@@ -874,7 +899,7 @@ finish:
|
|||||||
return waitResponse(1000, r1, r2, r3, r4, r5);
|
return waitResponse(1000, r1, r2, r3, r4, r5);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool commandMode(uint8_t retries = 2) {
|
bool commandMode(uint8_t retries = 3) {
|
||||||
uint8_t triesMade = 0;
|
uint8_t triesMade = 0;
|
||||||
bool success = false;
|
bool success = false;
|
||||||
streamClear(); // Empty everything in the buffer before starting
|
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
|
// Default guard time is 1s, but the init fxn decreases it to 250 ms
|
||||||
delay(guardTime);
|
delay(guardTime);
|
||||||
streamWrite(GF("+++")); // enter command mode
|
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 ++;
|
triesMade ++;
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
@@ -936,6 +966,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
int16_t guardTime;
|
int16_t guardTime;
|
||||||
|
int8_t resetPin;
|
||||||
XBeeType beeType;
|
XBeeType beeType;
|
||||||
GsmClient* sockets[TINY_GSM_MUX_COUNT];
|
GsmClient* sockets[TINY_GSM_MUX_COUNT];
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user