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 12:28:26 2015 +0000
Revision:
0:837e6c48e90d
Child:
1:3dc0ec2f9fd6
initial upload

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 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 }