xbee communication for UWB quadcopter project Originally by Greg Abdo Forking to reduce impact of interrupt by moving packetbuilder out of the interrupt and letting be handled in the main loop

Fork of com by Prosper Van

Committer:
oprospero
Date:
Sat Feb 15 19:54:45 2014 +0000
Revision:
1:4f53de75bc96
Parent:
0:26a151d2c6db
Child:
2:bd1621102cad
Update new commands tirms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oprospero 0:26a151d2c6db 1 /****************************** com.cpp **********************************/
oprospero 0:26a151d2c6db 2 /* Version: 1.0 */
oprospero 0:26a151d2c6db 3 /* Last Updated: June 1, 2013 */
oprospero 0:26a151d2c6db 4 /* */
oprospero 0:26a151d2c6db 5 /* The com class implements reliable data transfer between two nodes */
oprospero 0:26a151d2c6db 6 /*using a checksum and a sequence number for guaranteed message delivery */
oprospero 0:26a151d2c6db 7 /*over an xbee modem connected to the passed in tx and rx pins. Messages */
oprospero 0:26a151d2c6db 8 /*are received and placed in the rxBuffer to be read when convenient. */
oprospero 0:26a151d2c6db 9 /*Messages are encoded by sending a byte with the value of the command */
oprospero 0:26a151d2c6db 10 /*then and int of the command. */
oprospero 0:26a151d2c6db 11 /* */
oprospero 0:26a151d2c6db 12 /* Commands: 0 -> Ack, does not get placed in rxQueue. */
oprospero 0:26a151d2c6db 13 /* 1 -> Throttle */
oprospero 0:26a151d2c6db 14 /* 2 -> Pitch */
oprospero 0:26a151d2c6db 15 /* 3 -> Roll */
oprospero 0:26a151d2c6db 16 /* 4 -> Yaw */
oprospero 0:26a151d2c6db 17 /*************************************************************************/
oprospero 0:26a151d2c6db 18
oprospero 0:26a151d2c6db 19 #include "mbed.h"
oprospero 0:26a151d2c6db 20 #include "com.h"
oprospero 0:26a151d2c6db 21
oprospero 1:4f53de75bc96 22
oprospero 0:26a151d2c6db 23 /*********************** com( PinName, PinName ) *************************/
oprospero 0:26a151d2c6db 24 /* */
oprospero 0:26a151d2c6db 25 /*************************************************************************/
oprospero 0:26a151d2c6db 26
oprospero 1:4f53de75bc96 27 com::com( PinName tx, PinName rx , PinName rssipin) : xbeeTx( tx, rx), xbeeRx( tx, rx), rssi(rssipin)
oprospero 0:26a151d2c6db 28 {
oprospero 0:26a151d2c6db 29 bLength = 0; // How many bytes are in the buffer.
oprospero 1:4f53de75bc96 30 xbeeTx.baud(BAUDRATE); // Setup the serial baud rate.
oprospero 0:26a151d2c6db 31 xbeeRx.baud(BAUDRATE); // Setup the serial baud rate.
oprospero 0:26a151d2c6db 32 rxBuffer = new queue(); // Point to the rxQueue.
oprospero 0:26a151d2c6db 33 signalStrength = 0;
oprospero 0:26a151d2c6db 34 xbeeRx.attach( this, &com::callback ); // Set callback as the interrupt handler.
oprospero 1:4f53de75bc96 35 #ifdef DEBUG
oprospero 0:26a151d2c6db 36 xbeeTx.printf("Communication.....Done\n\r");
oprospero 1:4f53de75bc96 37 #endif
oprospero 0:26a151d2c6db 38 }
oprospero 0:26a151d2c6db 39
oprospero 0:26a151d2c6db 40 /************************* bool isData() ********************************/
oprospero 0:26a151d2c6db 41 /* */
oprospero 0:26a151d2c6db 42 /*************************************************************************/
oprospero 0:26a151d2c6db 43
oprospero 0:26a151d2c6db 44 bool com::isData()
oprospero 0:26a151d2c6db 45 {
oprospero 1:4f53de75bc96 46 return !rxBuffer->isEmpty();
oprospero 0:26a151d2c6db 47 }
oprospero 0:26a151d2c6db 48
oprospero 0:26a151d2c6db 49 /************************ void write( char ) *****************************/
oprospero 0:26a151d2c6db 50 /* Write a packet out the xbee com port. */
oprospero 0:26a151d2c6db 51 /* */
oprospero 0:26a151d2c6db 52 /* Data format byte[] */
oprospero 0:26a151d2c6db 53 /* byte[0] = command. */
oprospero 0:26a151d2c6db 54 /* byte[1] = upper 8 bits of value. */
oprospero 0:26a151d2c6db 55 /* byte[2] = lower 8 bits of value. */
oprospero 0:26a151d2c6db 56 /* byte[3] = Checksum byte[0] + byte[2]. */
oprospero 0:26a151d2c6db 57 /* byte[4] = Sequence Number. */
oprospero 0:26a151d2c6db 58 /* byte[5] = 255 End of message. */
oprospero 0:26a151d2c6db 59 /*************************************************************************/
oprospero 0:26a151d2c6db 60
oprospero 0:26a151d2c6db 61 void com::write( short command, short value )
oprospero 0:26a151d2c6db 62 {
oprospero 1:4f53de75bc96 63 short lvalue = (value % 128);
oprospero 0:26a151d2c6db 64 xbeeTx.putc( (char)command ); // Command
oprospero 1:4f53de75bc96 65 xbeeTx.putc( (char) value / 128 ); // First 8 bits in array.
oprospero 1:4f53de75bc96 66 xbeeTx.putc( (char) lvalue); // Second 8 bits in array.
oprospero 1:4f53de75bc96 67 xbeeTx.putc( command + lvalue ); // Checksum array[0] + array[1].
oprospero 1:4f53de75bc96 68 xbeeTx.putc( (char)value ); // Sequence number.
oprospero 0:26a151d2c6db 69 xbeeTx.putc( 255 ); // End of message.
oprospero 0:26a151d2c6db 70 }
oprospero 0:26a151d2c6db 71
oprospero 0:26a151d2c6db 72 /*************************** char read() ********************************/
oprospero 0:26a151d2c6db 73 /* */
oprospero 0:26a151d2c6db 74 /*************************************************************************/
oprospero 0:26a151d2c6db 75
oprospero 0:26a151d2c6db 76 short * com::read()
oprospero 0:26a151d2c6db 77 {
oprospero 0:26a151d2c6db 78 if( !rxBuffer->isEmpty())
oprospero 0:26a151d2c6db 79 return rxBuffer->pop();
oprospero 0:26a151d2c6db 80
oprospero 0:26a151d2c6db 81 return NULL;
oprospero 0:26a151d2c6db 82 }
oprospero 0:26a151d2c6db 83
oprospero 0:26a151d2c6db 84 /************************ void callback() ********************************/
oprospero 0:26a151d2c6db 85 /* */
oprospero 0:26a151d2c6db 86 /*************************************************************************/
oprospero 0:26a151d2c6db 87
oprospero 0:26a151d2c6db 88 void com::callback()
oprospero 0:26a151d2c6db 89 {
oprospero 0:26a151d2c6db 90 while( xbeeRx.readable() )
oprospero 0:26a151d2c6db 91 {
oprospero 0:26a151d2c6db 92 char data = xbeeRx.getc();
oprospero 0:26a151d2c6db 93 // xbeeTx.printf("data: %d\n\r", data);
oprospero 0:26a151d2c6db 94 if( bLength++ < BUFFERSIZE )
oprospero 0:26a151d2c6db 95 buffer[bLength] = data;
oprospero 0:26a151d2c6db 96
oprospero 0:26a151d2c6db 97 if( data == 255 )
oprospero 0:26a151d2c6db 98 packetBuilder();
oprospero 0:26a151d2c6db 99 }
oprospero 0:26a151d2c6db 100 }
oprospero 0:26a151d2c6db 101
oprospero 0:26a151d2c6db 102 /********************** void packetBuilder() *****************************/
oprospero 0:26a151d2c6db 103 /* Creates a packet from the buffered data and places it in the rxBuffer */
oprospero 0:26a151d2c6db 104 /* queue to be read whenever convenient. Max value of +/- 8063. */
oprospero 0:26a151d2c6db 105 /*************************************************************************/
oprospero 0:26a151d2c6db 106
oprospero 0:26a151d2c6db 107 void com::packetBuilder()
oprospero 0:26a151d2c6db 108 {
oprospero 0:26a151d2c6db 109 char * commandData = new char[bLength];
oprospero 0:26a151d2c6db 110 commandData[4] = buffer[--bLength]; // Sequence Number.
oprospero 0:26a151d2c6db 111 commandData[3] = buffer[--bLength]; // CheckSum value.
oprospero 0:26a151d2c6db 112 commandData[2] = buffer[--bLength]; // Second 7 bits.
oprospero 0:26a151d2c6db 113 commandData[1] = buffer[--bLength]; // Fisrt 7 bits.
oprospero 0:26a151d2c6db 114 commandData[0] = buffer[--bLength]; // Command.
oprospero 0:26a151d2c6db 115
oprospero 0:26a151d2c6db 116
oprospero 0:26a151d2c6db 117 if( commandData[0] + commandData[2] == commandData[3] ) // Validate checksum.
oprospero 0:26a151d2c6db 118 {
oprospero 0:26a151d2c6db 119 short * array = new short[2];
oprospero 0:26a151d2c6db 120
oprospero 0:26a151d2c6db 121 array[0] = (short)commandData[0];
oprospero 0:26a151d2c6db 122
oprospero 0:26a151d2c6db 123 short value = (short)(commandData[1] * 128 + commandData[2]);
oprospero 0:26a151d2c6db 124
oprospero 0:26a151d2c6db 125 if( value > 8062 )
oprospero 0:26a151d2c6db 126 value = (short)value + 57344;
oprospero 0:26a151d2c6db 127
oprospero 0:26a151d2c6db 128 array[1] = value;
oprospero 0:26a151d2c6db 129 // xbeeTx.printf("Cmd: %d,\tVal: %d\n\r,",array[0],array[1]);
oprospero 0:26a151d2c6db 130 rxBuffer->add( array ); // Add to read buffer.
oprospero 0:26a151d2c6db 131 write( (short)commandData[0], (short)commandData[4]); // Ack the packet with sequence nuber.
oprospero 0:26a151d2c6db 132 }
oprospero 0:26a151d2c6db 133 delete[] commandData;
oprospero 0:26a151d2c6db 134 bLength = 0; // Reset the buffer length.
oprospero 0:26a151d2c6db 135 }
oprospero 0:26a151d2c6db 136
oprospero 0:26a151d2c6db 137
oprospero 0:26a151d2c6db 138 /********************** bool isSignalGood() ******************************/
oprospero 0:26a151d2c6db 139 /* For future use */
oprospero 0:26a151d2c6db 140 /*************************************************************************/
oprospero 0:26a151d2c6db 141 bool com::isSignalGood()
oprospero 0:26a151d2c6db 142 {
oprospero 0:26a151d2c6db 143 signalStrength = rssi.dutycycle();
oprospero 0:26a151d2c6db 144 if (signalStrength > RSSI_THRES) return true;
oprospero 0:26a151d2c6db 145 else return false;
oprospero 0:26a151d2c6db 146 }
oprospero 0:26a151d2c6db 147