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