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