From 712950db5e0c08d7b31a5074765d507f73da423c Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 12 Feb 2016 20:46:34 +0100 Subject: quick&dirty hamming buffer implementation. --- src/fecmodem.cc | 28 ++++++++++++++++++++++++++++ src/fecmodem.h | 11 +++++++++++ src/modem.cc | 10 ++++++++++ src/modem.h | 5 ++++- 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/fecmodem.cc b/src/fecmodem.cc index bd0d58c..52271fd 100644 --- a/src/fecmodem.cc +++ b/src/fecmodem.cc @@ -48,4 +48,32 @@ uint8_t FECModem::hamming2416(uint8_t *byte1, uint8_t *byte2, uint8_t parity) return 0; } +uint8_t FECModem::buffer_available() +{ + if (rxWasReset()) + hammingState = FIRST_BYTE; + if (this->Modem::buffer_available() >= 3) + return 2; + if (hammingState == SECOND_BYTE) + return 1; + return 0; +} + +uint8_t FECModem::buffer_get() +{ + uint8_t byte1, parity; + if (hammingState == SECOND_BYTE) { + hammingState = FIRST_BYTE; + return buf_byte; + } + hammingState = SECOND_BYTE; + byte1 = this->Modem::buffer_get(); + buf_byte = this->Modem::buffer_get(); + parity = this->Modem::buffer_get(); + + hamming2416(&byte1, &buf_byte, parity); + + return byte1; +} + FECModem modem; diff --git a/src/fecmodem.h b/src/fecmodem.h index dd36f68..00487ee 100644 --- a/src/fecmodem.h +++ b/src/fecmodem.h @@ -9,10 +9,21 @@ class FECModem : public Modem { private: + enum HammingState : uint8_t { + FIRST_BYTE, + SECOND_BYTE + }; + HammingState hammingState; + uint8_t buf_byte; + uint8_t parity128(uint8_t byte); uint8_t parity2416(uint8_t byte1, uint8_t byte2); uint8_t correct128(uint8_t *byte, uint8_t parity); uint8_t hamming2416(uint8_t *byte1, uint8_t *byte2, uint8_t parity); + public: + FECModem() : Modem() { hammingState = FIRST_BYTE; }; + uint8_t buffer_available(void); + uint8_t buffer_get(void); }; extern FECModem modem; diff --git a/src/modem.cc b/src/modem.cc index 472fe04..dc183b1 100644 --- a/src/modem.cc +++ b/src/modem.cc @@ -14,6 +14,15 @@ extern FECModem modem; +bool Modem::rxWasReset() +{ + if (new_transmission) { + new_transmission = false; + return true; + } + return false; +} + /* * Returns number of available bytes in ringbuffer or 0 if empty */ @@ -84,6 +93,7 @@ void Modem::receive() { if (modem_pulselen > MODEM_SYNC_LEN) { modem_bitlen = (modem_pulselen >> 2); modem_bit = 0; + new_transmission = true; return; } diff --git a/src/modem.h b/src/modem.h index 4040c92..284edeb 100644 --- a/src/modem.h +++ b/src/modem.h @@ -32,9 +32,12 @@ class Modem { uint8_t buffer_head; uint8_t buffer_tail; uint8_t buffer[MODEM_BUFFER_SIZE]; + bool new_transmission; void buffer_put(const uint8_t c); public: - Modem() {}; + Modem() {new_transmission = false;}; + + bool rxWasReset(); /** * Checks if there are unprocessed bytes in the modem receive buffer. -- cgit v1.2.3