802.15.4 IO Sampling Callback example for mbed XBeeLib By Digi

Dependencies:   XBeeLib mbed

This example shows how to monitor remote XBee modules DigitalInputs and ADCs. The remote XBee module sends packets periodically to the local XBee module containing the value of its DigitalInputs and ADCs. This library process those packets and calls a user registered function callback so the user can handle them.

See Handling IO Data Samples from other modules chapter for more information.

Common Setup

Make sure you have a valid Example Common Setup

Example Setup

Application

You have to configure the remote device 64-bit address by customizing the REMOTE_NODE_ADDR64_MSB and REMOTE_NODE_ADDR64_LSB defines with the remote XBee module 64-bit address.

Hardware

On the Remote XBee module, wire following peripherals to the pins specified on the table and schematics, or change the application pins according to your hardware setup:

LinePinValue
DIO2/ADC218ADC (Analog Input)
DIO3/ADC317Digital Input

/media/uploads/hbujanda/dio_adc_schem.png

Running the example

Build and deploy the example to the mbed module.
Reset the mbed module so the example starts. You should see the example debug information through the debug interface configured in the 'Local Setup' chapter.
The application will do following operations:

  • Register the function callback that will be called by the library when corresponding IO sample frame is received.
  • Configure the remote XBee module pins according to the table above.
  • Configure the sample rate.
  • Configure remote XBee module to send IO Samples to local XBee module
  • Periodically ask the XBee library to process received frames

When a IO Sample frame is received the user callback does:

  • Read DIO3_AD3 digital value
  • Read DIO2_AD2 analog value
Committer:
spastor
Date:
Tue May 05 18:28:42 2015 +0200
Revision:
1:95a425d4fbd8
Parent:
0:e20fc9aeb09a
Child:
2:ec7fed406a0a
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hbujanda 0:e20fc9aeb09a 1 /**
hbujanda 0:e20fc9aeb09a 2 * Copyright (c) 2015 Digi International Inc.,
hbujanda 0:e20fc9aeb09a 3 * All rights not expressly granted are reserved.
hbujanda 0:e20fc9aeb09a 4 *
hbujanda 0:e20fc9aeb09a 5 * This Source Code Form is subject to the terms of the Mozilla Public
hbujanda 0:e20fc9aeb09a 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
hbujanda 0:e20fc9aeb09a 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
hbujanda 0:e20fc9aeb09a 8 *
hbujanda 0:e20fc9aeb09a 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
hbujanda 0:e20fc9aeb09a 10 * =======================================================================
hbujanda 0:e20fc9aeb09a 11 */
hbujanda 0:e20fc9aeb09a 12
hbujanda 0:e20fc9aeb09a 13 #include "mbed.h"
hbujanda 0:e20fc9aeb09a 14 #include "XBeeLib.h"
hbujanda 0:e20fc9aeb09a 15 #if defined(ENABLE_LOGGING)
hbujanda 0:e20fc9aeb09a 16 #include "DigiLoggerMbedSerial.h"
hbujanda 0:e20fc9aeb09a 17 using namespace DigiLog;
hbujanda 0:e20fc9aeb09a 18 #endif
hbujanda 0:e20fc9aeb09a 19
hbujanda 0:e20fc9aeb09a 20 // TODO Replace with the MSB of the remote module's 64-bit address (SH parameter)
hbujanda 0:e20fc9aeb09a 21 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200)
hbujanda 0:e20fc9aeb09a 22 // TODO Replace with the LSB of the remote module's 64-bit address (SL parameter)
hbujanda 0:e20fc9aeb09a 23 #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40D2B03E)
hbujanda 0:e20fc9aeb09a 24
hbujanda 0:e20fc9aeb09a 25 using namespace XBeeLib;
hbujanda 0:e20fc9aeb09a 26
hbujanda 0:e20fc9aeb09a 27 Serial *log_serial;
hbujanda 0:e20fc9aeb09a 28
hbujanda 0:e20fc9aeb09a 29 static void io_data_cb(const RemoteXBee802& remote, const IOSample802& sample_data)
hbujanda 0:e20fc9aeb09a 30 {
hbujanda 0:e20fc9aeb09a 31 if (remote.is_valid_addr16b()) {
hbujanda 0:e20fc9aeb09a 32 uint16_t remote16;
hbujanda 0:e20fc9aeb09a 33 remote.get_addr(&remote16);
hbujanda 0:e20fc9aeb09a 34 log_serial->printf("\r\nGot a 16-bit IO Sample Data [%04x]\r\n", remote16);
hbujanda 0:e20fc9aeb09a 35 } else {
hbujanda 0:e20fc9aeb09a 36 Addr64 remote64;
hbujanda 0:e20fc9aeb09a 37 remote.get_addr(&remote64);
hbujanda 0:e20fc9aeb09a 38 log_serial->printf("\r\nGot a 64-bit IO Sample Data [%08x:%08x]\r\n", remote64.get_high32(), remote64.get_low32());
hbujanda 0:e20fc9aeb09a 39 }
hbujanda 0:e20fc9aeb09a 40
hbujanda 0:e20fc9aeb09a 41 RadioStatus radioStatus;
hbujanda 0:e20fc9aeb09a 42
hbujanda 0:e20fc9aeb09a 43 DioVal dio3;
hbujanda 0:e20fc9aeb09a 44 radioStatus = sample_data.get_dio(XBee802::DIO3_AD3, &dio3);
hbujanda 0:e20fc9aeb09a 45 if (radioStatus != Success) {
hbujanda 0:e20fc9aeb09a 46 log_serial->printf("sample_data.get_dio(XBee802::DIO3_AD3, &dio3) FAILED\r\n");
hbujanda 0:e20fc9aeb09a 47 } else {
hbujanda 0:e20fc9aeb09a 48 log_serial->printf("DIO3 Digital value %d\r\n", dio3);
hbujanda 0:e20fc9aeb09a 49 }
hbujanda 0:e20fc9aeb09a 50
hbujanda 0:e20fc9aeb09a 51 uint16_t ad2;
hbujanda 0:e20fc9aeb09a 52 radioStatus = sample_data.get_adc(XBee802::DIO2_AD2, &ad2);
hbujanda 0:e20fc9aeb09a 53 if (radioStatus != Success) {
hbujanda 0:e20fc9aeb09a 54 log_serial->printf("sample_data.get_adc(XBee802::DIO2_AD2, &ad2) FAILED\r\n");
hbujanda 0:e20fc9aeb09a 55 } else {
hbujanda 0:e20fc9aeb09a 56 log_serial->printf("AD2 Analog value %04x\r\n", ad2);
hbujanda 0:e20fc9aeb09a 57 }
hbujanda 0:e20fc9aeb09a 58 }
hbujanda 0:e20fc9aeb09a 59
hbujanda 0:e20fc9aeb09a 60 int main()
hbujanda 0:e20fc9aeb09a 61 {
hbujanda 0:e20fc9aeb09a 62 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
hbujanda 0:e20fc9aeb09a 63 log_serial->baud(9600);
hbujanda 0:e20fc9aeb09a 64 log_serial->printf("Sample application to demo how to receive IO Sample Data from a RemoteXBee802 Node\r\n\r\n");
hbujanda 0:e20fc9aeb09a 65 log_serial->printf(XB_LIB_BANNER);
hbujanda 0:e20fc9aeb09a 66
hbujanda 0:e20fc9aeb09a 67 #if defined(ENABLE_LOGGING)
hbujanda 0:e20fc9aeb09a 68 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
hbujanda 0:e20fc9aeb09a 69 #endif
hbujanda 0:e20fc9aeb09a 70
hbujanda 0:e20fc9aeb09a 71 XBee802 xbee = XBee802(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
hbujanda 0:e20fc9aeb09a 72
hbujanda 0:e20fc9aeb09a 73 /* Register callback */
hbujanda 0:e20fc9aeb09a 74 xbee.register_io_sample_cb(&io_data_cb);
hbujanda 0:e20fc9aeb09a 75
hbujanda 0:e20fc9aeb09a 76 RadioStatus radioStatus;
hbujanda 0:e20fc9aeb09a 77 radioStatus = xbee.init();
hbujanda 0:e20fc9aeb09a 78 MBED_ASSERT(radioStatus == Success);
hbujanda 0:e20fc9aeb09a 79
hbujanda 0:e20fc9aeb09a 80 const RemoteXBee802 remoteDevice = RemoteXBee802(Addr64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB));
hbujanda 0:e20fc9aeb09a 81 log_serial->printf("Configuring remote Device (%08X:%08X) DIO3_AD3 as Input and DIO2_AD2 as ADC\r\n", REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB);
hbujanda 0:e20fc9aeb09a 82 radioStatus = xbee.set_pin_config(remoteDevice, XBee802::DIO3_AD3, DigitalInput);
hbujanda 0:e20fc9aeb09a 83 MBED_ASSERT(radioStatus == Success);
spastor 1:95a425d4fbd8 84 log_serial->printf("Enabling remote Device (%08X:%08X) internal Pull-up resistor on DIO3_AD3\r\n", REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB);
spastor 1:95a425d4fbd8 85 radioStatus = xbee.set_pin_pull_up(remoteDevice, XBee802::DIO3_AD3, true);
spastor 1:95a425d4fbd8 86 MBED_ASSERT(radioStatus == Success);
hbujanda 0:e20fc9aeb09a 87 radioStatus = xbee.set_pin_config(remoteDevice, XBee802::DIO2_AD2, Adc);
hbujanda 0:e20fc9aeb09a 88 MBED_ASSERT(radioStatus == Success);
hbujanda 0:e20fc9aeb09a 89
hbujanda 0:e20fc9aeb09a 90 log_serial->printf("Configuring remote Device (%08X:%08X) to send samples every 5 seconds\r\n", REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB);
spastor 1:95a425d4fbd8 91 xbee.set_io_sample_rate(remoteDevice, 5.0);
hbujanda 0:e20fc9aeb09a 92
hbujanda 0:e20fc9aeb09a 93 log_serial->printf("Configuring remote Device (%08X:%08X) to send samples to this device\r\n", REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB);
hbujanda 0:e20fc9aeb09a 94 Addr64 localAddr;
hbujanda 0:e20fc9aeb09a 95 xbee.get_addr(&localAddr);
spastor 1:95a425d4fbd8 96 xbee.config_io_sample_destination(remoteDevice, localAddr);
hbujanda 0:e20fc9aeb09a 97
hbujanda 0:e20fc9aeb09a 98 while (true) {
hbujanda 0:e20fc9aeb09a 99 xbee.process_rx_frames();
hbujanda 0:e20fc9aeb09a 100 wait_ms(100);
hbujanda 0:e20fc9aeb09a 101 log_serial->printf(".");
hbujanda 0:e20fc9aeb09a 102 }
hbujanda 0:e20fc9aeb09a 103
hbujanda 0:e20fc9aeb09a 104 delete(log_serial);
hbujanda 0:e20fc9aeb09a 105 }