Xbee API library with support SPI connection. (use only SPI supported model. see also http://www.digi.com/support/kbase/kbaseresultdetl?id=3362 )

Dependents:   XBeeWiFi_SPI_example

Fork of XBee by Suga koubou

Committer:
ban4jp
Date:
Sat Jan 04 15:34:59 2014 +0000
Revision:
10:eb70be6ceb6d
Parent:
9:e32c2e5390d3
Fixed #define USE_XBEE_SPI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:e3b2027e685c 1 /**
okini3939 1:e3b2027e685c 2 * XBee-mbed library
okini3939 1:e3b2027e685c 3 * Modified for mbed, 2011 Suga.
okini3939 1:e3b2027e685c 4 *
okini3939 1:e3b2027e685c 5 *
okini3939 1:e3b2027e685c 6 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
okini3939 1:e3b2027e685c 7 *
okini3939 1:e3b2027e685c 8 * This file is part of XBee-Arduino.
okini3939 1:e3b2027e685c 9 *
okini3939 1:e3b2027e685c 10 * XBee-Arduino is free software: you can redistribute it and/or modify
okini3939 1:e3b2027e685c 11 * it under the terms of the GNU General Public License as published by
okini3939 1:e3b2027e685c 12 * the Free Software Foundation, either version 3 of the License, or
okini3939 1:e3b2027e685c 13 * (at your option) any later version.
okini3939 1:e3b2027e685c 14 *
okini3939 1:e3b2027e685c 15 * XBee-Arduino is distributed in the hope that it will be useful,
okini3939 1:e3b2027e685c 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
okini3939 1:e3b2027e685c 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
okini3939 1:e3b2027e685c 18 * GNU General Public License for more details.
okini3939 1:e3b2027e685c 19 *
okini3939 1:e3b2027e685c 20 * You should have received a copy of the GNU General Public License
okini3939 1:e3b2027e685c 21 * along with XBee-Arduino. If not, see <http://www.gnu.org/licenses/>.
okini3939 1:e3b2027e685c 22 */
okini3939 1:e3b2027e685c 23
okini3939 3:8573b122fa84 24 /** @file
okini3939 3:8573b122fa84 25 * @brief XBee library for mbed
okini3939 3:8573b122fa84 26 */
okini3939 3:8573b122fa84 27
okini3939 3:8573b122fa84 28 //#define DEBUG
okini3939 3:8573b122fa84 29 #include "dbg.h"
okini3939 3:8573b122fa84 30
okini3939 6:6f84e2840408 31 #include "XBee_conf.h"
okini3939 6:6f84e2840408 32
okini3939 1:e3b2027e685c 33 #include "mbed.h"
okini3939 1:e3b2027e685c 34 #include "XBee.h"
okini3939 1:e3b2027e685c 35
okini3939 1:e3b2027e685c 36 XBeeResponse::XBeeResponse() {
okini3939 1:e3b2027e685c 37
okini3939 1:e3b2027e685c 38 }
okini3939 1:e3b2027e685c 39
okini3939 1:e3b2027e685c 40 uint8_t XBeeResponse::getApiId() {
okini3939 1:e3b2027e685c 41 return _apiId;
okini3939 1:e3b2027e685c 42 }
okini3939 1:e3b2027e685c 43
okini3939 1:e3b2027e685c 44 void XBeeResponse::setApiId(uint8_t apiId) {
okini3939 1:e3b2027e685c 45 _apiId = apiId;
okini3939 1:e3b2027e685c 46 }
okini3939 1:e3b2027e685c 47
okini3939 1:e3b2027e685c 48 uint8_t XBeeResponse::getMsbLength() {
okini3939 1:e3b2027e685c 49 return _msbLength;
okini3939 1:e3b2027e685c 50 }
okini3939 1:e3b2027e685c 51
okini3939 1:e3b2027e685c 52 void XBeeResponse::setMsbLength(uint8_t msbLength) {
okini3939 1:e3b2027e685c 53 _msbLength = msbLength;
okini3939 1:e3b2027e685c 54 }
okini3939 1:e3b2027e685c 55
okini3939 1:e3b2027e685c 56 uint8_t XBeeResponse::getLsbLength() {
okini3939 1:e3b2027e685c 57 return _lsbLength;
okini3939 1:e3b2027e685c 58 }
okini3939 1:e3b2027e685c 59
okini3939 1:e3b2027e685c 60 void XBeeResponse::setLsbLength(uint8_t lsbLength) {
okini3939 1:e3b2027e685c 61 _lsbLength = lsbLength;
okini3939 1:e3b2027e685c 62 }
okini3939 1:e3b2027e685c 63
okini3939 1:e3b2027e685c 64 uint8_t XBeeResponse::getChecksum() {
okini3939 1:e3b2027e685c 65 return _checksum;
okini3939 1:e3b2027e685c 66 }
okini3939 1:e3b2027e685c 67
okini3939 1:e3b2027e685c 68 void XBeeResponse::setChecksum(uint8_t checksum) {
okini3939 1:e3b2027e685c 69 _checksum = checksum;
okini3939 1:e3b2027e685c 70 }
okini3939 1:e3b2027e685c 71
okini3939 4:f6d73acc1f75 72 uint16_t XBeeResponse::getFrameDataLength() {
okini3939 1:e3b2027e685c 73 return _frameLength;
okini3939 1:e3b2027e685c 74 }
okini3939 1:e3b2027e685c 75
okini3939 4:f6d73acc1f75 76 void XBeeResponse::setFrameLength(uint16_t frameLength) {
okini3939 1:e3b2027e685c 77 _frameLength = frameLength;
okini3939 1:e3b2027e685c 78 }
okini3939 1:e3b2027e685c 79
okini3939 1:e3b2027e685c 80 bool XBeeResponse::isAvailable() {
okini3939 1:e3b2027e685c 81 return _complete;
okini3939 1:e3b2027e685c 82 }
okini3939 1:e3b2027e685c 83
okini3939 1:e3b2027e685c 84 void XBeeResponse::setAvailable(bool complete) {
okini3939 1:e3b2027e685c 85 _complete = complete;
okini3939 1:e3b2027e685c 86 }
okini3939 1:e3b2027e685c 87
okini3939 1:e3b2027e685c 88 bool XBeeResponse::isError() {
okini3939 1:e3b2027e685c 89 return _errorCode > 0;
okini3939 1:e3b2027e685c 90 }
okini3939 1:e3b2027e685c 91
okini3939 1:e3b2027e685c 92 uint8_t XBeeResponse::getErrorCode() {
okini3939 1:e3b2027e685c 93 return _errorCode;
okini3939 1:e3b2027e685c 94 }
okini3939 1:e3b2027e685c 95
okini3939 1:e3b2027e685c 96 void XBeeResponse::setErrorCode(uint8_t errorCode) {
okini3939 1:e3b2027e685c 97 _errorCode = errorCode;
okini3939 1:e3b2027e685c 98 }
okini3939 1:e3b2027e685c 99
okini3939 1:e3b2027e685c 100 // copy common fields from xbee response to target response
okini3939 1:e3b2027e685c 101 void XBeeResponse::setCommon(XBeeResponse &target) {
okini3939 1:e3b2027e685c 102 target.setApiId(getApiId());
okini3939 1:e3b2027e685c 103 target.setAvailable(isAvailable());
okini3939 1:e3b2027e685c 104 target.setChecksum(getChecksum());
okini3939 1:e3b2027e685c 105 target.setErrorCode(getErrorCode());
okini3939 1:e3b2027e685c 106 target.setFrameLength(getFrameDataLength());
okini3939 1:e3b2027e685c 107 target.setMsbLength(getMsbLength());
okini3939 1:e3b2027e685c 108 target.setLsbLength(getLsbLength());
okini3939 1:e3b2027e685c 109 }
okini3939 1:e3b2027e685c 110
okini3939 1:e3b2027e685c 111 #ifdef SERIES_2
okini3939 1:e3b2027e685c 112
okini3939 1:e3b2027e685c 113 ZBTxStatusResponse::ZBTxStatusResponse() : FrameIdResponse() {
okini3939 1:e3b2027e685c 114
okini3939 1:e3b2027e685c 115 }
okini3939 1:e3b2027e685c 116
okini3939 1:e3b2027e685c 117 uint16_t ZBTxStatusResponse::getRemoteAddress() {
okini3939 1:e3b2027e685c 118 return (getFrameData()[1] << 8) + getFrameData()[2];
okini3939 1:e3b2027e685c 119 }
okini3939 1:e3b2027e685c 120
okini3939 1:e3b2027e685c 121 uint8_t ZBTxStatusResponse::getTxRetryCount() {
okini3939 1:e3b2027e685c 122 return getFrameData()[3];
okini3939 1:e3b2027e685c 123 }
okini3939 1:e3b2027e685c 124
okini3939 1:e3b2027e685c 125 uint8_t ZBTxStatusResponse::getDeliveryStatus() {
okini3939 1:e3b2027e685c 126 return getFrameData()[4];
okini3939 1:e3b2027e685c 127 }
okini3939 1:e3b2027e685c 128
okini3939 1:e3b2027e685c 129 uint8_t ZBTxStatusResponse::getDiscoveryStatus() {
okini3939 1:e3b2027e685c 130 return getFrameData()[5];
okini3939 1:e3b2027e685c 131 }
okini3939 1:e3b2027e685c 132
okini3939 1:e3b2027e685c 133 bool ZBTxStatusResponse::isSuccess() {
okini3939 1:e3b2027e685c 134 return getDeliveryStatus() == SUCCESS;
okini3939 1:e3b2027e685c 135 }
okini3939 1:e3b2027e685c 136
okini3939 1:e3b2027e685c 137 void XBeeResponse::getZBTxStatusResponse(XBeeResponse &zbXBeeResponse) {
okini3939 1:e3b2027e685c 138
okini3939 1:e3b2027e685c 139 // way off?
okini3939 1:e3b2027e685c 140 ZBTxStatusResponse* zb = static_cast<ZBTxStatusResponse*>(&zbXBeeResponse);
okini3939 1:e3b2027e685c 141 // pass pointer array to subclass
okini3939 1:e3b2027e685c 142 zb->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 143 setCommon(zbXBeeResponse);
okini3939 1:e3b2027e685c 144 }
okini3939 1:e3b2027e685c 145
okini3939 1:e3b2027e685c 146 ZBRxResponse::ZBRxResponse(): RxDataResponse() {
okini3939 1:e3b2027e685c 147 _remoteAddress64 = XBeeAddress64();
okini3939 1:e3b2027e685c 148 }
okini3939 1:e3b2027e685c 149
okini3939 1:e3b2027e685c 150 uint16_t ZBRxResponse::getRemoteAddress16() {
okini3939 1:e3b2027e685c 151 return (getFrameData()[8] << 8) + getFrameData()[9];
okini3939 1:e3b2027e685c 152 }
okini3939 1:e3b2027e685c 153
okini3939 1:e3b2027e685c 154 uint8_t ZBRxResponse::getOption() {
okini3939 1:e3b2027e685c 155 return getFrameData()[10];
okini3939 1:e3b2027e685c 156 }
okini3939 1:e3b2027e685c 157
okini3939 1:e3b2027e685c 158 // markers to read data from packet array. this is the index, so the 12th item in the array
okini3939 1:e3b2027e685c 159 uint8_t ZBRxResponse::getDataOffset() {
okini3939 1:e3b2027e685c 160 return 11;
okini3939 1:e3b2027e685c 161 }
okini3939 1:e3b2027e685c 162
okini3939 4:f6d73acc1f75 163 uint16_t ZBRxResponse::getDataLength() {
okini3939 1:e3b2027e685c 164 return getPacketLength() - getDataOffset() - 1;
okini3939 1:e3b2027e685c 165 }
okini3939 1:e3b2027e685c 166
okini3939 1:e3b2027e685c 167 XBeeAddress64& ZBRxResponse::getRemoteAddress64() {
okini3939 1:e3b2027e685c 168 return _remoteAddress64;
okini3939 1:e3b2027e685c 169 }
okini3939 1:e3b2027e685c 170
okini3939 1:e3b2027e685c 171 void XBeeResponse::getZBRxResponse(XBeeResponse &rxResponse) {
okini3939 1:e3b2027e685c 172
okini3939 1:e3b2027e685c 173 ZBRxResponse* zb = static_cast<ZBRxResponse*>(&rxResponse);
okini3939 1:e3b2027e685c 174
okini3939 1:e3b2027e685c 175 //TODO verify response api id matches this api for this response
okini3939 1:e3b2027e685c 176
okini3939 1:e3b2027e685c 177 // pass pointer array to subclass
okini3939 1:e3b2027e685c 178 zb->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 179 setCommon(rxResponse);
okini3939 1:e3b2027e685c 180
okini3939 1:e3b2027e685c 181 zb->getRemoteAddress64().setMsb((uint32_t(getFrameData()[0]) << 24) + (uint32_t(getFrameData()[1]) << 16) + (uint16_t(getFrameData()[2]) << 8) + getFrameData()[3]);
okini3939 1:e3b2027e685c 182 zb->getRemoteAddress64().setLsb((uint32_t(getFrameData()[4]) << 24) + (uint32_t(getFrameData()[5]) << 16) + (uint16_t(getFrameData()[6]) << 8) + (getFrameData()[7]));
okini3939 1:e3b2027e685c 183 }
okini3939 1:e3b2027e685c 184
okini3939 1:e3b2027e685c 185
okini3939 1:e3b2027e685c 186 ZBRxIoSampleResponse::ZBRxIoSampleResponse() : ZBRxResponse() {
okini3939 1:e3b2027e685c 187
okini3939 1:e3b2027e685c 188 }
okini3939 1:e3b2027e685c 189
okini3939 1:e3b2027e685c 190 // 64 + 16 addresses, sample size, option = 12 (index 11), so this starts at 12
okini3939 1:e3b2027e685c 191 uint8_t ZBRxIoSampleResponse::getDigitalMaskMsb() {
okini3939 1:e3b2027e685c 192 return getFrameData()[12] & 0x1c;
okini3939 1:e3b2027e685c 193 }
okini3939 1:e3b2027e685c 194
okini3939 1:e3b2027e685c 195 uint8_t ZBRxIoSampleResponse::getDigitalMaskLsb() {
okini3939 1:e3b2027e685c 196 return getFrameData()[13];
okini3939 1:e3b2027e685c 197 }
okini3939 1:e3b2027e685c 198
okini3939 1:e3b2027e685c 199 uint8_t ZBRxIoSampleResponse::getAnalogMask() {
okini3939 1:e3b2027e685c 200 return getFrameData()[14] & 0x8f;
okini3939 1:e3b2027e685c 201 }
okini3939 1:e3b2027e685c 202
okini3939 1:e3b2027e685c 203 bool ZBRxIoSampleResponse::containsAnalog() {
okini3939 1:e3b2027e685c 204 return getAnalogMask() > 0;
okini3939 1:e3b2027e685c 205 }
okini3939 1:e3b2027e685c 206
okini3939 1:e3b2027e685c 207 bool ZBRxIoSampleResponse::containsDigital() {
okini3939 1:e3b2027e685c 208 return getDigitalMaskMsb() > 0 || getDigitalMaskLsb() > 0;
okini3939 1:e3b2027e685c 209 }
okini3939 1:e3b2027e685c 210
okini3939 1:e3b2027e685c 211 bool ZBRxIoSampleResponse::isAnalogEnabled(uint8_t pin) {
okini3939 1:e3b2027e685c 212 return ((getAnalogMask() >> pin) & 1) == 1;
okini3939 1:e3b2027e685c 213 }
okini3939 1:e3b2027e685c 214
okini3939 1:e3b2027e685c 215 bool ZBRxIoSampleResponse::isDigitalEnabled(uint8_t pin) {
okini3939 1:e3b2027e685c 216 if (pin <= 7) {
okini3939 1:e3b2027e685c 217 // added extra parens to calm avr compiler
okini3939 1:e3b2027e685c 218 return ((getDigitalMaskLsb() >> pin) & 1) == 1;
okini3939 1:e3b2027e685c 219 } else {
okini3939 1:e3b2027e685c 220 return ((getDigitalMaskMsb() >> (pin - 8)) & 1) == 1;
okini3939 1:e3b2027e685c 221 }
okini3939 1:e3b2027e685c 222 }
okini3939 1:e3b2027e685c 223
okini3939 1:e3b2027e685c 224 uint16_t ZBRxIoSampleResponse::getAnalog(uint8_t pin) {
okini3939 1:e3b2027e685c 225 // analog starts 13 bytes after sample size, if no dio enabled
okini3939 1:e3b2027e685c 226 uint8_t start = 15;
okini3939 1:e3b2027e685c 227
okini3939 1:e3b2027e685c 228 if (containsDigital()) {
okini3939 1:e3b2027e685c 229 // make room for digital i/o
okini3939 1:e3b2027e685c 230 start+=2;
okini3939 1:e3b2027e685c 231 }
okini3939 1:e3b2027e685c 232
okini3939 1:e3b2027e685c 233 // std::cout << "spacing is " << static_cast<unsigned int>(spacing) << std::endl;
okini3939 1:e3b2027e685c 234
okini3939 1:e3b2027e685c 235 // start depends on how many pins before this pin are enabled
okini3939 1:e3b2027e685c 236 for (int i = 0; i < pin; i++) {
okini3939 1:e3b2027e685c 237 // if (isAnalogEnabled(pin)) {
okini3939 1:e3b2027e685c 238 if (isAnalogEnabled(i)) {
okini3939 1:e3b2027e685c 239 start+=2;
okini3939 1:e3b2027e685c 240 }
okini3939 1:e3b2027e685c 241 }
okini3939 1:e3b2027e685c 242
okini3939 1:e3b2027e685c 243 // std::cout << "start for analog pin ["<< static_cast<unsigned int>(pin) << "]/sample " << static_cast<unsigned int>(sample) << " is " << static_cast<unsigned int>(start) << std::endl;
okini3939 1:e3b2027e685c 244
okini3939 1:e3b2027e685c 245 // std::cout << "returning index " << static_cast<unsigned int>(getSampleOffset() + start) << " and index " << static_cast<unsigned int>(getSampleOffset() + start + 1) << ", val is " << static_cast<unsigned int>(getFrameData()[getSampleOffset() + start] << 8) << " and " << + static_cast<unsigned int>(getFrameData()[getSampleOffset() + start + 1]) << std::endl;
okini3939 1:e3b2027e685c 246
okini3939 1:e3b2027e685c 247 return (uint16_t)((getFrameData()[start] << 8) + getFrameData()[start + 1]);
okini3939 1:e3b2027e685c 248 }
okini3939 1:e3b2027e685c 249
okini3939 1:e3b2027e685c 250 bool ZBRxIoSampleResponse::isDigitalOn(uint8_t pin) {
okini3939 1:e3b2027e685c 251 if (pin <= 7) {
okini3939 1:e3b2027e685c 252 // D0-7
okini3939 1:e3b2027e685c 253 // DIO LSB is index 5
okini3939 1:e3b2027e685c 254 return ((getFrameData()[16] >> pin) & 1) == 1;
okini3939 1:e3b2027e685c 255 } else {
okini3939 1:e3b2027e685c 256 // D10-12
okini3939 1:e3b2027e685c 257 // DIO MSB is index 4
okini3939 1:e3b2027e685c 258 return ((getFrameData()[15] >> (pin - 8)) & 1) == 1;
okini3939 1:e3b2027e685c 259 }
okini3939 1:e3b2027e685c 260 }
okini3939 1:e3b2027e685c 261
okini3939 1:e3b2027e685c 262 void XBeeResponse::getZBRxIoSampleResponse(XBeeResponse &response) {
okini3939 1:e3b2027e685c 263 ZBRxIoSampleResponse* zb = static_cast<ZBRxIoSampleResponse*>(&response);
okini3939 1:e3b2027e685c 264
okini3939 1:e3b2027e685c 265
okini3939 1:e3b2027e685c 266 // pass pointer array to subclass
okini3939 1:e3b2027e685c 267 zb->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 268 setCommon(response);
okini3939 1:e3b2027e685c 269
okini3939 1:e3b2027e685c 270 zb->getRemoteAddress64().setMsb((uint32_t(getFrameData()[0]) << 24) + (uint32_t(getFrameData()[1]) << 16) + (uint16_t(getFrameData()[2]) << 8) + getFrameData()[3]);
okini3939 1:e3b2027e685c 271 zb->getRemoteAddress64().setLsb((uint32_t(getFrameData()[4]) << 24) + (uint32_t(getFrameData()[5]) << 16) + (uint16_t(getFrameData()[6]) << 8) + (getFrameData()[7]));
okini3939 1:e3b2027e685c 272 }
okini3939 1:e3b2027e685c 273
okini3939 1:e3b2027e685c 274 #endif
okini3939 1:e3b2027e685c 275
okini3939 1:e3b2027e685c 276 #ifdef SERIES_1
okini3939 1:e3b2027e685c 277
okini3939 1:e3b2027e685c 278 RxResponse::RxResponse() : RxDataResponse() {
okini3939 1:e3b2027e685c 279
okini3939 1:e3b2027e685c 280 }
okini3939 1:e3b2027e685c 281
okini3939 1:e3b2027e685c 282 uint16_t Rx16Response::getRemoteAddress16() {
okini3939 1:e3b2027e685c 283 return (getFrameData()[0] << 8) + getFrameData()[1];
okini3939 1:e3b2027e685c 284 }
okini3939 1:e3b2027e685c 285
okini3939 1:e3b2027e685c 286 XBeeAddress64& Rx64Response::getRemoteAddress64() {
okini3939 1:e3b2027e685c 287 return _remoteAddress;
okini3939 1:e3b2027e685c 288 }
okini3939 1:e3b2027e685c 289
okini3939 1:e3b2027e685c 290 Rx64Response::Rx64Response() : RxResponse() {
okini3939 1:e3b2027e685c 291 _remoteAddress = XBeeAddress64();
okini3939 1:e3b2027e685c 292 }
okini3939 1:e3b2027e685c 293
okini3939 1:e3b2027e685c 294 Rx16Response::Rx16Response() : RxResponse() {
okini3939 1:e3b2027e685c 295
okini3939 1:e3b2027e685c 296 }
okini3939 1:e3b2027e685c 297
okini3939 1:e3b2027e685c 298 RxIoSampleBaseResponse::RxIoSampleBaseResponse() : RxResponse() {
okini3939 1:e3b2027e685c 299
okini3939 1:e3b2027e685c 300 }
okini3939 1:e3b2027e685c 301
okini3939 1:e3b2027e685c 302 uint8_t RxIoSampleBaseResponse::getSampleOffset() {
okini3939 1:e3b2027e685c 303 // sample starts 2 bytes after rssi
okini3939 1:e3b2027e685c 304 return getRssiOffset() + 2;
okini3939 1:e3b2027e685c 305 }
okini3939 1:e3b2027e685c 306
okini3939 1:e3b2027e685c 307
okini3939 1:e3b2027e685c 308 uint8_t RxIoSampleBaseResponse::getSampleSize() {
okini3939 1:e3b2027e685c 309 return getFrameData()[getSampleOffset()];
okini3939 1:e3b2027e685c 310 }
okini3939 1:e3b2027e685c 311
okini3939 1:e3b2027e685c 312 bool RxIoSampleBaseResponse::containsAnalog() {
okini3939 1:e3b2027e685c 313 return (getFrameData()[getSampleOffset() + 1] & 0x7e) > 0;
okini3939 1:e3b2027e685c 314 }
okini3939 1:e3b2027e685c 315
okini3939 1:e3b2027e685c 316 bool RxIoSampleBaseResponse::containsDigital() {
okini3939 1:e3b2027e685c 317 return (getFrameData()[getSampleOffset() + 1] & 0x1) > 0 || getFrameData()[getSampleOffset() + 2] > 0;
okini3939 1:e3b2027e685c 318 }
okini3939 1:e3b2027e685c 319
okini3939 1:e3b2027e685c 320 //uint16_t RxIoSampleBaseResponse::getAnalog0(uint8_t sample) {
okini3939 1:e3b2027e685c 321 // return getAnalog(0, sample);
okini3939 1:e3b2027e685c 322 //}
okini3939 1:e3b2027e685c 323
okini3939 1:e3b2027e685c 324 bool RxIoSampleBaseResponse::isAnalogEnabled(uint8_t pin) {
okini3939 1:e3b2027e685c 325 return (((getFrameData()[getSampleOffset() + 1] >> (pin + 1)) & 1) == 1);
okini3939 1:e3b2027e685c 326 }
okini3939 1:e3b2027e685c 327
okini3939 1:e3b2027e685c 328 bool RxIoSampleBaseResponse::isDigitalEnabled(uint8_t pin) {
okini3939 1:e3b2027e685c 329 if (pin < 8) {
okini3939 1:e3b2027e685c 330 return ((getFrameData()[getSampleOffset() + 4] >> pin) & 1) == 1;
okini3939 1:e3b2027e685c 331 } else {
okini3939 1:e3b2027e685c 332 return (getFrameData()[getSampleOffset() + 3] & 1) == 1;
okini3939 1:e3b2027e685c 333 }
okini3939 1:e3b2027e685c 334 }
okini3939 1:e3b2027e685c 335
okini3939 1:e3b2027e685c 336 uint16_t RxIoSampleBaseResponse::getAnalog(uint8_t pin, uint8_t sample) {
okini3939 1:e3b2027e685c 337
okini3939 1:e3b2027e685c 338 // analog starts 3 bytes after sample size, if no dio enabled
okini3939 1:e3b2027e685c 339 uint8_t start = 3;
okini3939 1:e3b2027e685c 340
okini3939 1:e3b2027e685c 341 if (containsDigital()) {
okini3939 1:e3b2027e685c 342 // make room for digital i/o sample (2 bytes per sample)
okini3939 1:e3b2027e685c 343 start+=2*(sample + 1);
okini3939 1:e3b2027e685c 344 }
okini3939 1:e3b2027e685c 345
okini3939 1:e3b2027e685c 346 uint8_t spacing = 0;
okini3939 1:e3b2027e685c 347
okini3939 1:e3b2027e685c 348 // spacing between samples depends on how many are enabled. add one for each analog that's enabled
okini3939 1:e3b2027e685c 349 for (int i = 0; i <= 5; i++) {
okini3939 1:e3b2027e685c 350 if (isAnalogEnabled(i)) {
okini3939 1:e3b2027e685c 351 // each analog is two bytes
okini3939 1:e3b2027e685c 352 spacing+=2;
okini3939 1:e3b2027e685c 353 }
okini3939 1:e3b2027e685c 354 }
okini3939 1:e3b2027e685c 355
okini3939 1:e3b2027e685c 356 // std::cout << "spacing is " << static_cast<unsigned int>(spacing) << std::endl;
okini3939 1:e3b2027e685c 357
okini3939 1:e3b2027e685c 358 // start depends on how many pins before this pin are enabled
okini3939 1:e3b2027e685c 359 for (int i = 0; i < pin; i++) {
okini3939 1:e3b2027e685c 360 if (isAnalogEnabled(pin)) {
okini3939 1:e3b2027e685c 361 start+=2;
okini3939 1:e3b2027e685c 362 }
okini3939 1:e3b2027e685c 363 }
okini3939 1:e3b2027e685c 364
okini3939 1:e3b2027e685c 365 start+= sample * spacing;
okini3939 1:e3b2027e685c 366
okini3939 1:e3b2027e685c 367 // std::cout << "start for analog pin ["<< static_cast<unsigned int>(pin) << "]/sample " << static_cast<unsigned int>(sample) << " is " << static_cast<unsigned int>(start) << std::endl;
okini3939 1:e3b2027e685c 368
okini3939 1:e3b2027e685c 369 // std::cout << "returning index " << static_cast<unsigned int>(getSampleOffset() + start) << " and index " << static_cast<unsigned int>(getSampleOffset() + start + 1) << ", val is " << static_cast<unsigned int>(getFrameData()[getSampleOffset() + start] << 8) << " and " << + static_cast<unsigned int>(getFrameData()[getSampleOffset() + start + 1]) << std::endl;
okini3939 1:e3b2027e685c 370
okini3939 1:e3b2027e685c 371 return (uint16_t)((getFrameData()[getSampleOffset() + start] << 8) + getFrameData()[getSampleOffset() + start + 1]);
okini3939 1:e3b2027e685c 372 }
okini3939 1:e3b2027e685c 373
okini3939 1:e3b2027e685c 374 bool RxIoSampleBaseResponse::isDigitalOn(uint8_t pin, uint8_t sample) {
okini3939 1:e3b2027e685c 375 if (pin < 8) {
okini3939 1:e3b2027e685c 376 return ((getFrameData()[getSampleOffset() + 4] >> pin) & 1) == 1;
okini3939 1:e3b2027e685c 377 } else {
okini3939 1:e3b2027e685c 378 return (getFrameData()[getSampleOffset() + 3] & 1) == 1;
okini3939 1:e3b2027e685c 379 }
okini3939 1:e3b2027e685c 380 }
okini3939 1:e3b2027e685c 381
okini3939 1:e3b2027e685c 382
okini3939 1:e3b2027e685c 383 //bool RxIoSampleBaseResponse::isDigital0On(uint8_t sample) {
okini3939 1:e3b2027e685c 384 // return isDigitalOn(0, sample);
okini3939 1:e3b2027e685c 385 //}
okini3939 1:e3b2027e685c 386
okini3939 1:e3b2027e685c 387 Rx16IoSampleResponse::Rx16IoSampleResponse() : RxIoSampleBaseResponse() {
okini3939 1:e3b2027e685c 388
okini3939 1:e3b2027e685c 389 }
okini3939 1:e3b2027e685c 390
okini3939 1:e3b2027e685c 391 uint16_t Rx16IoSampleResponse::getRemoteAddress16() {
okini3939 1:e3b2027e685c 392 return (uint16_t)((getFrameData()[0] << 8) + getFrameData()[1]);
okini3939 1:e3b2027e685c 393 }
okini3939 1:e3b2027e685c 394
okini3939 1:e3b2027e685c 395 uint8_t Rx16IoSampleResponse::getRssiOffset() {
okini3939 1:e3b2027e685c 396 return 2;
okini3939 1:e3b2027e685c 397 }
okini3939 1:e3b2027e685c 398
okini3939 1:e3b2027e685c 399 void XBeeResponse::getRx16IoSampleResponse(XBeeResponse &response) {
okini3939 1:e3b2027e685c 400 Rx16IoSampleResponse* rx = static_cast<Rx16IoSampleResponse*>(&response);
okini3939 1:e3b2027e685c 401
okini3939 1:e3b2027e685c 402 rx->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 403 setCommon(response);
okini3939 1:e3b2027e685c 404 }
okini3939 1:e3b2027e685c 405
okini3939 1:e3b2027e685c 406
okini3939 1:e3b2027e685c 407 Rx64IoSampleResponse::Rx64IoSampleResponse() : RxIoSampleBaseResponse() {
okini3939 1:e3b2027e685c 408 _remoteAddress = XBeeAddress64();
okini3939 1:e3b2027e685c 409 }
okini3939 1:e3b2027e685c 410
okini3939 1:e3b2027e685c 411 XBeeAddress64& Rx64IoSampleResponse::getRemoteAddress64() {
okini3939 1:e3b2027e685c 412 return _remoteAddress;
okini3939 1:e3b2027e685c 413 }
okini3939 1:e3b2027e685c 414
okini3939 1:e3b2027e685c 415 uint8_t Rx64IoSampleResponse::getRssiOffset() {
okini3939 1:e3b2027e685c 416 return 8;
okini3939 1:e3b2027e685c 417 }
okini3939 1:e3b2027e685c 418
okini3939 1:e3b2027e685c 419 void XBeeResponse::getRx64IoSampleResponse(XBeeResponse &response) {
okini3939 1:e3b2027e685c 420 Rx64IoSampleResponse* rx = static_cast<Rx64IoSampleResponse*>(&response);
okini3939 1:e3b2027e685c 421
okini3939 1:e3b2027e685c 422 rx->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 423 setCommon(response);
okini3939 1:e3b2027e685c 424
okini3939 1:e3b2027e685c 425 rx->getRemoteAddress64().setMsb((uint32_t(getFrameData()[0]) << 24) + (uint32_t(getFrameData()[1]) << 16) + (uint16_t(getFrameData()[2]) << 8) + getFrameData()[3]);
okini3939 1:e3b2027e685c 426 rx->getRemoteAddress64().setLsb((uint32_t(getFrameData()[4]) << 24) + (uint32_t(getFrameData()[5]) << 16) + (uint16_t(getFrameData()[6]) << 8) + getFrameData()[7]);
okini3939 1:e3b2027e685c 427 }
okini3939 1:e3b2027e685c 428
okini3939 1:e3b2027e685c 429 TxStatusResponse::TxStatusResponse() : FrameIdResponse() {
okini3939 1:e3b2027e685c 430
okini3939 1:e3b2027e685c 431 }
okini3939 1:e3b2027e685c 432
okini3939 1:e3b2027e685c 433 uint8_t TxStatusResponse::getStatus() {
okini3939 1:e3b2027e685c 434 return getFrameData()[1];
okini3939 1:e3b2027e685c 435 }
okini3939 1:e3b2027e685c 436
okini3939 1:e3b2027e685c 437 bool TxStatusResponse::isSuccess() {
okini3939 1:e3b2027e685c 438 return getStatus() == SUCCESS;
okini3939 1:e3b2027e685c 439 }
okini3939 1:e3b2027e685c 440
okini3939 1:e3b2027e685c 441 void XBeeResponse::getTxStatusResponse(XBeeResponse &txResponse) {
okini3939 1:e3b2027e685c 442
okini3939 1:e3b2027e685c 443 TxStatusResponse* txStatus = static_cast<TxStatusResponse*>(&txResponse);
okini3939 1:e3b2027e685c 444
okini3939 1:e3b2027e685c 445 // pass pointer array to subclass
okini3939 1:e3b2027e685c 446 txStatus->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 447 setCommon(txResponse);
okini3939 1:e3b2027e685c 448 }
okini3939 1:e3b2027e685c 449
okini3939 1:e3b2027e685c 450 uint8_t RxResponse::getRssi() {
okini3939 1:e3b2027e685c 451 return getFrameData()[getRssiOffset()];
okini3939 1:e3b2027e685c 452 }
okini3939 1:e3b2027e685c 453
okini3939 1:e3b2027e685c 454 uint8_t RxResponse::getOption() {
okini3939 1:e3b2027e685c 455 return getFrameData()[getRssiOffset() + 1];
okini3939 1:e3b2027e685c 456 }
okini3939 1:e3b2027e685c 457
okini3939 1:e3b2027e685c 458 bool RxResponse::isAddressBroadcast() {
okini3939 1:e3b2027e685c 459 return (getOption() & 2) == 2;
okini3939 1:e3b2027e685c 460 }
okini3939 1:e3b2027e685c 461
okini3939 1:e3b2027e685c 462 bool RxResponse::isPanBroadcast() {
okini3939 1:e3b2027e685c 463 return (getOption() & 4) == 4;
okini3939 1:e3b2027e685c 464 }
okini3939 1:e3b2027e685c 465
okini3939 4:f6d73acc1f75 466 uint16_t RxResponse::getDataLength() {
okini3939 1:e3b2027e685c 467 return getPacketLength() - getDataOffset() - 1;
okini3939 1:e3b2027e685c 468 }
okini3939 1:e3b2027e685c 469
okini3939 1:e3b2027e685c 470 uint8_t RxResponse::getDataOffset() {
okini3939 1:e3b2027e685c 471 return getRssiOffset() + 2;
okini3939 1:e3b2027e685c 472 }
okini3939 1:e3b2027e685c 473
okini3939 1:e3b2027e685c 474 uint8_t Rx16Response::getRssiOffset() {
okini3939 1:e3b2027e685c 475 return RX_16_RSSI_OFFSET;
okini3939 1:e3b2027e685c 476 }
okini3939 1:e3b2027e685c 477
okini3939 1:e3b2027e685c 478 void XBeeResponse::getRx16Response(XBeeResponse &rx16Response) {
okini3939 1:e3b2027e685c 479
okini3939 1:e3b2027e685c 480 Rx16Response* rx16 = static_cast<Rx16Response*>(&rx16Response);
okini3939 1:e3b2027e685c 481
okini3939 1:e3b2027e685c 482 // pass pointer array to subclass
okini3939 1:e3b2027e685c 483 rx16->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 484 setCommon(rx16Response);
okini3939 1:e3b2027e685c 485
okini3939 1:e3b2027e685c 486 // rx16->getRemoteAddress16().setAddress((getFrameData()[0] << 8) + getFrameData()[1]);
okini3939 1:e3b2027e685c 487 }
okini3939 1:e3b2027e685c 488
okini3939 1:e3b2027e685c 489 uint8_t Rx64Response::getRssiOffset() {
okini3939 1:e3b2027e685c 490 return RX_64_RSSI_OFFSET;
okini3939 1:e3b2027e685c 491 }
okini3939 1:e3b2027e685c 492
okini3939 1:e3b2027e685c 493 void XBeeResponse::getRx64Response(XBeeResponse &rx64Response) {
okini3939 1:e3b2027e685c 494
okini3939 1:e3b2027e685c 495 Rx64Response* rx64 = static_cast<Rx64Response*>(&rx64Response);
okini3939 1:e3b2027e685c 496
okini3939 1:e3b2027e685c 497 // pass pointer array to subclass
okini3939 1:e3b2027e685c 498 rx64->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 499 setCommon(rx64Response);
okini3939 1:e3b2027e685c 500
okini3939 1:e3b2027e685c 501 rx64->getRemoteAddress64().setMsb((uint32_t(getFrameData()[0]) << 24) + (uint32_t(getFrameData()[1]) << 16) + (uint16_t(getFrameData()[2]) << 8) + getFrameData()[3]);
okini3939 1:e3b2027e685c 502 rx64->getRemoteAddress64().setLsb((uint32_t(getFrameData()[4]) << 24) + (uint32_t(getFrameData()[5]) << 16) + (uint16_t(getFrameData()[6]) << 8) + getFrameData()[7]);
okini3939 1:e3b2027e685c 503 }
okini3939 1:e3b2027e685c 504
okini3939 1:e3b2027e685c 505 #endif
okini3939 1:e3b2027e685c 506
okini3939 1:e3b2027e685c 507 RemoteAtCommandResponse::RemoteAtCommandResponse() : AtCommandResponse() {
okini3939 1:e3b2027e685c 508
okini3939 1:e3b2027e685c 509 }
okini3939 1:e3b2027e685c 510
okini3939 1:e3b2027e685c 511 uint8_t* RemoteAtCommandResponse::getCommand() {
okini3939 1:e3b2027e685c 512 return getFrameData() + 11;
okini3939 1:e3b2027e685c 513 }
okini3939 1:e3b2027e685c 514
okini3939 1:e3b2027e685c 515 uint8_t RemoteAtCommandResponse::getStatus() {
okini3939 1:e3b2027e685c 516 return getFrameData()[13];
okini3939 1:e3b2027e685c 517 }
okini3939 1:e3b2027e685c 518
okini3939 1:e3b2027e685c 519 bool RemoteAtCommandResponse::isOk() {
okini3939 1:e3b2027e685c 520 // weird c++ behavior. w/o this method, it calls AtCommandResponse::isOk(), which calls the AtCommandResponse::getStatus, not this.getStatus!!!
okini3939 1:e3b2027e685c 521 return getStatus() == AT_OK;
okini3939 1:e3b2027e685c 522 }
okini3939 1:e3b2027e685c 523
okini3939 4:f6d73acc1f75 524 uint16_t RemoteAtCommandResponse::getValueLength() {
okini3939 1:e3b2027e685c 525 return getFrameDataLength() - 14;
okini3939 1:e3b2027e685c 526 }
okini3939 1:e3b2027e685c 527
okini3939 1:e3b2027e685c 528 uint8_t* RemoteAtCommandResponse::getValue() {
okini3939 1:e3b2027e685c 529 if (getValueLength() > 0) {
okini3939 1:e3b2027e685c 530 // value is only included for query commands. set commands does not return a value
okini3939 1:e3b2027e685c 531 return getFrameData() + 14;
okini3939 1:e3b2027e685c 532 }
okini3939 1:e3b2027e685c 533
okini3939 1:e3b2027e685c 534 return NULL;
okini3939 1:e3b2027e685c 535 }
okini3939 1:e3b2027e685c 536
okini3939 1:e3b2027e685c 537 uint16_t RemoteAtCommandResponse::getRemoteAddress16() {
okini3939 1:e3b2027e685c 538 return uint16_t((getFrameData()[9] << 8) + getFrameData()[10]);
okini3939 1:e3b2027e685c 539 }
okini3939 1:e3b2027e685c 540
okini3939 1:e3b2027e685c 541 XBeeAddress64& RemoteAtCommandResponse::getRemoteAddress64() {
okini3939 1:e3b2027e685c 542 return _remoteAddress64;
okini3939 1:e3b2027e685c 543 }
okini3939 1:e3b2027e685c 544
okini3939 1:e3b2027e685c 545 void XBeeResponse::getRemoteAtCommandResponse(XBeeResponse &response) {
okini3939 1:e3b2027e685c 546
okini3939 1:e3b2027e685c 547 // TODO no real need to cast. change arg to match expected class
okini3939 1:e3b2027e685c 548 RemoteAtCommandResponse* at = static_cast<RemoteAtCommandResponse*>(&response);
okini3939 1:e3b2027e685c 549
okini3939 1:e3b2027e685c 550 // pass pointer array to subclass
okini3939 1:e3b2027e685c 551 at->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 552 setCommon(response);
okini3939 1:e3b2027e685c 553
okini3939 1:e3b2027e685c 554 at->getRemoteAddress64().setMsb((uint32_t(getFrameData()[1]) << 24) + (uint32_t(getFrameData()[2]) << 16) + (uint16_t(getFrameData()[3]) << 8) + getFrameData()[4]);
okini3939 1:e3b2027e685c 555 at->getRemoteAddress64().setLsb((uint32_t(getFrameData()[5]) << 24) + (uint32_t(getFrameData()[6]) << 16) + (uint16_t(getFrameData()[7]) << 8) + (getFrameData()[8]));
okini3939 1:e3b2027e685c 556
okini3939 1:e3b2027e685c 557 }
okini3939 1:e3b2027e685c 558
okini3939 1:e3b2027e685c 559 RxDataResponse::RxDataResponse() : XBeeResponse() {
okini3939 1:e3b2027e685c 560
okini3939 1:e3b2027e685c 561 }
okini3939 1:e3b2027e685c 562
okini3939 1:e3b2027e685c 563 uint8_t RxDataResponse::getData(int index) {
okini3939 1:e3b2027e685c 564 return getFrameData()[getDataOffset() + index];
okini3939 1:e3b2027e685c 565 }
okini3939 1:e3b2027e685c 566
okini3939 1:e3b2027e685c 567 uint8_t* RxDataResponse::getData() {
okini3939 1:e3b2027e685c 568 return getFrameData() + getDataOffset();
okini3939 1:e3b2027e685c 569 }
okini3939 1:e3b2027e685c 570
okini3939 1:e3b2027e685c 571 FrameIdResponse::FrameIdResponse() {
okini3939 1:e3b2027e685c 572
okini3939 1:e3b2027e685c 573 }
okini3939 1:e3b2027e685c 574
okini3939 1:e3b2027e685c 575 uint8_t FrameIdResponse::getFrameId() {
okini3939 1:e3b2027e685c 576 return getFrameData()[0];
okini3939 1:e3b2027e685c 577 }
okini3939 1:e3b2027e685c 578
okini3939 1:e3b2027e685c 579
okini3939 1:e3b2027e685c 580 ModemStatusResponse::ModemStatusResponse() {
okini3939 1:e3b2027e685c 581
okini3939 1:e3b2027e685c 582 }
okini3939 1:e3b2027e685c 583
okini3939 1:e3b2027e685c 584 uint8_t ModemStatusResponse::getStatus() {
okini3939 1:e3b2027e685c 585 return getFrameData()[0];
okini3939 1:e3b2027e685c 586 }
okini3939 1:e3b2027e685c 587
okini3939 1:e3b2027e685c 588 void XBeeResponse::getModemStatusResponse(XBeeResponse &modemStatusResponse) {
okini3939 1:e3b2027e685c 589
okini3939 1:e3b2027e685c 590 ModemStatusResponse* modem = static_cast<ModemStatusResponse*>(&modemStatusResponse);
okini3939 1:e3b2027e685c 591
okini3939 1:e3b2027e685c 592 // pass pointer array to subclass
okini3939 1:e3b2027e685c 593 modem->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 594 setCommon(modemStatusResponse);
okini3939 1:e3b2027e685c 595
okini3939 1:e3b2027e685c 596 }
okini3939 1:e3b2027e685c 597
okini3939 1:e3b2027e685c 598 AtCommandResponse::AtCommandResponse() {
okini3939 1:e3b2027e685c 599
okini3939 1:e3b2027e685c 600 }
okini3939 1:e3b2027e685c 601
okini3939 1:e3b2027e685c 602 uint8_t* AtCommandResponse::getCommand() {
okini3939 1:e3b2027e685c 603 return getFrameData() + 1;
okini3939 1:e3b2027e685c 604 }
okini3939 1:e3b2027e685c 605
okini3939 1:e3b2027e685c 606 uint8_t AtCommandResponse::getStatus() {
okini3939 1:e3b2027e685c 607 return getFrameData()[3];
okini3939 1:e3b2027e685c 608 }
okini3939 1:e3b2027e685c 609
okini3939 4:f6d73acc1f75 610 uint16_t AtCommandResponse::getValueLength() {
okini3939 1:e3b2027e685c 611 return getFrameDataLength() - 4;
okini3939 1:e3b2027e685c 612 }
okini3939 1:e3b2027e685c 613
okini3939 1:e3b2027e685c 614 uint8_t* AtCommandResponse::getValue() {
okini3939 1:e3b2027e685c 615 if (getValueLength() > 0) {
okini3939 1:e3b2027e685c 616 // value is only included for query commands. set commands does not return a value
okini3939 1:e3b2027e685c 617 return getFrameData() + 4;
okini3939 1:e3b2027e685c 618 }
okini3939 1:e3b2027e685c 619
okini3939 1:e3b2027e685c 620 return NULL;
okini3939 1:e3b2027e685c 621 }
okini3939 1:e3b2027e685c 622
okini3939 1:e3b2027e685c 623 bool AtCommandResponse::isOk() {
okini3939 1:e3b2027e685c 624 return getStatus() == AT_OK;
okini3939 1:e3b2027e685c 625 }
okini3939 1:e3b2027e685c 626
okini3939 1:e3b2027e685c 627 void XBeeResponse::getAtCommandResponse(XBeeResponse &atCommandResponse) {
okini3939 1:e3b2027e685c 628
okini3939 1:e3b2027e685c 629 AtCommandResponse* at = static_cast<AtCommandResponse*>(&atCommandResponse);
okini3939 1:e3b2027e685c 630
okini3939 1:e3b2027e685c 631 // pass pointer array to subclass
okini3939 1:e3b2027e685c 632 at->setFrameData(getFrameData());
okini3939 1:e3b2027e685c 633 setCommon(atCommandResponse);
okini3939 1:e3b2027e685c 634 }
okini3939 1:e3b2027e685c 635
okini3939 1:e3b2027e685c 636 uint16_t XBeeResponse::getPacketLength() {
okini3939 4:f6d73acc1f75 637 return ((uint16_t)_msbLength << 8) + _lsbLength;
okini3939 1:e3b2027e685c 638 }
okini3939 1:e3b2027e685c 639
okini3939 1:e3b2027e685c 640 uint8_t* XBeeResponse::getFrameData() {
okini3939 1:e3b2027e685c 641 return _frameDataPtr;
okini3939 1:e3b2027e685c 642 }
okini3939 1:e3b2027e685c 643
okini3939 1:e3b2027e685c 644 void XBeeResponse::setFrameData(uint8_t* frameDataPtr) {
okini3939 1:e3b2027e685c 645 _frameDataPtr = frameDataPtr;
okini3939 1:e3b2027e685c 646 }
okini3939 1:e3b2027e685c 647
okini3939 1:e3b2027e685c 648 void XBeeResponse::init() {
okini3939 1:e3b2027e685c 649 _complete = false;
okini3939 1:e3b2027e685c 650 _errorCode = NO_ERROR;
okini3939 1:e3b2027e685c 651 _checksum = 0;
okini3939 1:e3b2027e685c 652 }
okini3939 1:e3b2027e685c 653
okini3939 1:e3b2027e685c 654 void XBeeResponse::reset() {
okini3939 1:e3b2027e685c 655 init();
okini3939 1:e3b2027e685c 656 _apiId = 0;
okini3939 1:e3b2027e685c 657 _msbLength = 0;
okini3939 1:e3b2027e685c 658 _lsbLength = 0;
okini3939 1:e3b2027e685c 659 _checksum = 0;
okini3939 1:e3b2027e685c 660 _frameLength = 0;
okini3939 1:e3b2027e685c 661
okini3939 1:e3b2027e685c 662 for (int i = 0; i < MAX_FRAME_DATA_SIZE; i++) {
okini3939 1:e3b2027e685c 663 getFrameData()[i] = 0;
okini3939 1:e3b2027e685c 664 }
okini3939 1:e3b2027e685c 665 }
okini3939 1:e3b2027e685c 666
okini3939 1:e3b2027e685c 667 void XBee::resetResponse() {
okini3939 1:e3b2027e685c 668 _pos = 0;
okini3939 4:f6d73acc1f75 669 _epos = 0;
okini3939 1:e3b2027e685c 670 _escape = false;
okini3939 4:f6d73acc1f75 671 _checksumTotal = 0;
okini3939 1:e3b2027e685c 672 _response.reset();
okini3939 1:e3b2027e685c 673 }
okini3939 1:e3b2027e685c 674
ban4jp 10:eb70be6ceb6d 675 #ifndef USE_XBEE_SPI
okini3939 2:6efb3541af61 676 XBee::XBee(PinName p_tx, PinName p_rx): _xbee(p_tx, p_rx) {
okini3939 1:e3b2027e685c 677 _pos = 0;
okini3939 4:f6d73acc1f75 678 _epos = 0;
okini3939 1:e3b2027e685c 679 _escape = false;
okini3939 1:e3b2027e685c 680 _checksumTotal = 0;
okini3939 1:e3b2027e685c 681 _nextFrameId = 0;
okini3939 3:8573b122fa84 682
okini3939 3:8573b122fa84 683 _response.init();
okini3939 3:8573b122fa84 684 _response.setFrameData(_responseFrameData);
okini3939 3:8573b122fa84 685 }
okini3939 3:8573b122fa84 686
okini3939 4:f6d73acc1f75 687 XBee::XBee(PinName p_tx, PinName p_rx, PinName p_cts, PinName p_rts): _xbee(p_tx, p_rx) {
okini3939 3:8573b122fa84 688 _pos = 0;
okini3939 4:f6d73acc1f75 689 _epos = 0;
okini3939 3:8573b122fa84 690 _escape = false;
okini3939 3:8573b122fa84 691 _checksumTotal = 0;
okini3939 3:8573b122fa84 692 _nextFrameId = 0;
okini3939 4:f6d73acc1f75 693 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 4:f6d73acc1f75 694 if (p_cts == p12) { // CTS (P0_17)
okini3939 4:f6d73acc1f75 695 LPC_UART1->MCR |= (1<<7); // CTSEN
okini3939 4:f6d73acc1f75 696 LPC_PINCON->PINSEL1 &= ~(3 << 2);
okini3939 4:f6d73acc1f75 697 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
okini3939 4:f6d73acc1f75 698 }
okini3939 4:f6d73acc1f75 699 if (p_rts == P0_22) { // RTS (P0_22)
okini3939 4:f6d73acc1f75 700 LPC_UART1->MCR |= (1<<6); // RTSEN
okini3939 4:f6d73acc1f75 701 LPC_PINCON->PINSEL1 &= ~(3 << 12);
okini3939 4:f6d73acc1f75 702 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
okini3939 4:f6d73acc1f75 703 _xbee.attach(this, &XBee::isr_recv, Serial::RxIrq);
okini3939 4:f6d73acc1f75 704 _rts = true;
okini3939 4:f6d73acc1f75 705 } else {
okini3939 4:f6d73acc1f75 706 _rts = false;
okini3939 4:f6d73acc1f75 707 }
okini3939 4:f6d73acc1f75 708 #elif defined(TARGET_LPC11U24)
okini3939 4:f6d73acc1f75 709 if (p_cts == p21) { // CTS (P0_7)
okini3939 4:f6d73acc1f75 710 LPC_UART->MCR = (1<<7); // CTSEN
okini3939 4:f6d73acc1f75 711 LPC_IOCON->PIO0_7 &= ~0x07;
okini3939 4:f6d73acc1f75 712 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
okini3939 4:f6d73acc1f75 713 }
okini3939 4:f6d73acc1f75 714 if (p_rts == p22) { // RTS (P0_17)
okini3939 4:f6d73acc1f75 715 LPC_UART->MCR = (1<<6); // RTSEN
okini3939 4:f6d73acc1f75 716 LPC_IOCON->PIO0_17 &= ~0x07;
okini3939 4:f6d73acc1f75 717 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
okini3939 4:f6d73acc1f75 718 _xbee.attach(this, &XBee::isr_recv, Serial::RxIrq);
okini3939 4:f6d73acc1f75 719 _rts = true;
okini3939 4:f6d73acc1f75 720 } else {
okini3939 4:f6d73acc1f75 721 _rts = false;
okini3939 4:f6d73acc1f75 722 }
okini3939 4:f6d73acc1f75 723 #endif
okini3939 1:e3b2027e685c 724
okini3939 1:e3b2027e685c 725 _response.init();
okini3939 1:e3b2027e685c 726 _response.setFrameData(_responseFrameData);
okini3939 1:e3b2027e685c 727 }
ban4jp 9:e32c2e5390d3 728 #endif
ban4jp 9:e32c2e5390d3 729
ban4jp 10:eb70be6ceb6d 730 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 731 XBee::XBee(PinName p_mosi, PinName p_miso, PinName p_sclk, PinName p_ssel, PinName p_attn, PinName p_reset):
ban4jp 9:e32c2e5390d3 732 _xbee(p_mosi, p_miso, p_sclk), _ssel(p_ssel), _attn(p_attn), _reset(p_reset) {
ban4jp 9:e32c2e5390d3 733 _ssel = 1;
ban4jp 9:e32c2e5390d3 734
ban4jp 9:e32c2e5390d3 735 _pos = 0;
ban4jp 9:e32c2e5390d3 736 _epos = 0;
ban4jp 9:e32c2e5390d3 737 _escape = false;
ban4jp 9:e32c2e5390d3 738 _checksumTotal = 0;
ban4jp 9:e32c2e5390d3 739 _nextFrameId = 0;
ban4jp 9:e32c2e5390d3 740
ban4jp 9:e32c2e5390d3 741 _xbee.format(8,0);
ban4jp 9:e32c2e5390d3 742 _xbee.frequency(3500000);
ban4jp 9:e32c2e5390d3 743
ban4jp 9:e32c2e5390d3 744 _reset = 0;
ban4jp 9:e32c2e5390d3 745 wait_ms(20);
ban4jp 9:e32c2e5390d3 746 _reset = 1;
ban4jp 9:e32c2e5390d3 747 wait_ms(100);
ban4jp 9:e32c2e5390d3 748
ban4jp 9:e32c2e5390d3 749 _response.init();
ban4jp 9:e32c2e5390d3 750 _response.setFrameData(_responseFrameData);
ban4jp 9:e32c2e5390d3 751 }
ban4jp 9:e32c2e5390d3 752 #endif
okini3939 1:e3b2027e685c 753
okini3939 1:e3b2027e685c 754 uint8_t XBee::getNextFrameId() {
okini3939 1:e3b2027e685c 755
okini3939 1:e3b2027e685c 756 _nextFrameId++;
okini3939 1:e3b2027e685c 757
okini3939 1:e3b2027e685c 758 if (_nextFrameId == 0) {
okini3939 1:e3b2027e685c 759 // can't send 0 because that disables status response
okini3939 1:e3b2027e685c 760 _nextFrameId = 1;
okini3939 1:e3b2027e685c 761 }
okini3939 1:e3b2027e685c 762
okini3939 1:e3b2027e685c 763 return _nextFrameId;
okini3939 1:e3b2027e685c 764 }
okini3939 1:e3b2027e685c 765
ban4jp 10:eb70be6ceb6d 766 #ifndef USE_XBEE_SPI
okini3939 1:e3b2027e685c 767 void XBee::begin(long baud) {
okini3939 1:e3b2027e685c 768 _xbee.baud(baud);
okini3939 1:e3b2027e685c 769 }
ban4jp 9:e32c2e5390d3 770 #endif
okini3939 1:e3b2027e685c 771
okini3939 1:e3b2027e685c 772 /*
okini3939 1:e3b2027e685c 773 void XBee::setSerial(HardwareSerial serial) {
okini3939 1:e3b2027e685c 774 Serial = serial;
okini3939 1:e3b2027e685c 775 }
okini3939 1:e3b2027e685c 776 */
okini3939 1:e3b2027e685c 777
okini3939 1:e3b2027e685c 778 XBeeResponse& XBee::getResponse() {
okini3939 1:e3b2027e685c 779 return _response;
okini3939 1:e3b2027e685c 780 }
okini3939 1:e3b2027e685c 781
okini3939 1:e3b2027e685c 782 // TODO how to convert response to proper subclass?
okini3939 1:e3b2027e685c 783 void XBee::getResponse(XBeeResponse &response) {
okini3939 1:e3b2027e685c 784
okini3939 1:e3b2027e685c 785 response.setMsbLength(_response.getMsbLength());
okini3939 1:e3b2027e685c 786 response.setLsbLength(_response.getLsbLength());
okini3939 1:e3b2027e685c 787 response.setApiId(_response.getApiId());
okini3939 1:e3b2027e685c 788 response.setFrameLength(_response.getFrameDataLength());
okini3939 1:e3b2027e685c 789
okini3939 1:e3b2027e685c 790 response.setFrameData(_response.getFrameData());
okini3939 1:e3b2027e685c 791 }
okini3939 1:e3b2027e685c 792
okini3939 1:e3b2027e685c 793 void XBee::readPacketUntilAvailable() {
okini3939 1:e3b2027e685c 794 while (!(getResponse().isAvailable() || getResponse().isError())) {
okini3939 1:e3b2027e685c 795 // read some more
okini3939 1:e3b2027e685c 796 readPacket();
okini3939 1:e3b2027e685c 797 }
okini3939 1:e3b2027e685c 798 }
okini3939 1:e3b2027e685c 799
okini3939 1:e3b2027e685c 800 bool XBee::readPacket(int timeout) {
okini3939 1:e3b2027e685c 801 Timer t;
okini3939 1:e3b2027e685c 802
okini3939 1:e3b2027e685c 803 if (timeout < 0) {
okini3939 1:e3b2027e685c 804 return false;
okini3939 1:e3b2027e685c 805 }
okini3939 1:e3b2027e685c 806
okini3939 1:e3b2027e685c 807 /*
okini3939 1:e3b2027e685c 808 unsigned long start = millis();
okini3939 1:e3b2027e685c 809
okini3939 1:e3b2027e685c 810 while (int((millis() - start)) < timeout) {
okini3939 1:e3b2027e685c 811 */
ban4jp 9:e32c2e5390d3 812 DBG("(readPacket timeout=%d)\r\n", timeout);
okini3939 3:8573b122fa84 813 t.reset();
okini3939 1:e3b2027e685c 814 t.start();
okini3939 1:e3b2027e685c 815 while (t.read_ms() < timeout) {
okini3939 1:e3b2027e685c 816 readPacket();
okini3939 1:e3b2027e685c 817
okini3939 1:e3b2027e685c 818 if (getResponse().isAvailable()) {
okini3939 1:e3b2027e685c 819 t.stop();
ban4jp 9:e32c2e5390d3 820 DBG("(available %d %d)\r\n", _pos, _epos);
okini3939 1:e3b2027e685c 821 return true;
okini3939 1:e3b2027e685c 822 } else if (getResponse().isError()) {
okini3939 1:e3b2027e685c 823 t.stop();
ban4jp 9:e32c2e5390d3 824 DBG("(error %d %d)\r\n", _pos, _epos);
okini3939 1:e3b2027e685c 825 return false;
okini3939 1:e3b2027e685c 826 }
okini3939 1:e3b2027e685c 827 }
okini3939 1:e3b2027e685c 828
okini3939 4:f6d73acc1f75 829 DBG("(timeout %d %d)\r\n", _pos, _epos);
okini3939 1:e3b2027e685c 830 // timed out
okini3939 1:e3b2027e685c 831 t.stop();
okini3939 1:e3b2027e685c 832 return false;
okini3939 1:e3b2027e685c 833 }
okini3939 1:e3b2027e685c 834
ban4jp 10:eb70be6ceb6d 835 #ifndef USE_XBEE_SPI
okini3939 4:f6d73acc1f75 836 void XBee::isr_recv () {
okini3939 4:f6d73acc1f75 837 _rxbuf[_rxaddr_w] = _xbee.getc();
okini3939 4:f6d73acc1f75 838 _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE;
okini3939 4:f6d73acc1f75 839 }
ban4jp 9:e32c2e5390d3 840 #endif
okini3939 4:f6d73acc1f75 841
okini3939 4:f6d73acc1f75 842 int XBee::getbuf () {
okini3939 4:f6d73acc1f75 843 int r;
okini3939 4:f6d73acc1f75 844 __disable_irq();
okini3939 4:f6d73acc1f75 845 r = _rxbuf[_rxaddr_r];
okini3939 4:f6d73acc1f75 846 _rxaddr_r = (_rxaddr_r + 1) % MAX_RXBUF_SIZE;
okini3939 4:f6d73acc1f75 847 __enable_irq();
okini3939 4:f6d73acc1f75 848 return r;
okini3939 4:f6d73acc1f75 849 }
okini3939 4:f6d73acc1f75 850
okini3939 4:f6d73acc1f75 851 int XBee::bufreadable () {
okini3939 4:f6d73acc1f75 852 return _rxaddr_w != _rxaddr_r;
okini3939 4:f6d73acc1f75 853 }
okini3939 4:f6d73acc1f75 854
okini3939 1:e3b2027e685c 855 void XBee::readPacket() {
okini3939 1:e3b2027e685c 856 // reset previous response
okini3939 1:e3b2027e685c 857 if (_response.isAvailable() || _response.isError()) {
okini3939 1:e3b2027e685c 858 // discard previous packet and start over
okini3939 1:e3b2027e685c 859 resetResponse();
okini3939 1:e3b2027e685c 860 }
okini3939 1:e3b2027e685c 861
ban4jp 10:eb70be6ceb6d 862 #ifndef USE_XBEE_SPI
okini3939 4:f6d73acc1f75 863 // while (_xbee.readable()) {
okini3939 4:f6d73acc1f75 864 while ((! _rts && _xbee.readable()) || (_rts && bufreadable())) {
ban4jp 9:e32c2e5390d3 865 #else
ban4jp 9:e32c2e5390d3 866 while (! _attn || bufreadable()) {
ban4jp 9:e32c2e5390d3 867 #endif
okini3939 1:e3b2027e685c 868
ban4jp 10:eb70be6ceb6d 869 #ifndef USE_XBEE_SPI
okini3939 4:f6d73acc1f75 870 // b = _xbee.getc();
okini3939 4:f6d73acc1f75 871 if (_rts) {
okini3939 4:f6d73acc1f75 872 b = getbuf();
okini3939 4:f6d73acc1f75 873 } else {
okini3939 4:f6d73acc1f75 874 b = _xbee.getc();
okini3939 4:f6d73acc1f75 875 }
ban4jp 9:e32c2e5390d3 876 #else
ban4jp 9:e32c2e5390d3 877 if (! _attn) {
ban4jp 9:e32c2e5390d3 878 _ssel = 0;
ban4jp 9:e32c2e5390d3 879 sendByte(0x00, false);
ban4jp 9:e32c2e5390d3 880 //_ssel = 1;
ban4jp 9:e32c2e5390d3 881 }
ban4jp 9:e32c2e5390d3 882 b = getbuf();
ban4jp 9:e32c2e5390d3 883 #endif
okini3939 1:e3b2027e685c 884
okini3939 1:e3b2027e685c 885 if (_pos > 0 && b == START_BYTE && ATAP == 2) {
okini3939 1:e3b2027e685c 886 // new packet start before previous packeted completed -- discard previous packet and start over
okini3939 4:f6d73acc1f75 887 DBG("error: %02x %d %d\r\n", b, _pos, _epos);
okini3939 1:e3b2027e685c 888 _response.setErrorCode(UNEXPECTED_START_BYTE);
ban4jp 10:eb70be6ceb6d 889 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 890 _ssel = 1;
ban4jp 9:e32c2e5390d3 891 #endif
okini3939 1:e3b2027e685c 892 return;
okini3939 1:e3b2027e685c 893 }
okini3939 1:e3b2027e685c 894
ban4jp 10:eb70be6ceb6d 895 #ifndef USE_XBEE_SPI
okini3939 1:e3b2027e685c 896 if (_pos > 0 && b == ESCAPE) {
okini3939 1:e3b2027e685c 897 if (_xbee.readable()) {
okini3939 4:f6d73acc1f75 898 // b = _xbee.getc();
okini3939 4:f6d73acc1f75 899 if (_rts) {
okini3939 4:f6d73acc1f75 900 b = getbuf();
okini3939 4:f6d73acc1f75 901 } else {
okini3939 4:f6d73acc1f75 902 b = _xbee.getc();
okini3939 4:f6d73acc1f75 903 }
okini3939 1:e3b2027e685c 904 b = 0x20 ^ b;
okini3939 4:f6d73acc1f75 905 _epos ++;
okini3939 1:e3b2027e685c 906 } else {
okini3939 1:e3b2027e685c 907 // escape byte. next byte will be
okini3939 1:e3b2027e685c 908 _escape = true;
okini3939 1:e3b2027e685c 909 continue;
okini3939 1:e3b2027e685c 910 }
okini3939 1:e3b2027e685c 911 }
ban4jp 9:e32c2e5390d3 912 #endif
okini3939 3:8573b122fa84 913 DBG("%02x_", b);
okini3939 1:e3b2027e685c 914
ban4jp 10:eb70be6ceb6d 915 #ifndef USE_XBEE_SPI
okini3939 1:e3b2027e685c 916 if (_escape == true) {
okini3939 1:e3b2027e685c 917 b = 0x20 ^ b;
okini3939 1:e3b2027e685c 918 _escape = false;
okini3939 4:f6d73acc1f75 919 _epos ++;
okini3939 1:e3b2027e685c 920 }
ban4jp 9:e32c2e5390d3 921 #endif
okini3939 1:e3b2027e685c 922
okini3939 1:e3b2027e685c 923 // checksum includes all bytes starting with api id
okini3939 1:e3b2027e685c 924 if (_pos >= API_ID_INDEX) {
okini3939 1:e3b2027e685c 925 _checksumTotal+= b;
okini3939 1:e3b2027e685c 926 }
okini3939 1:e3b2027e685c 927
okini3939 1:e3b2027e685c 928 switch(_pos) {
okini3939 1:e3b2027e685c 929 case 0:
okini3939 1:e3b2027e685c 930 if (b == START_BYTE) {
okini3939 1:e3b2027e685c 931 _pos++;
okini3939 1:e3b2027e685c 932 }
okini3939 1:e3b2027e685c 933
okini3939 1:e3b2027e685c 934 break;
okini3939 1:e3b2027e685c 935 case 1:
okini3939 1:e3b2027e685c 936 // length msb
okini3939 1:e3b2027e685c 937 _response.setMsbLength(b);
okini3939 1:e3b2027e685c 938 _pos++;
okini3939 1:e3b2027e685c 939
okini3939 1:e3b2027e685c 940 break;
okini3939 1:e3b2027e685c 941 case 2:
okini3939 1:e3b2027e685c 942 // length lsb
okini3939 1:e3b2027e685c 943 _response.setLsbLength(b);
okini3939 1:e3b2027e685c 944 _pos++;
okini3939 1:e3b2027e685c 945
okini3939 1:e3b2027e685c 946 break;
okini3939 1:e3b2027e685c 947 case 3:
okini3939 1:e3b2027e685c 948 _response.setApiId(b);
okini3939 1:e3b2027e685c 949 _pos++;
okini3939 1:e3b2027e685c 950
okini3939 1:e3b2027e685c 951 break;
okini3939 1:e3b2027e685c 952 default:
okini3939 1:e3b2027e685c 953 // starts at fifth byte
okini3939 1:e3b2027e685c 954
okini3939 1:e3b2027e685c 955 if (_pos > MAX_FRAME_DATA_SIZE) {
okini3939 1:e3b2027e685c 956 // exceed max size. should never occur
okini3939 1:e3b2027e685c 957 _response.setErrorCode(PACKET_EXCEEDS_BYTE_ARRAY_LENGTH);
ban4jp 10:eb70be6ceb6d 958 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 959 _ssel = 1;
ban4jp 9:e32c2e5390d3 960 #endif
okini3939 1:e3b2027e685c 961 return;
okini3939 1:e3b2027e685c 962 }
okini3939 1:e3b2027e685c 963
okini3939 1:e3b2027e685c 964 // check if we're at the end of the packet
okini3939 1:e3b2027e685c 965 // packet length does not include start, length, or checksum bytes, so add 3
okini3939 1:e3b2027e685c 966 if (_pos == (_response.getPacketLength() + 3)) {
okini3939 4:f6d73acc1f75 967 // if (_pos + _epos == (_response.getPacketLength() + 3)) {
okini3939 1:e3b2027e685c 968 // verify checksum
okini3939 1:e3b2027e685c 969
okini3939 1:e3b2027e685c 970 //std::cout << "read checksum " << static_cast<unsigned int>(b) << " at pos " << static_cast<unsigned int>(_pos) << std::endl;
okini3939 1:e3b2027e685c 971 if ((_checksumTotal & 0xff) == 0xff) {
okini3939 1:e3b2027e685c 972 _response.setChecksum(b);
okini3939 1:e3b2027e685c 973 _response.setAvailable(true);
okini3939 1:e3b2027e685c 974
okini3939 1:e3b2027e685c 975 _response.setErrorCode(NO_ERROR);
okini3939 1:e3b2027e685c 976 } else {
okini3939 1:e3b2027e685c 977 // checksum failed
okini3939 4:f6d73acc1f75 978 DBG("error: checksum %02x %02x %d %d\r\n", b, _checksumTotal, _pos, _epos);
okini3939 1:e3b2027e685c 979 _response.setErrorCode(CHECKSUM_FAILURE);
okini3939 1:e3b2027e685c 980 }
okini3939 1:e3b2027e685c 981
okini3939 1:e3b2027e685c 982 // minus 4 because we start after start,msb,lsb,api and up to but not including checksum
okini3939 1:e3b2027e685c 983 // e.g. if frame was one byte, _pos=4 would be the byte, pos=5 is the checksum, where end stop reading
okini3939 1:e3b2027e685c 984 _response.setFrameLength(_pos - 4);
okini3939 1:e3b2027e685c 985
okini3939 1:e3b2027e685c 986 // reset state vars
okini3939 1:e3b2027e685c 987 _pos = 0;
okini3939 4:f6d73acc1f75 988 _epos = 0;
okini3939 1:e3b2027e685c 989
okini3939 1:e3b2027e685c 990 _checksumTotal = 0;
okini3939 1:e3b2027e685c 991
ban4jp 10:eb70be6ceb6d 992 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 993 _ssel = 1;
ban4jp 9:e32c2e5390d3 994 #endif
okini3939 1:e3b2027e685c 995 return;
okini3939 1:e3b2027e685c 996 } else {
okini3939 1:e3b2027e685c 997 // add to packet array, starting with the fourth byte of the apiFrame
okini3939 1:e3b2027e685c 998 _response.getFrameData()[_pos - 4] = b;
okini3939 1:e3b2027e685c 999 _pos++;
okini3939 1:e3b2027e685c 1000 }
okini3939 1:e3b2027e685c 1001 }
okini3939 1:e3b2027e685c 1002 }
ban4jp 10:eb70be6ceb6d 1003 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 1004 _ssel = 1;
ban4jp 9:e32c2e5390d3 1005 #endif
okini3939 1:e3b2027e685c 1006 }
okini3939 1:e3b2027e685c 1007
okini3939 1:e3b2027e685c 1008 // it's peanut butter jelly time!!
okini3939 1:e3b2027e685c 1009
okini3939 1:e3b2027e685c 1010 XBeeRequest::XBeeRequest(uint8_t apiId, uint8_t frameId) {
okini3939 1:e3b2027e685c 1011 _apiId = apiId;
okini3939 1:e3b2027e685c 1012 _frameId = frameId;
okini3939 1:e3b2027e685c 1013 }
okini3939 1:e3b2027e685c 1014
okini3939 1:e3b2027e685c 1015 void XBeeRequest::setFrameId(uint8_t frameId) {
okini3939 1:e3b2027e685c 1016 _frameId = frameId;
okini3939 1:e3b2027e685c 1017 }
okini3939 1:e3b2027e685c 1018
okini3939 1:e3b2027e685c 1019 uint8_t XBeeRequest::getFrameId() {
okini3939 1:e3b2027e685c 1020 return _frameId;
okini3939 1:e3b2027e685c 1021 }
okini3939 1:e3b2027e685c 1022
okini3939 1:e3b2027e685c 1023 uint8_t XBeeRequest::getApiId() {
okini3939 1:e3b2027e685c 1024 return _apiId;
okini3939 1:e3b2027e685c 1025 }
okini3939 1:e3b2027e685c 1026
okini3939 1:e3b2027e685c 1027 void XBeeRequest::setApiId(uint8_t apiId) {
okini3939 1:e3b2027e685c 1028 _apiId = apiId;
okini3939 1:e3b2027e685c 1029 }
okini3939 1:e3b2027e685c 1030
okini3939 1:e3b2027e685c 1031 //void XBeeRequest::reset() {
okini3939 1:e3b2027e685c 1032 // _frameId = DEFAULT_FRAME_ID;
okini3939 1:e3b2027e685c 1033 //}
okini3939 1:e3b2027e685c 1034
okini3939 1:e3b2027e685c 1035 //uint8_t XBeeRequest::getPayloadOffset() {
okini3939 1:e3b2027e685c 1036 // return _payloadOffset;
okini3939 1:e3b2027e685c 1037 //}
okini3939 1:e3b2027e685c 1038 //
okini3939 1:e3b2027e685c 1039 //uint8_t XBeeRequest::setPayloadOffset(uint8_t payloadOffset) {
okini3939 1:e3b2027e685c 1040 // _payloadOffset = payloadOffset;
okini3939 1:e3b2027e685c 1041 //}
okini3939 1:e3b2027e685c 1042
okini3939 1:e3b2027e685c 1043
okini3939 4:f6d73acc1f75 1044 PayloadRequest::PayloadRequest(uint8_t apiId, uint8_t frameId, uint8_t *payload, uint16_t payloadLength) : XBeeRequest(apiId, frameId) {
okini3939 1:e3b2027e685c 1045 _payloadPtr = payload;
okini3939 1:e3b2027e685c 1046 _payloadLength = payloadLength;
okini3939 1:e3b2027e685c 1047 }
okini3939 1:e3b2027e685c 1048
okini3939 1:e3b2027e685c 1049 uint8_t* PayloadRequest::getPayload() {
okini3939 1:e3b2027e685c 1050 return _payloadPtr;
okini3939 1:e3b2027e685c 1051 }
okini3939 1:e3b2027e685c 1052
okini3939 1:e3b2027e685c 1053 void PayloadRequest::setPayload(uint8_t* payload) {
okini3939 1:e3b2027e685c 1054 _payloadPtr = payload;
okini3939 1:e3b2027e685c 1055 }
okini3939 1:e3b2027e685c 1056
okini3939 4:f6d73acc1f75 1057 uint16_t PayloadRequest::getPayloadLength() {
okini3939 1:e3b2027e685c 1058 return _payloadLength;
okini3939 1:e3b2027e685c 1059 }
okini3939 1:e3b2027e685c 1060
okini3939 4:f6d73acc1f75 1061 void PayloadRequest::setPayloadLength(uint16_t payloadLength) {
okini3939 1:e3b2027e685c 1062 _payloadLength = payloadLength;
okini3939 1:e3b2027e685c 1063 }
okini3939 1:e3b2027e685c 1064
okini3939 1:e3b2027e685c 1065
okini3939 1:e3b2027e685c 1066 XBeeAddress::XBeeAddress() {
okini3939 1:e3b2027e685c 1067
okini3939 1:e3b2027e685c 1068 }
okini3939 1:e3b2027e685c 1069
okini3939 1:e3b2027e685c 1070 XBeeAddress64::XBeeAddress64() : XBeeAddress() {
okini3939 1:e3b2027e685c 1071
okini3939 1:e3b2027e685c 1072 }
okini3939 1:e3b2027e685c 1073
okini3939 1:e3b2027e685c 1074 XBeeAddress64::XBeeAddress64(uint32_t msb, uint32_t lsb) : XBeeAddress() {
okini3939 1:e3b2027e685c 1075 _msb = msb;
okini3939 1:e3b2027e685c 1076 _lsb = lsb;
okini3939 1:e3b2027e685c 1077 }
okini3939 1:e3b2027e685c 1078
okini3939 1:e3b2027e685c 1079 uint32_t XBeeAddress64::getMsb() {
okini3939 1:e3b2027e685c 1080 return _msb;
okini3939 1:e3b2027e685c 1081 }
okini3939 1:e3b2027e685c 1082
okini3939 1:e3b2027e685c 1083 void XBeeAddress64::setMsb(uint32_t msb) {
okini3939 1:e3b2027e685c 1084 _msb = msb;
okini3939 1:e3b2027e685c 1085 }
okini3939 1:e3b2027e685c 1086
okini3939 1:e3b2027e685c 1087 uint32_t XBeeAddress64::getLsb() {
okini3939 1:e3b2027e685c 1088 return _lsb;
okini3939 1:e3b2027e685c 1089 }
okini3939 1:e3b2027e685c 1090
okini3939 1:e3b2027e685c 1091 void XBeeAddress64::setLsb(uint32_t lsb) {
okini3939 1:e3b2027e685c 1092 _lsb = lsb;
okini3939 1:e3b2027e685c 1093 }
okini3939 1:e3b2027e685c 1094
okini3939 1:e3b2027e685c 1095
okini3939 1:e3b2027e685c 1096 #ifdef SERIES_2
okini3939 1:e3b2027e685c 1097
okini3939 1:e3b2027e685c 1098 ZBTxRequest::ZBTxRequest() : PayloadRequest(ZB_TX_REQUEST, DEFAULT_FRAME_ID, NULL, 0) {
okini3939 1:e3b2027e685c 1099
okini3939 1:e3b2027e685c 1100 }
okini3939 1:e3b2027e685c 1101
okini3939 4:f6d73acc1f75 1102 ZBTxRequest::ZBTxRequest(XBeeAddress64 &addr64, uint16_t addr16, uint8_t broadcastRadius, uint8_t option, uint8_t *data, uint16_t dataLength, uint8_t frameId): PayloadRequest(ZB_TX_REQUEST, frameId, data, dataLength) {
okini3939 1:e3b2027e685c 1103 _addr64 = addr64;
okini3939 1:e3b2027e685c 1104 _addr16 = addr16;
okini3939 1:e3b2027e685c 1105 _broadcastRadius = broadcastRadius;
okini3939 1:e3b2027e685c 1106 _option = option;
okini3939 1:e3b2027e685c 1107 }
okini3939 1:e3b2027e685c 1108
okini3939 4:f6d73acc1f75 1109 ZBTxRequest::ZBTxRequest(XBeeAddress64 &addr64, uint8_t *data, uint16_t dataLength): PayloadRequest(ZB_TX_REQUEST, DEFAULT_FRAME_ID, data, dataLength) {
okini3939 1:e3b2027e685c 1110 _addr64 = addr64;
okini3939 1:e3b2027e685c 1111 _addr16 = ZB_BROADCAST_ADDRESS;
okini3939 1:e3b2027e685c 1112 _broadcastRadius = ZB_BROADCAST_RADIUS_MAX_HOPS;
okini3939 1:e3b2027e685c 1113 _option = ZB_TX_UNICAST;
okini3939 1:e3b2027e685c 1114 }
okini3939 1:e3b2027e685c 1115
okini3939 4:f6d73acc1f75 1116 uint8_t ZBTxRequest::getFrameData(uint16_t pos) {
okini3939 1:e3b2027e685c 1117 if (pos == 0) {
okini3939 1:e3b2027e685c 1118 return (_addr64.getMsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1119 } else if (pos == 1) {
okini3939 1:e3b2027e685c 1120 return (_addr64.getMsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1121 } else if (pos == 2) {
okini3939 1:e3b2027e685c 1122 return (_addr64.getMsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1123 } else if (pos == 3) {
okini3939 1:e3b2027e685c 1124 return _addr64.getMsb() & 0xff;
okini3939 1:e3b2027e685c 1125 } else if (pos == 4) {
okini3939 1:e3b2027e685c 1126 return (_addr64.getLsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1127 } else if (pos == 5) {
okini3939 1:e3b2027e685c 1128 return (_addr64.getLsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1129 } else if (pos == 6) {
okini3939 1:e3b2027e685c 1130 return (_addr64.getLsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1131 } else if (pos == 7) {
okini3939 1:e3b2027e685c 1132 return _addr64.getLsb() & 0xff;
okini3939 1:e3b2027e685c 1133 } else if (pos == 8) {
okini3939 1:e3b2027e685c 1134 return (_addr16 >> 8) & 0xff;
okini3939 1:e3b2027e685c 1135 } else if (pos == 9) {
okini3939 1:e3b2027e685c 1136 return _addr16 & 0xff;
okini3939 1:e3b2027e685c 1137 } else if (pos == 10) {
okini3939 1:e3b2027e685c 1138 return _broadcastRadius;
okini3939 1:e3b2027e685c 1139 } else if (pos == 11) {
okini3939 1:e3b2027e685c 1140 return _option;
okini3939 1:e3b2027e685c 1141 } else {
okini3939 1:e3b2027e685c 1142 return getPayload()[pos - ZB_TX_API_LENGTH];
okini3939 1:e3b2027e685c 1143 }
okini3939 1:e3b2027e685c 1144 }
okini3939 1:e3b2027e685c 1145
okini3939 4:f6d73acc1f75 1146 uint16_t ZBTxRequest::getFrameDataLength() {
okini3939 1:e3b2027e685c 1147 return ZB_TX_API_LENGTH + getPayloadLength();
okini3939 1:e3b2027e685c 1148 }
okini3939 1:e3b2027e685c 1149
okini3939 1:e3b2027e685c 1150 XBeeAddress64& ZBTxRequest::getAddress64() {
okini3939 1:e3b2027e685c 1151 return _addr64;
okini3939 1:e3b2027e685c 1152 }
okini3939 1:e3b2027e685c 1153
okini3939 1:e3b2027e685c 1154 uint16_t ZBTxRequest::getAddress16() {
okini3939 1:e3b2027e685c 1155 return _addr16;
okini3939 1:e3b2027e685c 1156 }
okini3939 1:e3b2027e685c 1157
okini3939 1:e3b2027e685c 1158 uint8_t ZBTxRequest::getBroadcastRadius() {
okini3939 1:e3b2027e685c 1159 return _broadcastRadius;
okini3939 1:e3b2027e685c 1160 }
okini3939 1:e3b2027e685c 1161
okini3939 1:e3b2027e685c 1162 uint8_t ZBTxRequest::getOption() {
okini3939 1:e3b2027e685c 1163 return _option;
okini3939 1:e3b2027e685c 1164 }
okini3939 1:e3b2027e685c 1165
okini3939 1:e3b2027e685c 1166 void ZBTxRequest::setAddress64(XBeeAddress64& addr64) {
okini3939 1:e3b2027e685c 1167 _addr64 = addr64;
okini3939 1:e3b2027e685c 1168 }
okini3939 1:e3b2027e685c 1169
okini3939 1:e3b2027e685c 1170 void ZBTxRequest::setAddress16(uint16_t addr16) {
okini3939 1:e3b2027e685c 1171 _addr16 = addr16;
okini3939 1:e3b2027e685c 1172 }
okini3939 1:e3b2027e685c 1173
okini3939 1:e3b2027e685c 1174 void ZBTxRequest::setBroadcastRadius(uint8_t broadcastRadius) {
okini3939 1:e3b2027e685c 1175 _broadcastRadius = broadcastRadius;
okini3939 1:e3b2027e685c 1176 }
okini3939 1:e3b2027e685c 1177
okini3939 1:e3b2027e685c 1178 void ZBTxRequest::setOption(uint8_t option) {
okini3939 1:e3b2027e685c 1179 _option = option;
okini3939 1:e3b2027e685c 1180 }
okini3939 1:e3b2027e685c 1181
okini3939 1:e3b2027e685c 1182 #endif
okini3939 1:e3b2027e685c 1183
okini3939 1:e3b2027e685c 1184 #ifdef SERIES_1
okini3939 1:e3b2027e685c 1185
okini3939 1:e3b2027e685c 1186 Tx16Request::Tx16Request() : PayloadRequest(TX_16_REQUEST, DEFAULT_FRAME_ID, NULL, 0) {
okini3939 1:e3b2027e685c 1187
okini3939 1:e3b2027e685c 1188 }
okini3939 1:e3b2027e685c 1189
okini3939 4:f6d73acc1f75 1190 Tx16Request::Tx16Request(uint16_t addr16, uint8_t option, uint8_t *data, uint16_t dataLength, uint8_t frameId) : PayloadRequest(TX_16_REQUEST, frameId, data, dataLength) {
okini3939 1:e3b2027e685c 1191 _addr16 = addr16;
okini3939 1:e3b2027e685c 1192 _option = option;
okini3939 1:e3b2027e685c 1193 }
okini3939 1:e3b2027e685c 1194
okini3939 4:f6d73acc1f75 1195 Tx16Request::Tx16Request(uint16_t addr16, uint8_t *data, uint16_t dataLength) : PayloadRequest(TX_16_REQUEST, DEFAULT_FRAME_ID, data, dataLength) {
okini3939 1:e3b2027e685c 1196 _addr16 = addr16;
okini3939 1:e3b2027e685c 1197 _option = ACK_OPTION;
okini3939 1:e3b2027e685c 1198 }
okini3939 1:e3b2027e685c 1199
okini3939 4:f6d73acc1f75 1200 uint8_t Tx16Request::getFrameData(uint16_t pos) {
okini3939 1:e3b2027e685c 1201
okini3939 1:e3b2027e685c 1202 if (pos == 0) {
okini3939 1:e3b2027e685c 1203 return (_addr16 >> 8) & 0xff;
okini3939 1:e3b2027e685c 1204 } else if (pos == 1) {
okini3939 1:e3b2027e685c 1205 return _addr16 & 0xff;
okini3939 1:e3b2027e685c 1206 } else if (pos == 2) {
okini3939 1:e3b2027e685c 1207 return _option;
okini3939 1:e3b2027e685c 1208 } else {
okini3939 1:e3b2027e685c 1209 return getPayload()[pos - TX_16_API_LENGTH];
okini3939 1:e3b2027e685c 1210 }
okini3939 1:e3b2027e685c 1211 }
okini3939 1:e3b2027e685c 1212
okini3939 4:f6d73acc1f75 1213 uint16_t Tx16Request::getFrameDataLength() {
okini3939 1:e3b2027e685c 1214 return TX_16_API_LENGTH + getPayloadLength();
okini3939 1:e3b2027e685c 1215 }
okini3939 1:e3b2027e685c 1216
okini3939 1:e3b2027e685c 1217 uint16_t Tx16Request::getAddress16() {
okini3939 1:e3b2027e685c 1218 return _addr16;
okini3939 1:e3b2027e685c 1219 }
okini3939 1:e3b2027e685c 1220
okini3939 1:e3b2027e685c 1221 void Tx16Request::setAddress16(uint16_t addr16) {
okini3939 1:e3b2027e685c 1222 _addr16 = addr16;
okini3939 1:e3b2027e685c 1223 }
okini3939 1:e3b2027e685c 1224
okini3939 1:e3b2027e685c 1225 uint8_t Tx16Request::getOption() {
okini3939 1:e3b2027e685c 1226 return _option;
okini3939 1:e3b2027e685c 1227 }
okini3939 1:e3b2027e685c 1228
okini3939 1:e3b2027e685c 1229 void Tx16Request::setOption(uint8_t option) {
okini3939 1:e3b2027e685c 1230 _option = option;
okini3939 1:e3b2027e685c 1231 }
okini3939 1:e3b2027e685c 1232
okini3939 1:e3b2027e685c 1233 Tx64Request::Tx64Request() : PayloadRequest(TX_64_REQUEST, DEFAULT_FRAME_ID, NULL, 0) {
okini3939 1:e3b2027e685c 1234
okini3939 1:e3b2027e685c 1235 }
okini3939 1:e3b2027e685c 1236
okini3939 4:f6d73acc1f75 1237 Tx64Request::Tx64Request(XBeeAddress64 &addr64, uint8_t option, uint8_t *data, uint16_t dataLength, uint8_t frameId) : PayloadRequest(TX_64_REQUEST, frameId, data, dataLength) {
okini3939 1:e3b2027e685c 1238 _addr64 = addr64;
okini3939 1:e3b2027e685c 1239 _option = option;
okini3939 1:e3b2027e685c 1240 }
okini3939 1:e3b2027e685c 1241
okini3939 4:f6d73acc1f75 1242 Tx64Request::Tx64Request(XBeeAddress64 &addr64, uint8_t *data, uint16_t dataLength) : PayloadRequest(TX_64_REQUEST, DEFAULT_FRAME_ID, data, dataLength) {
okini3939 1:e3b2027e685c 1243 _addr64 = addr64;
okini3939 1:e3b2027e685c 1244 _option = ACK_OPTION;
okini3939 1:e3b2027e685c 1245 }
okini3939 1:e3b2027e685c 1246
okini3939 4:f6d73acc1f75 1247 uint8_t Tx64Request::getFrameData(uint16_t pos) {
okini3939 1:e3b2027e685c 1248
okini3939 1:e3b2027e685c 1249 if (pos == 0) {
okini3939 1:e3b2027e685c 1250 return (_addr64.getMsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1251 } else if (pos == 1) {
okini3939 1:e3b2027e685c 1252 return (_addr64.getMsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1253 } else if (pos == 2) {
okini3939 1:e3b2027e685c 1254 return (_addr64.getMsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1255 } else if (pos == 3) {
okini3939 1:e3b2027e685c 1256 return _addr64.getMsb() & 0xff;
okini3939 1:e3b2027e685c 1257 } else if (pos == 4) {
okini3939 1:e3b2027e685c 1258 return (_addr64.getLsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1259 } else if (pos == 5) {
okini3939 1:e3b2027e685c 1260 return (_addr64.getLsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1261 } else if (pos == 6) {
okini3939 1:e3b2027e685c 1262 return(_addr64.getLsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1263 } else if (pos == 7) {
okini3939 1:e3b2027e685c 1264 return _addr64.getLsb() & 0xff;
okini3939 1:e3b2027e685c 1265 } else if (pos == 8) {
okini3939 1:e3b2027e685c 1266 return _option;
okini3939 1:e3b2027e685c 1267 } else {
okini3939 1:e3b2027e685c 1268 return getPayload()[pos - TX_64_API_LENGTH];
okini3939 1:e3b2027e685c 1269 }
okini3939 1:e3b2027e685c 1270 }
okini3939 1:e3b2027e685c 1271
okini3939 4:f6d73acc1f75 1272 uint16_t Tx64Request::getFrameDataLength() {
okini3939 1:e3b2027e685c 1273 return TX_64_API_LENGTH + getPayloadLength();
okini3939 1:e3b2027e685c 1274 }
okini3939 1:e3b2027e685c 1275
okini3939 1:e3b2027e685c 1276 XBeeAddress64& Tx64Request::getAddress64() {
okini3939 1:e3b2027e685c 1277 return _addr64;
okini3939 1:e3b2027e685c 1278 }
okini3939 1:e3b2027e685c 1279
okini3939 1:e3b2027e685c 1280 void Tx64Request::setAddress64(XBeeAddress64& addr64) {
okini3939 1:e3b2027e685c 1281 _addr64 = addr64;
okini3939 1:e3b2027e685c 1282 }
okini3939 1:e3b2027e685c 1283
okini3939 1:e3b2027e685c 1284 uint8_t Tx64Request::getOption() {
okini3939 1:e3b2027e685c 1285 return _option;
okini3939 1:e3b2027e685c 1286 }
okini3939 1:e3b2027e685c 1287
okini3939 1:e3b2027e685c 1288 void Tx64Request::setOption(uint8_t option) {
okini3939 1:e3b2027e685c 1289 _option = option;
okini3939 1:e3b2027e685c 1290 }
okini3939 1:e3b2027e685c 1291
okini3939 1:e3b2027e685c 1292 #endif
okini3939 1:e3b2027e685c 1293
okini3939 1:e3b2027e685c 1294 AtCommandRequest::AtCommandRequest() : XBeeRequest(AT_COMMAND_REQUEST, DEFAULT_FRAME_ID) {
okini3939 1:e3b2027e685c 1295 _command = NULL;
okini3939 1:e3b2027e685c 1296 clearCommandValue();
okini3939 1:e3b2027e685c 1297 }
okini3939 1:e3b2027e685c 1298
okini3939 1:e3b2027e685c 1299 AtCommandRequest::AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength) : XBeeRequest(AT_COMMAND_REQUEST, DEFAULT_FRAME_ID) {
okini3939 1:e3b2027e685c 1300 _command = command;
okini3939 1:e3b2027e685c 1301 _commandValue = commandValue;
okini3939 1:e3b2027e685c 1302 _commandValueLength = commandValueLength;
okini3939 1:e3b2027e685c 1303 }
okini3939 1:e3b2027e685c 1304
okini3939 1:e3b2027e685c 1305 AtCommandRequest::AtCommandRequest(uint8_t *command) : XBeeRequest(AT_COMMAND_REQUEST, DEFAULT_FRAME_ID) {
okini3939 1:e3b2027e685c 1306 _command = command;
okini3939 1:e3b2027e685c 1307 clearCommandValue();
okini3939 1:e3b2027e685c 1308 }
okini3939 1:e3b2027e685c 1309
okini3939 1:e3b2027e685c 1310 uint8_t* AtCommandRequest::getCommand() {
okini3939 1:e3b2027e685c 1311 return _command;
okini3939 1:e3b2027e685c 1312 }
okini3939 1:e3b2027e685c 1313
okini3939 1:e3b2027e685c 1314 uint8_t* AtCommandRequest::getCommandValue() {
okini3939 1:e3b2027e685c 1315 return _commandValue;
okini3939 1:e3b2027e685c 1316 }
okini3939 1:e3b2027e685c 1317
okini3939 1:e3b2027e685c 1318 uint8_t AtCommandRequest::getCommandValueLength() {
okini3939 1:e3b2027e685c 1319 return _commandValueLength;
okini3939 1:e3b2027e685c 1320 }
okini3939 1:e3b2027e685c 1321
okini3939 1:e3b2027e685c 1322 void AtCommandRequest::setCommand(uint8_t* command) {
okini3939 1:e3b2027e685c 1323 _command = command;
okini3939 1:e3b2027e685c 1324 }
okini3939 1:e3b2027e685c 1325
okini3939 1:e3b2027e685c 1326 void AtCommandRequest::setCommandValue(uint8_t* value) {
okini3939 1:e3b2027e685c 1327 _commandValue = value;
okini3939 1:e3b2027e685c 1328 }
okini3939 1:e3b2027e685c 1329
okini3939 1:e3b2027e685c 1330 void AtCommandRequest::setCommandValueLength(uint8_t length) {
okini3939 1:e3b2027e685c 1331 _commandValueLength = length;
okini3939 1:e3b2027e685c 1332 }
okini3939 1:e3b2027e685c 1333
okini3939 4:f6d73acc1f75 1334 uint8_t AtCommandRequest::getFrameData(uint16_t pos) {
okini3939 1:e3b2027e685c 1335
okini3939 1:e3b2027e685c 1336 if (pos == 0) {
okini3939 1:e3b2027e685c 1337 return _command[0];
okini3939 1:e3b2027e685c 1338 } else if (pos == 1) {
okini3939 1:e3b2027e685c 1339 return _command[1];
okini3939 1:e3b2027e685c 1340 } else {
okini3939 1:e3b2027e685c 1341 return _commandValue[pos - AT_COMMAND_API_LENGTH];
okini3939 1:e3b2027e685c 1342 }
okini3939 1:e3b2027e685c 1343 }
okini3939 1:e3b2027e685c 1344
okini3939 1:e3b2027e685c 1345 void AtCommandRequest::clearCommandValue() {
okini3939 1:e3b2027e685c 1346 _commandValue = NULL;
okini3939 1:e3b2027e685c 1347 _commandValueLength = 0;
okini3939 1:e3b2027e685c 1348 }
okini3939 1:e3b2027e685c 1349
okini3939 1:e3b2027e685c 1350 //void AtCommandRequest::reset() {
okini3939 1:e3b2027e685c 1351 // XBeeRequest::reset();
okini3939 1:e3b2027e685c 1352 //}
okini3939 1:e3b2027e685c 1353
okini3939 4:f6d73acc1f75 1354 uint16_t AtCommandRequest::getFrameDataLength() {
okini3939 1:e3b2027e685c 1355 // command is 2 byte + length of value
okini3939 1:e3b2027e685c 1356 return AT_COMMAND_API_LENGTH + _commandValueLength;
okini3939 1:e3b2027e685c 1357 }
okini3939 1:e3b2027e685c 1358
okini3939 1:e3b2027e685c 1359 XBeeAddress64 RemoteAtCommandRequest::broadcastAddress64 = XBeeAddress64(0x0, BROADCAST_ADDRESS);
okini3939 1:e3b2027e685c 1360
okini3939 1:e3b2027e685c 1361 RemoteAtCommandRequest::RemoteAtCommandRequest() : AtCommandRequest(NULL, NULL, 0) {
okini3939 1:e3b2027e685c 1362 _remoteAddress16 = 0;
okini3939 1:e3b2027e685c 1363 _applyChanges = false;
okini3939 1:e3b2027e685c 1364 setApiId(REMOTE_AT_REQUEST);
okini3939 1:e3b2027e685c 1365 }
okini3939 1:e3b2027e685c 1366
okini3939 1:e3b2027e685c 1367 RemoteAtCommandRequest::RemoteAtCommandRequest(uint16_t remoteAddress16, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength) : AtCommandRequest(command, commandValue, commandValueLength) {
okini3939 1:e3b2027e685c 1368 _remoteAddress64 = broadcastAddress64;
okini3939 1:e3b2027e685c 1369 _remoteAddress16 = remoteAddress16;
okini3939 1:e3b2027e685c 1370 _applyChanges = true;
okini3939 1:e3b2027e685c 1371 setApiId(REMOTE_AT_REQUEST);
okini3939 1:e3b2027e685c 1372 }
okini3939 1:e3b2027e685c 1373
okini3939 1:e3b2027e685c 1374 RemoteAtCommandRequest::RemoteAtCommandRequest(uint16_t remoteAddress16, uint8_t *command) : AtCommandRequest(command, NULL, 0) {
okini3939 1:e3b2027e685c 1375 _remoteAddress64 = broadcastAddress64;
okini3939 1:e3b2027e685c 1376 _remoteAddress16 = remoteAddress16;
okini3939 1:e3b2027e685c 1377 _applyChanges = false;
okini3939 1:e3b2027e685c 1378 setApiId(REMOTE_AT_REQUEST);
okini3939 1:e3b2027e685c 1379 }
okini3939 1:e3b2027e685c 1380
okini3939 1:e3b2027e685c 1381 RemoteAtCommandRequest::RemoteAtCommandRequest(XBeeAddress64 &remoteAddress64, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength) : AtCommandRequest(command, commandValue, commandValueLength) {
okini3939 1:e3b2027e685c 1382 _remoteAddress64 = remoteAddress64;
okini3939 1:e3b2027e685c 1383 // don't worry.. works for series 1 too!
okini3939 1:e3b2027e685c 1384 _remoteAddress16 = ZB_BROADCAST_ADDRESS;
okini3939 1:e3b2027e685c 1385 _applyChanges = true;
okini3939 1:e3b2027e685c 1386 setApiId(REMOTE_AT_REQUEST);
okini3939 1:e3b2027e685c 1387 }
okini3939 1:e3b2027e685c 1388
okini3939 1:e3b2027e685c 1389 RemoteAtCommandRequest::RemoteAtCommandRequest(XBeeAddress64 &remoteAddress64, uint8_t *command) : AtCommandRequest(command, NULL, 0) {
okini3939 1:e3b2027e685c 1390 _remoteAddress64 = remoteAddress64;
okini3939 1:e3b2027e685c 1391 _remoteAddress16 = ZB_BROADCAST_ADDRESS;
okini3939 1:e3b2027e685c 1392 _applyChanges = false;
okini3939 1:e3b2027e685c 1393 setApiId(REMOTE_AT_REQUEST);
okini3939 1:e3b2027e685c 1394 }
okini3939 1:e3b2027e685c 1395
okini3939 1:e3b2027e685c 1396 uint16_t RemoteAtCommandRequest::getRemoteAddress16() {
okini3939 1:e3b2027e685c 1397 return _remoteAddress16;
okini3939 1:e3b2027e685c 1398 }
okini3939 1:e3b2027e685c 1399
okini3939 1:e3b2027e685c 1400 void RemoteAtCommandRequest::setRemoteAddress16(uint16_t remoteAddress16) {
okini3939 1:e3b2027e685c 1401 _remoteAddress16 = remoteAddress16;
okini3939 1:e3b2027e685c 1402 }
okini3939 1:e3b2027e685c 1403
okini3939 1:e3b2027e685c 1404 XBeeAddress64& RemoteAtCommandRequest::getRemoteAddress64() {
okini3939 1:e3b2027e685c 1405 return _remoteAddress64;
okini3939 1:e3b2027e685c 1406 }
okini3939 1:e3b2027e685c 1407
okini3939 1:e3b2027e685c 1408 void RemoteAtCommandRequest::setRemoteAddress64(XBeeAddress64 &remoteAddress64) {
okini3939 1:e3b2027e685c 1409 _remoteAddress64 = remoteAddress64;
okini3939 1:e3b2027e685c 1410 }
okini3939 1:e3b2027e685c 1411
okini3939 1:e3b2027e685c 1412 bool RemoteAtCommandRequest::getApplyChanges() {
okini3939 1:e3b2027e685c 1413 return _applyChanges;
okini3939 1:e3b2027e685c 1414 }
okini3939 1:e3b2027e685c 1415
okini3939 1:e3b2027e685c 1416 void RemoteAtCommandRequest::setApplyChanges(bool applyChanges) {
okini3939 1:e3b2027e685c 1417 _applyChanges = applyChanges;
okini3939 1:e3b2027e685c 1418 }
okini3939 1:e3b2027e685c 1419
okini3939 1:e3b2027e685c 1420
okini3939 4:f6d73acc1f75 1421 uint8_t RemoteAtCommandRequest::getFrameData(uint16_t pos) {
okini3939 1:e3b2027e685c 1422 if (pos == 0) {
okini3939 1:e3b2027e685c 1423 return (_remoteAddress64.getMsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1424 } else if (pos == 1) {
okini3939 1:e3b2027e685c 1425 return (_remoteAddress64.getMsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1426 } else if (pos == 2) {
okini3939 1:e3b2027e685c 1427 return (_remoteAddress64.getMsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1428 } else if (pos == 3) {
okini3939 1:e3b2027e685c 1429 return _remoteAddress64.getMsb() & 0xff;
okini3939 1:e3b2027e685c 1430 } else if (pos == 4) {
okini3939 1:e3b2027e685c 1431 return (_remoteAddress64.getLsb() >> 24) & 0xff;
okini3939 1:e3b2027e685c 1432 } else if (pos == 5) {
okini3939 1:e3b2027e685c 1433 return (_remoteAddress64.getLsb() >> 16) & 0xff;
okini3939 1:e3b2027e685c 1434 } else if (pos == 6) {
okini3939 1:e3b2027e685c 1435 return(_remoteAddress64.getLsb() >> 8) & 0xff;
okini3939 1:e3b2027e685c 1436 } else if (pos == 7) {
okini3939 1:e3b2027e685c 1437 return _remoteAddress64.getLsb() & 0xff;
okini3939 1:e3b2027e685c 1438 } else if (pos == 8) {
okini3939 1:e3b2027e685c 1439 return (_remoteAddress16 >> 8) & 0xff;
okini3939 1:e3b2027e685c 1440 } else if (pos == 9) {
okini3939 1:e3b2027e685c 1441 return _remoteAddress16 & 0xff;
okini3939 1:e3b2027e685c 1442 } else if (pos == 10) {
okini3939 1:e3b2027e685c 1443 return _applyChanges ? 2: 0;
okini3939 1:e3b2027e685c 1444 } else if (pos == 11) {
okini3939 1:e3b2027e685c 1445 return getCommand()[0];
okini3939 1:e3b2027e685c 1446 } else if (pos == 12) {
okini3939 1:e3b2027e685c 1447 return getCommand()[1];
okini3939 1:e3b2027e685c 1448 } else {
okini3939 1:e3b2027e685c 1449 return getCommandValue()[pos - REMOTE_AT_COMMAND_API_LENGTH];
okini3939 1:e3b2027e685c 1450 }
okini3939 1:e3b2027e685c 1451 }
okini3939 1:e3b2027e685c 1452
okini3939 4:f6d73acc1f75 1453 uint16_t RemoteAtCommandRequest::getFrameDataLength() {
okini3939 1:e3b2027e685c 1454 return REMOTE_AT_COMMAND_API_LENGTH + getCommandValueLength();
okini3939 1:e3b2027e685c 1455 }
okini3939 1:e3b2027e685c 1456
okini3939 1:e3b2027e685c 1457
okini3939 1:e3b2027e685c 1458 // TODO
okini3939 1:e3b2027e685c 1459 //GenericRequest::GenericRequest(uint8_t* frame, uint8_t len, uint8_t apiId): XBeeRequest(apiId, *(frame), len) {
okini3939 1:e3b2027e685c 1460 // _frame = frame;
okini3939 1:e3b2027e685c 1461 //}
okini3939 1:e3b2027e685c 1462
okini3939 1:e3b2027e685c 1463 void XBee::send(XBeeRequest &request) {
ban4jp 10:eb70be6ceb6d 1464 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 1465 _ssel = 0;
ban4jp 9:e32c2e5390d3 1466 #endif
okini3939 1:e3b2027e685c 1467 // the new new deal
okini3939 1:e3b2027e685c 1468
okini3939 1:e3b2027e685c 1469 sendByte(START_BYTE, false);
okini3939 1:e3b2027e685c 1470
okini3939 1:e3b2027e685c 1471 // send length
okini3939 1:e3b2027e685c 1472 uint8_t msbLen = ((request.getFrameDataLength() + 2) >> 8) & 0xff;
okini3939 1:e3b2027e685c 1473 uint8_t lsbLen = (request.getFrameDataLength() + 2) & 0xff;
okini3939 1:e3b2027e685c 1474
okini3939 1:e3b2027e685c 1475 sendByte(msbLen, true);
okini3939 1:e3b2027e685c 1476 sendByte(lsbLen, true);
okini3939 1:e3b2027e685c 1477
okini3939 1:e3b2027e685c 1478 // api id
okini3939 1:e3b2027e685c 1479 sendByte(request.getApiId(), true);
okini3939 1:e3b2027e685c 1480 sendByte(request.getFrameId(), true);
okini3939 1:e3b2027e685c 1481
okini3939 1:e3b2027e685c 1482 uint8_t checksum = 0;
okini3939 1:e3b2027e685c 1483
okini3939 1:e3b2027e685c 1484 // compute checksum, start at api id
okini3939 1:e3b2027e685c 1485 checksum+= request.getApiId();
okini3939 1:e3b2027e685c 1486 checksum+= request.getFrameId();
okini3939 1:e3b2027e685c 1487
okini3939 1:e3b2027e685c 1488 //std::cout << "frame length is " << static_cast<unsigned int>(request.getFrameDataLength()) << std::endl;
okini3939 1:e3b2027e685c 1489
okini3939 1:e3b2027e685c 1490 for (int i = 0; i < request.getFrameDataLength(); i++) {
okini3939 1:e3b2027e685c 1491 // std::cout << "sending byte [" << static_cast<unsigned int>(i) << "] " << std::endl;
okini3939 1:e3b2027e685c 1492 sendByte(request.getFrameData(i), true);
okini3939 1:e3b2027e685c 1493 checksum+= request.getFrameData(i);
okini3939 1:e3b2027e685c 1494 }
okini3939 1:e3b2027e685c 1495
okini3939 1:e3b2027e685c 1496 // perform 2s complement
okini3939 1:e3b2027e685c 1497 checksum = 0xff - checksum;
okini3939 1:e3b2027e685c 1498
okini3939 1:e3b2027e685c 1499 // std::cout << "checksum is " << static_cast<unsigned int>(checksum) << std::endl;
okini3939 1:e3b2027e685c 1500
okini3939 1:e3b2027e685c 1501 // send checksum
okini3939 1:e3b2027e685c 1502 sendByte(checksum, true);
okini3939 1:e3b2027e685c 1503 /*
okini3939 1:e3b2027e685c 1504 // send packet
okini3939 1:e3b2027e685c 1505 Serial.flush();
okini3939 1:e3b2027e685c 1506 */
ban4jp 10:eb70be6ceb6d 1507 #ifdef USE_XBEE_SPI
ban4jp 9:e32c2e5390d3 1508 _ssel = 1;
ban4jp 9:e32c2e5390d3 1509 #endif
okini3939 3:8573b122fa84 1510 DBG("\r\n");
okini3939 1:e3b2027e685c 1511 }
okini3939 1:e3b2027e685c 1512
okini3939 1:e3b2027e685c 1513 void XBee::sendByte(uint8_t b, bool escape) {
okini3939 1:e3b2027e685c 1514
ban4jp 10:eb70be6ceb6d 1515 #ifndef USE_XBEE_SPI
okini3939 1:e3b2027e685c 1516 if (escape && (b == START_BYTE || b == ESCAPE || b == XON || b == XOFF)) {
okini3939 1:e3b2027e685c 1517 // std::cout << "escaping byte [" << toHexString(b) << "] " << std::endl;
okini3939 1:e3b2027e685c 1518 _xbee.putc(ESCAPE);
okini3939 1:e3b2027e685c 1519 _xbee.putc(b ^ 0x20);
okini3939 1:e3b2027e685c 1520 } else {
okini3939 1:e3b2027e685c 1521 _xbee.putc(b);
okini3939 1:e3b2027e685c 1522 }
ban4jp 9:e32c2e5390d3 1523 #else
ban4jp 9:e32c2e5390d3 1524 if (! _attn) {
ban4jp 9:e32c2e5390d3 1525 _rxbuf[_rxaddr_w] = _xbee.write(b);
ban4jp 9:e32c2e5390d3 1526 _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE;
ban4jp 9:e32c2e5390d3 1527 } else {
ban4jp 9:e32c2e5390d3 1528 _xbee.write(b);
ban4jp 9:e32c2e5390d3 1529 }
ban4jp 9:e32c2e5390d3 1530 #endif
okini3939 3:8573b122fa84 1531 DBG("%02x ", b);
okini3939 1:e3b2027e685c 1532 }
okini3939 1:e3b2027e685c 1533