Xbee API library with support SPI connection. (use only SPI supported model. see also http://www.digi.com/support/kbase/kbaseresultdetl?id=3362 )

Dependents:   XBeeWiFi_SPI_example

Fork of XBee by Suga koubou

Revision:
9:e32c2e5390d3
Parent:
6:6f84e2840408
Child:
10:eb70be6ceb6d
--- a/XBee.cpp	Tue Dec 31 05:31:24 2013 +0000
+++ b/XBee.cpp	Fri Jan 03 03:33:03 2014 +0000
@@ -672,6 +672,7 @@
     _response.reset();
 }
 
+#ifdef XBEE_USE_UART
 XBee::XBee(PinName p_tx, PinName p_rx): _xbee(p_tx, p_rx) {
     _pos = 0;
     _epos = 0;
@@ -724,6 +725,31 @@
     _response.init();
     _response.setFrameData(_responseFrameData);
 }
+#endif
+
+#ifdef XBEE_USE_SPI
+XBee::XBee(PinName p_mosi, PinName p_miso, PinName p_sclk, PinName p_ssel, PinName p_attn, PinName p_reset):
+    _xbee(p_mosi, p_miso, p_sclk), _ssel(p_ssel), _attn(p_attn), _reset(p_reset) {
+    _ssel = 1;
+    
+    _pos = 0;
+    _epos = 0;
+    _escape = false;
+    _checksumTotal = 0;
+    _nextFrameId = 0;
+
+    _xbee.format(8,0);
+    _xbee.frequency(3500000);
+    
+    _reset = 0;
+    wait_ms(20);
+    _reset = 1;
+    wait_ms(100);
+    
+    _response.init();
+    _response.setFrameData(_responseFrameData);
+}
+#endif
 
 uint8_t XBee::getNextFrameId() {
 
@@ -737,9 +763,11 @@
     return _nextFrameId;
 }
 
+#ifdef XBEE_USE_UART
 void XBee::begin(long baud) {
     _xbee.baud(baud);
 }
+#endif
 
 /*
 void XBee::setSerial(HardwareSerial serial) {
@@ -781,6 +809,7 @@
 
     while (int((millis() - start)) < timeout) {
 */
+    DBG("(readPacket timeout=%d)\r\n", timeout);
     t.reset();
     t.start();
     while (t.read_ms() < timeout) {
@@ -788,9 +817,11 @@
 
          if (getResponse().isAvailable()) {
              t.stop();
+             DBG("(available %d %d)\r\n", _pos, _epos);
              return true;
          } else if (getResponse().isError()) {
              t.stop();
+             DBG("(error %d %d)\r\n", _pos, _epos);
              return false;
          }
     }
@@ -801,10 +832,12 @@
     return false;
 }
 
+#ifdef XBEE_USE_UART
 void XBee::isr_recv () {
     _rxbuf[_rxaddr_w] = _xbee.getc();
     _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE;
 }
+#endif
 
 int XBee::getbuf () {
     int r;
@@ -826,23 +859,40 @@
         resetResponse();
     }
 
+#ifdef XBEE_USE_UART
 //    while (_xbee.readable()) {
     while ((! _rts && _xbee.readable()) || (_rts && bufreadable())) {
+#else
+    while (! _attn || bufreadable()) {
+#endif
 
+#ifdef XBEE_USE_UART
 //        b = _xbee.getc();
         if (_rts) {
             b = getbuf();
         } else {
             b = _xbee.getc();
         }
+#else
+        if (! _attn) {
+            _ssel = 0;
+            sendByte(0x00, false);
+            //_ssel = 1;
+        }
+        b = getbuf();
+#endif
 
         if (_pos > 0 && b == START_BYTE && ATAP == 2) {
             // new packet start before previous packeted completed -- discard previous packet and start over
             DBG("error: %02x %d %d\r\n", b, _pos, _epos);
             _response.setErrorCode(UNEXPECTED_START_BYTE);
+#ifdef XBEE_USE_SPI
+            _ssel = 1;
+#endif
             return;
         }
 
+#ifdef XBEE_USE_UART
         if (_pos > 0 && b == ESCAPE) {
             if (_xbee.readable()) {
 //                b = _xbee.getc();
@@ -859,13 +909,16 @@
                 continue;
             }
         }
+#endif
         DBG("%02x_", b);
 
+#ifdef XBEE_USE_UART
         if (_escape == true) {
             b = 0x20 ^ b;
             _escape = false;
             _epos ++;
         }
+#endif
 
         // checksum includes all bytes starting with api id
         if (_pos >= API_ID_INDEX) {
@@ -902,6 +955,9 @@
                 if (_pos > MAX_FRAME_DATA_SIZE) {
                     // exceed max size.  should never occur
                     _response.setErrorCode(PACKET_EXCEEDS_BYTE_ARRAY_LENGTH);
+#ifdef XBEE_USE_SPI
+                    _ssel = 1;
+#endif
                     return;
                 }
 
@@ -933,6 +989,9 @@
 
                     _checksumTotal = 0;
 
+#ifdef XBEE_USE_SPI
+                    _ssel = 1;
+#endif
                     return;
                 } else {
                     // add to packet array, starting with the fourth byte of the apiFrame
@@ -941,6 +1000,9 @@
                 }
         }
     }
+#ifdef XBEE_USE_SPI
+    _ssel = 1;
+#endif
 }
 
 // it's peanut butter jelly time!!
@@ -1399,6 +1461,9 @@
 //}
 
 void XBee::send(XBeeRequest &request) {
+#ifdef XBEE_USE_SPI
+    _ssel = 0;
+#endif
     // the new new deal
 
     sendByte(START_BYTE, false);
@@ -1439,11 +1504,15 @@
     // send packet
     Serial.flush();
 */
+#ifdef XBEE_USE_SPI
+    _ssel = 1;
+#endif
     DBG("\r\n");
 }
 
 void XBee::sendByte(uint8_t b, bool escape) {
 
+#ifdef XBEE_USE_UART
     if (escape && (b == START_BYTE || b == ESCAPE || b == XON || b == XOFF)) {
 //        std::cout << "escaping byte [" << toHexString(b) << "] " << std::endl;
         _xbee.putc(ESCAPE);
@@ -1451,6 +1520,14 @@
     } else {
         _xbee.putc(b);
     }
+#else
+    if (! _attn) {
+        _rxbuf[_rxaddr_w] = _xbee.write(b);
+        _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE;
+    } else {
+        _xbee.write(b);
+    }
+#endif
     DBG("%02x ", b);
 }