Bluetooth communication for flocking.
Fork of BeautifulMemeProject by
Diff: PsiSwarm/serial.cpp
- 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