This is an experimental driver for the XBee 900 HP pro module's SPI connection. This driver is unfinished and stability is not guaranteed. Use with caution.

Dependents:   Sentinel_BASE Sentinel_NODE

Committer:
ottaviano3
Date:
Wed Apr 27 05:46:34 2016 +0000
Revision:
15:3bb82129f3a8
Parent:
9:d4542525b218
Update comment formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ottaviano3 0:8c8a8244e590 1 #include "xbee900hp.h"
ottaviano3 0:8c8a8244e590 2
ottaviano3 7:3cb67634fa4e 3 xbee900hp::xbee900hp(PinName pin_mosi,PinName pin_miso,PinName pin_sck,PinName pin_attn, PinName pin_rst, unsigned int freq)
ottaviano3 7:3cb67634fa4e 4 : _pin_rst(pin_rst), _pin_attn(pin_attn), _xbeespi(pin_mosi,pin_miso,pin_sck) {
ottaviano3 7:3cb67634fa4e 5 // Set proper spi transfer mode format.
ottaviano3 0:8c8a8244e590 6 _xbeespi.format(8,0);
ottaviano3 7:3cb67634fa4e 7 // Set SPI frequency
ottaviano3 7:3cb67634fa4e 8 _xbeespi.frequency(freq);
ottaviano3 7:3cb67634fa4e 9
ottaviano3 7:3cb67634fa4e 10 // Reset for good measure.
ottaviano3 2:7f4ddf710a44 11 reset();
ottaviano3 7:3cb67634fa4e 12
ottaviano3 7:3cb67634fa4e 13 // Xbee is up and running!
ottaviano3 0:8c8a8244e590 14 }
ottaviano3 0:8c8a8244e590 15
ottaviano3 0:8c8a8244e590 16 xbee900hp::~xbee900hp() {}
ottaviano3 0:8c8a8244e590 17
ottaviano3 0:8c8a8244e590 18 void xbee900hp::reset()
ottaviano3 0:8c8a8244e590 19 {
ottaviano3 0:8c8a8244e590 20 _pin_rst = 0;
ottaviano3 0:8c8a8244e590 21 // Minimum pulse is 1ms
ottaviano3 7:3cb67634fa4e 22 wait_ms(2);
ottaviano3 0:8c8a8244e590 23 _pin_rst = 1;
ottaviano3 7:3cb67634fa4e 24
ottaviano3 7:3cb67634fa4e 25 // Wait for device to have time to start the reboot process.
ottaviano3 7:3cb67634fa4e 26 wait_ms(80);
ottaviano3 7:3cb67634fa4e 27
ottaviano3 7:3cb67634fa4e 28 // Now wait for the startup message.
ottaviano3 7:3cb67634fa4e 29 while (attn() == 1) {}
ottaviano3 7:3cb67634fa4e 30
ottaviano3 7:3cb67634fa4e 31 // This is the message the XBEE should send out on startup after a reset.
ottaviano3 7:3cb67634fa4e 32 unsigned int modemMsg[6] = { 0x7E,0x00,0x02,0x8A,0x00,0x75 };
ottaviano3 7:3cb67634fa4e 33 // Container for or new message.
ottaviano3 7:3cb67634fa4e 34 unsigned int delim[6];
ottaviano3 7:3cb67634fa4e 35
ottaviano3 7:3cb67634fa4e 36 // Read in the new message from the xbee.
ottaviano3 7:3cb67634fa4e 37 for (int i = 0; i < 6; i++) {
ottaviano3 7:3cb67634fa4e 38 delim[i] = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 39 }
ottaviano3 7:3cb67634fa4e 40
ottaviano3 7:3cb67634fa4e 41 // Compare recieved msg with msg we want.
ottaviano3 7:3cb67634fa4e 42 if (memcmp(delim, modemMsg, sizeof(modemMsg))) {
ottaviano3 7:3cb67634fa4e 43 // If msg mismatch.
ottaviano3 7:3cb67634fa4e 44 error("XBEE FAILURE");
ottaviano3 7:3cb67634fa4e 45 }
ottaviano3 0:8c8a8244e590 46 }
ottaviano3 0:8c8a8244e590 47
ottaviano3 7:3cb67634fa4e 48 int xbee900hp::sendPacket(char* data, unsigned int length, bool enMesh) {
ottaviano3 0:8c8a8244e590 49 // checksum
ottaviano3 0:8c8a8244e590 50 unsigned int checksum;
ottaviano3 0:8c8a8244e590 51 unsigned int checksumsub = 0;
ottaviano3 7:3cb67634fa4e 52
ottaviano3 0:8c8a8244e590 53 // start char
ottaviano3 0:8c8a8244e590 54 _xbeespi.write(0x7E);
ottaviano3 0:8c8a8244e590 55 // lenght
ottaviano3 0:8c8a8244e590 56 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 57
ottaviano3 0:8c8a8244e590 58 unsigned int totallength = 14 + length - 1;
ottaviano3 0:8c8a8244e590 59 _xbeespi.write(totallength);
ottaviano3 0:8c8a8244e590 60
ottaviano3 0:8c8a8244e590 61 // frame delimter
ottaviano3 0:8c8a8244e590 62 _xbeespi.write(0x10);
ottaviano3 0:8c8a8244e590 63 checksumsub += 0x10;
ottaviano3 7:3cb67634fa4e 64 // id for later reference
ottaviano3 0:8c8a8244e590 65 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 66
ottaviano3 0:8c8a8244e590 67 // destination address
ottaviano3 0:8c8a8244e590 68 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 69 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 70 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 71 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 72 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 73 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 74 _xbeespi.write(0xFF);
ottaviano3 0:8c8a8244e590 75 checksumsub += 0xFF;
ottaviano3 0:8c8a8244e590 76 _xbeespi.write(0xFF);
ottaviano3 0:8c8a8244e590 77 checksumsub += 0xFF;
ottaviano3 0:8c8a8244e590 78
ottaviano3 0:8c8a8244e590 79 // reserved field, dont change
ottaviano3 0:8c8a8244e590 80 _xbeespi.write(0xFF);
ottaviano3 0:8c8a8244e590 81 checksumsub += 0xFF;
ottaviano3 0:8c8a8244e590 82 _xbeespi.write(0xFE);
ottaviano3 0:8c8a8244e590 83 checksumsub += 0xFE;
ottaviano3 0:8c8a8244e590 84
ottaviano3 0:8c8a8244e590 85 //bcast radius
ottaviano3 0:8c8a8244e590 86 _xbeespi.write(0x00);
ottaviano3 0:8c8a8244e590 87
ottaviano3 7:3cb67634fa4e 88 // This is a bitmasked field
ottaviano3 7:3cb67634fa4e 89 // bit 0: Disable ACK
ottaviano3 7:3cb67634fa4e 90 // bit 1: Disable Route Discovery
ottaviano3 7:3cb67634fa4e 91 // bit 2: Enable Unicast NACK messages.
ottaviano3 7:3cb67634fa4e 92 // bit 3: Enable Unicast Trace Route messages.
ottaviano3 7:3cb67634fa4e 93 // bits 6,7: b’01 - Point-Multipoint
ottaviano3 7:3cb67634fa4e 94 // b’10 - Repeater mode (directed broadcast)
ottaviano3 7:3cb67634fa4e 95 // b’11 - DigiMesh
ottaviano3 7:3cb67634fa4e 96 // All other bits must be set to 0.
ottaviano3 7:3cb67634fa4e 97 if (enMesh == true) {
ottaviano3 7:3cb67634fa4e 98 // Transmit using digimesh
ottaviano3 7:3cb67634fa4e 99 _xbeespi.write(0xC0);
ottaviano3 7:3cb67634fa4e 100 checksumsub += 0xC0;
ottaviano3 7:3cb67634fa4e 101 } else {
ottaviano3 7:3cb67634fa4e 102 // Transmit point to point (without ACK)
ottaviano3 7:3cb67634fa4e 103 _xbeespi.write(0x41);
ottaviano3 7:3cb67634fa4e 104 checksumsub += 0x41;
ottaviano3 7:3cb67634fa4e 105 }
ottaviano3 0:8c8a8244e590 106
ottaviano3 0:8c8a8244e590 107 // dat data
ottaviano3 0:8c8a8244e590 108 for (int i = 0; i < (length - 1); i++) {
ottaviano3 0:8c8a8244e590 109 _xbeespi.write(*data);
ottaviano3 0:8c8a8244e590 110 checksumsub += (*(data++));
ottaviano3 0:8c8a8244e590 111 }
ottaviano3 0:8c8a8244e590 112
ottaviano3 0:8c8a8244e590 113 // Calculate checksum
ottaviano3 0:8c8a8244e590 114 checksumsub = checksumsub & 0xFF;
ottaviano3 0:8c8a8244e590 115 checksum = 0xFF - checksumsub;
ottaviano3 0:8c8a8244e590 116
ottaviano3 0:8c8a8244e590 117 // finally write checksum
ottaviano3 0:8c8a8244e590 118 _xbeespi.write(checksum);
ottaviano3 7:3cb67634fa4e 119
ottaviano3 7:3cb67634fa4e 120 return 0;
ottaviano3 1:b97d46c5d7ce 121 }
ottaviano3 1:b97d46c5d7ce 122
ottaviano3 7:3cb67634fa4e 123 unsigned long long xbee900hp::readPacket(char* data) {
ottaviano3 7:3cb67634fa4e 124 unsigned long long temp1;
ottaviano3 2:7f4ddf710a44 125 unsigned int temp2;
ottaviano3 2:7f4ddf710a44 126
ottaviano3 7:3cb67634fa4e 127 unsigned long long srcAddr = 0;
ottaviano3 7:3cb67634fa4e 128
ottaviano3 2:7f4ddf710a44 129 unsigned int checksumsub = 0;
ottaviano3 2:7f4ddf710a44 130 unsigned int checksum;
ottaviano3 7:3cb67634fa4e 131
ottaviano3 2:7f4ddf710a44 132 // get first vars.
ottaviano3 2:7f4ddf710a44 133 temp1 = _xbeespi.write(0x00);
ottaviano3 2:7f4ddf710a44 134 if (temp1 != 0x7E) {
ottaviano3 7:3cb67634fa4e 135 return 0;
ottaviano3 2:7f4ddf710a44 136 }
ottaviano3 2:7f4ddf710a44 137 // Get length of message
ottaviano3 2:7f4ddf710a44 138 temp1 = _xbeespi.write(0x00);
ottaviano3 2:7f4ddf710a44 139 temp2 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 140
ottaviano3 2:7f4ddf710a44 141 // Get total length
ottaviano3 2:7f4ddf710a44 142 unsigned int length = (temp1<<8) | temp2;
ottaviano3 7:3cb67634fa4e 143
ottaviano3 2:7f4ddf710a44 144 // Next read frame type to ensure it is an RX packet.
ottaviano3 2:7f4ddf710a44 145 temp1 = _xbeespi.write(0x00);
ottaviano3 2:7f4ddf710a44 146 if (temp1 != 0x90) {
ottaviano3 7:3cb67634fa4e 147 return 0;
ottaviano3 2:7f4ddf710a44 148 }
ottaviano3 2:7f4ddf710a44 149 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 150
ottaviano3 2:7f4ddf710a44 151 // in our case we dont care about source address this should be modified to extract source address if needed.
ottaviano3 7:3cb67634fa4e 152 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 153 srcAddr = (temp1 << 56);
ottaviano3 7:3cb67634fa4e 154 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 155 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 156 srcAddr ^= (temp1 << 48);
ottaviano3 7:3cb67634fa4e 157 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 158 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 159 srcAddr ^= (temp1 << 40);
ottaviano3 7:3cb67634fa4e 160 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 161 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 162 srcAddr ^= (temp1 << 32);
ottaviano3 7:3cb67634fa4e 163 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 164 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 165 srcAddr ^= (temp1 << 24);
ottaviano3 7:3cb67634fa4e 166 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 167 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 168 srcAddr ^= (temp1 << 16);
ottaviano3 7:3cb67634fa4e 169 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 170 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 171 srcAddr ^= (temp1 << 8);
ottaviano3 7:3cb67634fa4e 172 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 173 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 174 srcAddr ^= (temp1);
ottaviano3 7:3cb67634fa4e 175 checksumsub += temp1;
ottaviano3 2:7f4ddf710a44 176 // reserved field, we dont care about except for checksum
ottaviano3 2:7f4ddf710a44 177 checksumsub += _xbeespi.write(0x00);
ottaviano3 2:7f4ddf710a44 178 checksumsub += _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 179
ottaviano3 2:7f4ddf710a44 180 // recive options we also dont care though
ottaviano3 2:7f4ddf710a44 181 checksumsub += _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 182
ottaviano3 2:7f4ddf710a44 183 // Now for the sweet sweet data.
ottaviano3 2:7f4ddf710a44 184 for (int i = 0; i<(length-12); i++) {
ottaviano3 2:7f4ddf710a44 185 *data = _xbeespi.write(0x00);
ottaviano3 2:7f4ddf710a44 186 checksumsub += *(data++);
ottaviano3 2:7f4ddf710a44 187 }
ottaviano3 2:7f4ddf710a44 188 // Null terminate char array.
ottaviano3 4:4083baa871fb 189 *data = '\0';
ottaviano3 7:3cb67634fa4e 190
ottaviano3 2:7f4ddf710a44 191 // Get that salty checksum
ottaviano3 2:7f4ddf710a44 192 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 193
ottaviano3 2:7f4ddf710a44 194 checksumsub = checksumsub & 0xFF;
ottaviano3 2:7f4ddf710a44 195 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 196
ottaviano3 2:7f4ddf710a44 197 // Check the checksum
ottaviano3 2:7f4ddf710a44 198 if (temp1 != checksum) {
ottaviano3 2:7f4ddf710a44 199 // Checksum failure, flag to discard packet
ottaviano3 7:3cb67634fa4e 200 return 0;
ottaviano3 2:7f4ddf710a44 201 }
ottaviano3 7:3cb67634fa4e 202
ottaviano3 7:3cb67634fa4e 203 return srcAddr;
ottaviano3 2:7f4ddf710a44 204 }
ottaviano3 2:7f4ddf710a44 205
ottaviano3 2:7f4ddf710a44 206 int xbee900hp::attn() {
ottaviano3 2:7f4ddf710a44 207 return _pin_attn;
ottaviano3 2:7f4ddf710a44 208 }
ottaviano3 2:7f4ddf710a44 209
ottaviano3 7:3cb67634fa4e 210 unsigned int xbee900hp::getRSSI() {
ottaviano3 1:b97d46c5d7ce 211 // checksum Variables
ottaviano3 1:b97d46c5d7ce 212 unsigned int checksum = 0;
ottaviano3 1:b97d46c5d7ce 213 unsigned int checksumsub = 0;
ottaviano3 7:3cb67634fa4e 214
ottaviano3 7:3cb67634fa4e 215 // RSSI storage container
ottaviano3 7:3cb67634fa4e 216 unsigned int rssi;
ottaviano3 7:3cb67634fa4e 217
ottaviano3 7:3cb67634fa4e 218 // Frame initiator
ottaviano3 1:b97d46c5d7ce 219 _xbeespi.write(0x7E);
ottaviano3 7:3cb67634fa4e 220 // Length
ottaviano3 1:b97d46c5d7ce 221 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 222 _xbeespi.write(0x04);
ottaviano3 7:3cb67634fa4e 223
ottaviano3 1:b97d46c5d7ce 224 // Frame type (config)
ottaviano3 1:b97d46c5d7ce 225 _xbeespi.write(0x08);
ottaviano3 1:b97d46c5d7ce 226 checksumsub += 0x08;
ottaviano3 7:3cb67634fa4e 227 // Response frame ID
ottaviano3 7:3cb67634fa4e 228 _xbeespi.write(0x44);
ottaviano3 7:3cb67634fa4e 229 checksumsub += 0x44;
ottaviano3 7:3cb67634fa4e 230
ottaviano3 1:b97d46c5d7ce 231 // AT Command
ottaviano3 7:3cb67634fa4e 232 _xbeespi.write(0x44); // Hex for ASCII D
ottaviano3 7:3cb67634fa4e 233 checksumsub += 0x44;
ottaviano3 7:3cb67634fa4e 234 _xbeespi.write(0x42); // Hex for ASCII B
ottaviano3 7:3cb67634fa4e 235 checksumsub += 0x42;
ottaviano3 7:3cb67634fa4e 236
ottaviano3 1:b97d46c5d7ce 237 // Calculate checksum
ottaviano3 1:b97d46c5d7ce 238 checksumsub = checksumsub & 0xFF;
ottaviano3 1:b97d46c5d7ce 239 checksum = 0xFF - checksumsub;
ottaviano3 1:b97d46c5d7ce 240
ottaviano3 1:b97d46c5d7ce 241 // finally write checksum
ottaviano3 1:b97d46c5d7ce 242 _xbeespi.write(checksum);
ottaviano3 3:3c3707b0f5cd 243
ottaviano3 3:3c3707b0f5cd 244 // Block until xbee replys
ottaviano3 7:3cb67634fa4e 245 while (_pin_attn != 0) { }
ottaviano3 7:3cb67634fa4e 246
ottaviano3 3:3c3707b0f5cd 247 // reset checksum to zero.
ottaviano3 3:3c3707b0f5cd 248 checksum = 0;
ottaviano3 3:3c3707b0f5cd 249 checksumsub = 0;
ottaviano3 7:3cb67634fa4e 250
ottaviano3 7:3cb67634fa4e 251 unsigned int temp1;
ottaviano3 7:3cb67634fa4e 252 unsigned int temp2;
ottaviano3 7:3cb67634fa4e 253
ottaviano3 3:3c3707b0f5cd 254 // get start byte
ottaviano3 3:3c3707b0f5cd 255 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 256 if (temp1 != 0x7E) {
ottaviano3 3:3c3707b0f5cd 257 // drop packet
ottaviano3 3:3c3707b0f5cd 258 return 1;
ottaviano3 3:3c3707b0f5cd 259 }
ottaviano3 7:3cb67634fa4e 260 // Get length of message (we dont care, we know what it is)
ottaviano3 7:3cb67634fa4e 261 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 262 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 263
ottaviano3 3:3c3707b0f5cd 264 // Next read frame type to ensure it is an response packet.
ottaviano3 3:3c3707b0f5cd 265 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 266 if (temp1 != 0x88) {
ottaviano3 3:3c3707b0f5cd 267 // drop packet
ottaviano3 7:3cb67634fa4e 268 return 0;
ottaviano3 3:3c3707b0f5cd 269 }
ottaviano3 3:3c3707b0f5cd 270 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 271
ottaviano3 3:3c3707b0f5cd 272 // get response frame id
ottaviano3 7:3cb67634fa4e 273
ottaviano3 7:3cb67634fa4e 274 while (temp1 != 0x44) {
ottaviano3 7:3cb67634fa4e 275 // Dredge through data until the response frame we want arrives.
ottaviano3 7:3cb67634fa4e 276 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 277 }
ottaviano3 3:3c3707b0f5cd 278 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 279
ottaviano3 3:3c3707b0f5cd 280 // get at response parameter
ottaviano3 3:3c3707b0f5cd 281 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 282 checksumsub += temp1;
ottaviano3 3:3c3707b0f5cd 283 temp2 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 284 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 285
ottaviano3 7:3cb67634fa4e 286 if ((temp1 != 0x44) || (temp2 != 0x42)) {
ottaviano3 7:3cb67634fa4e 287 return 1;
ottaviano3 7:3cb67634fa4e 288 // drop
ottaviano3 7:3cb67634fa4e 289 }
ottaviano3 7:3cb67634fa4e 290
ottaviano3 7:3cb67634fa4e 291 // Check OK flag
ottaviano3 7:3cb67634fa4e 292 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 293 if (temp1 != 0x00) {
ottaviano3 3:3c3707b0f5cd 294 return 1;
ottaviano3 3:3c3707b0f5cd 295 // drop
ottaviano3 3:3c3707b0f5cd 296 }
ottaviano3 7:3cb67634fa4e 297 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 298
ottaviano3 7:3cb67634fa4e 299 // Get RSSI Data
ottaviano3 7:3cb67634fa4e 300 rssi = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 301 checksumsub += rssi;
ottaviano3 7:3cb67634fa4e 302
ottaviano3 7:3cb67634fa4e 303 // Get that salty checksum
ottaviano3 7:3cb67634fa4e 304 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 305
ottaviano3 7:3cb67634fa4e 306 checksumsub = checksumsub & 0xFF;
ottaviano3 7:3cb67634fa4e 307 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 308
ottaviano3 7:3cb67634fa4e 309 // Check the checksum
ottaviano3 7:3cb67634fa4e 310 if (temp1 != checksum) {
ottaviano3 7:3cb67634fa4e 311 // Checksum failure, flag to discard packet
ottaviano3 7:3cb67634fa4e 312 return 1;
ottaviano3 7:3cb67634fa4e 313 }
ottaviano3 7:3cb67634fa4e 314
ottaviano3 7:3cb67634fa4e 315 return rssi;
ottaviano3 7:3cb67634fa4e 316 }
ottaviano3 7:3cb67634fa4e 317
ottaviano3 7:3cb67634fa4e 318 int xbee900hp::setPower(int value) {
ottaviano3 7:3cb67634fa4e 319 if ((value > 4) || (value < 0)) {
ottaviano3 7:3cb67634fa4e 320 return 1;
ottaviano3 7:3cb67634fa4e 321 }
ottaviano3 7:3cb67634fa4e 322
ottaviano3 7:3cb67634fa4e 323 // checksum Variables
ottaviano3 7:3cb67634fa4e 324 unsigned int checksum = 0;
ottaviano3 7:3cb67634fa4e 325 unsigned int checksumsub = 0;
ottaviano3 7:3cb67634fa4e 326
ottaviano3 7:3cb67634fa4e 327 // Frame initiator
ottaviano3 7:3cb67634fa4e 328 _xbeespi.write(0x7E);
ottaviano3 7:3cb67634fa4e 329 // Length
ottaviano3 7:3cb67634fa4e 330 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 331 _xbeespi.write(0x05);
ottaviano3 7:3cb67634fa4e 332
ottaviano3 7:3cb67634fa4e 333 // Frame type (config)
ottaviano3 7:3cb67634fa4e 334 _xbeespi.write(0x08);
ottaviano3 7:3cb67634fa4e 335 checksumsub += 0x08;
ottaviano3 7:3cb67634fa4e 336 // Response frame ID
ottaviano3 7:3cb67634fa4e 337 _xbeespi.write(0x50);
ottaviano3 7:3cb67634fa4e 338 checksumsub += 0x50;
ottaviano3 7:3cb67634fa4e 339
ottaviano3 7:3cb67634fa4e 340 // AT Command
ottaviano3 7:3cb67634fa4e 341 _xbeespi.write(0x50); // Hex for ASCII P
ottaviano3 7:3cb67634fa4e 342 checksumsub += 0x50;
ottaviano3 7:3cb67634fa4e 343 _xbeespi.write(0x4C); // Hex for ASCII L
ottaviano3 7:3cb67634fa4e 344 checksumsub += 0x4C;
ottaviano3 7:3cb67634fa4e 345
ottaviano3 7:3cb67634fa4e 346 // Value to set
ottaviano3 7:3cb67634fa4e 347 _xbeespi.write(value);
ottaviano3 7:3cb67634fa4e 348 checksumsub += value;
ottaviano3 7:3cb67634fa4e 349
ottaviano3 7:3cb67634fa4e 350 // Calculate checksum
ottaviano3 7:3cb67634fa4e 351 checksumsub = checksumsub & 0xFF;
ottaviano3 7:3cb67634fa4e 352 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 353
ottaviano3 7:3cb67634fa4e 354 // finally write checksum
ottaviano3 7:3cb67634fa4e 355 _xbeespi.write(checksum);
ottaviano3 7:3cb67634fa4e 356
ottaviano3 7:3cb67634fa4e 357 // Block until xbee replys
ottaviano3 7:3cb67634fa4e 358 while (_pin_attn != 0) { }
ottaviano3 7:3cb67634fa4e 359
ottaviano3 7:3cb67634fa4e 360 // reset checksum to zero.
ottaviano3 7:3cb67634fa4e 361 checksum = 0;
ottaviano3 7:3cb67634fa4e 362 checksumsub = 0;
ottaviano3 7:3cb67634fa4e 363
ottaviano3 7:3cb67634fa4e 364 unsigned int temp1;
ottaviano3 7:3cb67634fa4e 365 unsigned int temp2;
ottaviano3 7:3cb67634fa4e 366
ottaviano3 7:3cb67634fa4e 367 // get start byte
ottaviano3 7:3cb67634fa4e 368 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 369 if (temp1 != 0x7E) {
ottaviano3 7:3cb67634fa4e 370 // drop packet
ottaviano3 7:3cb67634fa4e 371 return 1;
ottaviano3 7:3cb67634fa4e 372 }
ottaviano3 7:3cb67634fa4e 373 // Get length of message (we dont care, we know what it is)
ottaviano3 7:3cb67634fa4e 374 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 375 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 376
ottaviano3 7:3cb67634fa4e 377 // Next read frame type to ensure it is an response packet.
ottaviano3 7:3cb67634fa4e 378 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 379 if (temp1 != 0x88) {
ottaviano3 7:3cb67634fa4e 380 // drop packet
ottaviano3 7:3cb67634fa4e 381 return 0;
ottaviano3 7:3cb67634fa4e 382 }
ottaviano3 7:3cb67634fa4e 383 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 384
ottaviano3 7:3cb67634fa4e 385 while (temp1 != 0x50) {
ottaviano3 7:3cb67634fa4e 386 // Keep going through data until response frame is found.
ottaviano3 7:3cb67634fa4e 387 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 388 }
ottaviano3 7:3cb67634fa4e 389 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 390
ottaviano3 7:3cb67634fa4e 391 // get at response parameter
ottaviano3 7:3cb67634fa4e 392 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 393 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 394 temp2 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 395 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 396
ottaviano3 7:3cb67634fa4e 397 if ((temp1 != 0x50) || (temp2 != 0x4C)) {
ottaviano3 7:3cb67634fa4e 398 return 1;
ottaviano3 7:3cb67634fa4e 399 // drop
ottaviano3 7:3cb67634fa4e 400 }
ottaviano3 7:3cb67634fa4e 401
ottaviano3 3:3c3707b0f5cd 402 // Check OK flag
ottaviano3 3:3c3707b0f5cd 403 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 404 if (temp1 != 0x00) {
ottaviano3 3:3c3707b0f5cd 405 return 1;
ottaviano3 3:3c3707b0f5cd 406 // drop
ottaviano3 3:3c3707b0f5cd 407 }
ottaviano3 3:3c3707b0f5cd 408 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 409
ottaviano3 3:3c3707b0f5cd 410 // Get that salty checksum
ottaviano3 3:3c3707b0f5cd 411 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 412
ottaviano3 3:3c3707b0f5cd 413 checksumsub = checksumsub & 0xFF;
ottaviano3 3:3c3707b0f5cd 414 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 415
ottaviano3 3:3c3707b0f5cd 416 // Check the checksum
ottaviano3 3:3c3707b0f5cd 417 if (temp1 != checksum) {
ottaviano3 3:3c3707b0f5cd 418 // Checksum failure, flag to discard packet
ottaviano3 3:3c3707b0f5cd 419 return 1;
ottaviano3 3:3c3707b0f5cd 420 }
ottaviano3 7:3cb67634fa4e 421
ottaviano3 7:3cb67634fa4e 422 return 0;
ottaviano3 7:3cb67634fa4e 423 }
ottaviano3 7:3cb67634fa4e 424
ottaviano3 7:3cb67634fa4e 425 unsigned long long xbee900hp::getSerial() {
ottaviano3 3:3c3707b0f5cd 426 // checksum Variables
ottaviano3 7:3cb67634fa4e 427 unsigned int checksum = 0;
ottaviano3 7:3cb67634fa4e 428 unsigned int checksumsub = 0;
ottaviano3 7:3cb67634fa4e 429
ottaviano3 7:3cb67634fa4e 430 // Container for serial as we calculate it.
ottaviano3 7:3cb67634fa4e 431 unsigned long long serialNumber = 0;
ottaviano3 7:3cb67634fa4e 432
ottaviano3 7:3cb67634fa4e 433 // Containers for read values
ottaviano3 7:3cb67634fa4e 434 unsigned long long temp1 = 0;
ottaviano3 7:3cb67634fa4e 435 unsigned long long temp2 = 0;
ottaviano3 7:3cb67634fa4e 436 unsigned long long temp3 = 0;
ottaviano3 7:3cb67634fa4e 437 unsigned long long temp4 = 0;
ottaviano3 7:3cb67634fa4e 438
ottaviano3 7:3cb67634fa4e 439 // Write frame to return serial high.
ottaviano3 7:3cb67634fa4e 440 // Total frame looks like this:
ottaviano3 7:3cb67634fa4e 441 // 7E 00 04 08 52 53(S) 48(H) CHECKSUM
ottaviano3 7:3cb67634fa4e 442 // Wait for response to get high part of serial
ottaviano3 7:3cb67634fa4e 443 // Profit????
ottaviano3 7:3cb67634fa4e 444
ottaviano3 7:3cb67634fa4e 445 // Frame Header
ottaviano3 3:3c3707b0f5cd 446 _xbeespi.write(0x7E);
ottaviano3 7:3cb67634fa4e 447 // Frame Length
ottaviano3 3:3c3707b0f5cd 448 _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 449 _xbeespi.write(0x04);
ottaviano3 7:3cb67634fa4e 450
ottaviano3 3:3c3707b0f5cd 451 // Frame type (config)
ottaviano3 3:3c3707b0f5cd 452 _xbeespi.write(0x08);
ottaviano3 3:3c3707b0f5cd 453 checksumsub += 0x08;
ottaviano3 3:3c3707b0f5cd 454 _xbeespi.write(0x52);
ottaviano3 3:3c3707b0f5cd 455 checksumsub += 0x52;
ottaviano3 7:3cb67634fa4e 456
ottaviano3 7:3cb67634fa4e 457 // Setting wanted SerialHigh
ottaviano3 7:3cb67634fa4e 458 _xbeespi.write(0x53);
ottaviano3 7:3cb67634fa4e 459 checksumsub += 0x53;
ottaviano3 7:3cb67634fa4e 460 _xbeespi.write(0x48);
ottaviano3 7:3cb67634fa4e 461 checksumsub += 0x48;
ottaviano3 7:3cb67634fa4e 462
ottaviano3 3:3c3707b0f5cd 463 // Calculate checksum
ottaviano3 3:3c3707b0f5cd 464 checksumsub = checksumsub & 0xFF;
ottaviano3 3:3c3707b0f5cd 465 checksum = 0xFF - checksumsub;
ottaviano3 3:3c3707b0f5cd 466 // finally write checksum
ottaviano3 3:3c3707b0f5cd 467 _xbeespi.write(checksum);
ottaviano3 7:3cb67634fa4e 468
ottaviano3 7:3cb67634fa4e 469 // RECIEVE PORTION
ottaviano3 3:3c3707b0f5cd 470 // Block until xbee replys
ottaviano3 7:3cb67634fa4e 471 while (_pin_attn != 0) { }
ottaviano3 7:3cb67634fa4e 472
ottaviano3 3:3c3707b0f5cd 473 // reset checksum to zero.
ottaviano3 3:3c3707b0f5cd 474 checksum = 0;
ottaviano3 3:3c3707b0f5cd 475 checksumsub = 0;
ottaviano3 7:3cb67634fa4e 476
ottaviano3 3:3c3707b0f5cd 477 // get start byte
ottaviano3 3:3c3707b0f5cd 478 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 479 if (temp1 != 0x7E) {
ottaviano3 3:3c3707b0f5cd 480 // drop packet
ottaviano3 9:d4542525b218 481 return 1;
ottaviano3 3:3c3707b0f5cd 482 }
ottaviano3 7:3cb67634fa4e 483 // Get length of message (we don't care we know how long)
ottaviano3 7:3cb67634fa4e 484 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 485 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 486
ottaviano3 3:3c3707b0f5cd 487 // Next read frame type to ensure it is an response packet.
ottaviano3 3:3c3707b0f5cd 488 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 489 if (temp1 != 0x88) {
ottaviano3 3:3c3707b0f5cd 490 // drop packet
ottaviano3 9:d4542525b218 491 return 1;
ottaviano3 3:3c3707b0f5cd 492 }
ottaviano3 3:3c3707b0f5cd 493 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 494
ottaviano3 3:3c3707b0f5cd 495 // get response frame id
ottaviano3 3:3c3707b0f5cd 496 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 497 if (temp1 != 0x52) {
ottaviano3 3:3c3707b0f5cd 498 // drop packet
ottaviano3 9:d4542525b218 499 return 1;
ottaviano3 3:3c3707b0f5cd 500 }
ottaviano3 3:3c3707b0f5cd 501 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 502
ottaviano3 3:3c3707b0f5cd 503 // get at response parameter
ottaviano3 3:3c3707b0f5cd 504 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 505 checksumsub += temp1;
ottaviano3 3:3c3707b0f5cd 506 temp2 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 507 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 508
ottaviano3 7:3cb67634fa4e 509 if ((temp1 != 0x53) || (temp2 != 0x48)) {
ottaviano3 9:d4542525b218 510 return 1;
ottaviano3 3:3c3707b0f5cd 511 // drop
ottaviano3 3:3c3707b0f5cd 512 }
ottaviano3 7:3cb67634fa4e 513
ottaviano3 3:3c3707b0f5cd 514 // Check OK flag
ottaviano3 3:3c3707b0f5cd 515 temp1 = _xbeespi.write(0x00);
ottaviano3 3:3c3707b0f5cd 516 if (temp1 != 0x00) {
ottaviano3 9:d4542525b218 517 return 1;
ottaviano3 3:3c3707b0f5cd 518 // drop
ottaviano3 3:3c3707b0f5cd 519 }
ottaviano3 3:3c3707b0f5cd 520 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 521
ottaviano3 7:3cb67634fa4e 522 // Now for the high portion of the serial
ottaviano3 7:3cb67634fa4e 523 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 524 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 525 temp2 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 526 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 527 temp3 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 528 checksumsub += temp3;
ottaviano3 7:3cb67634fa4e 529 temp4 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 530 checksumsub += temp4;
ottaviano3 7:3cb67634fa4e 531
ottaviano3 7:3cb67634fa4e 532 // Store new items in serial number
ottaviano3 7:3cb67634fa4e 533 serialNumber += (temp1 << 56) ^ (temp2 << 48) ^ (temp3 << 40) ^ (temp4 << 32);
ottaviano3 7:3cb67634fa4e 534
ottaviano3 3:3c3707b0f5cd 535 // Get that salty checksum
ottaviano3 3:3c3707b0f5cd 536 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 537
ottaviano3 3:3c3707b0f5cd 538 checksumsub = checksumsub & 0xFF;
ottaviano3 3:3c3707b0f5cd 539 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 540
ottaviano3 3:3c3707b0f5cd 541 // Check the checksum
ottaviano3 3:3c3707b0f5cd 542 if (temp1 != checksum) {
ottaviano3 3:3c3707b0f5cd 543 // Checksum failure, flag to discard packet
ottaviano3 9:d4542525b218 544 return 1;
ottaviano3 7:3cb67634fa4e 545 }
ottaviano3 7:3cb67634fa4e 546
ottaviano3 7:3cb67634fa4e 547 ///////////////////////////////////////////////////Send portion
ottaviano3 7:3cb67634fa4e 548 // checksum Variables
ottaviano3 7:3cb67634fa4e 549 checksum = 0;
ottaviano3 7:3cb67634fa4e 550 checksumsub = 0;
ottaviano3 7:3cb67634fa4e 551
ottaviano3 7:3cb67634fa4e 552 // Containers for read values
ottaviano3 7:3cb67634fa4e 553 temp1 = 0;
ottaviano3 7:3cb67634fa4e 554 temp2 = 0;
ottaviano3 7:3cb67634fa4e 555 temp3 = 0;
ottaviano3 7:3cb67634fa4e 556 temp4 = 0;
ottaviano3 7:3cb67634fa4e 557
ottaviano3 7:3cb67634fa4e 558 // Write frame to return serial low.
ottaviano3 7:3cb67634fa4e 559 // Total frame looks like this:
ottaviano3 7:3cb67634fa4e 560 // 7E 00 04 08 52 53(S) 4C(L) CHECKSUM
ottaviano3 7:3cb67634fa4e 561 // Wait for response to get lower part of serial
ottaviano3 7:3cb67634fa4e 562 // Profit????
ottaviano3 7:3cb67634fa4e 563
ottaviano3 7:3cb67634fa4e 564 // Frame Header
ottaviano3 7:3cb67634fa4e 565 _xbeespi.write(0x7E);
ottaviano3 7:3cb67634fa4e 566 // Frame Length
ottaviano3 7:3cb67634fa4e 567 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 568 _xbeespi.write(0x04);
ottaviano3 7:3cb67634fa4e 569
ottaviano3 7:3cb67634fa4e 570 // Frame type (config)
ottaviano3 7:3cb67634fa4e 571 _xbeespi.write(0x08);
ottaviano3 7:3cb67634fa4e 572 checksumsub += 0x08;
ottaviano3 7:3cb67634fa4e 573 _xbeespi.write(0x52);
ottaviano3 7:3cb67634fa4e 574 checksumsub += 0x52;
ottaviano3 7:3cb67634fa4e 575
ottaviano3 7:3cb67634fa4e 576 // Setting wanted SerialLow
ottaviano3 7:3cb67634fa4e 577 _xbeespi.write(0x53);
ottaviano3 7:3cb67634fa4e 578 checksumsub += 0x53;
ottaviano3 7:3cb67634fa4e 579 _xbeespi.write(0x4C);
ottaviano3 7:3cb67634fa4e 580 checksumsub += 0x4C;
ottaviano3 7:3cb67634fa4e 581
ottaviano3 7:3cb67634fa4e 582 // Calculate checksum
ottaviano3 7:3cb67634fa4e 583 checksumsub = checksumsub & 0xFF;
ottaviano3 7:3cb67634fa4e 584 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 585 // finally write checksum
ottaviano3 7:3cb67634fa4e 586 _xbeespi.write(checksum);
ottaviano3 7:3cb67634fa4e 587
ottaviano3 7:3cb67634fa4e 588 // RECIEVE PORTION
ottaviano3 7:3cb67634fa4e 589 // Block until xbee replys
ottaviano3 7:3cb67634fa4e 590 while (_pin_attn != 0) { }
ottaviano3 7:3cb67634fa4e 591
ottaviano3 7:3cb67634fa4e 592 // reset checksum to zero.
ottaviano3 7:3cb67634fa4e 593 checksum = 0;
ottaviano3 7:3cb67634fa4e 594 checksumsub = 0;
ottaviano3 7:3cb67634fa4e 595
ottaviano3 7:3cb67634fa4e 596 // get start byte
ottaviano3 7:3cb67634fa4e 597 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 598 if (temp1 != 0x7E) {
ottaviano3 7:3cb67634fa4e 599 // drop packet
ottaviano3 9:d4542525b218 600 return 1;
ottaviano3 3:3c3707b0f5cd 601 }
ottaviano3 7:3cb67634fa4e 602 // Get length of message (dont care again)
ottaviano3 7:3cb67634fa4e 603 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 604 _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 605
ottaviano3 7:3cb67634fa4e 606 // Next read frame type to ensure it is an response packet.
ottaviano3 7:3cb67634fa4e 607 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 608 if (temp1 != 0x88) {
ottaviano3 7:3cb67634fa4e 609 // drop packet
ottaviano3 9:d4542525b218 610 return 1;
ottaviano3 7:3cb67634fa4e 611 }
ottaviano3 7:3cb67634fa4e 612 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 613
ottaviano3 7:3cb67634fa4e 614 // get response frame id
ottaviano3 7:3cb67634fa4e 615 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 616 if (temp1 != 0x52) {
ottaviano3 7:3cb67634fa4e 617 // drop packet
ottaviano3 9:d4542525b218 618 return 1;
ottaviano3 7:3cb67634fa4e 619 }
ottaviano3 7:3cb67634fa4e 620 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 621
ottaviano3 7:3cb67634fa4e 622 // get at response parameter
ottaviano3 7:3cb67634fa4e 623 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 624 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 625 temp2 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 626 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 627
ottaviano3 7:3cb67634fa4e 628 if ((temp1 != 0x53) || (temp2 != 0x4C)) {
ottaviano3 9:d4542525b218 629 return 1;
ottaviano3 7:3cb67634fa4e 630 // drop
ottaviano3 7:3cb67634fa4e 631 }
ottaviano3 3:3c3707b0f5cd 632
ottaviano3 7:3cb67634fa4e 633 // Check OK flag
ottaviano3 7:3cb67634fa4e 634 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 635 if (temp1 != 0x00) {
ottaviano3 9:d4542525b218 636 return 1;
ottaviano3 7:3cb67634fa4e 637 // drop
ottaviano3 7:3cb67634fa4e 638 }
ottaviano3 7:3cb67634fa4e 639 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 640
ottaviano3 7:3cb67634fa4e 641 // Now for the high portion of the serial
ottaviano3 7:3cb67634fa4e 642 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 643 checksumsub += temp1;
ottaviano3 7:3cb67634fa4e 644 temp2 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 645 checksumsub += temp2;
ottaviano3 7:3cb67634fa4e 646 temp3 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 647 checksumsub += temp3;
ottaviano3 7:3cb67634fa4e 648 temp4 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 649 checksumsub += temp4;
ottaviano3 7:3cb67634fa4e 650
ottaviano3 7:3cb67634fa4e 651 serialNumber += (temp1 << 24) ^ (temp2 << 16) ^ (temp3 << 8) ^ (temp4);
ottaviano3 7:3cb67634fa4e 652
ottaviano3 7:3cb67634fa4e 653 // Get that salty checksum
ottaviano3 7:3cb67634fa4e 654 temp1 = _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 655
ottaviano3 7:3cb67634fa4e 656 checksumsub = checksumsub & 0xFF;
ottaviano3 7:3cb67634fa4e 657 checksum = 0xFF - checksumsub;
ottaviano3 7:3cb67634fa4e 658
ottaviano3 7:3cb67634fa4e 659 // Check the checksum
ottaviano3 7:3cb67634fa4e 660 if (temp1 != checksum) {
ottaviano3 7:3cb67634fa4e 661 // Checksum failure, flag to discard packet
ottaviano3 9:d4542525b218 662 return 1;
ottaviano3 7:3cb67634fa4e 663 }
ottaviano3 7:3cb67634fa4e 664
ottaviano3 7:3cb67634fa4e 665 return serialNumber;
ottaviano3 6:3873db4a0164 666 }
ottaviano3 6:3873db4a0164 667
ottaviano3 7:3cb67634fa4e 668 void xbee900hp::clearBuff() {
ottaviano3 6:3873db4a0164 669 while(_pin_attn == 0) {
ottaviano3 6:3873db4a0164 670 _xbeespi.write(0x00);
ottaviano3 6:3873db4a0164 671 }
ottaviano3 7:3cb67634fa4e 672 }
ottaviano3 7:3cb67634fa4e 673
ottaviano3 9:d4542525b218 674 char xbee900hp::xbee_getc() {
ottaviano3 7:3cb67634fa4e 675 return _xbeespi.write(0x00);
ottaviano3 7:3cb67634fa4e 676 }