Library to easily communicate with XBee modules.

Dependencies:   DigiLogger

Dependents:   WaterLogger XbeeGateway XBee_Cooker ProjetReceiver ... more

Use XBee radio modules to easily improve your project with wireless connectivity. You can enable entire networks of connected devices. XBees can exchange data with other modules in the network and configure remote modules as well as trigger actions or collect sensor data on XBee nodes without needing additional external microcontrollers. Using this documentation and configuration tools with XBee modules, it is easy to develop these types of applications and more.

/media/uploads/spastor/xbee-xbeepro-series1.jpg

The XBee mbed Library is a ready-to-import mbed extension that dramatically reduces development time for XBee projects on the mbed platforms. There are many modular examples, making it an easy and smooth process to add wireless networking to a whole range of useful applications.

Info

Currently 802.15.4 (Series 1 and 2), ZigBee (Series 2) and DigiMesh (Series 1 and 2) modules are supported. The libraries can be extended to support other protocols like DigiMesh point-to-point, WiFi, etc.

User manual

The user manual can be found at this project's Wiki pages:

  1. Configuring the library
  2. Debugging the library
  3. Initializing modules
  4. Resetting the local module
  5. Receiving Data from other module
  6. Sending data to another module
  7. Discovering nodes in the network
  8. Configuring local and remote modules
  9. Handling modem status changes
  10. Handling remote modules DIOs, ADCs and PWMs
  11. Handling IO Data Samples from other module
  12. Radio Power Management

Ready to use examples

There are a lot of ready to use examples to get started quickly.
Make sure you have a valid example setup before running the examples:

Examples for ZigBee modules

Import programXBeeZB_Receive_Data

ZigBee Receive Data example for mbed XBeeLib By Digi

Import programXBeeZB_Send_Data

ZigBee Send Data example for mbed XBeeLib By Digi

Import programXBeeZB_module_config

ZigBee network configuration example for mbed XBeeLib By Digi

Import programXBeeZB_AT_Commands

ZigBee AT Commands example for mbed XBeeLib By Digi

Import programXBeeZB_dio_adc

ZigBee DIOs and ADCs example for mbed XBeeLib By Digi

Import programXBeeZB_IO_Sample_Callback

ZigBee IO Sampling Callback example for mbed XBeeLib By Digi

Import programXBeeZB_modem_status

ZigBee Modem Status example for mbed XBeeLib By Digi

Import programXBeeZB_node_discovery

ZigBee Node Discovery example for mbed XBeeLib By Digi

Import programXBeeZB_power_mngmnt_cyclic_sleep

ZigBee Power Management using Cyclic Sleep example for mbed XBeeLib By Digi

Import programXBeeZB_power_mngmnt_pin_sleep

ZigBee Power Management using Pin Sleep example for mbed XBeeLib By Digi

Examples for 802.15.4 modules

Import programXBee802_Receive_Data

802.15.4 Receive Data example for mbed XBeeLib By Digi

Import programXBee802_Send_Data

802.15.4 Send Data example for mbed XBeeLib By Digi

Import programXBee802_module_config

802.15.4 network configuration example for mbed XBeeLib By Digi

Import programXBee802_AT_Commands

802.15.4 AT Commands example for mbed XBeeLib By Digi

Import programXBee802_dio_adc_pwm

802.15.4 DIOs, ADCs and PWM example for mbed XBeeLib By Digi

Import programXBee802_IO_Sample_Callback

802.15.4 IO Sampling Callback example for mbed XBeeLib By Digi

Import programXBee802_node_discovery

802.15.4 Node Discovery example for mbed XBeeLib By Digi

Import programXBee802_power_mngmnt_cyclic_sleep

802.15.4 Power Management using Cyclic Sleep example for mbed XBeeLib By Digi

Import programXBee802_power_mngmnt_pin_sleep

802.15.4 Power Management using Pin Sleep example for mbed XBeeLib By Digi

Examples for DigiMesh modules

Import programXBeeDM_Receive_Data

DigiMesh Receive Data example for mbed XBeeLib By Digi

Import programXBeeDM_Send_Data

DigiMesh Send Data example for mbed XBeeLib By Digi

Import programXBeeDM_module_config

DigiMesh network configuration example for mbed XBeeLib By Digi

Import programXBeeDM_AT_Commands

DigiMesh AT Commands example for mbed XBeeLib By Digi

Import programXBeeDM_dio_adc_pwm

DigiMEsh DIOs, ADCs and PWMs example for mbed XBeeLib By Digi

Import programXBeeDM_IO_Sample_Callback

DigiMesh IO Sampling Callback example for mbed XBeeLib By Digi

Import programXBeeDM_modem_status

DigiMesh Modem Status example for mbed XBeeLib By Digi

Import programXBeeDM_node_discovery

DigiMesh Node Discovery example for mbed XBeeLib By Digi

Import programXBeeDM_power_mngmnt_asyncr_cyclic_sleep

DigiMesh Power Management using Asynchronous Cyclic Sleep example for mbed XBeeLib By Digi

Import programXBeeDM_power_mngmnt_pin_sleep

DigiMesh Power Management using Pin Sleep example for mbed XBeeLib By Digi

Committer:
spastor
Date:
Mon Jun 01 18:59:43 2015 +0200
Revision:
4:629712865107
Parent:
3:8662ebe83570
Child:
6:06522f3a6642
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spastor 0:fcaad0dfa051 1 /**
spastor 0:fcaad0dfa051 2 * Copyright (c) 2015 Digi International Inc.,
spastor 0:fcaad0dfa051 3 * All rights not expressly granted are reserved.
spastor 0:fcaad0dfa051 4 *
spastor 0:fcaad0dfa051 5 * This Source Code Form is subject to the terms of the Mozilla Public
spastor 0:fcaad0dfa051 6 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
spastor 0:fcaad0dfa051 7 * You can obtain one at http://mozilla.org/MPL/2.0/.
spastor 0:fcaad0dfa051 8 *
spastor 0:fcaad0dfa051 9 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
spastor 0:fcaad0dfa051 10 * =======================================================================
spastor 0:fcaad0dfa051 11 */
spastor 0:fcaad0dfa051 12
spastor 0:fcaad0dfa051 13 #include "XBeeLib.h"
spastor 0:fcaad0dfa051 14 #include "Frames/ApiFrame.h"
spastor 0:fcaad0dfa051 15
spastor 0:fcaad0dfa051 16 using namespace XBeeLib;
spastor 0:fcaad0dfa051 17
spastor 0:fcaad0dfa051 18 RadioStatus XBee::write_config(void)
spastor 0:fcaad0dfa051 19 {
spastor 0:fcaad0dfa051 20 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 21
spastor 0:fcaad0dfa051 22 cmdresp = set_param("WR");
spastor 0:fcaad0dfa051 23 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 24 return Failure;
spastor 0:fcaad0dfa051 25 }
spastor 0:fcaad0dfa051 26 return Success;
spastor 0:fcaad0dfa051 27 }
spastor 0:fcaad0dfa051 28
spastor 0:fcaad0dfa051 29 RadioStatus XBee::set_power_level(uint8_t level)
spastor 0:fcaad0dfa051 30 {
spastor 0:fcaad0dfa051 31 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 32
spastor 0:fcaad0dfa051 33 if (level > 4) {
spastor 0:fcaad0dfa051 34 return Failure;
spastor 0:fcaad0dfa051 35 }
spastor 0:fcaad0dfa051 36
spastor 0:fcaad0dfa051 37 cmdresp = set_param("PL", level);
spastor 0:fcaad0dfa051 38 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 39 return Failure;
spastor 0:fcaad0dfa051 40 }
spastor 0:fcaad0dfa051 41
spastor 0:fcaad0dfa051 42 return Success;
spastor 0:fcaad0dfa051 43 }
spastor 0:fcaad0dfa051 44
spastor 0:fcaad0dfa051 45 RadioStatus XBee::get_power_level(uint8_t * const level)
spastor 0:fcaad0dfa051 46 {
spastor 0:fcaad0dfa051 47 if (level == NULL) {
spastor 0:fcaad0dfa051 48 return Failure;
spastor 0:fcaad0dfa051 49 }
spastor 0:fcaad0dfa051 50 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 51
spastor 0:fcaad0dfa051 52 uint32_t var32;
spastor 0:fcaad0dfa051 53 cmdresp = get_param("PL", &var32);
spastor 0:fcaad0dfa051 54 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 55 return Failure;
spastor 0:fcaad0dfa051 56 }
spastor 0:fcaad0dfa051 57 *level = var32;
spastor 0:fcaad0dfa051 58 return Success;
spastor 0:fcaad0dfa051 59 }
spastor 0:fcaad0dfa051 60
spastor 0:fcaad0dfa051 61 RadioStatus XBee::get_network_address(uint16_t * const addr16)
spastor 0:fcaad0dfa051 62 {
spastor 0:fcaad0dfa051 63 if (addr16 == NULL) {
spastor 0:fcaad0dfa051 64 return Failure;
spastor 0:fcaad0dfa051 65 }
spastor 0:fcaad0dfa051 66 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 67
spastor 0:fcaad0dfa051 68 uint32_t var32;
spastor 0:fcaad0dfa051 69 cmdresp = get_param("MY", &var32);
spastor 0:fcaad0dfa051 70 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 71 return Failure;
spastor 0:fcaad0dfa051 72 }
spastor 0:fcaad0dfa051 73 *addr16 = var32;
spastor 0:fcaad0dfa051 74 return Success;
spastor 0:fcaad0dfa051 75 }
spastor 0:fcaad0dfa051 76
spastor 0:fcaad0dfa051 77 RadioStatus XBee::software_reset(void)
spastor 0:fcaad0dfa051 78 {
spastor 0:fcaad0dfa051 79 volatile uint16_t * const rst_cnt_p = &_wd_reset_cnt;
spastor 0:fcaad0dfa051 80 const uint16_t init_rst_cnt = *rst_cnt_p;
spastor 0:fcaad0dfa051 81
spastor 0:fcaad0dfa051 82 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 83
spastor 0:fcaad0dfa051 84 cmdresp = set_param("FR");
spastor 0:fcaad0dfa051 85 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
hbujanda 1:794d1d3e4a08 86 digi_log(LogLevelError, "software_reset failed!\r\n");
spastor 0:fcaad0dfa051 87 return Failure;
spastor 0:fcaad0dfa051 88 }
spastor 0:fcaad0dfa051 89
spastor 0:fcaad0dfa051 90 return wait_for_module_to_reset(rst_cnt_p, init_rst_cnt);
spastor 0:fcaad0dfa051 91 }
spastor 0:fcaad0dfa051 92
spastor 0:fcaad0dfa051 93 RadioStatus XBee::set_node_identifier(const char * const node_id)
spastor 0:fcaad0dfa051 94 {
spastor 0:fcaad0dfa051 95 if (node_id == NULL) {
spastor 0:fcaad0dfa051 96 return Failure;
spastor 0:fcaad0dfa051 97 }
spastor 0:fcaad0dfa051 98
spastor 0:fcaad0dfa051 99 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 100 const size_t str_len = strlen(node_id);
spastor 0:fcaad0dfa051 101
spastor 0:fcaad0dfa051 102 if(str_len > 20 || str_len < 1) {
spastor 0:fcaad0dfa051 103 return Failure;
spastor 0:fcaad0dfa051 104 }
spastor 0:fcaad0dfa051 105
spastor 0:fcaad0dfa051 106 cmdresp = set_param("NI", (const uint8_t *)node_id, str_len);
spastor 0:fcaad0dfa051 107 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 108 return Failure;
spastor 0:fcaad0dfa051 109 }
spastor 0:fcaad0dfa051 110 return Success;
spastor 0:fcaad0dfa051 111 }
spastor 0:fcaad0dfa051 112
spastor 0:fcaad0dfa051 113 RadioStatus XBee::get_node_identifier(char * const node_id)
spastor 0:fcaad0dfa051 114 {
spastor 0:fcaad0dfa051 115 if (node_id == NULL) {
spastor 0:fcaad0dfa051 116 return Failure;
spastor 0:fcaad0dfa051 117 }
spastor 0:fcaad0dfa051 118
spastor 0:fcaad0dfa051 119 uint16_t max_ni_length = 20;
spastor 0:fcaad0dfa051 120 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 121
spastor 0:fcaad0dfa051 122 cmdresp = get_param("NI", (uint8_t *)node_id, &max_ni_length);
spastor 0:fcaad0dfa051 123 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 124 return Failure;
spastor 0:fcaad0dfa051 125 }
spastor 0:fcaad0dfa051 126 node_id[max_ni_length] = '\0';
spastor 0:fcaad0dfa051 127 return Success;
spastor 0:fcaad0dfa051 128 }
spastor 0:fcaad0dfa051 129
spastor 4:629712865107 130 RadioStatus XBee::enable_network_encryption(bool enable)
spastor 4:629712865107 131 {
spastor 4:629712865107 132 AtCmdFrame::AtCmdResp cmdresp;
spastor 4:629712865107 133
spastor 4:629712865107 134 cmdresp = set_param("EE", enable);
spastor 4:629712865107 135 return cmdresp == AtCmdFrame::AtCmdRespOk ? Success : Failure;
spastor 4:629712865107 136 }
spastor 4:629712865107 137
spastor 4:629712865107 138 RadioStatus XBee::set_network_encryption_key(const uint8_t * const key, const uint16_t length)
spastor 4:629712865107 139 {
spastor 4:629712865107 140 if (key == NULL || length == 0 || length > 16) {
spastor 4:629712865107 141 return Failure;
spastor 4:629712865107 142 }
spastor 4:629712865107 143 AtCmdFrame::AtCmdResp cmdresp;
spastor 4:629712865107 144
spastor 4:629712865107 145 cmdresp = set_param("KY", key, length);
spastor 4:629712865107 146 return cmdresp == AtCmdFrame::AtCmdRespOk ? Success : Failure;
spastor 4:629712865107 147 }
spastor 4:629712865107 148
spastor 0:fcaad0dfa051 149 uint16_t XBee::get_hw_version() const
spastor 0:fcaad0dfa051 150 {
spastor 0:fcaad0dfa051 151 return _hw_version;
spastor 0:fcaad0dfa051 152 }
spastor 0:fcaad0dfa051 153
spastor 0:fcaad0dfa051 154 uint16_t XBee::get_fw_version() const
spastor 0:fcaad0dfa051 155 {
spastor 0:fcaad0dfa051 156 return _fw_version;
spastor 0:fcaad0dfa051 157 }
spastor 0:fcaad0dfa051 158
spastor 0:fcaad0dfa051 159 void XBee::set_tx_options(uint8_t options)
spastor 0:fcaad0dfa051 160 {
spastor 0:fcaad0dfa051 161 _tx_options = options;
spastor 0:fcaad0dfa051 162 }
spastor 0:fcaad0dfa051 163
spastor 0:fcaad0dfa051 164 uint8_t XBee::get_tx_options() const
spastor 0:fcaad0dfa051 165 {
spastor 0:fcaad0dfa051 166 return _tx_options;
spastor 0:fcaad0dfa051 167 }
spastor 0:fcaad0dfa051 168
spastor 0:fcaad0dfa051 169 RadioStatus XBee::start_node_discovery()
spastor 0:fcaad0dfa051 170 {
spastor 4:629712865107 171 AtCmdFrame::AtCmdResp cmdresp;
spastor 4:629712865107 172 uint32_t nd_timeout_cfg;
spastor 4:629712865107 173
spastor 4:629712865107 174 cmdresp = get_param("NT", &nd_timeout_cfg);
spastor 4:629712865107 175 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 4:629712865107 176 return Failure;
spastor 4:629712865107 177 }
spastor 4:629712865107 178
spastor 4:629712865107 179 const unsigned int guard_time_ms = 1000;
spastor 4:629712865107 180 const uint32_t nd_timeout_cfg_ms = nd_timeout_cfg * 100;
spastor 4:629712865107 181 _nd_timeout = nd_timeout_cfg_ms + guard_time_ms;
spastor 4:629712865107 182
spastor 4:629712865107 183 _nd_timer.start();
spastor 4:629712865107 184
spastor 0:fcaad0dfa051 185 AtCmdFrame cmd_frame = AtCmdFrame("ND");
spastor 0:fcaad0dfa051 186 send_api_frame(&cmd_frame);
spastor 0:fcaad0dfa051 187
spastor 0:fcaad0dfa051 188 return Success;
spastor 0:fcaad0dfa051 189 }
spastor 0:fcaad0dfa051 190
spastor 4:629712865107 191 bool XBee::is_node_discovery_in_progress()
spastor 4:629712865107 192 {
spastor 4:629712865107 193 const int nd_timer = _nd_timer.read_ms();
spastor 4:629712865107 194
spastor 4:629712865107 195 if (nd_timer == 0)
spastor 4:629712865107 196 return false;
spastor 4:629712865107 197
spastor 4:629712865107 198 if (nd_timer > _nd_timeout) {
spastor 4:629712865107 199 _nd_timer.stop();
spastor 4:629712865107 200 _nd_timer.reset();
spastor 4:629712865107 201 }
spastor 4:629712865107 202
spastor 4:629712865107 203 return true;
spastor 4:629712865107 204 }
spastor 4:629712865107 205
hbujanda 2:2ee1b6d51df2 206 void XBee::_get_remote_node_by_id(const char * const node_id, uint64_t * const addr64, uint16_t * const addr16)
hbujanda 2:2ee1b6d51df2 207 {
hbujanda 2:2ee1b6d51df2 208 *addr64 = ADDR64_UNASSIGNED;
hbujanda 2:2ee1b6d51df2 209 *addr16 = ADDR16_UNKNOWN;
hbujanda 2:2ee1b6d51df2 210 if (node_id == NULL) {
hbujanda 2:2ee1b6d51df2 211 return;
hbujanda 2:2ee1b6d51df2 212 }
hbujanda 2:2ee1b6d51df2 213 const size_t node_id_len = strlen(node_id);
hbujanda 2:2ee1b6d51df2 214 if (node_id_len == 0 || node_id_len > MAX_NI_PARAM_LEN) {
hbujanda 2:2ee1b6d51df2 215 return;
hbujanda 2:2ee1b6d51df2 216 }
hbujanda 2:2ee1b6d51df2 217
hbujanda 2:2ee1b6d51df2 218 const uint16_t old_timeout = _timeout_ms;
hbujanda 2:2ee1b6d51df2 219
hbujanda 2:2ee1b6d51df2 220 uint32_t nd_timeout_100msec;
hbujanda 2:2ee1b6d51df2 221 const AtCmdFrame::AtCmdResp nt_resp = get_param("NT", &nd_timeout_100msec);
hbujanda 2:2ee1b6d51df2 222 if (nt_resp != AtCmdFrame::AtCmdRespOk) {
hbujanda 2:2ee1b6d51df2 223 _timeout_ms = 10000;
hbujanda 2:2ee1b6d51df2 224 } else {
hbujanda 2:2ee1b6d51df2 225 _timeout_ms = (uint16_t)nd_timeout_100msec * 100 + 1000;
hbujanda 2:2ee1b6d51df2 226 }
hbujanda 2:2ee1b6d51df2 227
spastor 4:629712865107 228 const int nd_timeout = _timeout_ms;
spastor 4:629712865107 229 Timer nd_timer = Timer();
spastor 4:629712865107 230
spastor 4:629712865107 231 nd_timer.start();
spastor 4:629712865107 232
spastor 4:629712865107 233 AtCmdFrame atnd_frame = AtCmdFrame("ND", (const uint8_t *)node_id, strlen(node_id));
spastor 4:629712865107 234 const uint8_t frame_id = atnd_frame.get_frame_id();
spastor 4:629712865107 235 _node_by_ni_frame_id = frame_id;
spastor 4:629712865107 236 send_api_frame(&atnd_frame);
spastor 4:629712865107 237
spastor 4:629712865107 238 ApiFrame * const resp_frame = get_this_api_frame(frame_id, ApiFrame::AtCmdResp);
spastor 4:629712865107 239 _timeout_ms = old_timeout;
spastor 4:629712865107 240
spastor 4:629712865107 241 _node_by_ni_frame_id = 0;
spastor 4:629712865107 242
spastor 4:629712865107 243 if (resp_frame == NULL) {
spastor 4:629712865107 244 digi_log(LogLevelWarning, "_get_remote_node_by_id: timeout when waiting for ATND response");
hbujanda 2:2ee1b6d51df2 245 return;
hbujanda 2:2ee1b6d51df2 246 }
hbujanda 2:2ee1b6d51df2 247
spastor 4:629712865107 248 if (resp_frame->get_data_len() < sizeof (uint16_t) + sizeof (uint64_t)) {
spastor 4:629712865107 249 /* In 802.15.4 this might be the OK or Timeout message with no information */
spastor 4:629712865107 250 digi_log(LogLevelInfo, "_get_remote_node_by_id: node not found\r\n", __FUNCTION__, node_id);
spastor 4:629712865107 251 _framebuf_syncr.free_frame(resp_frame);
hbujanda 2:2ee1b6d51df2 252 return;
hbujanda 2:2ee1b6d51df2 253 }
hbujanda 2:2ee1b6d51df2 254
hbujanda 2:2ee1b6d51df2 255 const AtCmdFrame::AtCmdResp resp = (AtCmdFrame::AtCmdResp)resp_frame->get_data_at(ATCMD_RESP_STATUS_OFFSET);
hbujanda 2:2ee1b6d51df2 256 if (resp != AtCmdFrame::AtCmdRespOk) {
spastor 4:629712865107 257 digi_log(LogLevelWarning, "_get_remote_node_by_id: send_at_cmd bad response: 0x%x\r\n", resp);
spastor 4:629712865107 258 _framebuf_syncr.free_frame(resp_frame);
hbujanda 2:2ee1b6d51df2 259 return;
hbujanda 2:2ee1b6d51df2 260 }
hbujanda 2:2ee1b6d51df2 261
hbujanda 2:2ee1b6d51df2 262 rmemcpy((uint8_t *)addr16, resp_frame->get_data() + ATCMD_RESP_DATA_OFFSET, sizeof *addr16);
hbujanda 2:2ee1b6d51df2 263 rmemcpy((uint8_t *)addr64, resp_frame->get_data() + ATCMD_RESP_DATA_OFFSET + sizeof *addr16, sizeof *addr64);
spastor 4:629712865107 264 _framebuf_syncr.free_frame(resp_frame);
spastor 4:629712865107 265
spastor 4:629712865107 266 while (nd_timer.read_ms() < nd_timeout) {
spastor 4:629712865107 267 wait_ms(10);
spastor 4:629712865107 268 }
spastor 4:629712865107 269
hbujanda 2:2ee1b6d51df2 270 return;
hbujanda 2:2ee1b6d51df2 271 }
hbujanda 2:2ee1b6d51df2 272
spastor 0:fcaad0dfa051 273 RadioStatus XBee::config_node_discovery(uint16_t timeout_ms, uint8_t options)
spastor 0:fcaad0dfa051 274 {
spastor 0:fcaad0dfa051 275 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 276
spastor 0:fcaad0dfa051 277 cmdresp = set_param("NT", (uint8_t)(timeout_ms / 100));
spastor 0:fcaad0dfa051 278 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 279 return Failure;
spastor 0:fcaad0dfa051 280 }
spastor 0:fcaad0dfa051 281
spastor 0:fcaad0dfa051 282 cmdresp = set_param("NO", (uint8_t)options);
spastor 0:fcaad0dfa051 283 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 284 return Failure;
spastor 0:fcaad0dfa051 285 }
spastor 0:fcaad0dfa051 286 cmdresp = set_param("AC");
spastor 0:fcaad0dfa051 287 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 288 return Failure;
spastor 0:fcaad0dfa051 289 }
spastor 0:fcaad0dfa051 290
spastor 0:fcaad0dfa051 291 return Success;
spastor 0:fcaad0dfa051 292 }
spastor 0:fcaad0dfa051 293
spastor 0:fcaad0dfa051 294 RadioStatus XBee::get_config_node_discovery(uint16_t * const timeout_ms, uint8_t * const options)
spastor 0:fcaad0dfa051 295 {
spastor 0:fcaad0dfa051 296 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 297 uint32_t var32;
spastor 0:fcaad0dfa051 298
spastor 0:fcaad0dfa051 299 cmdresp = get_param("NT", &var32);
spastor 0:fcaad0dfa051 300 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 301 return Failure;
spastor 0:fcaad0dfa051 302 }
spastor 0:fcaad0dfa051 303 *timeout_ms = var32;
spastor 0:fcaad0dfa051 304
spastor 0:fcaad0dfa051 305 cmdresp = get_param("NO", &var32);
spastor 0:fcaad0dfa051 306 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 307 return Failure;
spastor 0:fcaad0dfa051 308 }
spastor 0:fcaad0dfa051 309 *options = var32;
spastor 0:fcaad0dfa051 310 return Success;
spastor 0:fcaad0dfa051 311 }
spastor 0:fcaad0dfa051 312
spastor 3:8662ebe83570 313 RadioStatus XBee::_get_iosample(const RemoteXBee& remote, uint8_t * const io_sample, uint16_t * const len)
spastor 0:fcaad0dfa051 314 {
spastor 0:fcaad0dfa051 315 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 316
spastor 0:fcaad0dfa051 317 /* Force a sample read */
spastor 0:fcaad0dfa051 318 cmdresp = get_param(remote, "IS", io_sample, len);
spastor 0:fcaad0dfa051 319 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 3:8662ebe83570 320 digi_log(LogLevelError, "_get_iosample error %d:\r\n", cmdresp);
spastor 0:fcaad0dfa051 321 return Failure;
spastor 0:fcaad0dfa051 322 }
spastor 0:fcaad0dfa051 323
spastor 0:fcaad0dfa051 324 return Success;
spastor 0:fcaad0dfa051 325 }
spastor 0:fcaad0dfa051 326
spastor 0:fcaad0dfa051 327 RadioStatus XBee::config_io_sample_destination(const RemoteXBee& remote, const RemoteXBee& destination)
spastor 0:fcaad0dfa051 328 {
spastor 0:fcaad0dfa051 329 uint32_t dh;
spastor 0:fcaad0dfa051 330 uint32_t dl;
spastor 0:fcaad0dfa051 331
spastor 0:fcaad0dfa051 332 if (destination.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 333 const uint64_t dest64 = destination.get_addr64();
spastor 0:fcaad0dfa051 334 dh = (uint32_t)((dest64 >> 32) & 0xFFFFFFFF);
spastor 0:fcaad0dfa051 335 dl = (uint32_t)((dest64 & 0xFFFFFFFF));
spastor 0:fcaad0dfa051 336 } else if (destination.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 337 const uint16_t destAddr16 = destination.get_addr16();
spastor 0:fcaad0dfa051 338 dh = 0;
spastor 0:fcaad0dfa051 339 dl = destAddr16;
spastor 0:fcaad0dfa051 340 } else {
spastor 0:fcaad0dfa051 341 digi_log(LogLevelError, "send_io_sample_to: Invalid destination");
spastor 0:fcaad0dfa051 342 return Failure;
spastor 0:fcaad0dfa051 343 }
spastor 0:fcaad0dfa051 344
spastor 0:fcaad0dfa051 345 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 346
spastor 0:fcaad0dfa051 347 cmdresp = set_param(remote, "DH", dh);
spastor 0:fcaad0dfa051 348 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 349 digi_log(LogLevelError, "send_io_sample_to error %d:\r\n", cmdresp);
spastor 0:fcaad0dfa051 350 return Failure;
spastor 0:fcaad0dfa051 351 }
spastor 0:fcaad0dfa051 352
spastor 0:fcaad0dfa051 353 cmdresp = set_param(remote, "DL", dl);
spastor 0:fcaad0dfa051 354 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 355 digi_log(LogLevelError, "send_io_sample_to error %d:\r\n", cmdresp);
spastor 0:fcaad0dfa051 356 return Failure;
spastor 0:fcaad0dfa051 357 }
spastor 0:fcaad0dfa051 358
spastor 0:fcaad0dfa051 359 return Success;
spastor 0:fcaad0dfa051 360 }
spastor 0:fcaad0dfa051 361
spastor 0:fcaad0dfa051 362 RadioStatus XBee::set_io_sample_rate(const RemoteXBee& remote, const float seconds)
spastor 0:fcaad0dfa051 363 {
spastor 0:fcaad0dfa051 364 const float max_seconds = 65.535;
spastor 0:fcaad0dfa051 365
spastor 0:fcaad0dfa051 366 if (seconds > max_seconds) {
spastor 0:fcaad0dfa051 367 digi_log(LogLevelError, "XBee::set_io_sample_rate error seconds rate exceeds maximum %d:\r\n", max_seconds);
spastor 0:fcaad0dfa051 368 return Failure;
spastor 0:fcaad0dfa051 369 }
spastor 0:fcaad0dfa051 370
spastor 0:fcaad0dfa051 371 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 372 const uint16_t milliseconds = seconds * 1000;
spastor 0:fcaad0dfa051 373
spastor 0:fcaad0dfa051 374 cmdresp = set_param(remote, "IR", milliseconds);
spastor 0:fcaad0dfa051 375 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 376 digi_log(LogLevelError, "XBee::set_io_sample_rate error %d:\r\n", cmdresp);
spastor 0:fcaad0dfa051 377 return Failure;
spastor 0:fcaad0dfa051 378 }
spastor 0:fcaad0dfa051 379
spastor 0:fcaad0dfa051 380 return Success;
spastor 0:fcaad0dfa051 381 }