Bluetooth communication for flocking.

Dependencies:   mbed

Fork of BeautifulMemeProject by James Hilder

Revision:
17:da524989b637
Parent:
6:ff3c66f7372b
Child:
18:5921c1853e8a
--- a/PsiSwarm/serial.cpp	Fri Oct 30 12:15:54 2015 +0000
+++ b/PsiSwarm/serial.cpp	Thu Jan 07 17:58:07 2016 +0000
@@ -20,7 +20,8 @@
 char bt_command_message_started = 0;
 char bt_command_message_byte = 0;
 char bt_command_message[3];
-
+char bt_single_byte_received = 0;
+char bt_single_byte = 0;
 
 
 char allow_commands = 1;
@@ -28,6 +29,8 @@
 
 Timeout pc_command_timeout;
 Timeout bt_command_timeout;
+//Timeout bt_single_byte_timeout;
+Timeout partial_message_timeout;
 
 
 
@@ -44,22 +47,81 @@
     //message = pointer to message char array
     //length = length of message
     //interface = 0 for PC serial connection, 1 for Bluetooth
+//    if(interface){
+//    char my_message [128];
+//    strncpy(my_message, message, length);
+//    pc.printf("BT message recieved:%s \n
+//    }
+}
+
+char partial_message_received = 0;
+int partial_message_length = 0;
+char partial_message[255];
+char partial_message_interface = 0;
+
+void IF_partial_message_timeout()
+{
+    partial_message_received = 0;
+    
+    char buffer[255];
+    sprintf(buffer, partial_message, partial_message_length);
+    buffer[partial_message_length] = 0;
+        
+    if(partial_message_interface)
+        debug("Received BT timed-out message: %s [%d chars]\n", buffer, partial_message_length);
+    else
+        debug("Received USB timed-out message: %s [%d chars]\n", buffer, partial_message_length);
+        
+    handle_user_serial_message(partial_message, partial_message_length, partial_message_interface);
 }
 
 void IF_handle_user_serial_message(char * message, char length, char interface)
 {
-    char buffer[255];
-    sprintf(buffer,message,length);
-    for(int i=0; i<length; i++) {
-        buffer[i]=message[i];
+    if(partial_message_received == 0)
+    {
+        wait_ms(500); // 0.5 ms delay
+        
+        partial_message_received = 1;
+        partial_message_interface = interface;
+        
+        for(int i = 0; i < length; i++)
+            partial_message[i] = message[i];
+            
+        partial_message_length = length;
+        partial_message_timeout.attach(&IF_partial_message_timeout, 0.1);
     }
-    buffer[length]=0;
-    if(interface) debug("Received BT message:%s [%d chars]\n",buffer,length);
-    else debug("Received USB message:%s [%d chars]\n",buffer,length);
-    handle_user_serial_message(message,length,interface);
+    else
+    {        
+        partial_message_timeout.detach();
+        partial_message_received = 0;
+        
+        char combined_message[255];
+        
+        for(int i = 0; i < partial_message_length; i++)
+            combined_message[i] = partial_message[i];
+        
+        int index = 0;
+        int combined_length = partial_message_length + length;
+        
+        for(int i = partial_message_length; i < combined_length; i++)
+        {
+            combined_message[i] = message[index];
+            index++;
+        }
+        
+        char buffer[255];
+        sprintf(buffer, combined_message, combined_length);
+        buffer[combined_length] = 0;
+        
+        if(interface)
+            debug("Received BT message: %s [%d chars]\n", buffer, combined_length);
+        else
+            debug("Received USB message: %s [%d chars]\n", buffer, combined_length);
+        
+        handle_user_serial_message(combined_message, combined_length, interface);
+    }
 }
 
-
 void IF_handle_command_serial_message(char message[3], char interface)
 {
     char iface [4];
@@ -822,6 +884,19 @@
     IF_handle_user_serial_message(message_array, length, 1);
 }
 
+void IF_bt_rx_single_byte_timeout()
+{
+    if(bt_single_byte_received == 1)
+    {    
+        bt_single_byte_received = 0;
+        
+        char message_array[1];
+        message_array[0] = bt_single_byte;
+        
+        IF_handle_user_serial_message(message_array, 1, 1);
+    }
+}
+
 void IF_pc_rx_callback()
 {
     int count = 0;
@@ -909,5 +984,34 @@
             }
         }
     }
-    if(!bt_command_message_started && count>0) IF_handle_user_serial_message(message_array, count, 1);
+    if(!bt_command_message_started && count > 0)
+        IF_handle_user_serial_message(message_array, count, 1);
+//    {
+////        debug("USER MESSAGE\n");
+//        
+//        if(count == 1)
+//        {
+////            debug("SINGLE BYTE RECEIVED\n");
+//            bt_single_byte_received = 1;
+//            bt_single_byte = message_array[0];
+////            bt_single_byte_timeout.attach(&IF_bt_rx_single_byte_timeout, 1);
+//        }
+//        else
+//        {
+//            if(bt_single_byte_received == 1)
+//            {
+////                debug("COMBINING MESSAGES\n");
+////                bt_single_byte_timeout.detach();            
+//                bt_single_byte_received = 0;
+//                
+//                for(int i = count; i > 0; i--)
+//                    message_array[i] = message_array[i-1];
+//                
+//                message_array[0] = bt_single_byte;
+//                count++;
+//            }
+//            
+//            IF_handle_user_serial_message(message_array, count, 1);
+//        }
+//    }
 }
\ No newline at end of file