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:
Thu Oct 22 20:02:11 2015 +0000
Revision:
1:3dc0ec2f9fd6
Parent:
0:837e6c48e90d
Child:
3:6b205ec8624b
bug fix

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 0:837e6c48e90d 77 void CoreAPI::writeByte(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 0:837e6c48e90d 289 }