XBee modules

Dependencies:   DigiLogger

Fork of XBeeLib by Digi International Inc.

Committer:
hbujanda
Date:
Mon May 11 17:58:00 2015 +0200
Revision:
1:794d1d3e4a08
Parent:
0:fcaad0dfa051
Child:
2:2ee1b6d51df2
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 #include "XBee802.h"
spastor 0:fcaad0dfa051 13 #include "IO/IOSample802.h"
spastor 0:fcaad0dfa051 14 #include "Frames/802_Frames.h"
spastor 0:fcaad0dfa051 15 #include "FrameHandlers/FH_ModemStatus.h"
spastor 0:fcaad0dfa051 16
spastor 0:fcaad0dfa051 17 using namespace XBeeLib;
spastor 0:fcaad0dfa051 18
spastor 0:fcaad0dfa051 19 /* Class constructor */
spastor 0:fcaad0dfa051 20 XBee802::XBee802(PinName tx, PinName rx, PinName reset, PinName rts, PinName cts, int baud) :
spastor 0:fcaad0dfa051 21 XBee(tx, rx, reset, rts, cts, baud),
spastor 0:fcaad0dfa051 22 _sync_lost_cnt(0), _nd_handler(NULL), _rx_64b_handler(NULL), _rx_16b_handler(NULL),
spastor 0:fcaad0dfa051 23 _io_data_64b_handler(NULL), _io_data_16b_handler(NULL)
spastor 0:fcaad0dfa051 24 {
spastor 0:fcaad0dfa051 25
spastor 0:fcaad0dfa051 26 _reset_timeout = RESET_TIMEOUT_MS;
spastor 0:fcaad0dfa051 27 }
spastor 0:fcaad0dfa051 28
spastor 0:fcaad0dfa051 29 /* Class destructor */
spastor 0:fcaad0dfa051 30 XBee802::~XBee802()
spastor 0:fcaad0dfa051 31 {
spastor 0:fcaad0dfa051 32 unregister_node_discovery_cb();
spastor 0:fcaad0dfa051 33 unregister_receive_cb();
spastor 0:fcaad0dfa051 34 unregister_io_sample_cb();
spastor 0:fcaad0dfa051 35 }
spastor 0:fcaad0dfa051 36
spastor 0:fcaad0dfa051 37 RadioStatus XBee802::init()
spastor 0:fcaad0dfa051 38 {
spastor 0:fcaad0dfa051 39 RadioStatus retval = XBee::init();
spastor 0:fcaad0dfa051 40 const RadioProtocol radioProtocol = get_radio_protocol();
spastor 0:fcaad0dfa051 41 if (radioProtocol != Raw_802_15_4) {
spastor 0:fcaad0dfa051 42 digi_log(LogLevelError, "Radio protocol does not match, needed a %d got a %d\r\n", Raw_802_15_4, radioProtocol);
spastor 0:fcaad0dfa051 43 retval = Failure;
spastor 0:fcaad0dfa051 44 }
spastor 0:fcaad0dfa051 45 assert(radioProtocol == Raw_802_15_4);
spastor 0:fcaad0dfa051 46
spastor 0:fcaad0dfa051 47 return retval;
spastor 0:fcaad0dfa051 48 }
spastor 0:fcaad0dfa051 49
spastor 0:fcaad0dfa051 50 RadioStatus XBee802::set_channel(uint8_t channel)
spastor 0:fcaad0dfa051 51 {
spastor 0:fcaad0dfa051 52 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 53
spastor 0:fcaad0dfa051 54 if (is_PRO()) {
spastor 0:fcaad0dfa051 55 if (channel < 0x0C || channel > 0x17) {
spastor 0:fcaad0dfa051 56 return Failure;
spastor 0:fcaad0dfa051 57 }
spastor 0:fcaad0dfa051 58 } else {
spastor 0:fcaad0dfa051 59 if (channel < 0x0B || channel > 0x1A) {
spastor 0:fcaad0dfa051 60 return Failure;
spastor 0:fcaad0dfa051 61 }
spastor 0:fcaad0dfa051 62 }
spastor 0:fcaad0dfa051 63
spastor 0:fcaad0dfa051 64 cmdresp = set_param("CH", channel);
spastor 0:fcaad0dfa051 65 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 66 return Failure;
spastor 0:fcaad0dfa051 67 }
spastor 0:fcaad0dfa051 68 return Success;
spastor 0:fcaad0dfa051 69 }
spastor 0:fcaad0dfa051 70
spastor 0:fcaad0dfa051 71 RadioStatus XBee802::get_channel(uint8_t * const channel)
spastor 0:fcaad0dfa051 72 {
spastor 0:fcaad0dfa051 73 if (channel == NULL) {
spastor 0:fcaad0dfa051 74 return Failure;
spastor 0:fcaad0dfa051 75 }
spastor 0:fcaad0dfa051 76 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 77
spastor 0:fcaad0dfa051 78 uint32_t var32;
spastor 0:fcaad0dfa051 79 cmdresp = get_param("CH", &var32);
spastor 0:fcaad0dfa051 80 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 81 return Failure;
spastor 0:fcaad0dfa051 82 *channel = var32;
spastor 0:fcaad0dfa051 83 return Success;
spastor 0:fcaad0dfa051 84 }
spastor 0:fcaad0dfa051 85
spastor 0:fcaad0dfa051 86 RadioStatus XBee802::set_panid(uint16_t panid)
spastor 0:fcaad0dfa051 87 {
spastor 0:fcaad0dfa051 88 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 89
spastor 0:fcaad0dfa051 90 cmdresp = set_param("ID", panid);
spastor 0:fcaad0dfa051 91 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 92 return Failure;
spastor 0:fcaad0dfa051 93 }
spastor 0:fcaad0dfa051 94 return Success;
spastor 0:fcaad0dfa051 95 }
spastor 0:fcaad0dfa051 96
spastor 0:fcaad0dfa051 97 RadioStatus XBee802::get_panid(uint16_t * const panid)
spastor 0:fcaad0dfa051 98 {
spastor 0:fcaad0dfa051 99 if (panid == NULL) {
spastor 0:fcaad0dfa051 100 return Failure;
spastor 0:fcaad0dfa051 101 }
spastor 0:fcaad0dfa051 102 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 103
spastor 0:fcaad0dfa051 104 uint32_t var32;
spastor 0:fcaad0dfa051 105 cmdresp = get_param("ID", &var32);
spastor 0:fcaad0dfa051 106 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 107 return Failure;
spastor 0:fcaad0dfa051 108 *panid = var32;
spastor 0:fcaad0dfa051 109 return Success;
spastor 0:fcaad0dfa051 110 }
spastor 0:fcaad0dfa051 111
spastor 0:fcaad0dfa051 112 RadioStatus XBee802::set_network_address(uint16_t addr16)
spastor 0:fcaad0dfa051 113 {
spastor 0:fcaad0dfa051 114 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 115
spastor 0:fcaad0dfa051 116 cmdresp = set_param("MY", addr16);
spastor 0:fcaad0dfa051 117 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 118 return Failure;
spastor 0:fcaad0dfa051 119 }
spastor 0:fcaad0dfa051 120 return Success;
spastor 0:fcaad0dfa051 121 }
spastor 0:fcaad0dfa051 122
spastor 0:fcaad0dfa051 123 void XBee802::radio_status_update(AtCmdFrame::ModemStatus modem_status)
spastor 0:fcaad0dfa051 124 {
spastor 0:fcaad0dfa051 125 /* Update the radio status variables */
spastor 0:fcaad0dfa051 126 if (modem_status == AtCmdFrame::HwReset)
spastor 0:fcaad0dfa051 127 _hw_reset_cnt++;
spastor 0:fcaad0dfa051 128 else if (modem_status == AtCmdFrame::WdReset)
spastor 0:fcaad0dfa051 129 _wd_reset_cnt++;
spastor 0:fcaad0dfa051 130 else if (modem_status == AtCmdFrame::SyncLost)
spastor 0:fcaad0dfa051 131 _sync_lost_cnt++;
spastor 0:fcaad0dfa051 132
spastor 0:fcaad0dfa051 133 _modem_status = modem_status;
spastor 0:fcaad0dfa051 134
spastor 0:fcaad0dfa051 135 digi_log(LogLevelDebug, "\r\nUpdating radio status: %02x\r\n", modem_status);
spastor 0:fcaad0dfa051 136 }
spastor 0:fcaad0dfa051 137
spastor 0:fcaad0dfa051 138 TxStatus XBee802::send_data(const RemoteXBee& remote, const uint8_t *const data, uint16_t len)
spastor 0:fcaad0dfa051 139 {
spastor 0:fcaad0dfa051 140 if (remote.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 141 const uint64_t remote64 = remote.get_addr64();
spastor 0:fcaad0dfa051 142
spastor 0:fcaad0dfa051 143 digi_log(LogLevelDebug, "send_data ADDR64: %08x:%08x\r\n", UINT64_HI32(remote64), UINT64_LO32(remote64));
spastor 0:fcaad0dfa051 144
spastor 0:fcaad0dfa051 145 TxFrame802 frame = TxFrame802(remote64, _tx_options, data, len);
spastor 0:fcaad0dfa051 146
spastor 0:fcaad0dfa051 147 return send_data(&frame);
spastor 0:fcaad0dfa051 148 }
spastor 0:fcaad0dfa051 149
spastor 0:fcaad0dfa051 150 if (remote.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 151 const uint16_t remote16 = remote.get_addr16();
spastor 0:fcaad0dfa051 152
spastor 0:fcaad0dfa051 153 digi_log(LogLevelDebug, "send_data ADDR16: %04x\r\n", remote16);
spastor 0:fcaad0dfa051 154
spastor 0:fcaad0dfa051 155 TxFrame802 frame = TxFrame802(remote16, _tx_options, data, len);
spastor 0:fcaad0dfa051 156
spastor 0:fcaad0dfa051 157 return send_data(&frame);
spastor 0:fcaad0dfa051 158 }
spastor 0:fcaad0dfa051 159
spastor 0:fcaad0dfa051 160 return TxStatusInvalidAddr;
spastor 0:fcaad0dfa051 161 }
spastor 0:fcaad0dfa051 162
hbujanda 1:794d1d3e4a08 163 TxStatus XBee802::send_data(uint64_t remote64, const uint8_t *const data, uint16_t len)
spastor 0:fcaad0dfa051 164 {
hbujanda 1:794d1d3e4a08 165 TxFrame802 frame = TxFrame802(remote64, _tx_options, data, len);
hbujanda 1:794d1d3e4a08 166 return send_data(&frame);
hbujanda 1:794d1d3e4a08 167 }
hbujanda 1:794d1d3e4a08 168
hbujanda 1:794d1d3e4a08 169 TxStatus XBee802::send_data(uint16_t addr16, const uint8_t *const data, uint16_t len)
hbujanda 1:794d1d3e4a08 170 {
hbujanda 1:794d1d3e4a08 171 TxFrame802 frame = TxFrame802(addr16, _tx_options, data, len);
hbujanda 1:794d1d3e4a08 172 return send_data(&frame);
spastor 0:fcaad0dfa051 173 }
spastor 0:fcaad0dfa051 174
spastor 0:fcaad0dfa051 175 void XBee802::register_node_discovery_cb(node_discovery_802_cb_t function)
spastor 0:fcaad0dfa051 176 {
spastor 0:fcaad0dfa051 177 if (_nd_handler == NULL) {
spastor 0:fcaad0dfa051 178 _nd_handler = new FH_NodeDiscovery802();
spastor 0:fcaad0dfa051 179 register_frame_handler(_nd_handler);
spastor 0:fcaad0dfa051 180 }
spastor 0:fcaad0dfa051 181 _nd_handler->register_node_discovery_cb(function);
spastor 0:fcaad0dfa051 182 }
spastor 0:fcaad0dfa051 183
spastor 0:fcaad0dfa051 184 void XBee802::unregister_node_discovery_cb()
spastor 0:fcaad0dfa051 185 {
spastor 0:fcaad0dfa051 186 if (_nd_handler != NULL) {
spastor 0:fcaad0dfa051 187 _nd_handler->unregister_node_discovery_cb();
spastor 0:fcaad0dfa051 188 unregister_frame_handler(_nd_handler);
spastor 0:fcaad0dfa051 189 delete _nd_handler;
spastor 0:fcaad0dfa051 190 _nd_handler = NULL; /* as delete does not set to NULL */
spastor 0:fcaad0dfa051 191 }
spastor 0:fcaad0dfa051 192 }
spastor 0:fcaad0dfa051 193
spastor 0:fcaad0dfa051 194 void XBee802::register_receive_cb(receive_802_cb_t function)
spastor 0:fcaad0dfa051 195 {
spastor 0:fcaad0dfa051 196 if (_rx_64b_handler == NULL) {
spastor 0:fcaad0dfa051 197 _rx_64b_handler = new FH_RxPacket64b802();
spastor 0:fcaad0dfa051 198 register_frame_handler(_rx_64b_handler);
spastor 0:fcaad0dfa051 199 }
spastor 0:fcaad0dfa051 200 _rx_64b_handler->register_receive_cb(function);
spastor 0:fcaad0dfa051 201
spastor 0:fcaad0dfa051 202 if (_rx_16b_handler == NULL) {
spastor 0:fcaad0dfa051 203 _rx_16b_handler = new FH_RxPacket16b802();
spastor 0:fcaad0dfa051 204 register_frame_handler(_rx_16b_handler);
spastor 0:fcaad0dfa051 205 }
spastor 0:fcaad0dfa051 206 _rx_16b_handler->register_receive_cb(function);
spastor 0:fcaad0dfa051 207 }
spastor 0:fcaad0dfa051 208
spastor 0:fcaad0dfa051 209 void XBee802::unregister_receive_cb()
spastor 0:fcaad0dfa051 210 {
spastor 0:fcaad0dfa051 211 if (_rx_64b_handler != NULL) {
spastor 0:fcaad0dfa051 212 _rx_64b_handler->unregister_receive_cb();
spastor 0:fcaad0dfa051 213 unregister_frame_handler(_rx_64b_handler);
spastor 0:fcaad0dfa051 214 delete _rx_64b_handler;
spastor 0:fcaad0dfa051 215 _rx_64b_handler = NULL; /* as delete does not set to NULL */
spastor 0:fcaad0dfa051 216 }
spastor 0:fcaad0dfa051 217
spastor 0:fcaad0dfa051 218 if (_rx_16b_handler != NULL) {
spastor 0:fcaad0dfa051 219 _rx_16b_handler->unregister_receive_cb();
spastor 0:fcaad0dfa051 220 unregister_frame_handler(_rx_16b_handler);
spastor 0:fcaad0dfa051 221 delete _rx_16b_handler;
spastor 0:fcaad0dfa051 222 _rx_16b_handler = NULL; /* as delete does not set to NULL */
spastor 0:fcaad0dfa051 223 }
spastor 0:fcaad0dfa051 224 }
spastor 0:fcaad0dfa051 225
spastor 0:fcaad0dfa051 226 void XBee802::register_io_sample_cb(io_data_cb_802_t function)
spastor 0:fcaad0dfa051 227 {
spastor 0:fcaad0dfa051 228 if (_io_data_64b_handler == NULL) {
spastor 0:fcaad0dfa051 229 _io_data_64b_handler = new FH_IoDataSampe64b802();
spastor 0:fcaad0dfa051 230 register_frame_handler(_io_data_64b_handler);
spastor 0:fcaad0dfa051 231 }
spastor 0:fcaad0dfa051 232 _io_data_64b_handler->register_io_data_cb(function);
spastor 0:fcaad0dfa051 233
spastor 0:fcaad0dfa051 234 if (_io_data_16b_handler == NULL) {
spastor 0:fcaad0dfa051 235 _io_data_16b_handler = new FH_IoDataSampe16b802();
spastor 0:fcaad0dfa051 236 register_frame_handler(_io_data_16b_handler);
spastor 0:fcaad0dfa051 237 }
spastor 0:fcaad0dfa051 238 _io_data_16b_handler->register_io_data_cb(function);
spastor 0:fcaad0dfa051 239 }
spastor 0:fcaad0dfa051 240
spastor 0:fcaad0dfa051 241 void XBee802::unregister_io_sample_cb()
spastor 0:fcaad0dfa051 242 {
spastor 0:fcaad0dfa051 243 if (_io_data_64b_handler != NULL) {
spastor 0:fcaad0dfa051 244 _io_data_64b_handler->unregister_io_data_cb();
spastor 0:fcaad0dfa051 245 unregister_frame_handler(_io_data_64b_handler);
spastor 0:fcaad0dfa051 246 delete _io_data_64b_handler;
spastor 0:fcaad0dfa051 247 _io_data_64b_handler = NULL; /* as delete does not set to NULL */
spastor 0:fcaad0dfa051 248 }
spastor 0:fcaad0dfa051 249
spastor 0:fcaad0dfa051 250 if (_io_data_16b_handler != NULL) {
spastor 0:fcaad0dfa051 251 _io_data_16b_handler->unregister_io_data_cb();
spastor 0:fcaad0dfa051 252 unregister_frame_handler(_io_data_16b_handler);
spastor 0:fcaad0dfa051 253 delete _io_data_16b_handler;
spastor 0:fcaad0dfa051 254 _io_data_16b_handler = NULL; /* as delete does not set to NULL */
spastor 0:fcaad0dfa051 255 }
spastor 0:fcaad0dfa051 256 }
spastor 0:fcaad0dfa051 257
spastor 0:fcaad0dfa051 258 AtCmdFrame::AtCmdResp XBee802::get_param(const RemoteXBee& remote, const char * const param, uint32_t * const data)
spastor 0:fcaad0dfa051 259 {
spastor 0:fcaad0dfa051 260 uint16_t len = sizeof *data;
spastor 0:fcaad0dfa051 261 AtCmdFrame::AtCmdResp atCmdResponse;
spastor 0:fcaad0dfa051 262
spastor 0:fcaad0dfa051 263 if (remote.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 264 const uint64_t dev_addr64 = remote.get_addr64();
spastor 0:fcaad0dfa051 265
spastor 0:fcaad0dfa051 266 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr64, param);
spastor 0:fcaad0dfa051 267 atCmdResponse = send_at_cmd(&cmd_frame, (uint8_t *)data, &len, RadioRemote);
spastor 0:fcaad0dfa051 268 } else if (remote.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 269 const uint16_t dev_addr16 = remote.get_addr16();
spastor 0:fcaad0dfa051 270
spastor 0:fcaad0dfa051 271 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr16, param);
spastor 0:fcaad0dfa051 272 atCmdResponse = send_at_cmd(&cmd_frame, (uint8_t *)data, &len, RadioRemote);
spastor 0:fcaad0dfa051 273 } else {
spastor 0:fcaad0dfa051 274 return AtCmdFrame::AtCmdRespInvalidAddr;
spastor 0:fcaad0dfa051 275 }
spastor 0:fcaad0dfa051 276
spastor 0:fcaad0dfa051 277 if (atCmdResponse == AtCmdFrame::AtCmdRespOk && len > sizeof *data) {
spastor 0:fcaad0dfa051 278 atCmdResponse = AtCmdFrame::AtCmdRespLenMismatch;
spastor 0:fcaad0dfa051 279 }
spastor 0:fcaad0dfa051 280
spastor 0:fcaad0dfa051 281 return atCmdResponse;
spastor 0:fcaad0dfa051 282 }
spastor 0:fcaad0dfa051 283
spastor 0:fcaad0dfa051 284 AtCmdFrame::AtCmdResp XBee802::set_param(const RemoteXBee& remote, const char * const param, uint32_t data)
spastor 0:fcaad0dfa051 285 {
spastor 0:fcaad0dfa051 286 if (remote.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 287 const uint64_t dev_addr64 = remote.get_addr64();
spastor 0:fcaad0dfa051 288
spastor 0:fcaad0dfa051 289 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr64, param, data);
spastor 0:fcaad0dfa051 290 return send_at_cmd(&cmd_frame, NULL, NULL, RadioRemote);
spastor 0:fcaad0dfa051 291 }
spastor 0:fcaad0dfa051 292
spastor 0:fcaad0dfa051 293 if (remote.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 294 const uint16_t dev_addr16 = remote.get_addr16();
spastor 0:fcaad0dfa051 295
spastor 0:fcaad0dfa051 296 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr16, param, data);
spastor 0:fcaad0dfa051 297 return send_at_cmd(&cmd_frame, NULL, NULL, RadioRemote);
spastor 0:fcaad0dfa051 298 }
spastor 0:fcaad0dfa051 299
spastor 0:fcaad0dfa051 300 return AtCmdFrame::AtCmdRespInvalidAddr;
spastor 0:fcaad0dfa051 301 }
spastor 0:fcaad0dfa051 302
spastor 0:fcaad0dfa051 303 AtCmdFrame::AtCmdResp XBee802::set_param(const RemoteXBee& remote, const char * const param, const uint8_t * data, uint16_t len)
spastor 0:fcaad0dfa051 304 {
spastor 0:fcaad0dfa051 305 if (remote.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 306 const uint64_t dev_addr64 = remote.get_addr64();
spastor 0:fcaad0dfa051 307
spastor 0:fcaad0dfa051 308 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr64, param, data, len);
spastor 0:fcaad0dfa051 309 return send_at_cmd(&cmd_frame, NULL, NULL, RadioRemote);
spastor 0:fcaad0dfa051 310 }
spastor 0:fcaad0dfa051 311
spastor 0:fcaad0dfa051 312 if (remote.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 313 const uint16_t dev_addr16 = remote.get_addr16();
spastor 0:fcaad0dfa051 314
spastor 0:fcaad0dfa051 315 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr16, param, data, len);
spastor 0:fcaad0dfa051 316 return send_at_cmd(&cmd_frame, NULL, NULL, RadioRemote);
spastor 0:fcaad0dfa051 317 }
spastor 0:fcaad0dfa051 318
spastor 0:fcaad0dfa051 319 return AtCmdFrame::AtCmdRespInvalidAddr;
spastor 0:fcaad0dfa051 320 }
spastor 0:fcaad0dfa051 321
spastor 0:fcaad0dfa051 322 AtCmdFrame::AtCmdResp XBee802::get_param(const RemoteXBee& remote, const char * const param, uint8_t * const data, uint16_t * const len)
spastor 0:fcaad0dfa051 323 {
spastor 0:fcaad0dfa051 324 if (remote.is_valid_addr64b()) {
spastor 0:fcaad0dfa051 325 uint64_t dev_addr64 = remote.get_addr64();
spastor 0:fcaad0dfa051 326
spastor 0:fcaad0dfa051 327 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr64, param);
spastor 0:fcaad0dfa051 328 return send_at_cmd(&cmd_frame, data, len, RadioRemote, false);
spastor 0:fcaad0dfa051 329 }
spastor 0:fcaad0dfa051 330
spastor 0:fcaad0dfa051 331 if (remote.is_valid_addr16b()) {
spastor 0:fcaad0dfa051 332 uint16_t dev_addr16 = remote.get_addr16();
spastor 0:fcaad0dfa051 333
spastor 0:fcaad0dfa051 334 AtCmdFrame cmd_frame = AtCmdFrame(dev_addr16, param);
spastor 0:fcaad0dfa051 335 return send_at_cmd(&cmd_frame, data, len, RadioRemote, false);
spastor 0:fcaad0dfa051 336 }
spastor 0:fcaad0dfa051 337
spastor 0:fcaad0dfa051 338 return AtCmdFrame::AtCmdRespInvalidAddr;
spastor 0:fcaad0dfa051 339 }
spastor 0:fcaad0dfa051 340
spastor 0:fcaad0dfa051 341 static void get_dio_cmd(XBee802::IoLine line, char * const iocmd)
spastor 0:fcaad0dfa051 342 {
spastor 0:fcaad0dfa051 343 if (line >= XBee802::PWM0) {
spastor 0:fcaad0dfa051 344 iocmd[0] = 'P';
spastor 0:fcaad0dfa051 345 iocmd[1] = '0' + line - XBee802::PWM0;
spastor 0:fcaad0dfa051 346 } else {
spastor 0:fcaad0dfa051 347 iocmd[0] = 'D';
spastor 0:fcaad0dfa051 348 iocmd[1] = '0' + line;
spastor 0:fcaad0dfa051 349 }
spastor 0:fcaad0dfa051 350 iocmd[2] = '\0';
spastor 0:fcaad0dfa051 351 }
spastor 0:fcaad0dfa051 352
spastor 0:fcaad0dfa051 353 RadioStatus XBee802::set_pin_config(const RemoteXBee& remote, IoLine line, IoMode mode)
spastor 0:fcaad0dfa051 354 {
spastor 0:fcaad0dfa051 355 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 356 char iocmd[3];
spastor 0:fcaad0dfa051 357
spastor 0:fcaad0dfa051 358 get_dio_cmd(line, iocmd);
spastor 0:fcaad0dfa051 359
spastor 0:fcaad0dfa051 360 cmdresp = set_param(remote, iocmd, (uint8_t)mode);
spastor 0:fcaad0dfa051 361 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 362 digi_log(LogLevelError, "set_pin_config: set_param returned %d\r\n", cmdresp);
spastor 0:fcaad0dfa051 363 return Failure;
spastor 0:fcaad0dfa051 364 }
spastor 0:fcaad0dfa051 365
spastor 0:fcaad0dfa051 366 return Success;
spastor 0:fcaad0dfa051 367 }
spastor 0:fcaad0dfa051 368
spastor 0:fcaad0dfa051 369 RadioStatus XBee802::get_pin_config(const RemoteXBee& remote, IoLine line, IoMode * const mode)
spastor 0:fcaad0dfa051 370 {
spastor 0:fcaad0dfa051 371 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 372 char iocmd[3];
spastor 0:fcaad0dfa051 373
spastor 0:fcaad0dfa051 374 get_dio_cmd(line, iocmd);
spastor 0:fcaad0dfa051 375
spastor 0:fcaad0dfa051 376 uint32_t var32;
spastor 0:fcaad0dfa051 377 cmdresp = get_param(remote, iocmd, &var32);
spastor 0:fcaad0dfa051 378 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 379 return Failure;
spastor 0:fcaad0dfa051 380 }
spastor 0:fcaad0dfa051 381 *mode = (IoMode)var32;
spastor 0:fcaad0dfa051 382
spastor 0:fcaad0dfa051 383 return Success;
spastor 0:fcaad0dfa051 384 }
spastor 0:fcaad0dfa051 385
spastor 0:fcaad0dfa051 386 RadioStatus XBee802::set_dio(const RemoteXBee& remote, IoLine line, DioVal val)
spastor 0:fcaad0dfa051 387 {
spastor 0:fcaad0dfa051 388 if (line > DI8) {
spastor 0:fcaad0dfa051 389 digi_log(LogLevelError, "set_dio: Pin %d not supported as IO\r\n", line);
spastor 0:fcaad0dfa051 390 return Failure;
spastor 0:fcaad0dfa051 391 }
spastor 0:fcaad0dfa051 392
spastor 0:fcaad0dfa051 393 if (val == Low) {
spastor 0:fcaad0dfa051 394 return set_pin_config(remote, line, DigitalOutLow);
spastor 0:fcaad0dfa051 395 } else {
spastor 0:fcaad0dfa051 396 return set_pin_config(remote, line, DigitalOutHigh);
spastor 0:fcaad0dfa051 397 }
spastor 0:fcaad0dfa051 398 }
spastor 0:fcaad0dfa051 399
spastor 0:fcaad0dfa051 400 RadioStatus XBee802::get_dio(const RemoteXBee& remote, IoLine line, DioVal * const val)
spastor 0:fcaad0dfa051 401 {
spastor 0:fcaad0dfa051 402 uint8_t io_sample[MAX_IO_SAMPLE_BUF_LEN];
spastor 0:fcaad0dfa051 403 uint16_t len;
spastor 0:fcaad0dfa051 404
spastor 0:fcaad0dfa051 405 if (line > DI8) {
spastor 0:fcaad0dfa051 406 digi_log(LogLevelError, "get_dio: Pin %d not supported as IO\r\n", line);
spastor 0:fcaad0dfa051 407 return Failure;
spastor 0:fcaad0dfa051 408 }
spastor 0:fcaad0dfa051 409
spastor 0:fcaad0dfa051 410 RadioStatus resp = get_iosample(remote, io_sample, &len);
spastor 0:fcaad0dfa051 411 if (resp != Success)
spastor 0:fcaad0dfa051 412 return resp;
spastor 0:fcaad0dfa051 413
spastor 0:fcaad0dfa051 414 IOSample802 ioSample = IOSample802(io_sample, len);
spastor 0:fcaad0dfa051 415 return ioSample.get_dio(line, val);
spastor 0:fcaad0dfa051 416 }
spastor 0:fcaad0dfa051 417
spastor 0:fcaad0dfa051 418 RadioStatus XBee802::get_adc(const RemoteXBee& remote, IoLine line, uint16_t * const val)
spastor 0:fcaad0dfa051 419 {
spastor 0:fcaad0dfa051 420 uint8_t io_sample[MAX_IO_SAMPLE_BUF_LEN];
spastor 0:fcaad0dfa051 421 uint16_t len;
spastor 0:fcaad0dfa051 422
spastor 0:fcaad0dfa051 423 if (line > DIO5_AD5) {
spastor 0:fcaad0dfa051 424 digi_log(LogLevelError, "get_adc: Pin %d not supported as ADC\r\n", line);
spastor 0:fcaad0dfa051 425 return Failure;
spastor 0:fcaad0dfa051 426 }
spastor 0:fcaad0dfa051 427
spastor 0:fcaad0dfa051 428 RadioStatus resp = get_iosample(remote, io_sample, &len);
spastor 0:fcaad0dfa051 429 if (resp != Success) {
spastor 0:fcaad0dfa051 430 return resp;
spastor 0:fcaad0dfa051 431 }
spastor 0:fcaad0dfa051 432
spastor 0:fcaad0dfa051 433 IOSample802 ioSample = IOSample802(io_sample, len);
spastor 0:fcaad0dfa051 434 return ioSample.get_adc(line, val);
spastor 0:fcaad0dfa051 435 }
spastor 0:fcaad0dfa051 436
spastor 0:fcaad0dfa051 437 RadioStatus XBee802::set_pwm(const RemoteXBee& remote, IoLine line, float duty_cycle)
spastor 0:fcaad0dfa051 438 {
spastor 0:fcaad0dfa051 439 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 440 char iocmd[3] = { 'M', '0', '\0' };
spastor 0:fcaad0dfa051 441
spastor 0:fcaad0dfa051 442 if (line != PWM0 && line != PWM1) {
spastor 0:fcaad0dfa051 443 return Failure;
spastor 0:fcaad0dfa051 444 }
spastor 0:fcaad0dfa051 445 if (line == PWM1) {
spastor 0:fcaad0dfa051 446 iocmd[1] = '1';
spastor 0:fcaad0dfa051 447 }
spastor 0:fcaad0dfa051 448
spastor 0:fcaad0dfa051 449 uint16_t pwm_val = (uint16_t)(duty_cycle * DR_PWM_MAX_VAL / 100);
spastor 0:fcaad0dfa051 450
spastor 0:fcaad0dfa051 451 cmdresp = set_param(remote, iocmd, pwm_val);
spastor 0:fcaad0dfa051 452 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 453 return Failure;
spastor 0:fcaad0dfa051 454
spastor 0:fcaad0dfa051 455 return Success;
spastor 0:fcaad0dfa051 456 }
spastor 0:fcaad0dfa051 457
spastor 0:fcaad0dfa051 458 static uint8_t get_dio_mask(XBee802::IoLine line)
spastor 0:fcaad0dfa051 459 {
spastor 0:fcaad0dfa051 460 switch (line) {
spastor 0:fcaad0dfa051 461 case XBee802::DIO4_AD4:
spastor 0:fcaad0dfa051 462 return (1 << 0);
spastor 0:fcaad0dfa051 463 case XBee802::DIO3_AD3:
spastor 0:fcaad0dfa051 464 return (1 << 1);
spastor 0:fcaad0dfa051 465 case XBee802::DIO2_AD2:
spastor 0:fcaad0dfa051 466 return (1 << 2);
spastor 0:fcaad0dfa051 467 case XBee802::DIO1_AD1:
spastor 0:fcaad0dfa051 468 return (1 << 3);
spastor 0:fcaad0dfa051 469 case XBee802::DIO0_AD0:
spastor 0:fcaad0dfa051 470 return (1 << 4);
spastor 0:fcaad0dfa051 471 case XBee802::DIO6:
spastor 0:fcaad0dfa051 472 return (1 << 5);
spastor 0:fcaad0dfa051 473 case XBee802::DI8:
spastor 0:fcaad0dfa051 474 return (1 << 6);
spastor 0:fcaad0dfa051 475 default:
spastor 0:fcaad0dfa051 476 return 0;
spastor 0:fcaad0dfa051 477 }
spastor 0:fcaad0dfa051 478 }
spastor 0:fcaad0dfa051 479
spastor 0:fcaad0dfa051 480 RadioStatus XBee802::set_pin_pull_up(const RemoteXBee& remote, IoLine line, bool enable)
spastor 0:fcaad0dfa051 481 {
spastor 0:fcaad0dfa051 482 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 483 uint32_t var32;
spastor 0:fcaad0dfa051 484 uint8_t pr;
spastor 0:fcaad0dfa051 485
spastor 0:fcaad0dfa051 486 cmdresp = get_param(remote, "PR", &var32);
spastor 0:fcaad0dfa051 487 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 488 return Failure;
spastor 0:fcaad0dfa051 489 pr = var32;
spastor 0:fcaad0dfa051 490
spastor 0:fcaad0dfa051 491 const uint8_t dio_mask = get_dio_mask(line);
spastor 0:fcaad0dfa051 492 if (dio_mask == 0) {
spastor 0:fcaad0dfa051 493 digi_log(LogLevelError, "XBee802::set_pin_pull_up: invalid pin %d\r\n", line);
spastor 0:fcaad0dfa051 494 return Failure;
spastor 0:fcaad0dfa051 495 }
spastor 0:fcaad0dfa051 496
spastor 0:fcaad0dfa051 497 if (enable) {
spastor 0:fcaad0dfa051 498 pr |= dio_mask;
spastor 0:fcaad0dfa051 499 } else {
spastor 0:fcaad0dfa051 500 pr &= ~dio_mask;
spastor 0:fcaad0dfa051 501 }
spastor 0:fcaad0dfa051 502
spastor 0:fcaad0dfa051 503 cmdresp = set_param(remote, "PR", pr);
spastor 0:fcaad0dfa051 504 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 505 return Failure;
spastor 0:fcaad0dfa051 506
spastor 0:fcaad0dfa051 507 return Success;
spastor 0:fcaad0dfa051 508 }
spastor 0:fcaad0dfa051 509
spastor 0:fcaad0dfa051 510 static uint8_t get_dio_ic_mask(XBee802::IoLine line)
spastor 0:fcaad0dfa051 511 {
spastor 0:fcaad0dfa051 512 if (line < XBee802::DI8) {
spastor 0:fcaad0dfa051 513 return (1 << line);
spastor 0:fcaad0dfa051 514 }
spastor 0:fcaad0dfa051 515 return 0;
spastor 0:fcaad0dfa051 516 }
spastor 0:fcaad0dfa051 517
spastor 0:fcaad0dfa051 518 RadioStatus XBee802::enable_dio_change_detection(const RemoteXBee& remote, IoLine line, bool enable)
spastor 0:fcaad0dfa051 519 {
spastor 0:fcaad0dfa051 520 if (line > DIO7) {
spastor 0:fcaad0dfa051 521 digi_log(LogLevelError, "XBee802::enable_dio_change_detection: pin not supported (%d)\r\n", line);
spastor 0:fcaad0dfa051 522 return Failure;
spastor 0:fcaad0dfa051 523 }
spastor 0:fcaad0dfa051 524
spastor 0:fcaad0dfa051 525 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 526 uint32_t var32;
spastor 0:fcaad0dfa051 527 uint8_t ic;
spastor 0:fcaad0dfa051 528
spastor 0:fcaad0dfa051 529 cmdresp = get_param(remote, "IC", &var32);
spastor 0:fcaad0dfa051 530 if (cmdresp != AtCmdFrame::AtCmdRespOk) {
spastor 0:fcaad0dfa051 531 return Failure;
spastor 0:fcaad0dfa051 532 }
spastor 0:fcaad0dfa051 533 ic = var32;
spastor 0:fcaad0dfa051 534
spastor 0:fcaad0dfa051 535 const uint8_t dio_mask = get_dio_ic_mask(line);
spastor 0:fcaad0dfa051 536 if (dio_mask == 0) {
spastor 0:fcaad0dfa051 537 digi_log(LogLevelError, "XBeeZB::enable_dio_change_detection: invalid pin %d\r\n", line);
spastor 0:fcaad0dfa051 538 return Failure;
spastor 0:fcaad0dfa051 539 }
spastor 0:fcaad0dfa051 540
spastor 0:fcaad0dfa051 541 if (enable) {
spastor 0:fcaad0dfa051 542 ic |= dio_mask;
spastor 0:fcaad0dfa051 543 } else {
spastor 0:fcaad0dfa051 544 ic &= ~dio_mask;
spastor 0:fcaad0dfa051 545 }
spastor 0:fcaad0dfa051 546
spastor 0:fcaad0dfa051 547 cmdresp = set_param(remote, "IC", ic);
spastor 0:fcaad0dfa051 548 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 549 return Failure;
spastor 0:fcaad0dfa051 550
spastor 0:fcaad0dfa051 551 return Success;
spastor 0:fcaad0dfa051 552 }
spastor 0:fcaad0dfa051 553
spastor 0:fcaad0dfa051 554 #ifdef GET_PWM_AVAILABLE
spastor 0:fcaad0dfa051 555 RadioStatus XBee802::get_pwm(const RemoteXBee& remote, IoLine line, float * const duty_cycle)
spastor 0:fcaad0dfa051 556 {
spastor 0:fcaad0dfa051 557 AtCmdFrame::AtCmdResp cmdresp;
spastor 0:fcaad0dfa051 558 char iocmd[3] = { 'M', '0', '\0' };
spastor 0:fcaad0dfa051 559
spastor 0:fcaad0dfa051 560 if (line != PWM0 && line != PWM1)
spastor 0:fcaad0dfa051 561 return Failure;
spastor 0:fcaad0dfa051 562
spastor 0:fcaad0dfa051 563 if (line == PWM1)
spastor 0:fcaad0dfa051 564 iocmd[1] = '1';
spastor 0:fcaad0dfa051 565
spastor 0:fcaad0dfa051 566 uint16_t pwm_val;
spastor 0:fcaad0dfa051 567
spastor 0:fcaad0dfa051 568 cmdresp = get_param(remote, iocmd, &pwm_val);
spastor 0:fcaad0dfa051 569 if (cmdresp != AtCmdFrame::AtCmdRespOk)
spastor 0:fcaad0dfa051 570 return Failure;
spastor 0:fcaad0dfa051 571
spastor 0:fcaad0dfa051 572 *duty_cycle = (float)(pwm_val * 100 / DR_PWM_MAX_VAL);
spastor 0:fcaad0dfa051 573
spastor 0:fcaad0dfa051 574 return Success;
spastor 0:fcaad0dfa051 575 }
spastor 0:fcaad0dfa051 576 #endif