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.

Dependencies:   BufferedArray

Dependents:   MBEDminiproject

Committer:
yangcq88517
Date:
Sat Nov 14 16:42:36 2015 +0000
Revision:
6:5f31ddc17239
Parent:
4:a0f1fba6c2fb
change to unsigned char array

Who changed what in which revision?

UserRevisionLine numberNew 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 1:3dc0ec2f9fd6 12 isChecksum = false;
yangcq88517 0:837e6c48e90d 13 isRunning = false;
yangcq88517 0:837e6c48e90d 14 }
yangcq88517 0:837e6c48e90d 15
yangcq88517 0:837e6c48e90d 16 CoreAPI::~CoreAPI()
yangcq88517 0:837e6c48e90d 17 {
yangcq88517 1:3dc0ec2f9fd6 18 if (msg != NULL)
yangcq88517 1:3dc0ec2f9fd6 19 delete msg;
yangcq88517 0:837e6c48e90d 20
yangcq88517 1:3dc0ec2f9fd6 21 if (serial != NULL)
yangcq88517 1:3dc0ec2f9fd6 22 delete serial;
yangcq88517 0:837e6c48e90d 23 }
yangcq88517 0:837e6c48e90d 24
yangcq88517 0:837e6c48e90d 25 void CoreAPI::start()
yangcq88517 0:837e6c48e90d 26 {
yangcq88517 0:837e6c48e90d 27 if (!isRunning) {
yangcq88517 0:837e6c48e90d 28 isRunning = true;
yangcq88517 0:837e6c48e90d 29
yangcq88517 0:837e6c48e90d 30 if (!serial->isOpen())
yangcq88517 0:837e6c48e90d 31 serial->open();
yangcq88517 0:837e6c48e90d 32 }
yangcq88517 0:837e6c48e90d 33 }
yangcq88517 0:837e6c48e90d 34
yangcq88517 0:837e6c48e90d 35 void CoreAPI::stop()
yangcq88517 0:837e6c48e90d 36 {
yangcq88517 0:837e6c48e90d 37 if (isRunning) {
yangcq88517 0:837e6c48e90d 38 isRunning = false;
yangcq88517 0:837e6c48e90d 39 serial->close();
yangcq88517 0:837e6c48e90d 40 }
yangcq88517 0:837e6c48e90d 41 }
yangcq88517 0:837e6c48e90d 42
yangcq88517 1:3dc0ec2f9fd6 43 void CoreAPI::setVerifyChecksum(bool isCheck)
yangcq88517 1:3dc0ec2f9fd6 44 {
yangcq88517 1:3dc0ec2f9fd6 45 isChecksum = isCheck;
yangcq88517 1:3dc0ec2f9fd6 46 }
yangcq88517 1:3dc0ec2f9fd6 47
yangcq88517 0:837e6c48e90d 48 void CoreAPI::send(APIFrame * request)
yangcq88517 0:837e6c48e90d 49 {
yangcq88517 0:837e6c48e90d 50 if (!isRunning)
yangcq88517 0:837e6c48e90d 51 return;
yangcq88517 0:837e6c48e90d 52
yangcq88517 0:837e6c48e90d 53 request->calculateChecksum();
yangcq88517 0:837e6c48e90d 54 int size = request->getPosition();
yangcq88517 0:837e6c48e90d 55
yangcq88517 0:837e6c48e90d 56 serial->writeByte(KEY);
yangcq88517 0:837e6c48e90d 57
yangcq88517 0:837e6c48e90d 58 writeByte(size >> 8);
yangcq88517 0:837e6c48e90d 59 writeByte(size);
yangcq88517 0:837e6c48e90d 60
yangcq88517 0:837e6c48e90d 61 for (int i = 0; i < size; i++)
yangcq88517 0:837e6c48e90d 62 writeByte(request->get(i));
yangcq88517 0:837e6c48e90d 63
yangcq88517 0:837e6c48e90d 64 writeByte(request->getCheckSum());
yangcq88517 0:837e6c48e90d 65 }
yangcq88517 0:837e6c48e90d 66
yangcq88517 0:837e6c48e90d 67 int CoreAPI::readByte()
yangcq88517 0:837e6c48e90d 68 {
yangcq88517 0:837e6c48e90d 69 int value = serial->readByte();
yangcq88517 0:837e6c48e90d 70
yangcq88517 1:3dc0ec2f9fd6 71 if (isEscapeMode && value == ESCAPED)
yangcq88517 0:837e6c48e90d 72 return serial->readByte() ^ 0x20;
yangcq88517 0:837e6c48e90d 73
yangcq88517 0:837e6c48e90d 74 return value;
yangcq88517 0:837e6c48e90d 75 }
yangcq88517 0:837e6c48e90d 76
yangcq88517 6:5f31ddc17239 77 void CoreAPI::writeByte(unsigned char data)
yangcq88517 0:837e6c48e90d 78 {
yangcq88517 0:837e6c48e90d 79 if (isEscapeMode) {
yangcq88517 0:837e6c48e90d 80 if (data == KEY || data == ESCAPED || data == XON || data == XOFF) {
yangcq88517 0:837e6c48e90d 81 serial->writeByte(ESCAPED);
yangcq88517 0:837e6c48e90d 82 serial->writeByte(data ^ 0x20);
yangcq88517 0:837e6c48e90d 83 return;
yangcq88517 0:837e6c48e90d 84 }
yangcq88517 0:837e6c48e90d 85 }
yangcq88517 0:837e6c48e90d 86
yangcq88517 0:837e6c48e90d 87 serial->writeByte(data);
yangcq88517 0:837e6c48e90d 88 }
yangcq88517 0:837e6c48e90d 89
yangcq88517 0:837e6c48e90d 90 APIFrame * CoreAPI::getResponse()
yangcq88517 0:837e6c48e90d 91 {
yangcq88517 1:3dc0ec2f9fd6 92 if (!isRunning)
yangcq88517 0:837e6c48e90d 93 return NULL;
yangcq88517 0:837e6c48e90d 94
yangcq88517 1:3dc0ec2f9fd6 95 if (!serial->peek())
yangcq88517 1:3dc0ec2f9fd6 96 return NULL;
yangcq88517 1:3dc0ec2f9fd6 97
yangcq88517 1:3dc0ec2f9fd6 98 while (serial->readByte() != KEY);
yangcq88517 1:3dc0ec2f9fd6 99
yangcq88517 0:837e6c48e90d 100 int length = getLength();
yangcq88517 0:837e6c48e90d 101
yangcq88517 0:837e6c48e90d 102 msg->allocate(length);
yangcq88517 0:837e6c48e90d 103
yangcq88517 0:837e6c48e90d 104 readPayLoad(length);
yangcq88517 0:837e6c48e90d 105
yangcq88517 0:837e6c48e90d 106 if (isChecksum) {
yangcq88517 0:837e6c48e90d 107 if (msg->verifyChecksum())
yangcq88517 0:837e6c48e90d 108 return msg;
yangcq88517 0:837e6c48e90d 109 else
yangcq88517 0:837e6c48e90d 110 return NULL;
yangcq88517 0:837e6c48e90d 111 } else return msg;
yangcq88517 0:837e6c48e90d 112 }
yangcq88517 0:837e6c48e90d 113
yangcq88517 0:837e6c48e90d 114 int CoreAPI::getLength()
yangcq88517 0:837e6c48e90d 115 {
yangcq88517 0:837e6c48e90d 116 int msb = readByte();
yangcq88517 0:837e6c48e90d 117
yangcq88517 0:837e6c48e90d 118 int lsb = readByte();
yangcq88517 0:837e6c48e90d 119
yangcq88517 0:837e6c48e90d 120 return (msb << 8) | lsb;
yangcq88517 0:837e6c48e90d 121 }
yangcq88517 0:837e6c48e90d 122
yangcq88517 0:837e6c48e90d 123 void CoreAPI::readPayLoad(int length)
yangcq88517 0:837e6c48e90d 124 {
yangcq88517 0:837e6c48e90d 125 for (int i = 0; i < length; i++)
yangcq88517 0:837e6c48e90d 126 msg->set(readByte());
yangcq88517 0:837e6c48e90d 127
yangcq88517 0:837e6c48e90d 128 msg->setCheckSum(readByte());
yangcq88517 0:837e6c48e90d 129 }
yangcq88517 0:837e6c48e90d 130
yangcq88517 0:837e6c48e90d 131 XBeeRx64Indicator * CoreAPI::getXBeeRx64()
yangcq88517 0:837e6c48e90d 132 {
yangcq88517 0:837e6c48e90d 133 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 134 return NULL;
yangcq88517 0:837e6c48e90d 135
yangcq88517 0:837e6c48e90d 136 if (xBeeRx64Indicator.convert(msg))
yangcq88517 0:837e6c48e90d 137 return &xBeeRx64Indicator;
yangcq88517 0:837e6c48e90d 138 else return NULL;
yangcq88517 0:837e6c48e90d 139 }
yangcq88517 0:837e6c48e90d 140
yangcq88517 0:837e6c48e90d 141 XBeeRx16Indicator * CoreAPI::getXBeeRx16()
yangcq88517 0:837e6c48e90d 142 {
yangcq88517 0:837e6c48e90d 143 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 144 return NULL;
yangcq88517 0:837e6c48e90d 145
yangcq88517 0:837e6c48e90d 146 if (xBeeRx16Indicator.convert(msg))
yangcq88517 0:837e6c48e90d 147 return &xBeeRx16Indicator;
yangcq88517 0:837e6c48e90d 148 else return NULL;
yangcq88517 0:837e6c48e90d 149 }
yangcq88517 0:837e6c48e90d 150
yangcq88517 0:837e6c48e90d 151 XBeeRx64IOSampleIndicator * CoreAPI::getXBeeRx64IOSample()
yangcq88517 0:837e6c48e90d 152 {
yangcq88517 0:837e6c48e90d 153 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 154 return NULL;
yangcq88517 0:837e6c48e90d 155
yangcq88517 0:837e6c48e90d 156 if (xBeeRx64IOSampleIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 157 return &xBeeRx64IOSampleIndicator;
yangcq88517 0:837e6c48e90d 158 else return NULL;
yangcq88517 0:837e6c48e90d 159 }
yangcq88517 0:837e6c48e90d 160
yangcq88517 0:837e6c48e90d 161 XBeeRx16IOSampleIndicator * CoreAPI::getXBeeRx16IOSample()
yangcq88517 0:837e6c48e90d 162 {
yangcq88517 0:837e6c48e90d 163 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 164 return NULL;
yangcq88517 0:837e6c48e90d 165
yangcq88517 0:837e6c48e90d 166 if (xBeeRx16IOSampleIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 167 return &xBeeRx16IOSampleIndicator;
yangcq88517 0:837e6c48e90d 168 else return NULL;
yangcq88517 0:837e6c48e90d 169 }
yangcq88517 0:837e6c48e90d 170
yangcq88517 0:837e6c48e90d 171 XBeeTxStatusIndicator * CoreAPI::getXBeeTxStatus()
yangcq88517 0:837e6c48e90d 172 {
yangcq88517 0:837e6c48e90d 173 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 174 return NULL;
yangcq88517 0:837e6c48e90d 175
yangcq88517 0:837e6c48e90d 176 if (xBeeTxStatusIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 177 return &xBeeTxStatusIndicator;
yangcq88517 0:837e6c48e90d 178 else return NULL;
yangcq88517 0:837e6c48e90d 179 }
yangcq88517 0:837e6c48e90d 180
yangcq88517 0:837e6c48e90d 181 ATCommandIndicator * CoreAPI::getATCommand()
yangcq88517 0:837e6c48e90d 182 {
yangcq88517 0:837e6c48e90d 183 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 184 return NULL;
yangcq88517 0:837e6c48e90d 185
yangcq88517 0:837e6c48e90d 186 if (aTCommandIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 187 return &aTCommandIndicator;
yangcq88517 0:837e6c48e90d 188 else return NULL;
yangcq88517 0:837e6c48e90d 189 }
yangcq88517 0:837e6c48e90d 190
yangcq88517 0:837e6c48e90d 191 ModemStatusIndicator * CoreAPI::getModemStatus()
yangcq88517 0:837e6c48e90d 192 {
yangcq88517 0:837e6c48e90d 193 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 194 return NULL;
yangcq88517 0:837e6c48e90d 195
yangcq88517 0:837e6c48e90d 196 if (modemStatusIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 197 return &modemStatusIndicator;
yangcq88517 0:837e6c48e90d 198 else return NULL;
yangcq88517 0:837e6c48e90d 199 }
yangcq88517 0:837e6c48e90d 200
yangcq88517 0:837e6c48e90d 201 ZigBeeTxStatusIndicator * CoreAPI::getZigBeeTxStatus()
yangcq88517 0:837e6c48e90d 202 {
yangcq88517 0:837e6c48e90d 203 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 204 return NULL;
yangcq88517 0:837e6c48e90d 205
yangcq88517 0:837e6c48e90d 206 if (zigBeeTxStatusIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 207 return &zigBeeTxStatusIndicator;
yangcq88517 0:837e6c48e90d 208 else return NULL;
yangcq88517 0:837e6c48e90d 209 }
yangcq88517 0:837e6c48e90d 210
yangcq88517 0:837e6c48e90d 211 ZigBeeRxIndicator * CoreAPI::getZigBeeRx()
yangcq88517 0:837e6c48e90d 212 {
yangcq88517 0:837e6c48e90d 213 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 214 return NULL;
yangcq88517 0:837e6c48e90d 215
yangcq88517 0:837e6c48e90d 216 if (zigBeeRxIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 217 return &zigBeeRxIndicator;
yangcq88517 0:837e6c48e90d 218 else return NULL;
yangcq88517 0:837e6c48e90d 219 }
yangcq88517 0:837e6c48e90d 220
yangcq88517 0:837e6c48e90d 221 ZigBeeExplicitRxIndicator * CoreAPI::getZigBeeExplicitRx()
yangcq88517 0:837e6c48e90d 222 {
yangcq88517 0:837e6c48e90d 223 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 224 return NULL;
yangcq88517 0:837e6c48e90d 225
yangcq88517 0:837e6c48e90d 226 if (zigBeeExplicitRxIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 227 return &zigBeeExplicitRxIndicator;
yangcq88517 0:837e6c48e90d 228 else return NULL;
yangcq88517 0:837e6c48e90d 229 }
yangcq88517 0:837e6c48e90d 230
yangcq88517 0:837e6c48e90d 231 ZigBeeIOSampleIndicator * CoreAPI::getZigBeeIOSample()
yangcq88517 0:837e6c48e90d 232 {
yangcq88517 0:837e6c48e90d 233 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 234 return NULL;
yangcq88517 0:837e6c48e90d 235
yangcq88517 0:837e6c48e90d 236 if (zigBeeIOSampleIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 237 return &zigBeeIOSampleIndicator;
yangcq88517 0:837e6c48e90d 238 else return NULL;
yangcq88517 0:837e6c48e90d 239 }
yangcq88517 0:837e6c48e90d 240
yangcq88517 0:837e6c48e90d 241 SensorReadIndicator * CoreAPI::getSensorRead()
yangcq88517 0:837e6c48e90d 242 {
yangcq88517 0:837e6c48e90d 243 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 244 return NULL;
yangcq88517 0:837e6c48e90d 245
yangcq88517 0:837e6c48e90d 246 if (sensorReadIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 247 return &sensorReadIndicator;
yangcq88517 0:837e6c48e90d 248 else return NULL;
yangcq88517 0:837e6c48e90d 249 }
yangcq88517 0:837e6c48e90d 250
yangcq88517 0:837e6c48e90d 251 NodeIdentificationIndicator * CoreAPI::getNodeIdentification()
yangcq88517 0:837e6c48e90d 252 {
yangcq88517 0:837e6c48e90d 253 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 254 return NULL;
yangcq88517 0:837e6c48e90d 255
yangcq88517 0:837e6c48e90d 256 if (nodeIdentificationIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 257 return &nodeIdentificationIndicator;
yangcq88517 0:837e6c48e90d 258 else return NULL;
yangcq88517 0:837e6c48e90d 259 }
yangcq88517 0:837e6c48e90d 260
yangcq88517 0:837e6c48e90d 261 RemoteCommandIndicator * CoreAPI::getRemoteCommand()
yangcq88517 0:837e6c48e90d 262 {
yangcq88517 0:837e6c48e90d 263 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 264 return NULL;
yangcq88517 0:837e6c48e90d 265
yangcq88517 0:837e6c48e90d 266 if (remoteCommandIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 267 return &remoteCommandIndicator;
yangcq88517 0:837e6c48e90d 268 else return NULL;
yangcq88517 0:837e6c48e90d 269 }
yangcq88517 0:837e6c48e90d 270
yangcq88517 0:837e6c48e90d 271 RouteRecordIndicator * CoreAPI::getRouteRecord()
yangcq88517 0:837e6c48e90d 272 {
yangcq88517 0:837e6c48e90d 273 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 274 return NULL;
yangcq88517 0:837e6c48e90d 275
yangcq88517 0:837e6c48e90d 276 if (routeRecordIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 277 return &routeRecordIndicator;
yangcq88517 0:837e6c48e90d 278 else return NULL;
yangcq88517 0:837e6c48e90d 279 }
yangcq88517 0:837e6c48e90d 280
yangcq88517 0:837e6c48e90d 281 ManyToOneRouteIndicator * CoreAPI::getManyToOneRoute()
yangcq88517 0:837e6c48e90d 282 {
yangcq88517 0:837e6c48e90d 283 if (getResponse() == NULL)
yangcq88517 0:837e6c48e90d 284 return NULL;
yangcq88517 0:837e6c48e90d 285
yangcq88517 0:837e6c48e90d 286 if (manyToOneRouteIndicator.convert(msg))
yangcq88517 0:837e6c48e90d 287 return &manyToOneRouteIndicator;
yangcq88517 0:837e6c48e90d 288 else return NULL;
yangcq88517 3:6b205ec8624b 289 }
yangcq88517 3:6b205ec8624b 290
yangcq88517 6:5f31ddc17239 291 XBeeTxStatusIndicator * CoreAPI::sendXBeeTx16(Address * remoteAddress, OptionsBase * option, const unsigned char * payload, int offset, int length)
yangcq88517 3:6b205ec8624b 292 {
yangcq88517 3:6b205ec8624b 293 if (!isRunning)
yangcq88517 3:6b205ec8624b 294 return NULL;
yangcq88517 3:6b205ec8624b 295
yangcq88517 3:6b205ec8624b 296 waitFrameID++;
yangcq88517 3:6b205ec8624b 297 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 298 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 299
yangcq88517 3:6b205ec8624b 300 msg->rewind();
yangcq88517 3:6b205ec8624b 301 msg->set(APIFrame::Tx16_Request);
yangcq88517 3:6b205ec8624b 302 msg->set(waitFrameID);
yangcq88517 3:6b205ec8624b 303 msg->set(remoteAddress->getNetworkAddress() >> 8);
yangcq88517 3:6b205ec8624b 304 msg->set(remoteAddress->getNetworkAddress());
yangcq88517 3:6b205ec8624b 305 msg->set(option->getValue());
yangcq88517 3:6b205ec8624b 306 msg->sets(payload, offset, length);
yangcq88517 3:6b205ec8624b 307
yangcq88517 3:6b205ec8624b 308 send(msg);
yangcq88517 3:6b205ec8624b 309
yangcq88517 3:6b205ec8624b 310 timer.start();
yangcq88517 3:6b205ec8624b 311 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 312 timer.reset();
yangcq88517 3:6b205ec8624b 313 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 314 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 315 timer.stop();
yangcq88517 3:6b205ec8624b 316 return NULL;
yangcq88517 3:6b205ec8624b 317 }
yangcq88517 3:6b205ec8624b 318 }
yangcq88517 3:6b205ec8624b 319
yangcq88517 3:6b205ec8624b 320 getResponse();
yangcq88517 3:6b205ec8624b 321
yangcq88517 3:6b205ec8624b 322 if (xBeeTxStatusIndicator.convert(msg) && xBeeTxStatusIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 323 timer.stop();
yangcq88517 3:6b205ec8624b 324 return &xBeeTxStatusIndicator;
yangcq88517 3:6b205ec8624b 325 }
yangcq88517 3:6b205ec8624b 326 }
yangcq88517 3:6b205ec8624b 327 timer.stop();
yangcq88517 3:6b205ec8624b 328 return NULL;
yangcq88517 3:6b205ec8624b 329 }
yangcq88517 3:6b205ec8624b 330
yangcq88517 6:5f31ddc17239 331 XBeeTxStatusIndicator * CoreAPI::sendXBeeTx64(Address * remoteAddress, OptionsBase * option, const unsigned char * payload, int offset, int length)
yangcq88517 3:6b205ec8624b 332 {
yangcq88517 3:6b205ec8624b 333 if (!isRunning)
yangcq88517 3:6b205ec8624b 334 return NULL;
yangcq88517 3:6b205ec8624b 335
yangcq88517 3:6b205ec8624b 336 waitFrameID++;
yangcq88517 3:6b205ec8624b 337 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 338 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 339
yangcq88517 3:6b205ec8624b 340 msg->rewind();
yangcq88517 3:6b205ec8624b 341 msg->set(APIFrame::Tx64_Request);
yangcq88517 3:6b205ec8624b 342 msg->set(waitFrameID);
yangcq88517 3:6b205ec8624b 343 msg->sets(remoteAddress->getAddressValue(), 0, 8);
yangcq88517 3:6b205ec8624b 344 msg->set(option->getValue());
yangcq88517 3:6b205ec8624b 345 msg->sets(payload, offset, length);
yangcq88517 3:6b205ec8624b 346
yangcq88517 3:6b205ec8624b 347 send(msg);
yangcq88517 3:6b205ec8624b 348
yangcq88517 3:6b205ec8624b 349 timer.start();
yangcq88517 3:6b205ec8624b 350 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 351 timer.reset();
yangcq88517 3:6b205ec8624b 352 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 353 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 354 timer.stop();
yangcq88517 3:6b205ec8624b 355 return NULL;
yangcq88517 3:6b205ec8624b 356 }
yangcq88517 3:6b205ec8624b 357 }
yangcq88517 3:6b205ec8624b 358
yangcq88517 3:6b205ec8624b 359 getResponse();
yangcq88517 3:6b205ec8624b 360
yangcq88517 3:6b205ec8624b 361 if (xBeeTxStatusIndicator.convert(msg) && xBeeTxStatusIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 362 timer.stop();
yangcq88517 3:6b205ec8624b 363 return &xBeeTxStatusIndicator;
yangcq88517 3:6b205ec8624b 364 }
yangcq88517 3:6b205ec8624b 365 }
yangcq88517 3:6b205ec8624b 366 timer.stop();
yangcq88517 3:6b205ec8624b 367 return NULL;
yangcq88517 3:6b205ec8624b 368 }
yangcq88517 3:6b205ec8624b 369
yangcq88517 6:5f31ddc17239 370 ATCommandIndicator * CoreAPI::sendATCommand(const char * command, bool applyChange, const unsigned char * parameter, int offset, int length)
yangcq88517 3:6b205ec8624b 371 {
yangcq88517 3:6b205ec8624b 372 waitFrameID++;
yangcq88517 3:6b205ec8624b 373 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 374 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 375
yangcq88517 3:6b205ec8624b 376 msg->rewind();
yangcq88517 3:6b205ec8624b 377 if (applyChange)
yangcq88517 3:6b205ec8624b 378 msg->set(APIFrame::AT_Command);
yangcq88517 3:6b205ec8624b 379 else msg->set(APIFrame::AT_Command_Queue_Parameter_Value);
yangcq88517 3:6b205ec8624b 380 msg->set(waitFrameID);
yangcq88517 6:5f31ddc17239 381 msg->set(command[0]);
yangcq88517 6:5f31ddc17239 382 msg->set(command[1]);
yangcq88517 3:6b205ec8624b 383 if (parameter != NULL)
yangcq88517 3:6b205ec8624b 384 msg->sets(parameter, offset, length);
yangcq88517 3:6b205ec8624b 385
yangcq88517 3:6b205ec8624b 386 send(msg);
yangcq88517 3:6b205ec8624b 387
yangcq88517 3:6b205ec8624b 388 timer.start();
yangcq88517 3:6b205ec8624b 389 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 390 timer.reset();
yangcq88517 3:6b205ec8624b 391 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 392 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 393 timer.stop();
yangcq88517 3:6b205ec8624b 394 return NULL;
yangcq88517 3:6b205ec8624b 395 }
yangcq88517 3:6b205ec8624b 396 }
yangcq88517 3:6b205ec8624b 397
yangcq88517 3:6b205ec8624b 398 getResponse();
yangcq88517 3:6b205ec8624b 399
yangcq88517 3:6b205ec8624b 400 if (aTCommandIndicator.convert(msg) && aTCommandIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 401 timer.stop();
yangcq88517 3:6b205ec8624b 402 return &aTCommandIndicator;
yangcq88517 3:6b205ec8624b 403 }
yangcq88517 3:6b205ec8624b 404 }
yangcq88517 3:6b205ec8624b 405 timer.stop();
yangcq88517 3:6b205ec8624b 406 return NULL;
yangcq88517 3:6b205ec8624b 407 }
yangcq88517 3:6b205ec8624b 408
yangcq88517 6:5f31ddc17239 409 RemoteCommandIndicator * CoreAPI::sendRemoteATCommand(Address * remoteAddress, const char * command, OptionsBase * transmitOptions, const unsigned char * parameter, int parameterOffset, int parameterLength)
yangcq88517 3:6b205ec8624b 410 {
yangcq88517 3:6b205ec8624b 411 waitFrameID++;
yangcq88517 3:6b205ec8624b 412 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 413 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 414
yangcq88517 3:6b205ec8624b 415 msg->rewind();
yangcq88517 3:6b205ec8624b 416 msg->set(APIFrame::Remote_Command_Request);
yangcq88517 3:6b205ec8624b 417 msg->set(waitFrameID);
yangcq88517 3:6b205ec8624b 418
yangcq88517 3:6b205ec8624b 419 msg->sets(remoteAddress->getAddressValue(), 0, 10);
yangcq88517 3:6b205ec8624b 420 msg->set(transmitOptions->getValue());
yangcq88517 6:5f31ddc17239 421 msg->set(command[0]);
yangcq88517 6:5f31ddc17239 422 msg->set(command[1]);
yangcq88517 3:6b205ec8624b 423
yangcq88517 3:6b205ec8624b 424 if (parameter != NULL)
yangcq88517 3:6b205ec8624b 425 msg->sets(parameter, parameterOffset, parameterLength);
yangcq88517 3:6b205ec8624b 426
yangcq88517 3:6b205ec8624b 427 send(msg);
yangcq88517 3:6b205ec8624b 428
yangcq88517 3:6b205ec8624b 429 timer.start();
yangcq88517 3:6b205ec8624b 430 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 431 timer.reset();
yangcq88517 3:6b205ec8624b 432 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 433 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 434 timer.stop();
yangcq88517 3:6b205ec8624b 435 return NULL;
yangcq88517 3:6b205ec8624b 436 }
yangcq88517 3:6b205ec8624b 437 }
yangcq88517 3:6b205ec8624b 438
yangcq88517 3:6b205ec8624b 439 getResponse();
yangcq88517 3:6b205ec8624b 440
yangcq88517 3:6b205ec8624b 441 if (remoteCommandIndicator.convert(msg) && remoteCommandIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 442 timer.stop();
yangcq88517 3:6b205ec8624b 443 return &remoteCommandIndicator;
yangcq88517 3:6b205ec8624b 444 }
yangcq88517 3:6b205ec8624b 445 }
yangcq88517 3:6b205ec8624b 446 timer.stop();
yangcq88517 3:6b205ec8624b 447 return NULL;
yangcq88517 3:6b205ec8624b 448 }
yangcq88517 3:6b205ec8624b 449
yangcq88517 6:5f31ddc17239 450 ZigBeeTxStatusIndicator * CoreAPI::sendZigBeeTx(Address * remoteAddress, OptionsBase * option, const unsigned char * payload, int offset, int length)
yangcq88517 3:6b205ec8624b 451 {
yangcq88517 3:6b205ec8624b 452 waitFrameID++;
yangcq88517 3:6b205ec8624b 453 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 454 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 455
yangcq88517 3:6b205ec8624b 456 msg->rewind();
yangcq88517 3:6b205ec8624b 457 msg->set(APIFrame::ZigBee_Transmit_Request);
yangcq88517 3:6b205ec8624b 458 msg->set(waitFrameID);
yangcq88517 3:6b205ec8624b 459 msg->sets(remoteAddress->getAddressValue(), 0, 10);
yangcq88517 3:6b205ec8624b 460 msg->set(0x00);
yangcq88517 3:6b205ec8624b 461 msg->set(option->getValue());
yangcq88517 3:6b205ec8624b 462 msg->sets(payload, offset, length);
yangcq88517 3:6b205ec8624b 463
yangcq88517 3:6b205ec8624b 464 send(msg);
yangcq88517 3:6b205ec8624b 465
yangcq88517 3:6b205ec8624b 466 timer.start();
yangcq88517 3:6b205ec8624b 467 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 468 timer.reset();
yangcq88517 3:6b205ec8624b 469 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 470 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 471 timer.stop();
yangcq88517 3:6b205ec8624b 472 return NULL;
yangcq88517 3:6b205ec8624b 473 }
yangcq88517 3:6b205ec8624b 474 }
yangcq88517 3:6b205ec8624b 475
yangcq88517 3:6b205ec8624b 476 getResponse();
yangcq88517 3:6b205ec8624b 477
yangcq88517 3:6b205ec8624b 478 if (zigBeeTxStatusIndicator.convert(msg) && zigBeeTxStatusIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 479 timer.stop();
yangcq88517 3:6b205ec8624b 480 return &zigBeeTxStatusIndicator;
yangcq88517 3:6b205ec8624b 481 }
yangcq88517 3:6b205ec8624b 482 }
yangcq88517 3:6b205ec8624b 483 timer.stop();
yangcq88517 3:6b205ec8624b 484 return NULL;
yangcq88517 3:6b205ec8624b 485 }
yangcq88517 3:6b205ec8624b 486
yangcq88517 6:5f31ddc17239 487 ZigBeeTxStatusIndicator * CoreAPI::sendZigBeeExplicitTx(ExplicitAddress * remoteAddress, OptionsBase * option, const unsigned char * payload, int offset, int length)
yangcq88517 3:6b205ec8624b 488 {
yangcq88517 3:6b205ec8624b 489 waitFrameID++;
yangcq88517 3:6b205ec8624b 490 if (waitFrameID == 0)
yangcq88517 3:6b205ec8624b 491 waitFrameID = 0x01;
yangcq88517 3:6b205ec8624b 492
yangcq88517 3:6b205ec8624b 493 msg->rewind();
yangcq88517 3:6b205ec8624b 494 msg->set(APIFrame::Explicit_Addressing_ZigBee_Command_Frame);
yangcq88517 3:6b205ec8624b 495 msg->set(waitFrameID);
yangcq88517 3:6b205ec8624b 496 msg->sets(remoteAddress->getAddressValue(), 0, 10);
yangcq88517 3:6b205ec8624b 497 msg->sets(remoteAddress->getExplicitValue(), 0 , 6);
yangcq88517 3:6b205ec8624b 498 msg->set(0x00);
yangcq88517 3:6b205ec8624b 499 msg->set(option->getValue());
yangcq88517 3:6b205ec8624b 500 msg->sets(payload, offset, length);
yangcq88517 3:6b205ec8624b 501
yangcq88517 3:6b205ec8624b 502 send(msg);
yangcq88517 3:6b205ec8624b 503
yangcq88517 3:6b205ec8624b 504 timer.start();
yangcq88517 3:6b205ec8624b 505 for (int i = 0; i < 3; i++) {
yangcq88517 3:6b205ec8624b 506 timer.reset();
yangcq88517 3:6b205ec8624b 507 while (!serial->peek()) {
yangcq88517 3:6b205ec8624b 508 if (timer.read_ms() > 1000) {
yangcq88517 3:6b205ec8624b 509 timer.stop();
yangcq88517 3:6b205ec8624b 510 return NULL;
yangcq88517 3:6b205ec8624b 511 }
yangcq88517 3:6b205ec8624b 512 }
yangcq88517 3:6b205ec8624b 513
yangcq88517 3:6b205ec8624b 514 getResponse();
yangcq88517 3:6b205ec8624b 515
yangcq88517 3:6b205ec8624b 516 if (zigBeeTxStatusIndicator.convert(msg) && zigBeeTxStatusIndicator.getFrameID() == waitFrameID) {
yangcq88517 3:6b205ec8624b 517 timer.stop();
yangcq88517 3:6b205ec8624b 518 return &zigBeeTxStatusIndicator;
yangcq88517 3:6b205ec8624b 519 }
yangcq88517 3:6b205ec8624b 520 }
yangcq88517 3:6b205ec8624b 521 timer.stop();
yangcq88517 3:6b205ec8624b 522 return NULL;
yangcq88517 3:6b205ec8624b 523 }
yangcq88517 3:6b205ec8624b 524
yangcq88517 6:5f31ddc17239 525 ATCommandIndicator * CoreAPI::setPinFunction(Pin * pin, unsigned char function)
yangcq88517 3:6b205ec8624b 526 {
yangcq88517 3:6b205ec8624b 527 return sendATCommand(pin->getCommand(), true, &function, 0 , 1);
yangcq88517 3:6b205ec8624b 528 }
yangcq88517 3:6b205ec8624b 529
yangcq88517 4:a0f1fba6c2fb 530 ATCommandIndicator * CoreAPI::setIODetection(Pin ** pins, int size)
yangcq88517 3:6b205ec8624b 531 {
yangcq88517 3:6b205ec8624b 532 return sendATCommand(ATCommands::Digital_IO_Change_Detection, true, Pin::IOChangeDetectionConfiguration(pins, size));
yangcq88517 3:6b205ec8624b 533 }
yangcq88517 3:6b205ec8624b 534
yangcq88517 6:5f31ddc17239 535 RemoteCommandIndicator * CoreAPI::setRemotePinFunction(Address * remoteAddress, Pin * pin, unsigned char function)
yangcq88517 3:6b205ec8624b 536 {
yangcq88517 4:a0f1fba6c2fb 537 return sendRemoteATCommand(remoteAddress, pin->getCommand(), RemoteCommandOptions::ApplyChanges, &function, 0 , 1);
yangcq88517 3:6b205ec8624b 538 }
yangcq88517 3:6b205ec8624b 539
yangcq88517 4:a0f1fba6c2fb 540 RemoteCommandIndicator * CoreAPI::setRemoteIODetection(Address * remoteAddress, Pin ** pins, int size)
yangcq88517 3:6b205ec8624b 541 {
yangcq88517 4:a0f1fba6c2fb 542 return sendRemoteATCommand(remoteAddress, ATCommands::Digital_IO_Change_Detection, RemoteCommandOptions::ApplyChanges, Pin::IOChangeDetectionConfiguration(pins, size), 0, 2);
yangcq88517 3:6b205ec8624b 543 }
yangcq88517 3:6b205ec8624b 544
yangcq88517 3:6b205ec8624b 545 bool CoreAPI::forceXBeeLocalIOSample()
yangcq88517 3:6b205ec8624b 546 {
yangcq88517 3:6b205ec8624b 547 ATCommandIndicator * re = sendATCommand(ATCommands::Force_Sample, true);
yangcq88517 3:6b205ec8624b 548
yangcq88517 3:6b205ec8624b 549 if (re == NULL)
yangcq88517 3:6b205ec8624b 550 return false;
yangcq88517 3:6b205ec8624b 551
yangcq88517 3:6b205ec8624b 552 if (re->getCommandStatus() != 0x00)
yangcq88517 3:6b205ec8624b 553 return false;
yangcq88517 3:6b205ec8624b 554
yangcq88517 3:6b205ec8624b 555 return true;
yangcq88517 3:6b205ec8624b 556 }
yangcq88517 3:6b205ec8624b 557
yangcq88517 3:6b205ec8624b 558 IOSamples * CoreAPI::forceZigBeeLocalIOSample()
yangcq88517 3:6b205ec8624b 559 {
yangcq88517 3:6b205ec8624b 560 ATCommandIndicator * re = sendATCommand(ATCommands::Force_Sample, true);
yangcq88517 3:6b205ec8624b 561
yangcq88517 3:6b205ec8624b 562 if (re == NULL)
yangcq88517 3:6b205ec8624b 563 return NULL;
yangcq88517 3:6b205ec8624b 564
yangcq88517 3:6b205ec8624b 565 return IOSampleDecoder::ZigBeeSamplesParse(re->getParameter());
yangcq88517 3:6b205ec8624b 566 }
yangcq88517 3:6b205ec8624b 567
yangcq88517 3:6b205ec8624b 568 IOSamples * CoreAPI::forceXBeeRemoteIOSample(Address * remote)
yangcq88517 3:6b205ec8624b 569 {
yangcq88517 4:a0f1fba6c2fb 570 RemoteCommandIndicator * re = sendRemoteATCommand(remote, ATCommands::Force_Sample, OptionsBase::DEFAULT);
yangcq88517 3:6b205ec8624b 571
yangcq88517 3:6b205ec8624b 572 return IOSampleDecoder::XBeeSamplesParse(re->getParameter());
yangcq88517 3:6b205ec8624b 573 }
yangcq88517 3:6b205ec8624b 574
yangcq88517 3:6b205ec8624b 575 IOSamples * CoreAPI::forceZigBeeRemoteIOSample(Address * remote)
yangcq88517 3:6b205ec8624b 576 {
yangcq88517 4:a0f1fba6c2fb 577 RemoteCommandIndicator * re = sendRemoteATCommand(remote, ATCommands::Force_Sample, OptionsBase::DEFAULT);
yangcq88517 3:6b205ec8624b 578
yangcq88517 3:6b205ec8624b 579 return IOSampleDecoder::ZigBeeSamplesParse(re->getParameter());
yangcq88517 3:6b205ec8624b 580 }
yangcq88517 3:6b205ec8624b 581