- simplified m_symbolMask calculation
- removed debug prints git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1083 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+25
-37
@@ -4,8 +4,6 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "DeSymbolizer.hpp"
|
#include "DeSymbolizer.hpp"
|
||||||
|
|
||||||
#define DESYMBOLIZER_DEBUG printf
|
|
||||||
|
|
||||||
DeSymbolizer::DeSymbolizer()
|
DeSymbolizer::DeSymbolizer()
|
||||||
: Processor::Block(1, 1)
|
: Processor::Block(1, 1)
|
||||||
, m_dataBitCount(0)
|
, m_dataBitCount(0)
|
||||||
@@ -23,12 +21,7 @@ DeSymbolizer::DeSymbolizer()
|
|||||||
void DeSymbolizer::setNumBitsPerSymbol(size_t nBitsPerSym)
|
void DeSymbolizer::setNumBitsPerSymbol(size_t nBitsPerSym)
|
||||||
{
|
{
|
||||||
m_nBitsPerSym = nBitsPerSym;
|
m_nBitsPerSym = nBitsPerSym;
|
||||||
m_symbolMask = 0;
|
m_symbolMask = (1 << nBitsPerSym) - 1;
|
||||||
for(size_t k=0; k < nBitsPerSym; k++)
|
|
||||||
{
|
|
||||||
m_symbolMask <<= 1;
|
|
||||||
m_symbolMask |= 1;
|
|
||||||
}
|
|
||||||
m_dataBitCount = 0;
|
m_dataBitCount = 0;
|
||||||
m_lastSymbol = 0;
|
m_lastSymbol = 0;
|
||||||
}
|
}
|
||||||
@@ -48,23 +41,20 @@ void DeSymbolizer::sync(symbol_t symbol)
|
|||||||
{
|
{
|
||||||
m_sync_counter = 0;
|
m_sync_counter = 0;
|
||||||
m_sync_dist_last = 0;
|
m_sync_dist_last = 0;
|
||||||
DESYMBOLIZER_DEBUG("Idle -> ACQ\n");
|
|
||||||
m_state = State::Acq;
|
m_state = State::Acq;
|
||||||
}
|
}
|
||||||
else if (m_state == State::Acq)
|
else if (m_state == State::Acq)
|
||||||
{
|
{
|
||||||
if (is_preamble(word))
|
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)
|
if (m_sync_dist_last == m_sync_dist)
|
||||||
{
|
{
|
||||||
m_sync_counter++;
|
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)
|
if (m_sync_counter == SYNC_COUNTER_RELOAD)
|
||||||
{
|
{
|
||||||
m_sync_counter = 0;
|
m_sync_counter = 0;
|
||||||
m_dataBitCount = 0;
|
// Adjust data count phase
|
||||||
DESYMBOLIZER_DEBUG("ACQ -> TRK\n");
|
m_dataBitCount = m_nBitsPerSym;
|
||||||
m_state = State::Trk;
|
m_state = State::Trk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,54 +73,52 @@ void DeSymbolizer::sync(symbol_t symbol)
|
|||||||
{
|
{
|
||||||
if (not is_preamble(word))
|
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;
|
m_state = State::Idle;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// printf("We tracked sync at %zu -> OK\n", m_sync_dist);
|
|
||||||
}
|
|
||||||
m_sync_dist = 0;
|
m_sync_dist = 0;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (is_preamble(word))
|
|
||||||
{
|
|
||||||
DESYMBOLIZER_DEBUG("Found sync at %zu -> IGN\n", m_sync_dist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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)
|
void DeSymbolizer::process(symbol_t symbol_enc)
|
||||||
{
|
{
|
||||||
|
uint8_t bytes[2];
|
||||||
symbol_t symbol = differentialDecode(symbol_enc);
|
symbol_t symbol = differentialDecode(symbol_enc);
|
||||||
sync(symbol);
|
sync(symbol);
|
||||||
|
|
||||||
// Create bytes from symbol
|
// Create bytes from symbol
|
||||||
uint8_t byte = sym2byte(symbol);
|
size_t numBytes = sym2bytes(symbol, bytes);
|
||||||
|
|
||||||
// Commit bytes if in sync
|
// Commit bytes if in sync
|
||||||
if (m_state == State::Trk)
|
if (m_state == State::Trk)
|
||||||
{
|
{
|
||||||
if (m_dataBitCount == 0)
|
if (numBytes)
|
||||||
{
|
{
|
||||||
// printf("Write %02X\n", byte);
|
m_buf_out->write(bytes, numBytes);
|
||||||
m_buf_out->write(&byte, 1);
|
|
||||||
}
|
}
|
||||||
m_dataBitCount = (m_dataBitCount + m_nBitsPerSym) & 7;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t m_nBitsPerSym;
|
size_t m_nBitsPerSym;
|
||||||
uint32_t m_dataBitCount;
|
size_t m_dataBitCount;
|
||||||
symbol_t m_lastSymbol;
|
symbol_t m_lastSymbol;
|
||||||
symbol_t m_symbolMask;
|
symbol_t m_symbolMask;
|
||||||
symbol_t differentialDecode(symbol_t symbol);
|
symbol_t differentialDecode(symbol_t symbol);
|
||||||
@@ -45,7 +45,7 @@ private:
|
|||||||
Processor::Buffer<uint8_t> *m_buf_out;
|
Processor::Buffer<uint8_t> *m_buf_out;
|
||||||
void process(symbol_t symbol);
|
void process(symbol_t symbol);
|
||||||
void sync(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);
|
bool is_preamble(uint16_t data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user