// -------------------------------------------------------------- #include #include #include #include "DeSymbolizer.hpp" DeSymbolizer::DeSymbolizer() : Processor::Block(1, 1) , m_dataBitCount(0) , m_lastSymbol(0) , m_symbolMask(0) , m_nBitsPerSym(0) { setNumBitsPerSymbol(8); } void DeSymbolizer::setNumBitsPerSymbol(uint32_t nBitsPerSym) { m_nBitsPerSym = nBitsPerSym; m_symbolMask = 0; for(uint32_t k=0; k < nBitsPerSym; k++) { m_symbolMask <<= 1; m_symbolMask |= 1; } m_dataBitCount = 0; m_lastSymbol = 0; } void DeSymbolizer::process(uint32_t src) { uint32_t i, j; static uint8_t dst; static uint16_t preamble; uint16_t preamble_soll; uint32_t symSync; src = differentialDecode(src); symSync = src; const uint8_t preamble_bytes[2] = {(uint8_t)FRAME_PREAMBLE_IV, (uint8_t)(~FRAME_PREAMBLE_IV)}; preamble_soll = ((uint16_t)preamble_bytes[0] << 8) | ((uint16_t)preamble_bytes[1] & 0xFF); j = 0; for (i=0; i < m_nBitsPerSym; i++) { preamble <<= 1; preamble |= (uint32_t)((symSync >> (m_nBitsPerSym-1) & 1) != 0); symSync <<= 1; if (preamble == preamble_soll) { // We have bit sync m_dataBitCount = 0; j = i + 1; src = symSync; preamble = 0; m_buf_out->write(preamble_bytes, sizeof(preamble_bytes)); } } // Transmission order MSB first for (i=j; i < m_nBitsPerSym; i++) { dst <<= 1; dst |= (uint32_t)((src >> (m_nBitsPerSym-1) & 1) != 0); src <<= 1; m_dataBitCount++; if (m_dataBitCount == SIZEOF_DATA_BITS) { m_buf_out->write(&dst, 1); m_dataBitCount = 0; dst = 0; } } } void DeSymbolizer::prepare() { // Get buffers m_buf_in = buffer_in(); m_buf_out = buffer_out(); } void DeSymbolizer::process() { // Process input while(m_buf_in->len()) { symbol_t sym; m_buf_in->read(&sym, 1); process(sym); } } uint32_t DeSymbolizer::differentialDecode(uint32_t symbol) { uint32_t res; // Differential decode res = (uint32_t)(m_symbolMask & (symbol - m_lastSymbol)); m_lastSymbol = symbol; return res; } // --------------------------------------------------------------