Fork of my original MQTTGateway

Dependencies:   mbed-http

Committer:
vpcola
Date:
Sat Apr 08 14:43:14 2017 +0000
Revision:
0:a1734fe1ec4b
Initial commit

Who changed what in which revision?

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