XBee-mbed library Forked from http://mbed.org/users/okini3939/notebook/xbee-mbed/

Fork of XBee by Suga koubou

Committer:
okini3939
Date:
Fri Jul 29 16:22:15 2011 +0000
Revision:
2:6efb3541af61
Parent:
1:e3b2027e685c
Child:
3:8573b122fa84

        

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