Code for the mbed NXP LPC1768. To be used on The Robot Studio Master Boards. License : Simplified BSD.

Dependencies:   MODSERIAL mbed

Revision:
1:95d85c81bb11
Parent:
0:369222671f3c
Child:
2:201618ffa295
--- a/main.cpp	Thu Feb 28 17:31:55 2013 +0000
+++ b/main.cpp	Tue Mar 05 15:46:46 2013 +0000
@@ -18,6 +18,9 @@
 #define TFE 0x01
 #define RNE 0x04
 
+#define CLOSE_ARROW         0x3E //< = 62
+#define NUMBER_OF_ARROWS    5
+
 MODSERIAL ros(p28, p27, 1024, 512); // tx, rx
 Serial pc(USBTX, USBRX); //terminal for debug
 DigitalOut ledchain[] = {(LED1), (LED2), (LED3), (LED4)}; //used for debugging
@@ -38,7 +41,35 @@
 uint8_t j=0;
  
 char rByte = 0x00;
-bool threeArrowsFound = false;
+
+bool fiveArrowsFound = false;
+bool msgValid = false;
+
+int move(char *s, int nbBytes) //custom move function (cp from MODESERIAL without the end character)
+{
+    int counter = 0;
+    char c;
+    while(ros.readable()) {
+        c = ros.getc();        
+        *(s++) = c;
+        counter++;
+        if (counter == nbBytes) break;
+    }
+    return counter;
+}
+
+bool verifyChecksum(char* data, int length, char checksum)
+{      
+    for(int i=0; i<length; i++)
+    {
+        checksum += data[i];
+    }        
+    
+    checksum++; //add 1 to obtain 0x00
+        
+    if(checksum == 0x00) return true;
+    else return false;
+}
 
 // Called everytime a new character goes into
 // the RX buffer. Test that character for '/'
@@ -50,7 +81,7 @@
     logicPin = 1;
     
     MODSERIAL *serial = q->serial;
-    
+  /*  
     if ( serial->rxGetLastChar() == '/') 
     {
         //pc.printf("new1\n");
@@ -65,25 +96,50 @@
             //pc.printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
         //}
     }
-    /*
+    
+    */
+    
     rByte = serial->rxGetLastChar();
+    //pc.printf("0x%02X ", rByte);
     
-    if(nbArrows < 3)
+    if(!fiveArrowsFound)
     {
-        if(rByte == 0x3C) 
-        {   
-            nbArrows++;  
+        if(nbArrows < NUMBER_OF_ARROWS)
+        {
+            if(rByte == CLOSE_ARROW)
+            {   
+                nbArrows++;  
+                //pc.printf("nbArrows %d\n\r", nbArrows);
+            }
+            //else 
+            if((nbArrows > 0) && (rByte != CLOSE_ARROW))
+            {
+                nbArrows = 0; //reset in case the previous arrows was data. 
+                //pc.printf("reset\n\r");
+            }
+            
+            if(nbArrows == NUMBER_OF_ARROWS) 
+            {
+                fiveArrowsFound = true;
+            } 
         }
-        else 
-        {
-            nbArrows = 0; 
-        }
+    }
+    else //fiveArrowsFound, so rByte is the checksum
+    {
+        move(readBufferSerial, NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG);
+        //pc.printf("r cs 0x%02X\n", rByte);
+        //pc.printf("move %02X %02X %02X %02X %02X %02X %02X \n", readBufferSerial[0], readBufferSerial[1], readBufferSerial[2], readBufferSerial[3], readBufferSerial[4], readBufferSerial[5], readBufferSerial[6]);
         
-        if(nbArrows == 3) 
-        {
-            threeArrowsFound = true;
-        } 
-    }
+        msgValid = verifyChecksum(readBufferSerial, NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG, rByte);
+               
+        if(msgValid) pc.printf("msgValid\n\r");
+        
+        //reset
+        serial->rxBufferFlush();  
+        nbArrows = 0;
+        fiveArrowsFound = false;      
+    }   
+/*        
     else
     {               
         readBufferSerial[i][j] = rByte;
@@ -110,7 +166,8 @@
             }   
         }        
     }
-    */
+*/
+    
     logicPin = 0;
 }
  
@@ -132,7 +189,14 @@
     logicPin = 0;
  
     // Wait here until we detect the \n going into the buffer.
-    while(!newCmd_detected);    
+    while(1)
+    {
+        if(msgValid)
+        {
+            //pass it to the SPI bus
+        }
+    }
+        
     
     // When we get here the RX buffer now contains a sentence.
     // ...