A library to send and receive packets over serial, uses MODSERIAL

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Revision:
1:98ad30934a71
Parent:
0:1639507580d5
Child:
2:43794e0b738f
--- a/Protocol.cpp	Thu Jun 28 21:19:58 2012 +0000
+++ b/Protocol.cpp	Wed Aug 27 17:35:30 2014 +0000
@@ -1,10 +1,8 @@
-#include <stdarg.h>
-
 #include "Protocol.h"
 
 namespace SimpleSerialProtocol {
 
-Protocol::Protocol(PinName tx, PinName rx, PinName led_pin) : MODSERIAL(tx, rx, 64, 512), _receive_led(led_pin), _send_buffer(512) {
+Protocol::Protocol(PinName tx, PinName rx, PinName led_pin) : MODSERIAL(tx, rx, 64, 512), _receive_led(led_pin), _send_buffer(512){
 
     _corrupt_packets = 0;
     _invalid_bytes = 0;
@@ -17,8 +15,7 @@
     _state = 0;
     _last_byte = 0;
 
-    _receive_timeout.start();
-    
+    _receive_timeout.start();    
 }
 
 Protocol::~Protocol() {
@@ -35,7 +32,7 @@
 void Protocol::update() {
     for (uint16_t j = 0; j < _transmit_callback.size(); j++) {
         if (_transmit_callback[j].trigger()) {
-            _transmit_callback[j]._callback.call(&_packet_transmit);
+            _transmit_callback[j]._callback.call(this, &_packet_transmit);
             sendPacket(&_packet_transmit);
             _packet_transmit.reset();
         }
@@ -49,9 +46,11 @@
 
         if (_callback.count(_packet._type)) {
             for (uint16_t i = 0; i < _callback[_packet._type].size(); i++) {
-                _callback[_packet._type][i].call(&_packet);
+                _callback[_packet._type][i].call(this, &_packet);
             }
         }
+        _header_read = 0;
+        _data_read = 0;
         _packet.reset();
         _receive_led = 0;
     }
@@ -100,10 +99,6 @@
 
             case HEADER_RECEIVE:
                 _header[_header_read++] = MODSERIAL::getc();
-                _state = HEADER_DECODE;
-                break;
-
-            case HEADER_DECODE:
                 _packet._size = _header[0];
                 _state = DATA_RECEIVE;
                 break;
@@ -115,7 +110,9 @@
                         _state = DATA_VALIDATE;
                     }
                 } else {
-                    _state = PACKET_RESET;
+                    _state = PACKET_START;
+                    _header_read = 0;
+                    _data_read = 0;
                     _corrupt_packets++;
                 }
                 break;
@@ -125,22 +122,17 @@
                 _packet._checksum = MODSERIAL::getc();
                 cs = checksum(_packet._data, _packet._size);
                 if (cs == _packet._checksum) {
-                    _state = PACKET_VALID;
                     _packet._valid = true;
+                    _state = PACKET_START;
+                    return;
                 } else {
-                    _state = PACKET_RESET;
+                    _state = PACKET_START;
+                    _header_read = 0;
+                    _data_read = 0;
                     _corrupt_packets++;
                 }
                 break;
 
-            case PACKET_VALID:
-                if (!_packet._valid) {
-                    _state = PACKET_RESET;
-                } else {
-                    return;
-                }
-                return;
-
             default:
                 _state = PACKET_START;
                 _header_read = 0;
@@ -158,38 +150,4 @@
     return tmp_checksum;
 }
 
-//SERIAL overides
-int Protocol::printf( const char * format, ...) {
-    char buffer[256];
-    buffer[0] = '\0';
-    int status = 0;
-    
-    va_list args;
-    va_start( args, format);
-    status = vsnprintf (buffer, sizeof(buffer) - 1, format, args);
-    va_end(args);
-        
-    uint16_t i = 0;
-    while(buffer[i] != '\0' && i < sizeof(buffer)){
-        send(buffer[i]);
-        ++i;
-    }
-
-    return status;
-}
-
-int Protocol::puts( const char * str) {
-    uint16_t i = 0;
-    while(str[i] != '\0'){
-        send(str[i]);
-        ++i;
-    }
-    return i;
-}
-
-int Protocol::putc( int character){
-    send(character);
-    return 1;
-}
-
 }
\ No newline at end of file