Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ESC SR04 TSI
com/com.cpp@32:d2b973c8d196, 2013-06-09 (annotated)
- Committer:
- gabdo
- Date:
- Sun Jun 09 02:41:27 2013 +0000
- Revision:
- 32:d2b973c8d196
Updated June 8 2013
Who changed what in which revision?
User | Revision | Line number | New 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 |