00001
00020 #ifndef XBee_h
00021 #define XBee_h
00022
00023 #if defined(ARDUINO) && ARDUINO >= 100
00024 #include "Arduino.h"
00025 #else
00026 #include "WProgram.h"
00027 #endif
00028
00029 #include <inttypes.h>
00030
00031 #define SERIES_1
00032 #define SERIES_2
00033
00034
00035 #define ATAP 2
00036
00037 #define START_BYTE 0x7e
00038 #define ESCAPE 0x7d
00039 #define XON 0x11
00040 #define XOFF 0x13
00041
00042
00043
00044
00045
00046
00047
00048 #define MAX_FRAME_DATA_SIZE 110
00049
00050 #define BROADCAST_ADDRESS 0xffff
00051 #define ZB_BROADCAST_ADDRESS 0xfffe
00052
00053
00054 #define ZB_TX_API_LENGTH 12
00055 #define TX_16_API_LENGTH 3
00056 #define TX_64_API_LENGTH 9
00057 #define AT_COMMAND_API_LENGTH 2
00058 #define REMOTE_AT_COMMAND_API_LENGTH 13
00059
00060 #define PACKET_OVERHEAD_LENGTH 6
00061
00062 #define API_ID_INDEX 3
00063
00064
00065 #define RX_16_RSSI_OFFSET 2
00066 #define RX_64_RSSI_OFFSET 8
00067
00068 #define DEFAULT_FRAME_ID 1
00069 #define NO_RESPONSE_FRAME_ID 0
00070
00071
00072 #define ACK_OPTION 0
00073 #define DISABLE_ACK_OPTION 1
00074 #define BROADCAST_OPTION 4
00075
00076
00077 #define ZB_PACKET_ACKNOWLEDGED 0x01
00078 #define ZB_BROADCAST_PACKET 0x02
00079
00080
00084 #define TX_64_REQUEST 0x0
00085 #define TX_16_REQUEST 0x1
00086 #define AT_COMMAND_REQUEST 0x08
00087 #define AT_COMMAND_QUEUE_REQUEST 0x09
00088 #define REMOTE_AT_REQUEST 0x17
00089 #define ZB_TX_REQUEST 0x10
00090 #define ZB_EXPLICIT_TX_REQUEST 0x11
00091 #define RX_64_RESPONSE 0x80
00092 #define RX_16_RESPONSE 0x81
00093 #define RX_64_IO_RESPONSE 0x82
00094 #define RX_16_IO_RESPONSE 0x83
00095 #define AT_RESPONSE 0x88
00096 #define TX_STATUS_RESPONSE 0x89
00097 #define MODEM_STATUS_RESPONSE 0x8a
00098 #define ZB_RX_RESPONSE 0x90
00099 #define ZB_EXPLICIT_RX_RESPONSE 0x91
00100 #define ZB_TX_STATUS_RESPONSE 0x8b
00101 #define ZB_IO_SAMPLE_RESPONSE 0x92
00102 #define ZB_IO_NODE_IDENTIFIER_RESPONSE 0x95
00103 #define AT_COMMAND_RESPONSE 0x88
00104 #define REMOTE_AT_COMMAND_RESPONSE 0x97
00105
00106
00110 #define SUCCESS 0x0
00111 #define CCA_FAILURE 0x2
00112 #define INVALID_DESTINATION_ENDPOINT_SUCCESS 0x15
00113 #define NETWORK_ACK_FAILURE 0x21
00114 #define NOT_JOINED_TO_NETWORK 0x22
00115 #define SELF_ADDRESSED 0x23
00116 #define ADDRESS_NOT_FOUND 0x24
00117 #define ROUTE_NOT_FOUND 0x25
00118 #define PAYLOAD_TOO_LARGE 0x74
00119
00120
00121 #define HARDWARE_RESET 0
00122 #define WATCHDOG_TIMER_RESET 1
00123 #define ASSOCIATED 2
00124 #define DISASSOCIATED 3
00125 #define SYNCHRONIZATION_LOST 4
00126 #define COORDINATOR_REALIGNMENT 5
00127 #define COORDINATOR_STARTED 6
00128
00129 #define ZB_BROADCAST_RADIUS_MAX_HOPS 0
00130
00131 #define ZB_TX_UNICAST 0
00132 #define ZB_TX_BROADCAST 8
00133
00134 #define AT_OK 0
00135 #define AT_ERROR 1
00136 #define AT_INVALID_COMMAND 2
00137 #define AT_INVALID_PARAMETER 3
00138 #define AT_NO_RESPONSE 4
00139
00140 #define NO_ERROR 0
00141 #define CHECKSUM_FAILURE 1
00142 #define PACKET_EXCEEDS_BYTE_ARRAY_LENGTH 2
00143 #define UNEXPECTED_START_BYTE 3
00144
00151 class XBeeResponse {
00152 public:
00153
00157 XBeeResponse();
00161 uint8_t getApiId();
00162 void setApiId(uint8_t apiId);
00166 uint8_t getMsbLength();
00167 void setMsbLength(uint8_t msbLength);
00171 uint8_t getLsbLength();
00172 void setLsbLength(uint8_t lsbLength);
00176 uint8_t getChecksum();
00177 void setChecksum(uint8_t checksum);
00182 uint8_t getFrameDataLength();
00183 void setFrameData(uint8_t* frameDataPtr);
00192 uint8_t* getFrameData();
00193
00194 void setFrameLength(uint8_t frameLength);
00195
00199 uint16_t getPacketLength();
00203 void reset();
00207 void init();
00208 #ifdef SERIES_2
00209
00213 void getZBTxStatusResponse(XBeeResponse &response);
00218 void getZBRxResponse(XBeeResponse &response);
00223 void getZBRxIoSampleResponse(XBeeResponse &response);
00224 #endif
00225 #ifdef SERIES_1
00226
00229 void getTxStatusResponse(XBeeResponse &response);
00233 void getRx16Response(XBeeResponse &response);
00237 void getRx64Response(XBeeResponse &response);
00241 void getRx16IoSampleResponse(XBeeResponse &response);
00245 void getRx64IoSampleResponse(XBeeResponse &response);
00246 #endif
00247
00250 void getAtCommandResponse(XBeeResponse &responses);
00254 void getRemoteAtCommandResponse(XBeeResponse &response);
00258 void getModemStatusResponse(XBeeResponse &response);
00262 bool isAvailable();
00263 void setAvailable(bool complete);
00267 bool isError();
00272 uint8_t getErrorCode();
00273 void setErrorCode(uint8_t errorCode);
00274 protected:
00275
00276 uint8_t* _frameDataPtr;
00277 private:
00278 void setCommon(XBeeResponse &target);
00279 uint8_t _apiId;
00280 uint8_t _msbLength;
00281 uint8_t _lsbLength;
00282 uint8_t _checksum;
00283 uint8_t _frameLength;
00284 bool _complete;
00285 uint8_t _errorCode;
00286 };
00287
00288 class XBeeAddress {
00289 public:
00290 XBeeAddress();
00291 };
00292
00296 class XBeeAddress64 : public XBeeAddress {
00297 public:
00298 XBeeAddress64(uint32_t msb, uint32_t lsb);
00299 XBeeAddress64();
00300 uint32_t getMsb();
00301 uint32_t getLsb();
00302 void setMsb(uint32_t msb);
00303 void setLsb(uint32_t lsb);
00304 private:
00305 uint32_t _msb;
00306 uint32_t _lsb;
00307 };
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00322 class FrameIdResponse : public XBeeResponse {
00323 public:
00324 FrameIdResponse();
00325 uint8_t getFrameId();
00326 private:
00327 uint8_t _frameId;
00328 };
00329
00333 class RxDataResponse : public XBeeResponse {
00334 public:
00335 RxDataResponse();
00340 uint8_t getData(int index);
00344 uint8_t* getData();
00348 virtual uint8_t getDataLength() = 0;
00352 virtual uint8_t getDataOffset() = 0;
00353 };
00354
00355
00356
00357
00358
00359 #ifdef SERIES_2
00360
00363 class ZBTxStatusResponse : public FrameIdResponse {
00364 public:
00365 ZBTxStatusResponse();
00366 uint16_t getRemoteAddress();
00367 uint8_t getTxRetryCount();
00368 uint8_t getDeliveryStatus();
00369 uint8_t getDiscoveryStatus();
00370 bool isSuccess();
00371 };
00372
00376 class ZBRxResponse : public RxDataResponse {
00377 public:
00378 ZBRxResponse();
00379 XBeeAddress64& getRemoteAddress64();
00380 uint16_t getRemoteAddress16();
00381 uint8_t getOption();
00382 uint8_t getDataLength();
00383
00384 uint8_t getDataOffset();
00385 private:
00386 XBeeAddress64 _remoteAddress64;
00387 };
00388
00392 class ZBRxIoSampleResponse : public ZBRxResponse {
00393 public:
00394 ZBRxIoSampleResponse();
00395 bool containsAnalog();
00396 bool containsDigital();
00400 bool isAnalogEnabled(uint8_t pin);
00404 bool isDigitalEnabled(uint8_t pin);
00409 uint16_t getAnalog(uint8_t pin);
00414 bool isDigitalOn(uint8_t pin);
00415 uint8_t getDigitalMaskMsb();
00416 uint8_t getDigitalMaskLsb();
00417 uint8_t getAnalogMask();
00418 };
00419
00420 #endif
00421
00422 #ifdef SERIES_1
00423
00426 class TxStatusResponse : public FrameIdResponse {
00427 public:
00428 TxStatusResponse();
00429 uint8_t getStatus();
00430 bool isSuccess();
00431 };
00432
00436 class RxResponse : public RxDataResponse {
00437 public:
00438 RxResponse();
00439
00440 uint8_t getRssi();
00441 uint8_t getOption();
00442 bool isAddressBroadcast();
00443 bool isPanBroadcast();
00444 uint8_t getDataLength();
00445 uint8_t getDataOffset();
00446 virtual uint8_t getRssiOffset() = 0;
00447 };
00448
00452 class Rx16Response : public RxResponse {
00453 public:
00454 Rx16Response();
00455 uint8_t getRssiOffset();
00456 uint16_t getRemoteAddress16();
00457 protected:
00458 uint16_t _remoteAddress;
00459 };
00460
00464 class Rx64Response : public RxResponse {
00465 public:
00466 Rx64Response();
00467 uint8_t getRssiOffset();
00468 XBeeAddress64& getRemoteAddress64();
00469 private:
00470 XBeeAddress64 _remoteAddress;
00471 };
00472
00476 class RxIoSampleBaseResponse : public RxResponse {
00477 public:
00478 RxIoSampleBaseResponse();
00482 uint8_t getSampleSize();
00483 bool containsAnalog();
00484 bool containsDigital();
00488 bool isAnalogEnabled(uint8_t pin);
00492 bool isDigitalEnabled(uint8_t pin);
00497 uint16_t getAnalog(uint8_t pin, uint8_t sample);
00502 bool isDigitalOn(uint8_t pin, uint8_t sample);
00503 uint8_t getSampleOffset();
00504 private:
00505 };
00506
00507 class Rx16IoSampleResponse : public RxIoSampleBaseResponse {
00508 public:
00509 Rx16IoSampleResponse();
00510 uint16_t getRemoteAddress16();
00511 uint8_t getRssiOffset();
00512
00513 };
00514
00515 class Rx64IoSampleResponse : public RxIoSampleBaseResponse {
00516 public:
00517 Rx64IoSampleResponse();
00518 XBeeAddress64& getRemoteAddress64();
00519 uint8_t getRssiOffset();
00520 private:
00521 XBeeAddress64 _remoteAddress;
00522 };
00523
00524 #endif
00525
00529 class ModemStatusResponse : public XBeeResponse {
00530 public:
00531 ModemStatusResponse();
00532 uint8_t getStatus();
00533 };
00534
00538 class AtCommandResponse : public FrameIdResponse {
00539 public:
00540 AtCommandResponse();
00544 uint8_t* getCommand();
00549 uint8_t getStatus();
00554 uint8_t* getValue();
00558 uint8_t getValueLength();
00562 bool isOk();
00563 };
00564
00568 class RemoteAtCommandResponse : public AtCommandResponse {
00569 public:
00570 RemoteAtCommandResponse();
00574 uint8_t* getCommand();
00579 uint8_t getStatus();
00584 uint8_t* getValue();
00588 uint8_t getValueLength();
00592 uint16_t getRemoteAddress16();
00596 XBeeAddress64& getRemoteAddress64();
00600 bool isOk();
00601 private:
00602 XBeeAddress64 _remoteAddress64;
00603 };
00604
00605
00613 class XBeeRequest {
00614 public:
00619 XBeeRequest(uint8_t apiId, uint8_t frameId);
00623 void setFrameId(uint8_t frameId);
00627 uint8_t getFrameId();
00631 uint8_t getApiId();
00632
00639 virtual uint8_t getFrameData(uint8_t pos) = 0;
00643 virtual uint8_t getFrameDataLength() = 0;
00644
00645 protected:
00646 void setApiId(uint8_t apiId);
00647 private:
00648 uint8_t _apiId;
00649 uint8_t _frameId;
00650 };
00651
00652
00674 class XBee {
00675 public:
00676 XBee();
00689 void readPacket();
00694 bool readPacket(int timeout);
00700 void readPacketUntilAvailable();
00704 void begin(long baud);
00705 void getResponse(XBeeResponse &response);
00710 XBeeResponse& getResponse();
00714 void send(XBeeRequest &request);
00715
00719 uint8_t getNextFrameId();
00723 void setSerial(HardwareSerial &serial);
00724 private:
00725 bool available();
00726 uint8_t read();
00727 void flush();
00728 void write(uint8_t val);
00729 void sendByte(uint8_t b, bool escape);
00730 void resetResponse();
00731 XBeeResponse _response;
00732 bool _escape;
00733
00734 uint8_t _pos;
00735
00736 uint8_t b;
00737 uint8_t _checksumTotal;
00738 uint8_t _nextFrameId;
00739
00740 uint8_t _responseFrameData[MAX_FRAME_DATA_SIZE];
00741 HardwareSerial* _serial;
00742 };
00743
00747 class PayloadRequest : public XBeeRequest {
00748 public:
00749 PayloadRequest(uint8_t apiId, uint8_t frameId, uint8_t *payload, uint8_t payloadLength);
00753 uint8_t* getPayload();
00757 void setPayload(uint8_t* payloadPtr);
00761 uint8_t getPayloadLength();
00767 void setPayloadLength(uint8_t payloadLength);
00768 private:
00769 uint8_t* _payloadPtr;
00770 uint8_t _payloadLength;
00771 };
00772
00773 #ifdef SERIES_1
00774
00783 class Tx16Request : public PayloadRequest {
00784 public:
00785 Tx16Request(uint16_t addr16, uint8_t option, uint8_t *payload, uint8_t payloadLength, uint8_t frameId);
00789 Tx16Request(uint16_t addr16, uint8_t *payload, uint8_t payloadLength);
00794 Tx16Request();
00795 uint16_t getAddress16();
00796 void setAddress16(uint16_t addr16);
00797 uint8_t getOption();
00798 void setOption(uint8_t option);
00799 uint8_t getFrameData(uint8_t pos);
00800 uint8_t getFrameDataLength();
00801 protected:
00802 private:
00803 uint16_t _addr16;
00804 uint8_t _option;
00805 };
00806
00815 class Tx64Request : public PayloadRequest {
00816 public:
00817 Tx64Request(XBeeAddress64 &addr64, uint8_t option, uint8_t *payload, uint8_t payloadLength, uint8_t frameId);
00821 Tx64Request(XBeeAddress64 &addr64, uint8_t *payload, uint8_t payloadLength);
00826 Tx64Request();
00827 XBeeAddress64& getAddress64();
00828 void setAddress64(XBeeAddress64& addr64);
00829
00830 uint8_t getOption();
00831 void setOption(uint8_t option);
00832 uint8_t getFrameData(uint8_t pos);
00833 uint8_t getFrameDataLength();
00834 private:
00835 XBeeAddress64 _addr64;
00836 uint8_t _option;
00837 };
00838
00839 #endif
00840
00841
00842 #ifdef SERIES_2
00843
00856 class ZBTxRequest : public PayloadRequest {
00857 public:
00861 ZBTxRequest(XBeeAddress64 &addr64, uint8_t *payload, uint8_t payloadLength);
00862 ZBTxRequest(XBeeAddress64 &addr64, uint16_t addr16, uint8_t broadcastRadius, uint8_t option, uint8_t *payload, uint8_t payloadLength, uint8_t frameId);
00867 ZBTxRequest();
00868 XBeeAddress64& getAddress64();
00869 uint16_t getAddress16();
00870 uint8_t getBroadcastRadius();
00871 uint8_t getOption();
00872 void setAddress64(XBeeAddress64& addr64);
00873 void setAddress16(uint16_t addr16);
00874 void setBroadcastRadius(uint8_t broadcastRadius);
00875 void setOption(uint8_t option);
00876 protected:
00877
00878 uint8_t getFrameData(uint8_t pos);
00879 uint8_t getFrameDataLength();
00880 private:
00881 XBeeAddress64 _addr64;
00882 uint16_t _addr16;
00883 uint8_t _broadcastRadius;
00884 uint8_t _option;
00885 };
00886
00887 #endif
00888
00893 class AtCommandRequest : public XBeeRequest {
00894 public:
00895 AtCommandRequest();
00896 AtCommandRequest(uint8_t *command);
00897 AtCommandRequest(uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
00898 uint8_t getFrameData(uint8_t pos);
00899 uint8_t getFrameDataLength();
00900 uint8_t* getCommand();
00901 void setCommand(uint8_t* command);
00902 uint8_t* getCommandValue();
00903 void setCommandValue(uint8_t* command);
00904 uint8_t getCommandValueLength();
00905 void setCommandValueLength(uint8_t length);
00909 void clearCommandValue();
00910
00911 private:
00912 uint8_t *_command;
00913 uint8_t *_commandValue;
00914 uint8_t _commandValueLength;
00915 };
00916
00921 class RemoteAtCommandRequest : public AtCommandRequest {
00922 public:
00923 RemoteAtCommandRequest();
00928 RemoteAtCommandRequest(uint16_t remoteAddress16, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
00933 RemoteAtCommandRequest(uint16_t remoteAddress16, uint8_t *command);
00938 RemoteAtCommandRequest(XBeeAddress64 &remoteAddress64, uint8_t *command, uint8_t *commandValue, uint8_t commandValueLength);
00943 RemoteAtCommandRequest(XBeeAddress64 &remoteAddress64, uint8_t *command);
00944 uint16_t getRemoteAddress16();
00945 void setRemoteAddress16(uint16_t remoteAddress16);
00946 XBeeAddress64& getRemoteAddress64();
00947 void setRemoteAddress64(XBeeAddress64 &remoteAddress64);
00948 bool getApplyChanges();
00949 void setApplyChanges(bool applyChanges);
00950 uint8_t getFrameData(uint8_t pos);
00951 uint8_t getFrameDataLength();
00952 static XBeeAddress64 broadcastAddress64;
00953
00954 private:
00955 XBeeAddress64 _remoteAddress64;
00956 uint16_t _remoteAddress16;
00957 bool _applyChanges;
00958 };
00959
00960
00961
00962 #endif //XBee_h