Sample program for XBee remote API operation. This program get ADC sample data from remote XBee connected over the radio

Dependencies:   TextLCD mbed

Revision:
0:6e92a52f1a08
Child:
1:3b74123e6d7a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Dec 12 04:45:05 2010 +0000
@@ -0,0 +1,134 @@
+#include "mbed.h"
+#include "XBee.h"
+#include "TextLCD.h"
+
+TextLCD lcd(p25, p26, p24, p23, p22, p21); // RS, E, DB4, DB5, DB6, DB7
+
+/*-- AT command and parameters --*/
+uint8_t atISCmd[] = {'I', 'S'};      // Forces a read of all enabled digital and analog input lines
+uint8_t atDBCmd[] = {'D', 'B'};      // Received Signal Strength
+uint8_t cmdVal0[] = {0};             // Clear RSSI regisger
+
+/*-- Create instanse of Xbee object --*/
+XBee xbee(p13, p14);
+XBeeAddress64 remoteAddress(0x0013A200, 0x406B7111);    // Specify your XBee address
+
+/*-- Create instanse of Command and Response object --*/
+// Remot ATIS command to read ADC value (ADC3 is enabled by X-CTU tool)
+RemoteAtCommandRequest remoteSampleRequest(remoteAddress, atISCmd);
+// Local ATDB command to read signal strength (RSSI)
+AtCommandRequest atDB(atDBCmd);
+// Local ATDB0 command to clear RSSI
+AtCommandRequest atDB0(atDBCmd, cmdVal0, sizeof(cmdVal0));
+// Create instanse to handle command response
+AtCommandResponse response = AtCommandResponse();
+RemoteAtCommandResponse remoteResp = RemoteAtCommandResponse();
+
+
+/* Receive command response packet
+ * If OK response recieved, return pointer to the Response Data Frame
+ */
+uint8_t* GetResponse() {
+    // Read response
+    if (xbee.readPacket(5000)) {
+        // Got a response! Check if response is AT command respose
+        if (xbee.getResponse().getApiId() == AT_COMMAND_RESPONSE) {
+            xbee.getResponse().getAtCommandResponse(response);
+            if ( response.getStatus() == AT_OK ) 
+                return response.getValue();
+        } else  if (xbee.getResponse().getApiId() == REMOTE_AT_COMMAND_RESPONSE) {
+            xbee.getResponse().getRemoteAtCommandResponse(remoteResp);
+            if ( remoteResp.getStatus() == AT_OK ) {
+               // Debug print
+                printf("Response Data:");
+                   for (int i = 0; i < remoteResp.getValueLength(); i++)
+                   printf("%02X ", remoteResp.getValue()[i]);
+                printf("\n");
+                
+                return remoteResp.getValue();
+            } else {
+                printf("Remote Command Error:0x%X\n", response.getStatus());
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+/* Get ADC data
+ * Data frame structure of ATIS
+ * Offset
+ *   0   : Number of Samples (Always 1)
+ *   1-2 : Digital Channel Mask
+ *   3   : Analog Channel Mask
+ *   4-5 : Digital Samples (Omit if no DIO enabled)
+ *   6-7 : First ADC Data
+ */
+uint16_t getAnalog(uint8_t *FrameData, int ADC) {
+    // ADC data feild starts 4 bytes offest, if no DIO enabled
+    uint8_t start = 4;
+
+    // Contains Digital channel?
+    if (FrameData[1] > 0 || FrameData[2]) {
+        // make room for digital i/o
+        start+=2;
+    }
+
+    // start depends on how many ADCs before this ADC are enabled
+    for (int i = 0; i < ADC; i++) {
+        // Is Analog channel Enabled ?
+        if ( (FrameData[3] >> i) & 1 ) {
+            start+=2;
+        }
+    }
+
+    return (uint16_t)((FrameData[start] << 8) + FrameData[start + 1]);
+}
+
+
+int main() {
+    unsigned int loop = 0;
+
+    xbee.begin(9600);
+    lcd.printf("RSSI:");
+    lcd.locate(0, 1);
+    lcd.printf("ADC :");
+    printf("\nStart.\n");
+
+    while (true) {
+        uint8_t *responseVal;
+        uint8_t rssiVal = 0;
+        uint16_t adcVal = 0;
+
+        // Send ATDB command (Read RSSI register from local Xbee)
+        xbee.send(atDB);
+        responseVal = GetResponse();
+        if ( responseVal != 0 )
+            rssiVal = responseVal[0];
+        lcd.locate(5, 0);
+        if (rssiVal == 0)
+            lcd.printf("No Signal");
+        else
+            lcd.printf("-%ddBm   ", rssiVal);
+
+        // Clear RSSI register, because Xbee hold RSSI value of last received packet even after radio disconneded
+        xbee.send(atDB0);
+        GetResponse();
+
+        // Read ADC3 value by sending ATIS command
+        xbee.send(remoteSampleRequest);
+        responseVal = GetResponse();
+        if ( responseVal != 0 ) {
+            adcVal = getAnalog(responseVal, 3); // Assume ADC3 is enabled
+        }
+        lcd.locate(5, 1);
+        if (adcVal == 0)
+            lcd.printf("-     ");
+        else
+            lcd.printf("%d", adcVal);
+    
+        printf("Loop:%d\n", loop++);
+        wait(1.0);
+    }
+}