
Sample program for XBee remote API operation. This program get ADC sample data from remote XBee connected over the radio
main.cpp
- Committer:
- todotani
- Date:
- 2010-12-12
- Revision:
- 1:3b74123e6d7a
- Parent:
- 0:6e92a52f1a08
File content as of revision 1:3b74123e6d7a:
#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] > 0) { // 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); } }