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
xbee900hp.cpp@15:3bb82129f3a8, 2016-04-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |