diff --git a/radio/DeSymbolizer.cpp b/radio/DeSymbolizer.cpp index d6c30c5..e4d0fc2 100644 --- a/radio/DeSymbolizer.cpp +++ b/radio/DeSymbolizer.cpp @@ -4,8 +4,6 @@ #include #include "DeSymbolizer.hpp" -#define DESYMBOLIZER_DEBUG printf - DeSymbolizer::DeSymbolizer() : Processor::Block(1, 1) , m_dataBitCount(0) @@ -23,12 +21,7 @@ DeSymbolizer::DeSymbolizer() void DeSymbolizer::setNumBitsPerSymbol(size_t nBitsPerSym) { m_nBitsPerSym = nBitsPerSym; - m_symbolMask = 0; - for(size_t k=0; k < nBitsPerSym; k++) - { - m_symbolMask <<= 1; - m_symbolMask |= 1; - } + m_symbolMask = (1 << nBitsPerSym) - 1; m_dataBitCount = 0; m_lastSymbol = 0; } @@ -48,23 +41,20 @@ void DeSymbolizer::sync(symbol_t symbol) { m_sync_counter = 0; m_sync_dist_last = 0; - DESYMBOLIZER_DEBUG("Idle -> ACQ\n"); m_state = State::Acq; } else if (m_state == State::Acq) { if (is_preamble(word)) { - DESYMBOLIZER_DEBUG("Acquired bit sync. Last bit sync was %zu symbols ago\n", m_sync_dist); if (m_sync_dist_last == m_sync_dist) { m_sync_counter++; - DESYMBOLIZER_DEBUG("Received sync at %zu %zu times -> OK\n", m_sync_dist, m_sync_counter); if (m_sync_counter == SYNC_COUNTER_RELOAD) { m_sync_counter = 0; - m_dataBitCount = 0; - DESYMBOLIZER_DEBUG("ACQ -> TRK\n"); + // Adjust data count phase + m_dataBitCount = m_nBitsPerSym; m_state = State::Trk; } } @@ -83,54 +73,52 @@ void DeSymbolizer::sync(symbol_t symbol) { if (not is_preamble(word)) { - DESYMBOLIZER_DEBUG("Missed sync at %zu. Found %04X instead -> NOK\n", m_sync_dist, word); - DESYMBOLIZER_DEBUG("TRK -> Idle\n"); m_state = State::Idle; } - else - { -// printf("We tracked sync at %zu -> OK\n", m_sync_dist); - } m_sync_dist = 0; } - else - { - if (is_preamble(word)) - { - DESYMBOLIZER_DEBUG("Found sync at %zu -> IGN\n", m_sync_dist); - } - } } m_sync_dist++; } -uint8_t DeSymbolizer::sym2byte(symbol_t symbol) +size_t DeSymbolizer::sym2bytes(symbol_t symbol, uint8_t *pBytes) { - static uint8_t byte; - byte <<= m_nBitsPerSym; - byte |= symbol & m_symbolMask; - return byte; + static uint8_t byte; + size_t num_produced = 0; + + // Transmission order MSB first + for (size_t i=0; i < m_nBitsPerSym; i++) + { + byte <<= 1; + byte |= (symbol_t)(symbol >> (m_nBitsPerSym-1) & 1); + symbol <<= 1; + m_dataBitCount--; + if (m_dataBitCount == 0) + { + pBytes[num_produced++] = byte; + m_dataBitCount = 8; + } + } + return num_produced; } void DeSymbolizer::process(symbol_t symbol_enc) { - + uint8_t bytes[2]; symbol_t symbol = differentialDecode(symbol_enc); sync(symbol); // Create bytes from symbol - uint8_t byte = sym2byte(symbol); + size_t numBytes = sym2bytes(symbol, bytes); // Commit bytes if in sync if (m_state == State::Trk) { - if (m_dataBitCount == 0) + if (numBytes) { -// printf("Write %02X\n", byte); - m_buf_out->write(&byte, 1); + m_buf_out->write(bytes, numBytes); } - m_dataBitCount = (m_dataBitCount + m_nBitsPerSym) & 7; } } diff --git a/radio/DeSymbolizer.hpp b/radio/DeSymbolizer.hpp index a17b426..5e0008c 100644 --- a/radio/DeSymbolizer.hpp +++ b/radio/DeSymbolizer.hpp @@ -30,8 +30,8 @@ public: private: - uint32_t m_nBitsPerSym; - uint32_t m_dataBitCount; + size_t m_nBitsPerSym; + size_t m_dataBitCount; symbol_t m_lastSymbol; symbol_t m_symbolMask; symbol_t differentialDecode(symbol_t symbol); @@ -45,7 +45,7 @@ private: Processor::Buffer *m_buf_out; void process(symbol_t symbol); void sync(symbol_t symbol); - uint8_t sym2byte(symbol_t symbol); + size_t sym2bytes(symbol_t symbol, uint8_t *pBytes); bool is_preamble(uint16_t data); };