The presence of rtos library, and line 294 in RF12B.cpp causes a crash when ISR occurs on falling edge on pin 9.

Dependencies:   mbed

Committer:
narshu
Date:
Sun Mar 25 20:14:41 2012 +0000
Revision:
0:b4c2aa657754

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 0:b4c2aa657754 1 #include "RF12B.h"
narshu 0:b4c2aa657754 2
narshu 0:b4c2aa657754 3 #include "RF_defs.h"
narshu 0:b4c2aa657754 4 #include <algorithm>
narshu 0:b4c2aa657754 5
narshu 0:b4c2aa657754 6 //#include "globals.h"
narshu 0:b4c2aa657754 7
narshu 0:b4c2aa657754 8 DigitalOut DBG2(LED2);
narshu 0:b4c2aa657754 9 DigitalOut DBG3(LED3);
narshu 0:b4c2aa657754 10 DigitalOut DBG4(LED4);
narshu 0:b4c2aa657754 11
narshu 0:b4c2aa657754 12 RF12B::RF12B(PinName _SDI,
narshu 0:b4c2aa657754 13 PinName _SDO,
narshu 0:b4c2aa657754 14 PinName _SCK,
narshu 0:b4c2aa657754 15 PinName _NCS,
narshu 0:b4c2aa657754 16 PinName _NIRQ):spi(_SDI, _SDO, _SCK),
narshu 0:b4c2aa657754 17 NCS(_NCS), NIRQ(_NIRQ), NIRQ_in(_NIRQ){// rfled(LED3) {
narshu 0:b4c2aa657754 18
narshu 0:b4c2aa657754 19 /* SPI frequency, word lenght, polarity and phase */
narshu 0:b4c2aa657754 20 spi.format(16,0);
narshu 0:b4c2aa657754 21 spi.frequency(2000000);
narshu 0:b4c2aa657754 22
narshu 0:b4c2aa657754 23 /* Set ~CS high */
narshu 0:b4c2aa657754 24 NCS = 1;
narshu 0:b4c2aa657754 25
narshu 0:b4c2aa657754 26 /* Initialise RF Module */
narshu 0:b4c2aa657754 27 init();
narshu 0:b4c2aa657754 28
narshu 0:b4c2aa657754 29 /* Setup interrupt to happen on falling edge of NIRQ */
narshu 0:b4c2aa657754 30 NIRQ.fall(this, &RF12B::rxISR);
narshu 0:b4c2aa657754 31
narshu 0:b4c2aa657754 32
narshu 0:b4c2aa657754 33 }
narshu 0:b4c2aa657754 34
narshu 0:b4c2aa657754 35 /* Returns the packet length if data is available in the receive buffer, 0 otherwise*/
narshu 0:b4c2aa657754 36 unsigned int RF12B::available() {
narshu 0:b4c2aa657754 37 return fifo.size();
narshu 0:b4c2aa657754 38 }
narshu 0:b4c2aa657754 39
narshu 0:b4c2aa657754 40 /* Reads a packet of data, with length "size" Returns false if read failed. TODO: make a metafifo to isolate packets*/
narshu 0:b4c2aa657754 41 bool RF12B::read(unsigned char* data, unsigned int size) {
narshu 0:b4c2aa657754 42 if (fifo.size() == 0) {
narshu 0:b4c2aa657754 43 return false;
narshu 0:b4c2aa657754 44 } else {
narshu 0:b4c2aa657754 45 unsigned int i = 0;
narshu 0:b4c2aa657754 46 while (fifo.size() > 0 && i < size) {
narshu 0:b4c2aa657754 47 data[i++] = fifo.front();
narshu 0:b4c2aa657754 48 fifo.pop();
narshu 0:b4c2aa657754 49 }
narshu 0:b4c2aa657754 50 return true;
narshu 0:b4c2aa657754 51 }
narshu 0:b4c2aa657754 52 }
narshu 0:b4c2aa657754 53
narshu 0:b4c2aa657754 54 /* Reads a byte of data from the receive buffer */
narshu 0:b4c2aa657754 55 unsigned char RF12B::read() {
narshu 0:b4c2aa657754 56 if (available()) {
narshu 0:b4c2aa657754 57 unsigned char data = fifo.front();
narshu 0:b4c2aa657754 58 fifo.pop();
narshu 0:b4c2aa657754 59 return data;
narshu 0:b4c2aa657754 60 } else {
narshu 0:b4c2aa657754 61 return 0xFF; // Error val although could also be data...
narshu 0:b4c2aa657754 62 }
narshu 0:b4c2aa657754 63 }
narshu 0:b4c2aa657754 64
narshu 0:b4c2aa657754 65 /* Sends a packet of data to the RF module for transmission TODO: Make asych*/
narshu 0:b4c2aa657754 66 void RF12B::write(unsigned char *data, unsigned char length) {
narshu 0:b4c2aa657754 67 unsigned char crc = 0;
narshu 0:b4c2aa657754 68
narshu 0:b4c2aa657754 69 /* Transmitter mode */
narshu 0:b4c2aa657754 70 changeMode(TX);
narshu 0:b4c2aa657754 71
narshu 0:b4c2aa657754 72 writeCmd(0x0000);
narshu 0:b4c2aa657754 73 send(0xAA); // PREAMBLE
narshu 0:b4c2aa657754 74 send(0xAA);
narshu 0:b4c2aa657754 75 send(0xAA);
narshu 0:b4c2aa657754 76 send(0x2D); // SYNC
narshu 0:b4c2aa657754 77 send(0xD4);
narshu 0:b4c2aa657754 78 /* Packet Length */
narshu 0:b4c2aa657754 79 send(length);
narshu 0:b4c2aa657754 80 crc = crc8(crc, length);
narshu 0:b4c2aa657754 81 send(crc);
narshu 0:b4c2aa657754 82 crc = crc8(crc, crc);
narshu 0:b4c2aa657754 83 /* Packet Data */
narshu 0:b4c2aa657754 84 for (unsigned char i=0; i<length; i++) {
narshu 0:b4c2aa657754 85 send(data[i]);
narshu 0:b4c2aa657754 86 crc = crc8(crc, data[i]);
narshu 0:b4c2aa657754 87 }
narshu 0:b4c2aa657754 88 send(crc);
narshu 0:b4c2aa657754 89 send(0xAA); // DUMMY BYTES
narshu 0:b4c2aa657754 90 send(0xAA);
narshu 0:b4c2aa657754 91 send(0xAA);
narshu 0:b4c2aa657754 92
narshu 0:b4c2aa657754 93 /* Back to receiver mode */
narshu 0:b4c2aa657754 94 changeMode(RX);
narshu 0:b4c2aa657754 95 status();
narshu 0:b4c2aa657754 96
narshu 0:b4c2aa657754 97
narshu 0:b4c2aa657754 98 }
narshu 0:b4c2aa657754 99
narshu 0:b4c2aa657754 100 /* Transmit a 1-byte data packet */
narshu 0:b4c2aa657754 101 void RF12B::write(unsigned char data) {
narshu 0:b4c2aa657754 102 write(&data, 1);
narshu 0:b4c2aa657754 103 }
narshu 0:b4c2aa657754 104
narshu 0:b4c2aa657754 105 void RF12B::write(queue<char> &data, int length) {
narshu 0:b4c2aa657754 106 char crc = 0;
narshu 0:b4c2aa657754 107 char length_byte = 0;
narshu 0:b4c2aa657754 108
narshu 0:b4c2aa657754 109 /* -1 means try to transmit everything in the queue */
narshu 0:b4c2aa657754 110 if(length == -1) {
narshu 0:b4c2aa657754 111 length = data.size();
narshu 0:b4c2aa657754 112 }
narshu 0:b4c2aa657754 113
narshu 0:b4c2aa657754 114 /* max length of packet is 255 */
narshu 0:b4c2aa657754 115 length_byte = min(length, 255);
narshu 0:b4c2aa657754 116
narshu 0:b4c2aa657754 117 /* Transmitter mode */
narshu 0:b4c2aa657754 118 changeMode(TX);
narshu 0:b4c2aa657754 119
narshu 0:b4c2aa657754 120 writeCmd(0x0000);
narshu 0:b4c2aa657754 121 send(0xAA); // PREAMBLE
narshu 0:b4c2aa657754 122 send(0xAA);
narshu 0:b4c2aa657754 123 send(0xAA);
narshu 0:b4c2aa657754 124 send(0x2D); // SYNC
narshu 0:b4c2aa657754 125 send(0xD4);
narshu 0:b4c2aa657754 126 /* Packet Length */
narshu 0:b4c2aa657754 127 send(length_byte);
narshu 0:b4c2aa657754 128 crc = crc8(crc, length_byte);
narshu 0:b4c2aa657754 129 send(crc);
narshu 0:b4c2aa657754 130 crc = crc8(crc, crc);
narshu 0:b4c2aa657754 131 /* Packet Data */
narshu 0:b4c2aa657754 132 for (char i=0; i<length_byte; i++) {
narshu 0:b4c2aa657754 133 send(data.front());
narshu 0:b4c2aa657754 134 crc = crc8(crc, data.front());
narshu 0:b4c2aa657754 135 data.pop();
narshu 0:b4c2aa657754 136 }
narshu 0:b4c2aa657754 137 send(crc);
narshu 0:b4c2aa657754 138 send(0xAA); // DUMMY BYTES
narshu 0:b4c2aa657754 139 send(0xAA);
narshu 0:b4c2aa657754 140 send(0xAA);
narshu 0:b4c2aa657754 141
narshu 0:b4c2aa657754 142 /* Back to receiver mode */
narshu 0:b4c2aa657754 143 changeMode(RX);
narshu 0:b4c2aa657754 144 status();
narshu 0:b4c2aa657754 145 }
narshu 0:b4c2aa657754 146
narshu 0:b4c2aa657754 147 /**********************************************************************
narshu 0:b4c2aa657754 148 * PRIVATE FUNCTIONS
narshu 0:b4c2aa657754 149 *********************************************************************/
narshu 0:b4c2aa657754 150
narshu 0:b4c2aa657754 151 /* Initialises the RF12B module */
narshu 0:b4c2aa657754 152 void RF12B::init() {
narshu 0:b4c2aa657754 153 /* writeCmd(0x80E7); //EL,EF,868band,12.0pF
narshu 0:b4c2aa657754 154 changeMode(RX);
narshu 0:b4c2aa657754 155 writeCmd(0xA640); //frequency select
narshu 0:b4c2aa657754 156 writeCmd(0xC647); //4.8kbps
narshu 0:b4c2aa657754 157 writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
narshu 0:b4c2aa657754 158 writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
narshu 0:b4c2aa657754 159 writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
narshu 0:b4c2aa657754 160 writeCmd(0xCED4); //SYNC=2DD4
narshu 0:b4c2aa657754 161 writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
narshu 0:b4c2aa657754 162 writeCmd(0x9850); //!mp,90kHz,MAX OUT
narshu 0:b4c2aa657754 163 writeCmd(0xCC17); //OB1, COB0, LPX, Iddy, CDDIT&#65533;CBW0
narshu 0:b4c2aa657754 164 writeCmd(0xE000); //NOT USED
narshu 0:b4c2aa657754 165 writeCmd(0xC800); //NOT USED
narshu 0:b4c2aa657754 166 writeCmd(0xC040); //1.66MHz,2.2V */
narshu 0:b4c2aa657754 167
narshu 0:b4c2aa657754 168 writeCmd(
narshu 0:b4c2aa657754 169 RFM_CONFIG_EL |
narshu 0:b4c2aa657754 170 RFM_CONFIG_EF |
narshu 0:b4c2aa657754 171 RFM_CONFIG_BAND_433 //|
narshu 0:b4c2aa657754 172 //RFM_CONFIG_X_11_0pf // meh, using default
narshu 0:b4c2aa657754 173 );
narshu 0:b4c2aa657754 174
narshu 0:b4c2aa657754 175 // 2. Power Management Command
narshu 0:b4c2aa657754 176 // leave everything switched off for now
narshu 0:b4c2aa657754 177 /*
narshu 0:b4c2aa657754 178 writeCmd(
narshu 0:b4c2aa657754 179 RFM_POWER_MANAGEMENT // switch all off
narshu 0:b4c2aa657754 180 );
narshu 0:b4c2aa657754 181 */
narshu 0:b4c2aa657754 182
narshu 0:b4c2aa657754 183 // 3. Frequency Setting Command
narshu 0:b4c2aa657754 184 writeCmd(
narshu 0:b4c2aa657754 185 RFM_FREQUENCY |
narshu 0:b4c2aa657754 186 RFM_FREQ_433Band(435.7) //I totally made this value up... if someone knows where the sweetspots are in this band, tell me!
narshu 0:b4c2aa657754 187 );
narshu 0:b4c2aa657754 188
narshu 0:b4c2aa657754 189
narshu 0:b4c2aa657754 190 // 4. Data Rate Command
narshu 0:b4c2aa657754 191 writeCmd(RFM_DATA_RATE_9600);
narshu 0:b4c2aa657754 192
narshu 0:b4c2aa657754 193
narshu 0:b4c2aa657754 194 // 5. Receiver Control Command
narshu 0:b4c2aa657754 195 writeCmd(
narshu 0:b4c2aa657754 196 RFM_RX_CONTROL_P20_VDI |
narshu 0:b4c2aa657754 197 RFM_RX_CONTROL_VDI_FAST |
narshu 0:b4c2aa657754 198 //RFM_RX_CONTROL_BW(RFM_BAUD_RATE) |
narshu 0:b4c2aa657754 199 RFM_RX_CONTROL_BW_134 | // CHANGE THIS TO 67 TO IMPROVE RANGE! (though the bitrate must then be below 8kbaud, and fsk modulation changed)
narshu 0:b4c2aa657754 200 RFM_RX_CONTROL_GAIN_0 |
narshu 0:b4c2aa657754 201 RFM_RX_CONTROL_RSSI_103 // Might need adjustment. Datasheet says around 10^-5 bit error rate at this level and baudrate.
narshu 0:b4c2aa657754 202 );
narshu 0:b4c2aa657754 203
narshu 0:b4c2aa657754 204 // 6. Data Filter Command
narshu 0:b4c2aa657754 205 writeCmd(
narshu 0:b4c2aa657754 206 RFM_DATA_FILTER_AL |
narshu 0:b4c2aa657754 207 RFM_DATA_FILTER_ML |
narshu 0:b4c2aa657754 208 RFM_DATA_FILTER_DIG //|
narshu 0:b4c2aa657754 209 //RFM_DATA_FILTER_DQD(4)
narshu 0:b4c2aa657754 210 );
narshu 0:b4c2aa657754 211
narshu 0:b4c2aa657754 212 // 7. FIFO and Reset Mode Command
narshu 0:b4c2aa657754 213 writeCmd(
narshu 0:b4c2aa657754 214 RFM_FIFO_IT(8) |
narshu 0:b4c2aa657754 215 RFM_FIFO_DR |
narshu 0:b4c2aa657754 216 0x8 //turn on 16bit sync word
narshu 0:b4c2aa657754 217 );
narshu 0:b4c2aa657754 218
narshu 0:b4c2aa657754 219 // 8. FIFO Syncword
narshu 0:b4c2aa657754 220 // Leave as default: 0xD4
narshu 0:b4c2aa657754 221
narshu 0:b4c2aa657754 222 // 9. Receiver FIFO Read
narshu 0:b4c2aa657754 223 // when the interupt goes high, (and if we can assume that it was a fifo fill interrupt) we can read a byte using:
narshu 0:b4c2aa657754 224 // result = RFM_READ_FIFO();
narshu 0:b4c2aa657754 225
narshu 0:b4c2aa657754 226 // 10. AFC Command
narshu 0:b4c2aa657754 227 writeCmd(
narshu 0:b4c2aa657754 228 //RFM_AFC_AUTO_VDI | //Note this might be changed to improve range. Refer to datasheet.
narshu 0:b4c2aa657754 229 RFM_AFC_AUTO_INDEPENDENT |
narshu 0:b4c2aa657754 230 RFM_AFC_RANGE_LIMIT_7_8 |
narshu 0:b4c2aa657754 231 RFM_AFC_EN |
narshu 0:b4c2aa657754 232 RFM_AFC_OE |
narshu 0:b4c2aa657754 233 RFM_AFC_FI
narshu 0:b4c2aa657754 234 );
narshu 0:b4c2aa657754 235
narshu 0:b4c2aa657754 236 // 11. TX Configuration Control Command
narshu 0:b4c2aa657754 237 writeCmd(
narshu 0:b4c2aa657754 238 RFM_TX_CONTROL_MOD_60 |
narshu 0:b4c2aa657754 239 RFM_TX_CONTROL_POW_0
narshu 0:b4c2aa657754 240 );
narshu 0:b4c2aa657754 241
narshu 0:b4c2aa657754 242
narshu 0:b4c2aa657754 243 // 12. PLL Setting Command
narshu 0:b4c2aa657754 244 writeCmd(
narshu 0:b4c2aa657754 245 0xCC77 & ~0x01 // Setting the PLL bandwith, less noise, but max bitrate capped at 86.2
narshu 0:b4c2aa657754 246 // I think this will slow down the pll's reaction time. Not sure, check with someone!
narshu 0:b4c2aa657754 247 );
narshu 0:b4c2aa657754 248
narshu 0:b4c2aa657754 249 changeMode(RX);
narshu 0:b4c2aa657754 250 resetRX();
narshu 0:b4c2aa657754 251 status();
narshu 0:b4c2aa657754 252 }
narshu 0:b4c2aa657754 253
narshu 0:b4c2aa657754 254 /* Write a command to the RF Module */
narshu 0:b4c2aa657754 255 unsigned int RF12B::writeCmd(unsigned int cmd) {
narshu 0:b4c2aa657754 256 NCS = 0;
narshu 0:b4c2aa657754 257 unsigned int recv = spi.write(cmd);
narshu 0:b4c2aa657754 258 NCS = 1;
narshu 0:b4c2aa657754 259 return recv;
narshu 0:b4c2aa657754 260 }
narshu 0:b4c2aa657754 261
narshu 0:b4c2aa657754 262 /* Sends a byte of data across RF */
narshu 0:b4c2aa657754 263 void RF12B::send(unsigned char data) {
narshu 0:b4c2aa657754 264 while (NIRQ);
narshu 0:b4c2aa657754 265 writeCmd(0xB800 + data);
narshu 0:b4c2aa657754 266 }
narshu 0:b4c2aa657754 267
narshu 0:b4c2aa657754 268 /* Change the mode of the RF module to Transmitting or Receiving */
narshu 0:b4c2aa657754 269 void RF12B::changeMode(rfmode_t _mode) {
narshu 0:b4c2aa657754 270 mode = _mode;
narshu 0:b4c2aa657754 271 if (_mode == TX) {
narshu 0:b4c2aa657754 272 writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
narshu 0:b4c2aa657754 273 } else { /* mode == RX */
narshu 0:b4c2aa657754 274 writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC
narshu 0:b4c2aa657754 275 }
narshu 0:b4c2aa657754 276 }
narshu 0:b4c2aa657754 277
narshu 0:b4c2aa657754 278 /* Interrupt routine for data reception */
narshu 0:b4c2aa657754 279 void RF12B::rxISR() {
narshu 0:b4c2aa657754 280
narshu 0:b4c2aa657754 281 static int cnt = 0;
narshu 0:b4c2aa657754 282 //printf("%d hits\r\n", cnt);
narshu 0:b4c2aa657754 283 cnt++;
narshu 0:b4c2aa657754 284
narshu 0:b4c2aa657754 285 DBG2 = !(cnt%3);
narshu 0:b4c2aa657754 286 DBG3 = !((cnt+1)%3);
narshu 0:b4c2aa657754 287 DBG4 = !((cnt+2)%3);
narshu 0:b4c2aa657754 288
narshu 0:b4c2aa657754 289
narshu 0:b4c2aa657754 290 unsigned int data = 0;
narshu 0:b4c2aa657754 291 static int i = -2;
narshu 0:b4c2aa657754 292 static unsigned char packet_length = 0;
narshu 0:b4c2aa657754 293 static unsigned char crc = 0;
narshu 0:b4c2aa657754 294 static queue<unsigned char> temp;
narshu 0:b4c2aa657754 295
narshu 0:b4c2aa657754 296
narshu 0:b4c2aa657754 297 //Loop while interrupt is asserted
narshu 0:b4c2aa657754 298 while (!NIRQ_in && mode == RX) {
narshu 0:b4c2aa657754 299
narshu 0:b4c2aa657754 300
narshu 0:b4c2aa657754 301 // Grab the packet's length byte
narshu 0:b4c2aa657754 302 if (i == -2) {
narshu 0:b4c2aa657754 303 data = writeCmd(0x0000);
narshu 0:b4c2aa657754 304 if ( (data&0x8000) ) {
narshu 0:b4c2aa657754 305 data = writeCmd(0xB000);
narshu 0:b4c2aa657754 306 packet_length = (data&0x00FF);
narshu 0:b4c2aa657754 307 crc = crc8(crc, packet_length);
narshu 0:b4c2aa657754 308 i++;
narshu 0:b4c2aa657754 309 }
narshu 0:b4c2aa657754 310 }
narshu 0:b4c2aa657754 311
narshu 0:b4c2aa657754 312 //If we exhaust the interrupt, exit
narshu 0:b4c2aa657754 313 if (NIRQ_in)
narshu 0:b4c2aa657754 314 break;
narshu 0:b4c2aa657754 315
narshu 0:b4c2aa657754 316 // Check that packet length was correct
narshu 0:b4c2aa657754 317 if (i == -1) {
narshu 0:b4c2aa657754 318 data = writeCmd(0x0000);
narshu 0:b4c2aa657754 319 if ( (data&0x8000) ) {
narshu 0:b4c2aa657754 320 data = writeCmd(0xB000);
narshu 0:b4c2aa657754 321 unsigned char crcofsize = (data&0x00FF);
narshu 0:b4c2aa657754 322 if (crcofsize != crc) {
narshu 0:b4c2aa657754 323 //It was wrong, start over
narshu 0:b4c2aa657754 324 i = -2;
narshu 0:b4c2aa657754 325 packet_length = 0;
narshu 0:b4c2aa657754 326 crc = 0;
narshu 0:b4c2aa657754 327 temp = queue<unsigned char>();
narshu 0:b4c2aa657754 328 resetRX();
narshu 0:b4c2aa657754 329 } else {
narshu 0:b4c2aa657754 330 crc = crc8(crc, crcofsize);
narshu 0:b4c2aa657754 331 i++;
narshu 0:b4c2aa657754 332 }
narshu 0:b4c2aa657754 333 }
narshu 0:b4c2aa657754 334 }
narshu 0:b4c2aa657754 335
narshu 0:b4c2aa657754 336 //If we exhaust the interrupt, exit
narshu 0:b4c2aa657754 337 if (NIRQ_in)
narshu 0:b4c2aa657754 338 break;
narshu 0:b4c2aa657754 339
narshu 0:b4c2aa657754 340 // Grab the packet's data
narshu 0:b4c2aa657754 341 if (i >= 0 && i < packet_length) {
narshu 0:b4c2aa657754 342 data = writeCmd(0x0000);
narshu 0:b4c2aa657754 343 if ( (data&0x8000) ) {
narshu 0:b4c2aa657754 344 data = writeCmd(0xB000);
narshu 0:b4c2aa657754 345 temp.push(data&0x00FF);
narshu 0:b4c2aa657754 346 crc = crc8(crc, (unsigned char)(data&0x00FF));
narshu 0:b4c2aa657754 347 i++;
narshu 0:b4c2aa657754 348 }
narshu 0:b4c2aa657754 349 }
narshu 0:b4c2aa657754 350
narshu 0:b4c2aa657754 351 //If we exhaust the interrupt, exit
narshu 0:b4c2aa657754 352 if (NIRQ_in)
narshu 0:b4c2aa657754 353 break;
narshu 0:b4c2aa657754 354
narshu 0:b4c2aa657754 355 if (i >= packet_length) {
narshu 0:b4c2aa657754 356 data = writeCmd(0x0000);
narshu 0:b4c2aa657754 357 if ( (data&0x8000) ) {
narshu 0:b4c2aa657754 358 data = writeCmd(0xB000);
narshu 0:b4c2aa657754 359 if ((unsigned char)(data & 0x00FF) == crc) {
narshu 0:b4c2aa657754 360 //If the checksum is correct, add our data to the end of the output buffer
narshu 0:b4c2aa657754 361 while (!temp.empty()) {
narshu 0:b4c2aa657754 362 fifo.push(temp.front());
narshu 0:b4c2aa657754 363 temp.pop();
narshu 0:b4c2aa657754 364 }
narshu 0:b4c2aa657754 365 }
narshu 0:b4c2aa657754 366
narshu 0:b4c2aa657754 367 // Tell RF Module we are finished, and clean up
narshu 0:b4c2aa657754 368 i = -2;
narshu 0:b4c2aa657754 369 packet_length = 0;
narshu 0:b4c2aa657754 370 crc = 0;
narshu 0:b4c2aa657754 371 temp = queue<unsigned char>();
narshu 0:b4c2aa657754 372 resetRX();
narshu 0:b4c2aa657754 373 }
narshu 0:b4c2aa657754 374 }
narshu 0:b4c2aa657754 375 }
narshu 0:b4c2aa657754 376
narshu 0:b4c2aa657754 377 }
narshu 0:b4c2aa657754 378
narshu 0:b4c2aa657754 379 unsigned int RF12B::status() {
narshu 0:b4c2aa657754 380 return writeCmd(0x0000);
narshu 0:b4c2aa657754 381 }
narshu 0:b4c2aa657754 382
narshu 0:b4c2aa657754 383 /* Tell the RF Module this packet is received and wait for the next */
narshu 0:b4c2aa657754 384 void RF12B::resetRX() {
narshu 0:b4c2aa657754 385 writeCmd(0xCA81);
narshu 0:b4c2aa657754 386 writeCmd(0xCA83);
narshu 0:b4c2aa657754 387 };
narshu 0:b4c2aa657754 388
narshu 0:b4c2aa657754 389 /* Calculate CRC8 */
narshu 0:b4c2aa657754 390 unsigned char RF12B::crc8(unsigned char crc, unsigned char data) {
narshu 0:b4c2aa657754 391 crc = crc ^ data;
narshu 0:b4c2aa657754 392 for (int i = 0; i < 8; i++) {
narshu 0:b4c2aa657754 393 if (crc & 0x01) {
narshu 0:b4c2aa657754 394 crc = (crc >> 1) ^ 0x8C;
narshu 0:b4c2aa657754 395 } else {
narshu 0:b4c2aa657754 396 crc >>= 1;
narshu 0:b4c2aa657754 397 }
narshu 0:b4c2aa657754 398 }
narshu 0:b4c2aa657754 399 return crc;
narshu 0:b4c2aa657754 400 }