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.
Fork of com by
com.cpp@12:bf4642578682, 2014-04-26 (annotated)
- Committer:
- oprospero
- Date:
- Sat Apr 26 02:38:08 2014 +0000
- Revision:
- 12:bf4642578682
- Parent:
- 11:d1f488302d06
- Child:
- 13:2fb7b19dcd70
initial changed from orginal
Who changed what in which revision?
| User | Revision | Line number | New 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 | 2:bd1621102cad | 27 | com::com( PinName tx, PinName rx , PinName rssipin) : xbeeTx( tx, NC), xbeeRx( NC, rx), rssi(rssipin) |
| oprospero | 0:26a151d2c6db | 28 | { |
| oprospero | 12:bf4642578682 | 29 | index1 = 0; // How many bytes are in the buffer. |
| oprospero | 12:bf4642578682 | 30 | index2 = 0; // How many bytes are in the buffer. |
| oprospero | 12:bf4642578682 | 31 | pindex = 0; // How many bytes are in the buffer. |
| oprospero | 12:bf4642578682 | 32 | rdy2build = false; // Xbee is in transparent mode. |
| oprospero | 1:4f53de75bc96 | 33 | xbeeTx.baud(BAUDRATE); // Setup the serial baud rate. |
| oprospero | 0:26a151d2c6db | 34 | xbeeRx.baud(BAUDRATE); // Setup the serial baud rate. |
| oprospero | 5:7cdf299ea7a4 | 35 | txBuffer = new queue(); |
| oprospero | 0:26a151d2c6db | 36 | signalStrength = 0; |
| oprospero | 0:26a151d2c6db | 37 | xbeeRx.attach( this, &com::callback ); // Set callback as the interrupt handler. |
| oprospero | 1:4f53de75bc96 | 38 | #ifdef DEBUG |
| oprospero | 0:26a151d2c6db | 39 | xbeeTx.printf("Communication.....Done\n\r"); |
| oprospero | 1:4f53de75bc96 | 40 | #endif |
| oprospero | 0:26a151d2c6db | 41 | } |
| oprospero | 0:26a151d2c6db | 42 | |
| oprospero | 0:26a151d2c6db | 43 | /************************* bool isData() ********************************/ |
| oprospero | 0:26a151d2c6db | 44 | /* */ |
| oprospero | 0:26a151d2c6db | 45 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 46 | |
| oprospero | 0:26a151d2c6db | 47 | bool com::isData() |
| oprospero | 0:26a151d2c6db | 48 | { |
| oprospero | 2:bd1621102cad | 49 | |
| oprospero | 12:bf4642578682 | 50 | return rdy2build; |
| oprospero | 0:26a151d2c6db | 51 | } |
| oprospero | 0:26a151d2c6db | 52 | |
| oprospero | 0:26a151d2c6db | 53 | /************************ void write( char ) *****************************/ |
| oprospero | 0:26a151d2c6db | 54 | /* Write a packet out the xbee com port. */ |
| oprospero | 0:26a151d2c6db | 55 | /* */ |
| oprospero | 0:26a151d2c6db | 56 | /* Data format byte[] */ |
| oprospero | 0:26a151d2c6db | 57 | /* byte[0] = command. */ |
| oprospero | 0:26a151d2c6db | 58 | /* byte[1] = upper 8 bits of value. */ |
| oprospero | 0:26a151d2c6db | 59 | /* byte[2] = lower 8 bits of value. */ |
| oprospero | 0:26a151d2c6db | 60 | /* byte[3] = Checksum byte[0] + byte[2]. */ |
| oprospero | 0:26a151d2c6db | 61 | /* byte[4] = Sequence Number. */ |
| oprospero | 0:26a151d2c6db | 62 | /* byte[5] = 255 End of message. */ |
| oprospero | 0:26a151d2c6db | 63 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 64 | |
| oprospero | 0:26a151d2c6db | 65 | void com::write( short command, short value ) |
| oprospero | 12:bf4642578682 | 66 | { |
| oprospero | 12:bf4642578682 | 67 | short lvalue = (value % 128); |
| oprospero | 12:bf4642578682 | 68 | xbeeTx.putc( (char)command ); // Command |
| oprospero | 12:bf4642578682 | 69 | xbeeTx.putc( (char) value / 128 ); // First 8 bits in array. |
| oprospero | 12:bf4642578682 | 70 | xbeeTx.putc( (char) lvalue); // Second 8 bits in array. |
| oprospero | 12:bf4642578682 | 71 | xbeeTx.putc( command + lvalue ); // Checksum array[0] + array[1]. |
| oprospero | 12:bf4642578682 | 72 | xbeeTx.putc( (char)value ); // Sequence number. |
| oprospero | 12:bf4642578682 | 73 | xbeeTx.putc( 255 ); // End of message. |
| oprospero | 0:26a151d2c6db | 74 | } |
| oprospero | 0:26a151d2c6db | 75 | |
| oprospero | 5:7cdf299ea7a4 | 76 | /*************************** char ackCheck() ********************************/ |
| oprospero | 0:26a151d2c6db | 77 | /* */ |
| oprospero | 0:26a151d2c6db | 78 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 79 | |
| oprospero | 4:f8e953201251 | 80 | void com::ackCheck() |
| oprospero | 4:f8e953201251 | 81 | { |
| oprospero | 5:7cdf299ea7a4 | 82 | if( !txBuffer->isEmpty() && xbeeTx.writeable()) |
| oprospero | 4:f8e953201251 | 83 | { |
| oprospero | 11:d1f488302d06 | 84 | __disable_irq(); |
| oprospero | 5:7cdf299ea7a4 | 85 | short * pkt = txBuffer->pop(); |
| oprospero | 5:7cdf299ea7a4 | 86 | write(pkt[0],pkt[1]); //may need to disable interrupt |
| oprospero | 5:7cdf299ea7a4 | 87 | delete[] pkt; |
| oprospero | 11:d1f488302d06 | 88 | __enable_irq(); |
| oprospero | 4:f8e953201251 | 89 | } |
| oprospero | 4:f8e953201251 | 90 | } |
| oprospero | 4:f8e953201251 | 91 | |
| oprospero | 5:7cdf299ea7a4 | 92 | bool com::rdy2ack() |
| oprospero | 5:7cdf299ea7a4 | 93 | { |
| oprospero | 5:7cdf299ea7a4 | 94 | return !txBuffer->isEmpty(); |
| oprospero | 5:7cdf299ea7a4 | 95 | } |
| oprospero | 4:f8e953201251 | 96 | |
| oprospero | 4:f8e953201251 | 97 | |
| oprospero | 0:26a151d2c6db | 98 | |
| oprospero | 0:26a151d2c6db | 99 | /************************ void callback() ********************************/ |
| oprospero | 0:26a151d2c6db | 100 | /* */ |
| oprospero | 0:26a151d2c6db | 101 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 102 | |
| oprospero | 0:26a151d2c6db | 103 | void com::callback() |
| oprospero | 0:26a151d2c6db | 104 | { |
| oprospero | 4:f8e953201251 | 105 | __disable_irq(); |
| oprospero | 0:26a151d2c6db | 106 | while( xbeeRx.readable() ) |
| oprospero | 0:26a151d2c6db | 107 | { |
| oprospero | 0:26a151d2c6db | 108 | char data = xbeeRx.getc(); |
| oprospero | 12:bf4642578682 | 109 | |
| oprospero | 12:bf4642578682 | 110 | if (isA1) |
| oprospero | 12:bf4642578682 | 111 | { |
| oprospero | 12:bf4642578682 | 112 | if ( data == 255 && index1 > 4 ) |
| oprospero | 12:bf4642578682 | 113 | { |
| oprospero | 12:bf4642578682 | 114 | rdy2build = true; |
| oprospero | 12:bf4642578682 | 115 | pindex = index1; |
| oprospero | 12:bf4642578682 | 116 | index1 = 0; |
| oprospero | 12:bf4642578682 | 117 | isA1 = false; |
| oprospero | 12:bf4642578682 | 118 | } |
| oprospero | 12:bf4642578682 | 119 | else if ( index1 < BUFFERSIZE ) |
| oprospero | 12:bf4642578682 | 120 | { |
| oprospero | 12:bf4642578682 | 121 | buffer1[index1++] = data; |
| oprospero | 12:bf4642578682 | 122 | } |
| oprospero | 12:bf4642578682 | 123 | } |
| oprospero | 12:bf4642578682 | 124 | else |
| oprospero | 12:bf4642578682 | 125 | { |
| oprospero | 12:bf4642578682 | 126 | if ( data == 255 && index2 > 4 ) |
| oprospero | 12:bf4642578682 | 127 | { |
| oprospero | 12:bf4642578682 | 128 | rdy2build = true; |
| oprospero | 12:bf4642578682 | 129 | pindex = index2; |
| oprospero | 12:bf4642578682 | 130 | index2 = 0; |
| oprospero | 12:bf4642578682 | 131 | isA1 = true; |
| oprospero | 12:bf4642578682 | 132 | } |
| oprospero | 12:bf4642578682 | 133 | else if ( index2 < BUFFERSIZE ) |
| oprospero | 12:bf4642578682 | 134 | { |
| oprospero | 12:bf4642578682 | 135 | buffer2[index2++] = data; |
| oprospero | 12:bf4642578682 | 136 | } |
| oprospero | 12:bf4642578682 | 137 | } |
| oprospero | 0:26a151d2c6db | 138 | } |
| oprospero | 4:f8e953201251 | 139 | __enable_irq(); |
| oprospero | 0:26a151d2c6db | 140 | } |
| oprospero | 0:26a151d2c6db | 141 | |
| oprospero | 2:bd1621102cad | 142 | |
| oprospero | 0:26a151d2c6db | 143 | /********************** void packetBuilder() *****************************/ |
| oprospero | 0:26a151d2c6db | 144 | /* Creates a packet from the buffered data and places it in the rxBuffer */ |
| oprospero | 0:26a151d2c6db | 145 | /* queue to be read whenever convenient. Max value of +/- 8063. */ |
| oprospero | 0:26a151d2c6db | 146 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 147 | |
| oprospero | 12:bf4642578682 | 148 | short * com::read() |
| oprospero | 0:26a151d2c6db | 149 | { |
| oprospero | 12:bf4642578682 | 150 | if (rdy2build) |
| oprospero | 0:26a151d2c6db | 151 | { |
| oprospero | 12:bf4642578682 | 152 | char * commandData = new char[pindex]; |
| oprospero | 12:bf4642578682 | 153 | if (!isA1) |
| oprospero | 12:bf4642578682 | 154 | { |
| oprospero | 12:bf4642578682 | 155 | commandData[4] = buffer1[--pindex]; // Sequence Number. |
| oprospero | 12:bf4642578682 | 156 | commandData[3] = buffer1[--pindex]; // CheckSum value. |
| oprospero | 12:bf4642578682 | 157 | commandData[2] = buffer1[--pindex]; // Second 7 bits. |
| oprospero | 12:bf4642578682 | 158 | commandData[1] = buffer1[--pindex]; // Fisrt 7 bits. |
| oprospero | 12:bf4642578682 | 159 | commandData[0] = buffer1[--pindex]; // Command. |
| oprospero | 12:bf4642578682 | 160 | } |
| oprospero | 12:bf4642578682 | 161 | else |
| oprospero | 12:bf4642578682 | 162 | { |
| oprospero | 12:bf4642578682 | 163 | commandData[4] = buffer2[--pindex]; // Sequence Number. |
| oprospero | 12:bf4642578682 | 164 | commandData[3] = buffer2[--pindex]; // CheckSum value. |
| oprospero | 12:bf4642578682 | 165 | commandData[2] = buffer2[--pindex]; // Second 7 bits. |
| oprospero | 12:bf4642578682 | 166 | commandData[1] = buffer2[--pindex]; // Fisrt 7 bits. |
| oprospero | 12:bf4642578682 | 167 | commandData[0] = buffer2[--pindex]; // Command. |
| oprospero | 12:bf4642578682 | 168 | } |
| oprospero | 0:26a151d2c6db | 169 | |
| oprospero | 12:bf4642578682 | 170 | |
| oprospero | 12:bf4642578682 | 171 | if( commandData[0] + commandData[2] == commandData[3] ) // Validate checksum. |
| oprospero | 4:f8e953201251 | 172 | { |
| oprospero | 12:bf4642578682 | 173 | short * array = new short[2]; |
| oprospero | 12:bf4642578682 | 174 | array[0] = (short)commandData[0]; |
| oprospero | 12:bf4642578682 | 175 | |
| oprospero | 12:bf4642578682 | 176 | short value = (short)(commandData[1] * 128 + commandData[2]); |
| oprospero | 12:bf4642578682 | 177 | |
| oprospero | 12:bf4642578682 | 178 | if( value > 8062 ) |
| oprospero | 12:bf4642578682 | 179 | value = (short)value + 57344; |
| oprospero | 12:bf4642578682 | 180 | |
| oprospero | 12:bf4642578682 | 181 | array[1] = value; |
| oprospero | 12:bf4642578682 | 182 | if ( commandData[0] != 0) |
| oprospero | 12:bf4642578682 | 183 | { |
| oprospero | 12:bf4642578682 | 184 | short * ackPacket = new short[2]; |
| oprospero | 12:bf4642578682 | 185 | ackPacket[0] = commandData[0]; |
| oprospero | 12:bf4642578682 | 186 | ackPacket[1] = commandData[4]; |
| oprospero | 12:bf4642578682 | 187 | txBuffer->add( ackPacket ); // Ack the packet with sequence nuber. |
| oprospero | 12:bf4642578682 | 188 | } |
| oprospero | 12:bf4642578682 | 189 | |
| oprospero | 12:bf4642578682 | 190 | delete[] commandData; |
| oprospero | 12:bf4642578682 | 191 | return array; |
| oprospero | 12:bf4642578682 | 192 | } |
| oprospero | 12:bf4642578682 | 193 | delete[] commandData; |
| oprospero | 12:bf4642578682 | 194 | } |
| oprospero | 12:bf4642578682 | 195 | return NULL; |
| oprospero | 0:26a151d2c6db | 196 | } |
| oprospero | 12:bf4642578682 | 197 | |
| oprospero | 0:26a151d2c6db | 198 | |
| oprospero | 0:26a151d2c6db | 199 | |
| oprospero | 0:26a151d2c6db | 200 | /********************** bool isSignalGood() ******************************/ |
| oprospero | 0:26a151d2c6db | 201 | /* For future use */ |
| oprospero | 0:26a151d2c6db | 202 | /*************************************************************************/ |
| oprospero | 0:26a151d2c6db | 203 | bool com::isSignalGood() |
| oprospero | 0:26a151d2c6db | 204 | { |
| oprospero | 0:26a151d2c6db | 205 | signalStrength = rssi.dutycycle(); |
| oprospero | 0:26a151d2c6db | 206 | if (signalStrength > RSSI_THRES) return true; |
| oprospero | 0:26a151d2c6db | 207 | else return false; |
| oprospero | 0:26a151d2c6db | 208 | } |
