Derek McLean / Mbed 2 deprecated uwb-quadcopter

Dependencies:   mbed ESC SR04 TSI

Committer:
gabdo
Date:
Sun Jun 09 02:41:27 2013 +0000
Revision:
32:d2b973c8d196
Updated June 8 2013

Who changed what in which revision?

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