Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:50a4a80f3ecd, committed 2013-11-11
- Comitter:
- embeddedartists
- Date:
- Mon Nov 11 09:41:44 2013 +0000
- Child:
- 1:fb7d92d3adbe
- Commit message:
- Example showing how to use the XBee interface
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EALib.lib Mon Nov 11 09:41:44 2013 +0000 @@ -0,0 +1,1 @@ +https://mbed.org/users/embeddedartists/code/EALib/#e431d9d47db6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Nov 11 09:41:44 2013 +0000
@@ -0,0 +1,227 @@
+/******************************************************************************
+ * Includes
+ *****************************************************************************/
+#include "mbed.h"
+#include "XBee.h"
+
+/******************************************************************************
+ * Typedefs and defines
+ *****************************************************************************/
+
+// define NODE_IS_COORDINATOR if this board should act
+// as XBee coordinator. Make sure it is undefined it the board
+// should act as End-Device
+//#define NODE_IS_COORDINATOR (1)
+
+#define CMD_BTN_MSG (0)
+#define CMD_ACK_MSG (1)
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+static XBee xbee(P4_22, P4_23, P4_17, P4_19);
+
+// led1 + led 2 -> active low
+static DigitalOut xbeeInitLed(LED1);
+static DigitalOut remoteBtnLed(LED2);
+// led3 + led 4 -> active high
+static DigitalOut ackLed(LED3);
+static DigitalOut led4(LED4);
+
+static DigitalIn button(p23);
+static bool xbeeIsUp = false;
+
+/******************************************************************************
+ * Local functions
+ *****************************************************************************/
+
+static void xbeeDeviceUp(void) {
+ xbeeIsUp = true;
+}
+
+static void xbeeDeviceDown(void) {
+ xbeeIsUp = false;
+}
+
+static void xbeeNodeFound(void) {
+ uint32_t addrHi = 0;
+ uint32_t addrLo = 0;
+ uint8_t rssi = 0;
+
+ xbee.getRemoteAddress(&addrHi, &addrLo);
+ xbee.getRssi(&rssi);
+
+ printf("XBee: node found: hi=%lx, lo=%lx, rssi=%d\n",
+ addrHi, addrLo, rssi);
+}
+
+static void xbeeTxStat(void) {
+
+ uint8_t frameId = 0;
+ XBee::XBeeTxStatus status = XBee::TxStatusOk;
+
+ xbee.getTxStatus(&frameId, &status);
+
+ printf("XBee: Tx Stat. Id=%u, status=%d\n", frameId, (int)status);
+}
+
+
+
+static void xbeeDataAvailable(void) {
+ char* data = NULL;
+ char ackMsg = CMD_ACK_MSG;
+ uint8_t frameId = 0;
+ uint8_t len = 0;
+ uint32_t addrHi = 0;
+ uint32_t addrLo = 0;
+ uint8_t rssi = 0;
+
+ xbee.getRemoteAddress(&addrHi, &addrLo);
+ xbee.getData(&data, &len);
+ xbee.getRssi(&rssi);
+
+ printf("XBee: Data available: len=%d hi=%lx, lo=%lx, rssi=%d\n",
+ (int)len, addrHi, addrLo, rssi);
+
+ if (len > 0) {
+
+ switch(data[0]) {
+ case CMD_BTN_MSG:
+ if (len > 1) {
+ // change led to indicate button state
+ remoteBtnLed = ((data[1] == 1) ? 1 : 0);
+
+
+ // Send an ACK directly to the remote node (only for
+ // buttons state == 0)
+ if (data[1] == 0) {
+ xbee.send(addrHi, addrLo, &ackMsg, 1, &frameId);
+ }
+ }
+ break;
+ case CMD_ACK_MSG:
+ for (int i = 0; i < 3; i++) {
+ ackLed = 1;
+ wait_ms(100);
+ ackLed = 0;
+ wait_ms(100);
+ }
+ break;
+ }
+
+ }
+
+}
+
+static bool xbeeInit()
+{
+ xbee.registerCallback(xbeeDeviceUp, XBee::CbDeviceUp);
+ xbee.registerCallback(xbeeDeviceDown, XBee::CbDeviceDown);
+ xbee.registerCallback(xbeeNodeFound, XBee::CbNodeFound);
+ xbee.registerCallback(xbeeTxStat, XBee::CbTxStat);
+ xbee.registerCallback(xbeeDataAvailable, XBee::CbDataAvailable);
+
+#ifdef NODE_IS_COORDINATOR
+ XBee::XBeeError err = xbee.init(XBee::Coordinator, "EAEA");
+#else
+ XBee::XBeeError err = xbee.init(XBee::EndDevice, "EAEA");
+#endif
+ if (err != XBee::Ok) {
+ return false;
+ }
+
+ return true;
+
+}
+
+static void reportInitFailed() {
+ while (true) {
+ xbeeInitLed = !xbeeInitLed;
+ wait_ms(200);
+ }
+}
+
+static void ledInit() {
+ xbeeInitLed = 0; // turn on
+ remoteBtnLed = 1; // turn off
+ ackLed = 0; // turn off
+ led4 = 0; // turn off
+}
+
+
+/******************************************************************************
+ * Main function
+ *****************************************************************************/
+
+int main() {
+
+ /*
+ * For this example to work at least two boards with XBee nodes must
+ * be available; one which is configured as Coordinator and another
+ * which is configured as End-Device.
+ *
+ * LED1 shows the state of XBee initialization. This LED is turned
+ * on when initialization starts and turned off when initialization
+ * is ready and the device us up. If initialization fails LED1
+ * will blink.
+ *
+ * When the Push-button on the LPC4088 QuickStart Board is pushed
+ * a message will be broadcasted. The board(s) that receives the message
+ * will show the state of the remote board's button by turning LED2
+ * on or off.
+ *
+ * The board that receives the button state message will send back
+ * an ACK message (only for button down). The board that receives
+ * the ACK message will blink with LED3. This can be used to verify
+ * that a board that is not close to you actually received a message
+ * without having to look at that board's LED2.
+ */
+
+ int buttonState = 1;
+ char data[2];
+ uint8_t frameId = 0;
+
+ // pull-up must be enabled for button
+ button.mode(PullUp);
+
+ ledInit();
+
+ printf("Initializing\n");
+ if (!xbeeInit()) {
+ reportInitFailed();
+ }
+
+ // Wait until XBee node is reported to be up.
+ // - For End-device this means that the node is associated with a
+ // coordinator
+ // - For a coordinator this means that the node is initialized and ready
+ printf("Wait until up\n");
+ while(!xbeeIsUp) {
+ xbee.process();
+ }
+
+ // turn off led to indicate initialization is okay and node is up
+ xbeeInitLed = 1;
+
+ printf("Node is Up\n");
+ while (1) {
+
+ if (button != buttonState) {
+ buttonState = button;
+
+ data[0] = CMD_BTN_MSG;
+ data[1] = buttonState;
+
+ // Send the button state. In this example we are broadcasting the
+ // message to all nodes on the same network (PAN ID). In reality
+ // direct messaging is preferred.
+ xbee.send(XBEE_ADDRHI_BROADCAST, XBEE_ADDRLO_BROADCAST,
+ data, 2, &frameId);
+ }
+
+
+ xbee.process();
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.lib Mon Nov 11 09:41:44 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/#f37f3b9c9f0b