A library to send and receive packets over serial, uses MODSERIAL
Dependents: SimpleSerialProtocolExample SerialFileReceiver
Diff: Protocol.cpp
- 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