XBee and XBee-PRO ZigBee RF modules provide cost-effective wireless connectivity to electronic devices. They are interoperable with other ZigBee PRO feature set devices, including devices from other vendors.
Core/CoreAPI.cpp@0:837e6c48e90d, 2015-10-22 (annotated)
- Committer:
- yangcq88517
- Date:
- Thu Oct 22 12:28:26 2015 +0000
- Revision:
- 0:837e6c48e90d
- Child:
- 1:3dc0ec2f9fd6
initial upload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yangcq88517 | 0:837e6c48e90d | 1 | #include "CoreAPI.h" |
yangcq88517 | 0:837e6c48e90d | 2 | |
yangcq88517 | 0:837e6c48e90d | 3 | CoreAPI::CoreAPI(ISerial * serial, bool escape) |
yangcq88517 | 0:837e6c48e90d | 4 | :xBeeRx64Indicator(NULL),xBeeRx16Indicator(NULL),xBeeRx64IOSampleIndicator(NULL),xBeeRx16IOSampleIndicator(NULL),xBeeTxStatusIndicator(NULL), |
yangcq88517 | 0:837e6c48e90d | 5 | aTCommandIndicator(NULL),modemStatusIndicator(NULL),zigBeeTxStatusIndicator(NULL),zigBeeRxIndicator(NULL), |
yangcq88517 | 0:837e6c48e90d | 6 | zigBeeExplicitRxIndicator(NULL),zigBeeIOSampleIndicator(NULL),sensorReadIndicator(NULL),nodeIdentificationIndicator(NULL), |
yangcq88517 | 0:837e6c48e90d | 7 | remoteCommandIndicator(NULL),routeRecordIndicator(NULL),manyToOneRouteIndicator(NULL) |
yangcq88517 | 0:837e6c48e90d | 8 | { |
yangcq88517 | 0:837e6c48e90d | 9 | this->serial = serial; |
yangcq88517 | 0:837e6c48e90d | 10 | isEscapeMode = escape; |
yangcq88517 | 0:837e6c48e90d | 11 | msg = new APIFrame(INITIAL_FRAME_LENGTH); |
yangcq88517 | 0:837e6c48e90d | 12 | isRunning = false; |
yangcq88517 | 0:837e6c48e90d | 13 | isChecksum = false; |
yangcq88517 | 0:837e6c48e90d | 14 | } |
yangcq88517 | 0:837e6c48e90d | 15 | |
yangcq88517 | 0:837e6c48e90d | 16 | CoreAPI::~CoreAPI() |
yangcq88517 | 0:837e6c48e90d | 17 | { |
yangcq88517 | 0:837e6c48e90d | 18 | delete msg; |
yangcq88517 | 0:837e6c48e90d | 19 | } |
yangcq88517 | 0:837e6c48e90d | 20 | |
yangcq88517 | 0:837e6c48e90d | 21 | |
yangcq88517 | 0:837e6c48e90d | 22 | void CoreAPI::setVerifyChecksum(bool isCheck) |
yangcq88517 | 0:837e6c48e90d | 23 | { |
yangcq88517 | 0:837e6c48e90d | 24 | isChecksum = isCheck; |
yangcq88517 | 0:837e6c48e90d | 25 | } |
yangcq88517 | 0:837e6c48e90d | 26 | |
yangcq88517 | 0:837e6c48e90d | 27 | void CoreAPI::start() |
yangcq88517 | 0:837e6c48e90d | 28 | { |
yangcq88517 | 0:837e6c48e90d | 29 | if (!isRunning) { |
yangcq88517 | 0:837e6c48e90d | 30 | isRunning = true; |
yangcq88517 | 0:837e6c48e90d | 31 | |
yangcq88517 | 0:837e6c48e90d | 32 | if (!serial->isOpen()) |
yangcq88517 | 0:837e6c48e90d | 33 | serial->open(); |
yangcq88517 | 0:837e6c48e90d | 34 | } |
yangcq88517 | 0:837e6c48e90d | 35 | } |
yangcq88517 | 0:837e6c48e90d | 36 | |
yangcq88517 | 0:837e6c48e90d | 37 | void CoreAPI::stop() |
yangcq88517 | 0:837e6c48e90d | 38 | { |
yangcq88517 | 0:837e6c48e90d | 39 | if (isRunning) { |
yangcq88517 | 0:837e6c48e90d | 40 | isRunning = false; |
yangcq88517 | 0:837e6c48e90d | 41 | serial->close(); |
yangcq88517 | 0:837e6c48e90d | 42 | } |
yangcq88517 | 0:837e6c48e90d | 43 | } |
yangcq88517 | 0:837e6c48e90d | 44 | |
yangcq88517 | 0:837e6c48e90d | 45 | void CoreAPI::send(APIFrame * request) |
yangcq88517 | 0:837e6c48e90d | 46 | { |
yangcq88517 | 0:837e6c48e90d | 47 | if (!isRunning) |
yangcq88517 | 0:837e6c48e90d | 48 | return; |
yangcq88517 | 0:837e6c48e90d | 49 | |
yangcq88517 | 0:837e6c48e90d | 50 | request->calculateChecksum(); |
yangcq88517 | 0:837e6c48e90d | 51 | int size = request->getPosition(); |
yangcq88517 | 0:837e6c48e90d | 52 | |
yangcq88517 | 0:837e6c48e90d | 53 | serial->writeByte(KEY); |
yangcq88517 | 0:837e6c48e90d | 54 | |
yangcq88517 | 0:837e6c48e90d | 55 | writeByte(size >> 8); |
yangcq88517 | 0:837e6c48e90d | 56 | writeByte(size); |
yangcq88517 | 0:837e6c48e90d | 57 | |
yangcq88517 | 0:837e6c48e90d | 58 | for (int i = 0; i < size; i++) |
yangcq88517 | 0:837e6c48e90d | 59 | writeByte(request->get(i)); |
yangcq88517 | 0:837e6c48e90d | 60 | |
yangcq88517 | 0:837e6c48e90d | 61 | writeByte(request->getCheckSum()); |
yangcq88517 | 0:837e6c48e90d | 62 | } |
yangcq88517 | 0:837e6c48e90d | 63 | |
yangcq88517 | 0:837e6c48e90d | 64 | int CoreAPI::readByte() |
yangcq88517 | 0:837e6c48e90d | 65 | { |
yangcq88517 | 0:837e6c48e90d | 66 | int value = serial->readByte(); |
yangcq88517 | 0:837e6c48e90d | 67 | |
yangcq88517 | 0:837e6c48e90d | 68 | if (isEscapeMode) |
yangcq88517 | 0:837e6c48e90d | 69 | return serial->readByte() ^ 0x20; |
yangcq88517 | 0:837e6c48e90d | 70 | |
yangcq88517 | 0:837e6c48e90d | 71 | return value; |
yangcq88517 | 0:837e6c48e90d | 72 | } |
yangcq88517 | 0:837e6c48e90d | 73 | |
yangcq88517 | 0:837e6c48e90d | 74 | void CoreAPI::writeByte(char data) |
yangcq88517 | 0:837e6c48e90d | 75 | { |
yangcq88517 | 0:837e6c48e90d | 76 | if (isEscapeMode) { |
yangcq88517 | 0:837e6c48e90d | 77 | if (data == KEY || data == ESCAPED || data == XON || data == XOFF) { |
yangcq88517 | 0:837e6c48e90d | 78 | serial->writeByte(ESCAPED); |
yangcq88517 | 0:837e6c48e90d | 79 | serial->writeByte(data ^ 0x20); |
yangcq88517 | 0:837e6c48e90d | 80 | return; |
yangcq88517 | 0:837e6c48e90d | 81 | } |
yangcq88517 | 0:837e6c48e90d | 82 | } |
yangcq88517 | 0:837e6c48e90d | 83 | |
yangcq88517 | 0:837e6c48e90d | 84 | serial->writeByte(data); |
yangcq88517 | 0:837e6c48e90d | 85 | } |
yangcq88517 | 0:837e6c48e90d | 86 | |
yangcq88517 | 0:837e6c48e90d | 87 | APIFrame * CoreAPI::getResponse() |
yangcq88517 | 0:837e6c48e90d | 88 | { |
yangcq88517 | 0:837e6c48e90d | 89 | if (readByte() != KEY) |
yangcq88517 | 0:837e6c48e90d | 90 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 91 | |
yangcq88517 | 0:837e6c48e90d | 92 | int length = getLength(); |
yangcq88517 | 0:837e6c48e90d | 93 | |
yangcq88517 | 0:837e6c48e90d | 94 | msg->allocate(length); |
yangcq88517 | 0:837e6c48e90d | 95 | |
yangcq88517 | 0:837e6c48e90d | 96 | readPayLoad(length); |
yangcq88517 | 0:837e6c48e90d | 97 | |
yangcq88517 | 0:837e6c48e90d | 98 | if (isChecksum) { |
yangcq88517 | 0:837e6c48e90d | 99 | if (msg->verifyChecksum()) |
yangcq88517 | 0:837e6c48e90d | 100 | return msg; |
yangcq88517 | 0:837e6c48e90d | 101 | else |
yangcq88517 | 0:837e6c48e90d | 102 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 103 | } else return msg; |
yangcq88517 | 0:837e6c48e90d | 104 | } |
yangcq88517 | 0:837e6c48e90d | 105 | |
yangcq88517 | 0:837e6c48e90d | 106 | int CoreAPI::getLength() |
yangcq88517 | 0:837e6c48e90d | 107 | { |
yangcq88517 | 0:837e6c48e90d | 108 | int msb = readByte(); |
yangcq88517 | 0:837e6c48e90d | 109 | |
yangcq88517 | 0:837e6c48e90d | 110 | int lsb = readByte(); |
yangcq88517 | 0:837e6c48e90d | 111 | |
yangcq88517 | 0:837e6c48e90d | 112 | return (msb << 8) | lsb; |
yangcq88517 | 0:837e6c48e90d | 113 | } |
yangcq88517 | 0:837e6c48e90d | 114 | |
yangcq88517 | 0:837e6c48e90d | 115 | void CoreAPI::readPayLoad(int length) |
yangcq88517 | 0:837e6c48e90d | 116 | { |
yangcq88517 | 0:837e6c48e90d | 117 | for (int i = 0; i < length; i++) |
yangcq88517 | 0:837e6c48e90d | 118 | msg->set(readByte()); |
yangcq88517 | 0:837e6c48e90d | 119 | |
yangcq88517 | 0:837e6c48e90d | 120 | msg->setCheckSum(readByte()); |
yangcq88517 | 0:837e6c48e90d | 121 | } |
yangcq88517 | 0:837e6c48e90d | 122 | |
yangcq88517 | 0:837e6c48e90d | 123 | XBeeRx64Indicator * CoreAPI::getXBeeRx64() |
yangcq88517 | 0:837e6c48e90d | 124 | { |
yangcq88517 | 0:837e6c48e90d | 125 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 126 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 127 | |
yangcq88517 | 0:837e6c48e90d | 128 | if (xBeeRx64Indicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 129 | return &xBeeRx64Indicator; |
yangcq88517 | 0:837e6c48e90d | 130 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 131 | } |
yangcq88517 | 0:837e6c48e90d | 132 | |
yangcq88517 | 0:837e6c48e90d | 133 | XBeeRx16Indicator * CoreAPI::getXBeeRx16() |
yangcq88517 | 0:837e6c48e90d | 134 | { |
yangcq88517 | 0:837e6c48e90d | 135 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 136 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 137 | |
yangcq88517 | 0:837e6c48e90d | 138 | if (xBeeRx16Indicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 139 | return &xBeeRx16Indicator; |
yangcq88517 | 0:837e6c48e90d | 140 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 141 | } |
yangcq88517 | 0:837e6c48e90d | 142 | |
yangcq88517 | 0:837e6c48e90d | 143 | XBeeRx64IOSampleIndicator * CoreAPI::getXBeeRx64IOSample() |
yangcq88517 | 0:837e6c48e90d | 144 | { |
yangcq88517 | 0:837e6c48e90d | 145 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 146 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 147 | |
yangcq88517 | 0:837e6c48e90d | 148 | if (xBeeRx64IOSampleIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 149 | return &xBeeRx64IOSampleIndicator; |
yangcq88517 | 0:837e6c48e90d | 150 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 151 | } |
yangcq88517 | 0:837e6c48e90d | 152 | |
yangcq88517 | 0:837e6c48e90d | 153 | XBeeRx16IOSampleIndicator * CoreAPI::getXBeeRx16IOSample() |
yangcq88517 | 0:837e6c48e90d | 154 | { |
yangcq88517 | 0:837e6c48e90d | 155 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 156 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 157 | |
yangcq88517 | 0:837e6c48e90d | 158 | if (xBeeRx16IOSampleIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 159 | return &xBeeRx16IOSampleIndicator; |
yangcq88517 | 0:837e6c48e90d | 160 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 161 | } |
yangcq88517 | 0:837e6c48e90d | 162 | |
yangcq88517 | 0:837e6c48e90d | 163 | XBeeTxStatusIndicator * CoreAPI::getXBeeTxStatus() |
yangcq88517 | 0:837e6c48e90d | 164 | { |
yangcq88517 | 0:837e6c48e90d | 165 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 166 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 167 | |
yangcq88517 | 0:837e6c48e90d | 168 | if (xBeeTxStatusIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 169 | return &xBeeTxStatusIndicator; |
yangcq88517 | 0:837e6c48e90d | 170 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 171 | } |
yangcq88517 | 0:837e6c48e90d | 172 | |
yangcq88517 | 0:837e6c48e90d | 173 | ATCommandIndicator * CoreAPI::getATCommand() |
yangcq88517 | 0:837e6c48e90d | 174 | { |
yangcq88517 | 0:837e6c48e90d | 175 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 176 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 177 | |
yangcq88517 | 0:837e6c48e90d | 178 | if (aTCommandIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 179 | return &aTCommandIndicator; |
yangcq88517 | 0:837e6c48e90d | 180 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 181 | } |
yangcq88517 | 0:837e6c48e90d | 182 | |
yangcq88517 | 0:837e6c48e90d | 183 | ModemStatusIndicator * CoreAPI::getModemStatus() |
yangcq88517 | 0:837e6c48e90d | 184 | { |
yangcq88517 | 0:837e6c48e90d | 185 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 186 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 187 | |
yangcq88517 | 0:837e6c48e90d | 188 | if (modemStatusIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 189 | return &modemStatusIndicator; |
yangcq88517 | 0:837e6c48e90d | 190 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 191 | } |
yangcq88517 | 0:837e6c48e90d | 192 | |
yangcq88517 | 0:837e6c48e90d | 193 | ZigBeeTxStatusIndicator * CoreAPI::getZigBeeTxStatus() |
yangcq88517 | 0:837e6c48e90d | 194 | { |
yangcq88517 | 0:837e6c48e90d | 195 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 196 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 197 | |
yangcq88517 | 0:837e6c48e90d | 198 | if (zigBeeTxStatusIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 199 | return &zigBeeTxStatusIndicator; |
yangcq88517 | 0:837e6c48e90d | 200 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 201 | } |
yangcq88517 | 0:837e6c48e90d | 202 | |
yangcq88517 | 0:837e6c48e90d | 203 | ZigBeeRxIndicator * CoreAPI::getZigBeeRx() |
yangcq88517 | 0:837e6c48e90d | 204 | { |
yangcq88517 | 0:837e6c48e90d | 205 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 206 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 207 | |
yangcq88517 | 0:837e6c48e90d | 208 | if (zigBeeRxIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 209 | return &zigBeeRxIndicator; |
yangcq88517 | 0:837e6c48e90d | 210 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 211 | } |
yangcq88517 | 0:837e6c48e90d | 212 | |
yangcq88517 | 0:837e6c48e90d | 213 | ZigBeeExplicitRxIndicator * CoreAPI::getZigBeeExplicitRx() |
yangcq88517 | 0:837e6c48e90d | 214 | { |
yangcq88517 | 0:837e6c48e90d | 215 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 216 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 217 | |
yangcq88517 | 0:837e6c48e90d | 218 | if (zigBeeExplicitRxIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 219 | return &zigBeeExplicitRxIndicator; |
yangcq88517 | 0:837e6c48e90d | 220 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 221 | } |
yangcq88517 | 0:837e6c48e90d | 222 | |
yangcq88517 | 0:837e6c48e90d | 223 | ZigBeeIOSampleIndicator * CoreAPI::getZigBeeIOSample() |
yangcq88517 | 0:837e6c48e90d | 224 | { |
yangcq88517 | 0:837e6c48e90d | 225 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 226 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 227 | |
yangcq88517 | 0:837e6c48e90d | 228 | if (zigBeeIOSampleIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 229 | return &zigBeeIOSampleIndicator; |
yangcq88517 | 0:837e6c48e90d | 230 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 231 | } |
yangcq88517 | 0:837e6c48e90d | 232 | |
yangcq88517 | 0:837e6c48e90d | 233 | SensorReadIndicator * CoreAPI::getSensorRead() |
yangcq88517 | 0:837e6c48e90d | 234 | { |
yangcq88517 | 0:837e6c48e90d | 235 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 236 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 237 | |
yangcq88517 | 0:837e6c48e90d | 238 | if (sensorReadIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 239 | return &sensorReadIndicator; |
yangcq88517 | 0:837e6c48e90d | 240 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 241 | } |
yangcq88517 | 0:837e6c48e90d | 242 | |
yangcq88517 | 0:837e6c48e90d | 243 | NodeIdentificationIndicator * CoreAPI::getNodeIdentification() |
yangcq88517 | 0:837e6c48e90d | 244 | { |
yangcq88517 | 0:837e6c48e90d | 245 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 246 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 247 | |
yangcq88517 | 0:837e6c48e90d | 248 | if (nodeIdentificationIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 249 | return &nodeIdentificationIndicator; |
yangcq88517 | 0:837e6c48e90d | 250 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 251 | } |
yangcq88517 | 0:837e6c48e90d | 252 | |
yangcq88517 | 0:837e6c48e90d | 253 | RemoteCommandIndicator * CoreAPI::getRemoteCommand() |
yangcq88517 | 0:837e6c48e90d | 254 | { |
yangcq88517 | 0:837e6c48e90d | 255 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 256 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 257 | |
yangcq88517 | 0:837e6c48e90d | 258 | if (remoteCommandIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 259 | return &remoteCommandIndicator; |
yangcq88517 | 0:837e6c48e90d | 260 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 261 | } |
yangcq88517 | 0:837e6c48e90d | 262 | |
yangcq88517 | 0:837e6c48e90d | 263 | RouteRecordIndicator * CoreAPI::getRouteRecord() |
yangcq88517 | 0:837e6c48e90d | 264 | { |
yangcq88517 | 0:837e6c48e90d | 265 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 266 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 267 | |
yangcq88517 | 0:837e6c48e90d | 268 | if (routeRecordIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 269 | return &routeRecordIndicator; |
yangcq88517 | 0:837e6c48e90d | 270 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 271 | } |
yangcq88517 | 0:837e6c48e90d | 272 | |
yangcq88517 | 0:837e6c48e90d | 273 | ManyToOneRouteIndicator * CoreAPI::getManyToOneRoute() |
yangcq88517 | 0:837e6c48e90d | 274 | { |
yangcq88517 | 0:837e6c48e90d | 275 | if (getResponse() == NULL) |
yangcq88517 | 0:837e6c48e90d | 276 | return NULL; |
yangcq88517 | 0:837e6c48e90d | 277 | |
yangcq88517 | 0:837e6c48e90d | 278 | if (manyToOneRouteIndicator.convert(msg)) |
yangcq88517 | 0:837e6c48e90d | 279 | return &manyToOneRouteIndicator; |
yangcq88517 | 0:837e6c48e90d | 280 | else return NULL; |
yangcq88517 | 0:837e6c48e90d | 281 | } |