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

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Revision:
2:43794e0b738f
Parent:
1:98ad30934a71
Child:
3:5caff50e14a7
--- a/Protocol.cpp	Wed Aug 27 17:35:30 2014 +0000
+++ b/Protocol.cpp	Thu Sep 18 17:37:04 2014 +0000
@@ -3,29 +3,19 @@
 namespace SimpleSerialProtocol {
 
 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;
-
-    _header[0]= 0;
-    _header[1]= 0;
-    _header_read = 0;
-    _data_read = 0;
-    _footer_read = 0;
-    _state = 0;
-    _last_byte = 0;
-
-    _receive_timeout.start();    
+    _receive_timeout.start();
+    codec = 0;
 }
 
 Protocol::~Protocol() {
-
+    codec = 0;
 }
 
 void Protocol::blockUntilTxEmpty(){
     while(_send_buffer.available()){
         MODSERIAL::putc(_send_buffer.read());
     }
+    while(!MODSERIAL::txBufferEmpty());
     return;
 }
 
@@ -33,26 +23,22 @@
     for (uint16_t j = 0; j < _transmit_callback.size(); j++) {
         if (_transmit_callback[j].trigger()) {
             _transmit_callback[j]._callback.call(this, &_packet_transmit);
-            sendPacket(&_packet_transmit);
+            send(&_packet_transmit);
             _packet_transmit.reset();
         }
     }
     
-    send();
+    transmit();
     receive();
     
     if (packetWaiting()) {
         _receive_led = 1;
-
         if (_callback.count(_packet._type)) {
             for (uint16_t i = 0; i < _callback[_packet._type].size(); i++) {
                 _callback[_packet._type][i].call(this, &_packet);
             }
         }
-        _header_read = 0;
-        _data_read = 0;
         _packet.reset();
-        _receive_led = 0;
     }
 }
 
@@ -60,7 +46,7 @@
     _send_buffer.write(byte);
 }
 
-void Protocol::send() {
+void Protocol::transmit() {
 
     uint16_t buffer_size = _send_buffer.available();
     uint16_t send_length = 0;
@@ -79,75 +65,20 @@
 }
 
 void Protocol::receive() {
-    uint8_t new_byte = 0;
-    uint8_t cs = 0;
-
     _receive_timeout.reset();
     while (MODSERIAL::rxBufferGetCount() > 0 &&  _receive_timeout.read_us() < 50) {
-        switch (_state) {
-            case PACKET_START:
-                new_byte = MODSERIAL::getc();
-                if (_last_byte == 255 && new_byte == 127) {
-                    _state = HEADER_RECEIVE;
-                } else {
-                    if (new_byte!=255) {
-                        _invalid_bytes++;
-                    }
-                }
-                _last_byte = new_byte;
-                break;
-
-            case HEADER_RECEIVE:
-                _header[_header_read++] = MODSERIAL::getc();
-                _packet._size = _header[0];
-                _state = DATA_RECEIVE;
-                break;
-
-            case DATA_RECEIVE:
-                if (_data_read < _packet._size) {
-                    _packet._data[_data_read++] = MODSERIAL::getc();
-                    if (_data_read == _packet._size) {
-                        _state = DATA_VALIDATE;
-                    }
-                } else {
-                    _state = PACKET_START;
-                    _header_read = 0;
-                    _data_read = 0;
-                    _corrupt_packets++;
-                }
-                break;
-
-            case DATA_VALIDATE:
-                _packet._type = _packet._data[0];
-                _packet._checksum = MODSERIAL::getc();
-                cs = checksum(_packet._data, _packet._size);
-                if (cs == _packet._checksum) {
-                    _packet._valid = true;
-                    _state = PACKET_START;
-                    return;
-                } else {
-                    _state = PACKET_START;
-                    _header_read = 0;
-                    _data_read = 0;
-                    _corrupt_packets++;
-                }
-                break;
-
-            default:
-                _state = PACKET_START;
-                _header_read = 0;
-                _data_read = 0;
-                break;
+        if(codec){
+            codec->decode(&_packet, MODSERIAL::getc());
         }
     }
 }
 
-uint8_t Protocol::checksum(uint8_t* packet, uint16_t packet_size) {
-    uint8_t tmp_checksum = 16;
-    for (int i = 0; i < packet_size; i++) {
-        tmp_checksum ^= packet[i];
+void Protocol::send(Packet* packet) {
+    if (packet != 0) {
+        if(codec){
+            codec->encode(packet, &_send_buffer);
+        }
     }
-    return tmp_checksum;
 }
 
 }
\ No newline at end of file