xbee communication for UWB quadcopter project

Dependencies:   PwmIn

Revision:
2:bd1621102cad
Parent:
1:4f53de75bc96
Child:
3:f8e953201251
Child:
8:42e37cdab039
--- a/com.cpp	Sat Feb 15 19:54:45 2014 +0000
+++ b/com.cpp	Sun Apr 20 02:27:39 2014 +0000
@@ -24,9 +24,10 @@
 /*                                                                       */
 /*************************************************************************/
 
-com::com( PinName tx, PinName rx , PinName rssipin) : xbeeTx( tx, rx), xbeeRx( tx, rx), rssi(rssipin)
+com::com( PinName tx, PinName rx , PinName rssipin) : xbeeTx( tx, NC), xbeeRx( NC, rx), rssi(rssipin)
 {
     bLength = 0;                            // How many bytes are in the buffer.
+    api_mode = false;                       // Xbee is in transparent mode.
     xbeeTx.baud(BAUDRATE);                    // Setup the serial baud rate.
     xbeeRx.baud(BAUDRATE);                    // Setup the serial baud rate.
     rxBuffer = new queue();                 // Point to the rxQueue.
@@ -43,6 +44,7 @@
 
 bool com::isData()
 {
+    
     return !rxBuffer->isEmpty();
 }
 
@@ -60,13 +62,37 @@
 
 void com::write( short command, short value  )
 {
-    short lvalue = (value % 128);
-    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.
+    if (api_mode)
+    {
+        short hvalue = value / 128;
+        short lvalue = (value % 128);
+        short sum = (2*command + hvalue + 2*lvalue + value);
+        short check = sum % 256;
+        xbeeTx.putc( (char) 127);               //Start Delimiter
+        
+        xbeeTx.putc( (char) 0);                 //Frame Data Length MSB
+        xbeeTx.putc( (char) 6);                 //Frame Data Length LSB
+        //Frame Data
+        xbeeTx.putc( (char) command);           // Command
+        xbeeTx.putc( (char) hvalue);            // 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) 255 - check);       //Checksum
+        
+    }
+    else
+    {    
+        short lvalue = (value % 128);
+        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.
+    }
 }
 
 /*************************** char read()  ********************************/
@@ -91,6 +117,8 @@
     {
         char data = xbeeRx.getc(); 
 //        xbeeTx.printf("data: %d\n\r", data);
+//        xbeeTx.printf("%d %d", data,(char) 255);
+//        xbeeTx.putc( data );
         if( bLength++ < BUFFERSIZE )
             buffer[bLength] = data;      
      
@@ -99,6 +127,15 @@
     }
 }
 
+//void com::api_callback()
+//{
+//    while( xbeeRx.readable() )
+//    {
+//        buffer[bLength++] = xbeeRx.getc(); 
+//    }
+//}
+
+
 /********************** 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.          */
@@ -128,11 +165,18 @@
         array[1] = value;
 //        xbeeTx.printf("Cmd: %d,\tVal: %d\n\r,",array[0],array[1]);
         rxBuffer->add( array );   // Add to read buffer.
+//        xbeeTx.putc( 255 );
+//        xbeeTx.putc( 255 );
         write( (short)commandData[0], (short)commandData[4]); // Ack the packet with sequence nuber.
     } 
     delete[] commandData;
     bLength = 0;    // Reset the buffer length.                                           
 }
+//
+//void com::api_packetBuilder()
+//{
+//    
+//}
 
 
 /********************** bool isSignalGood() ******************************/
@@ -145,3 +189,8 @@
     else return false;
 }
 
+void com::setAPImode(bool mode)
+{
+    api_mode = mode;
+}
+