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
Revision 15:3f742edaa359, committed 2014-08-27
- Comitter:
- oprospero
- Date:
- Wed Aug 27 06:20:23 2014 +0000
- Parent:
- 14:d2acb373d81c
- Child:
- 16:89695823d407
- Commit message:
- Changed to new controls.; Off load code from RX callback to main loop
Changed in this revision
--- a/PwmIn.lib Sun May 25 22:54:45 2014 +0000 +++ b/PwmIn.lib Wed Aug 27 06:20:23 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/simon/code/PwmIn/#6d68eb9b6bbb +http://mbed.org/users/simon/code/PwmIn/#f87e8836a87b
--- a/com.cpp Sun May 25 22:54:45 2014 +0000 +++ b/com.cpp Wed Aug 27 06:20:23 2014 +0000 @@ -67,9 +67,85 @@ /* */ /*************************************************************************/ +//bool com::isData() +//{ +// return rdy2build; +//} + bool com::isData() { - return rdy2build; + static short packetIndex = 0; + static short pack_cmd = 0; + static short pack_value[2] = {0,0}; + static short pack_seq = 0; + static short pack_checksum = 0; + while ( !rxBuffer->isEmpty() ) + { + short * data = rxBuffer->pop(); + switch (packetIndex) + { + case 0: + { + if ( *data == 255 ) + packetIndex++; + break; + } + case 1: + { + if ( *data < 13 ) + { + pack_cmd = *data; + packetIndex++; + } + else + packetIndex = 0; + break; + } + case 2: + { + pack_value[1] = *data; + packetIndex++; + break; + } + case 3: + { + pack_value[0] = *data; + packetIndex++; + break; + } + case 4: + { + pack_seq = *data; + packetIndex++; + break; + } + case 5: + { + short temp = pack_value[0] + pack_cmd; + pack_checksum = *data; + if ( temp == pack_checksum ) + { + short * ackPacket = new short[2]; + ackPacket[0] = pack_cmd; + ackPacket[1] = pack_seq; + txBuffer->add( ackPacket ); // Ack the packet with sequence nuber. + + short * array = new short[2]; + array[0] = pack_cmd; + array[1] = pack_value[1] * 128 + pack_value[0]; + cmdBuffer->add( array ); + } + + packetIndex = 0; + break; + } + default: + packetIndex = 0; + break; + } + + } + return !cmdBuffer->isEmpty(); } /************************ void write( char ) *****************************/ @@ -86,13 +162,10 @@ void com::write( short command, short value ) { - short lvalue = (value % 128); + xbeeTx.putc( 255 ); // End of message. xbeeTx.putc( (char)command ); // Command - xbeeTx.putc( (char) value / 128 ); // First 8 bits in array. - xbeeTx.putc( (char) lvalue); // Second 8 bits in array. - xbeeTx.putc( command + lvalue ); // Checksum array[0] + array[1]. - xbeeTx.putc( (char)value ); // Sequence number. - xbeeTx.putc( 255 ); // End of message. + xbeeTx.putc( (char) value); // Second 8 bits in array. + xbeeTx.putc( command + value ); // Checksum array[0] + array[1]. } /*************************** char ackCheck() ********************************/ @@ -130,106 +203,125 @@ /* */ /*************************************************************************/ +//void com::callback() +//{ +// __disable_irq(); +// while( xbeeRx.readable() ) +// { +// char data = xbeeRx.getc(); +//// xbeeRx.putc(data); +// if (isA1) +// { +// if ( data == 255 && index1 > 4 ) +// { +// rdy2build = true; +// pindex = index1; +// index1 = 0; +// isA1 = false; +// } +// else if ( index1 < BUFFERSIZE ) +// { +// +// buffer1[index1++] = data; +// } +// } +// else +// { +// if ( data == 255 && index2 > 4 ) +// { +// rdy2build = true; +// pindex = index2; +// index2 = 0; +// isA1 = true; +// } +// else if ( index2 < BUFFERSIZE ) +// { +// buffer2[index2++] = data; +// } +// } +// } +// __enable_irq(); +//} + void com::callback() { __disable_irq(); while( xbeeRx.readable() ) { - char data = xbeeRx.getc(); -// xbeeRx.putc(data); - if (isA1) - { - if ( data == 255 && index1 > 4 ) - { - rdy2build = true; - pindex = index1; - index1 = 0; - isA1 = false; - } - else if ( index1 < BUFFERSIZE ) - { - - buffer1[index1++] = data; - } - } - else - { - if ( data == 255 && index2 > 4 ) - { - rdy2build = true; - pindex = index2; - index2 = 0; - isA1 = true; - } - else if ( index2 < BUFFERSIZE ) - { - buffer2[index2++] = data; - } - } + short *data = new short; + *data = xbeeRx.getc(); + + rxBuffer->add( data ); } __enable_irq(); } - /********************** void packetBuilder() *****************************/ /* Creates a packet from the buffered data and places it in the rxBuffer */ /* queue to be read whenever convenient. Max value of +/- 8063. */ /*************************************************************************/ +//short * com::read() +//{ +// if (rdy2build) +// { +// rdy2build = false; +// char * commandData = new char[5]; +// if (!isA1) +// { +// commandData[4] = buffer1[--pindex]; // Sequence Number. +// commandData[3] = buffer1[--pindex]; // CheckSum value. +// commandData[2] = buffer1[--pindex]; // Second 7 bits. +// commandData[1] = buffer1[--pindex]; // Fisrt 7 bits. +// commandData[0] = buffer1[--pindex]; // Command. +// } +// else +// { +// commandData[4] = buffer2[--pindex]; // Sequence Number. +// commandData[3] = buffer2[--pindex]; // CheckSum value. +// commandData[2] = buffer2[--pindex]; // Second 7 bits. +// commandData[1] = buffer2[--pindex]; // Fisrt 7 bits. +// commandData[0] = buffer2[--pindex]; // Command. +// } +// +//// xbeeTx.printf("Copied: %d %d %d %d %d\n\r",commandData[0],commandData[1],commandData[2],commandData[3],commandData[4]); +// +// if( commandData[0] + commandData[2] == commandData[3] ) // Validate checksum. +// { +// short * array = new short[2]; +// array[0] = (short)commandData[0]; +// +// short value = (short)(commandData[1] * 128 + commandData[2]); +// +// if( value > 8062 ) +// value = (short)value + 57344; +// +// array[1] = value; +// if ( commandData[0] != 0) +// { +// short * ackPacket = new short[2]; +// ackPacket[0] = commandData[0]; +// ackPacket[1] = commandData[4]; +// txBuffer->add( ackPacket ); // Ack the packet with sequence nuber. +// } +// +// delete[] commandData; +// return array; +// } +// delete[] commandData; +// } +// return NULL; +//} + short * com::read() { - if (rdy2build) - { - rdy2build = false; - char * commandData = new char[5]; - if (!isA1) - { - commandData[4] = buffer1[--pindex]; // Sequence Number. - commandData[3] = buffer1[--pindex]; // CheckSum value. - commandData[2] = buffer1[--pindex]; // Second 7 bits. - commandData[1] = buffer1[--pindex]; // Fisrt 7 bits. - commandData[0] = buffer1[--pindex]; // Command. - } - else - { - commandData[4] = buffer2[--pindex]; // Sequence Number. - commandData[3] = buffer2[--pindex]; // CheckSum value. - commandData[2] = buffer2[--pindex]; // Second 7 bits. - commandData[1] = buffer2[--pindex]; // Fisrt 7 bits. - commandData[0] = buffer2[--pindex]; // Command. - } - -// xbeeTx.printf("Copied: %d %d %d %d %d\n\r",commandData[0],commandData[1],commandData[2],commandData[3],commandData[4]); - - if( commandData[0] + commandData[2] == commandData[3] ) // Validate checksum. - { - short * array = new short[2]; - array[0] = (short)commandData[0]; - - short value = (short)(commandData[1] * 128 + commandData[2]); - - if( value > 8062 ) - value = (short)value + 57344; - - array[1] = value; - if ( commandData[0] != 0) - { - short * ackPacket = new short[2]; - ackPacket[0] = commandData[0]; - ackPacket[1] = commandData[4]; - txBuffer->add( ackPacket ); // Ack the packet with sequence nuber. - } - - delete[] commandData; - return array; - } - delete[] commandData; - } - return NULL; + if ( !cmdBuffer->isEmpty() ) + return cmdBuffer->pop(); + else + return NULL; } - /********************** bool isSignalGood() ******************************/ /* For future use */ /*************************************************************************/
--- a/com.h Sun May 25 22:54:45 2014 +0000 +++ b/com.h Wed Aug 27 06:20:23 2014 +0000 @@ -40,6 +40,8 @@ RawSerial xbeeTx; // tx - DIN, rx - DOUT RawSerial xbeeRx; // tx - DIN, rx - DOUT queue *txBuffer; + queue *rxBuffer; + queue *cmdBuffer; PwmIn rssi; bool rdy2build;
--- a/queue/queue.h Sun May 25 22:54:45 2014 +0000 +++ b/queue/queue.h Wed Aug 27 06:20:23 2014 +0000 @@ -14,7 +14,7 @@ using namespace std; -const int MAXQUEUELENGTH = 4; +const int MAXQUEUELENGTH = 12; class queue {