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