this version has all of Jim's fixes for reading the GPS and IMU data synchronously

Dependencies:   MODSERIAL SDFileSystem mbed SDShell CRC CommHandler FP LinkedList LogUtil

Revision:
30:96d133f3008e
Parent:
29:dead10cce6e9
diff -r dead10cce6e9 -r 96d133f3008e PCMessaging.h
--- a/PCMessaging.h	Thu Jan 09 14:09:05 2014 +0000
+++ b/PCMessaging.h	Mon Mar 03 13:19:31 2014 +0000
@@ -1,40 +1,187 @@
 //these are defines for the messages that are sent from the PC across the USB
 //these messages produce reactions on the mbed
+//currently there is only a single message -- the trigger command
 const unsigned char  FIRE_TRIGGER_MSG   = 1;
 
-const unsigned short serBuffMax = 18;
-char serBuf[serBuffMax];
-int serBufChars=0;
+const unsigned short msgBuffSize = 28;
+char messageBuffer[msgBuffSize+1];  //the +1 allows for a null-terminated string
 
-//flags to control the PC command actions
-bool fireTrigger    =false;
+//flags to control the mbed actions (in main) in response to the PC command
+bool fireTrigger    = false;
 
 unsigned char CR = 0x0d;                //ASCII Carriage Return
 unsigned char LF = 0x0a;                //ASCII Line Feed
 
+int totalNumChars = 0;
+
 bool validMessage = false;
 
-
+/*
 void readFromPC()
 {
-    //  should this be a while rather than if ??? -- may have multiple bytes in buffer
-    if (toPC.readable()) //read a PC serial byte and test it for a command
+    //read all available PC serial bytes and test the sequence for a command string
+    if (toPC.readable()) 
+    {   loopsThroughPCreadable++;  //reset to zero when we detect a valid message
+        //wait_ms(5);
+    }
+    while (toPC.readable()) 
     {
+        ///////////////////////////////////////////////////////////////////////////////////
+        //PC-to-mbed and mbed-to-PC message format
+        //   1) preamble:            "mbedmessage "   (note the space)
+        //   2) messageType          "trig "          (note the space
+        //   3) 10-char dataValue    "0000000000"     (ASCI integer representation
+        //0123456789012345678901234567890123456789
+        //mbedmessage trig 0000000000 CR/LF
+        ///////////////////////////////////////////////////////////////////////////////////
+        
         // Read in next character
-        // why not read all available bytes
+        // we get through the main loop at > 500,000 times a sec
         unsigned char inChar = 0;
         inChar = toPC.getc();  //read char from the USB serial link to the PC
         
-        //incoming messages will end witb a CR / LF -- disregard these chars
-        if (inChar == CR || inChar == LF)  return; //CR is a 0x0a
+        totalNumChars++;
+        
+        //slide all the characters back by one place -- oldest char in the buffer gets discarded
+        for (int i=0; i<(msgBuffSize-1); i++) messageBuffer[i] = messageBuffer[i+1];
+        //now fill in the last entry to the buffer with the most recent received char
+        messageBuffer[msgBuffSize-1] = inChar;
+        
+        //locate the proper message signature in the saved buffer:  "mbedmessage "
+        if      (messageBuffer[0]  != 'm') continue;
+        else if( messageBuffer[1]  != 'b') continue;
+        else if( messageBuffer[2]  != 'e') continue;
+        else if( messageBuffer[3]  != 'd') continue;
+        else if( messageBuffer[4]  != 'm') continue;
+        else if( messageBuffer[5]  != 'e') continue;
+        else if( messageBuffer[6]  != 's') continue;
+        else if( messageBuffer[7]  != 's') continue;
+        else if( messageBuffer[8]  != 'a') continue;       
+        else if( messageBuffer[9]  != 'g') continue;  
+        else if( messageBuffer[10] != 'e') continue;  
+        else if( messageBuffer[11] != ' ') continue; 
+        //else if( messageBuffer[28] != CR) return;  
+        //else if( messageBuffer[29] != LF) return;
         
-        //all incoming messages will start with "mbedMessage", "messageType", numberDataBytes, and will end with CR & LF
-        //1) look for the mbedMessage and then get the next byte as numberDataBytes;
-        //2) read the next numberDataBytes and then look for CR & LF
-        //if 1) & 2)  are successful, declare a valid incoming message
-        //if message is valid, then send a response as a repeat of the original message
-        //
+        //from testing: this always activates on inChar multiple of 28
+        //if ( inChar == 0x0a ) toPC.printf("%d  LF received:   %s\n",totalNumChars, messageBuffer);
+        
+        //if we get here. we have the proper signature of an incoming message
+        //now test for the message types
+        
+        //why do we do this??
+        //messageBuffer[msgBuffSize]= '/0'; //make the message buffer a null-terminated ASCII string
+        
+        //if (toPC.writeable()) toPC.printf(messageBuffer);    
+            
+        if (    messageBuffer[12] == 't' && 
+                messageBuffer[13] == 'r' && 
+                messageBuffer[14] == 'i' && 
+                messageBuffer[15] == 'g'    )
+        {
+            //we have detected a trigger command message: "trig"  
+            //send back a response to this message
+            if (toPC.writeable())
+            {
+                 toPC.printf("FromMbed  %s \n", messageBuffer);
+                 toPC.printf("FromMbed   %d  %d  \n", loopsThroughPCreadable, totalNumChars);
+            }
+            fireTrigger = true;
+            loopsThroughPCreadable = 0;
+        }
         
     }  //end pc.readable
 };
+*/
 
+void readFromPC()
+{
+        
+    //if there is no chars to read -- just return;
+    if (!toPC.readable()) return;
+    
+    totalNumChars = 0;
+    
+    if (toPC.writeable())
+    {
+        toPC.printf("FromMbed  testing for Trigger \n");
+    }
+    
+    bool timeOutInRead = false;
+
+    timeInMessageRead.reset();
+    
+    while (totalNumChars < 16) 
+    {
+        ///////////////////////////////////////////////////////////////////////////////////
+        //PC-to-mbed and mbed-to-PC message format
+        //   1) preamble:            "mbedmessage "   (note the space)
+        //   2) messageType          "trig "          (note the space
+        //   3) 10-char dataValue    "0000000000"     (ASCI integer representation
+        //0123456789012345678901234567890123456789
+        //mbedmessage trig 0000000000 CR/LF
+        ///////////////////////////////////////////////////////////////////////////////////
+        
+        // we get through the main loop at > 500,000 times a sec
+
+        if ( toPC.readable() )
+        { 
+            messageBuffer[totalNumChars] = toPC.getc();
+            totalNumChars++;
+        }
+        
+        if (timeInMessageRead.read_us() > 500)
+        {
+             timeOutInRead = true;
+             break;
+        }
+    }
+    
+    messageBuffer[28] = '\0';  //make a null-terminated string
+       
+    if (timeOutInRead)
+    {
+        if (toPC.writeable())
+        {
+            toPC.printf("FromMbed TimeOut %s \n", messageBuffer);
+        }
+    }
+    
+ 
+        
+    if      (messageBuffer[0]  == 'm' &&
+             messageBuffer[1]  == 'b' &&
+             messageBuffer[2]  == 'e' &&
+             messageBuffer[3]  == 'd' &&
+             messageBuffer[4]  == 'm' &&
+             messageBuffer[5]  == 'e' &&
+             messageBuffer[6]  == 's' &&
+             messageBuffer[7]  == 's' &&
+             messageBuffer[8]  == 'a' &&       
+             messageBuffer[9]  == 'g' &&  
+             messageBuffer[10] == 'e' &&  
+             messageBuffer[11] == ' ' && 
+             messageBuffer[12] == 't' && 
+             messageBuffer[13] == 'r' && 
+             messageBuffer[14] == 'i' && 
+             messageBuffer[15] == 'g'    )
+        {
+
+            
+            //we have detected a trigger command message: "trig"  
+            //send back a response to this message
+            if (toPC.writeable())
+            {
+                toPC.printf("FromMbed  %s %d\n", messageBuffer, timeInMessageRead.read_us());
+            }
+            
+            for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0;
+            fireTrigger = true;
+        }
+        else
+        {
+            toPC.printf("FromMbed badMsg  %s \n", messageBuffer);
+            for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0;
+        }
+};
+