Experiment of serial command protocol

Dependencies:   RingBuffer SerialInterfaceProtocol duinotech_16x2_LCD mbed

You can edit this area

Revision:
3:0c4aa3cec685
Parent:
2:54932809c7b2
--- a/CommandPacket.cpp	Thu Jun 09 12:28:31 2016 +0000
+++ b/CommandPacket.cpp	Thu Jun 16 03:52:01 2016 +0000
@@ -47,7 +47,7 @@
 
 bool CommandPacket::verify()
 {
-    return checksum == generate_checksum(payload, length);
+    return checksum == generate_checksum();
 }
 
 CommandPacket::CommandPacket()
@@ -67,24 +67,6 @@
 const char *CommandPacket::getErrorString() const
 {
     return errorString[errno];
-} 
-
-char *CommandPacket::getErrorCode() const
-{
-    // clear error code
-    memset(errorCode, 0x0, sizeof(errorCode));
-    
-    // push into buffer
-    snprintf(errorCode, sizeof(errorCode), "%c%02x%02x%02x%02x%c",
-        sflag,
-        0xe0 | (errno & 0x0f),
-        0x1,
-        command,
-        0x0,
-        eflag
-    );
-    
-    return errorCode;
 }
 
 int CommandPacket::serialize(uint8_t *output)
@@ -104,12 +86,34 @@
         command,
         length,
         (char *) buffer,
-        generate_checksum(payload, length),
+        generate_checksum(),
         eflag
     );
     
     return length;
 }
-        
+
+uint8_t CommandPacket::generate_checksum()
+{
+    // checksum is defined by the sum of all characters between sflag and checksum field
+    uint8_t s = 0;
+    
+    // include command
+    s += command;
+    
+    // include length
+    s += length;
+    
+    // include payload
+    for (int i = 0; i < length; i++)
+    {
+        s += payload[i];
+    }
+    
+    // calculate two's complement of the remainder
+    s = 0xff - s + 1;
+    
+    return s;
+}