- blockifized DeSymbolizer, DeFormatter, FrameReceiver

git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1077 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2022-06-24 15:13:44 +00:00
parent 1da7f978ae
commit 8b6d6313e5
5 changed files with 209 additions and 142 deletions
+67 -41
View File
@@ -3,7 +3,7 @@
#include <math.h> #include <math.h>
#include <stdint.h> #include <stdint.h>
#include <algorithm> #include <algorithm>
#include <stdio.h> #include <cstdio>
#include <crc/crc.h> #include <crc/crc.h>
#include "DeFormatter.hpp" #include "DeFormatter.hpp"
@@ -11,8 +11,8 @@
// -------------------------------------------------------------- // --------------------------------------------------------------
// Deformatter // Deformatter
// -------------------------------------------------------------- // --------------------------------------------------------------
DeFormatter::DeFormatter(IDeFormatter *pDataHandler) DeFormatter::DeFormatter()
: m_pDataHandler(pDataHandler) : Processor::Block(1, 1)
, m_scrambler(FRAME_SCRAMBLER_SEED, FRAME_SCRAMBLER_POLY) , m_scrambler(FRAME_SCRAMBLER_SEED, FRAME_SCRAMBLER_POLY)
, m_dataCount(0) , m_dataCount(0)
, m_state(Idle) , m_state(Idle)
@@ -20,24 +20,65 @@ DeFormatter::DeFormatter(IDeFormatter *pDataHandler)
resetStats(); resetStats();
} }
DeFormatter::~DeFormatter() void DeFormatter::resetStats()
{ {
memset(&m_frameStats, 0, sizeof(frame_statistics_t));
} }
void DeFormatter::process(uint8_t data) frame_statistics_t DeFormatter::getStats()
{ {
return m_frameStats;
}
void DeFormatter::prepare()
{
// Get buffers
m_buf_in = buffer_in<uint8_t>();
// m_buf_out = buffer_out<uint8_t>();
}
void DeFormatter::process()
{
// Process input
if (m_state == Idle) if (m_state == Idle)
{
process_sync();
}
else if (m_state == Header)
{
process_header();
}
else if (m_state == Data)
{
process_data();
}
}
void DeFormatter::process_sync()
{
while(m_buf_in->len())
{
uint8_t data;
m_buf_in->read(&data, 1);
m_sync_preamble <<= 8;
m_sync_preamble = m_sync_preamble | (uint16_t)data & 0xFF;
if (m_sync_preamble == 0x55AA)
{
m_state = Header;
break;
}
}
}
void DeFormatter::process_header()
{
if (m_buf_in->len() < sizeof(frame_hdr_t))
{ {
return; return;
} }
uint8_t *pData; m_buf_in->read((uint8_t*)&m_Hdr, sizeof(frame_hdr_t));
if (m_state == Header)
{
pData = (uint8_t*)&m_Hdr;
pData[m_dataCount++] = data;
if (m_dataCount == (sizeof(frame_hdr_t)))
{
m_scrambler.stateSet(m_Hdr.prn_state); m_scrambler.stateSet(m_Hdr.prn_state);
m_scrambler.process((uint8_t*)&m_Hdr.crc16, sizeof(m_Hdr.crc16)); m_scrambler.process((uint8_t*)&m_Hdr.crc16, sizeof(m_Hdr.crc16));
m_scrambler.process((uint8_t*)&m_Hdr.type, sizeof(m_Hdr.type)); m_scrambler.process((uint8_t*)&m_Hdr.type, sizeof(m_Hdr.type));
@@ -45,13 +86,22 @@ void DeFormatter::process(uint8_t data)
m_dataCount = 0; m_dataCount = 0;
m_state = Data; m_state = Data;
} }
void DeFormatter::process_data()
{
if (m_Hdr.length != sizeof(m_data))
{
m_state = Idle;
} }
else if (m_state == Data)
{ if(m_buf_in->len() < m_Hdr.length)
pData = (uint8_t*)&m_data;
pData[m_dataCount++] = data;
if (m_dataCount == m_Hdr.length)
{ {
return;
}
m_buf_in->read(m_data, m_Hdr.length);
m_dataCount += m_Hdr.length;
m_scrambler.process(m_data, FRAME_NUM_BYTES_PER_FRAME); m_scrambler.process(m_data, FRAME_NUM_BYTES_PER_FRAME);
uint16_t crc16_ist = Crc16(FRAME_CRC16_POLY, FRAME_CRC16_IV, m_data, FRAME_NUM_BYTES_PER_FRAME); uint16_t crc16_ist = Crc16(FRAME_CRC16_POLY, FRAME_CRC16_IV, m_data, FRAME_NUM_BYTES_PER_FRAME);
if (crc16_ist == m_Hdr.crc16) if (crc16_ist == m_Hdr.crc16)
@@ -60,7 +110,6 @@ void DeFormatter::process(uint8_t data)
if (m_Hdr.type == FRAME_TYPE_DATA) if (m_Hdr.type == FRAME_TYPE_DATA)
{ {
m_frameStats.numDataBytes += m_Hdr.length; m_frameStats.numDataBytes += m_Hdr.length;
m_pDataHandler->onData(m_data, m_Hdr.length);
} }
} }
m_frameStats.numDataFrame += (uint32_t)(m_Hdr.type == FRAME_TYPE_DATA); m_frameStats.numDataFrame += (uint32_t)(m_Hdr.type == FRAME_TYPE_DATA);
@@ -70,28 +119,5 @@ void DeFormatter::process(uint8_t data)
m_dataCount = 0; m_dataCount = 0;
m_state = Idle; m_state = Idle;
} }
}
}
frame_statistics_t DeFormatter::getStats()
{
return m_frameStats;
}
void DeFormatter::resetStats()
{
memset(&m_frameStats, 0, sizeof(frame_statistics_t));
}
void DeFormatter::onReset()
{
m_dataCount = 0;
m_state = Header;
};
void DeFormatter::onData(data_t data)
{
process((uint8_t)data);
}
// -------------------------------------------------------------- // --------------------------------------------------------------
+16 -23
View File
@@ -4,28 +4,12 @@
#include <radio/radio_types.h> #include <radio/radio_types.h>
#include <radio/cpx.h> #include <radio/cpx.h>
#include <cpp/radio/processor/src/Block.hpp>
#include "FrameDefs.hpp" #include "FrameDefs.hpp"
#include "Scrambler.hpp" #include "Scrambler.hpp"
class IData class DeFormatter : public Processor::Block
{
public:
IData() {}
virtual ~IData() {}
virtual void onData(data_t data) = 0;
virtual void onReset() = 0;
};
class IDeFormatter
{
public:
IDeFormatter() {}
virtual ~IDeFormatter() {}
virtual void onData(void *pData, uint32_t size) = 0;
};
class DeFormatter : public IData
{ {
enum State enum State
{ {
@@ -33,23 +17,32 @@ class DeFormatter : public IData
Header, Header,
Data Data
}; };
public: public:
DeFormatter(IDeFormatter *pDataHandler); DeFormatter();
~DeFormatter(); virtual ~DeFormatter() = default;
void process(uint8_t data); void process(uint8_t data);
frame_statistics_t getStats(); frame_statistics_t getStats();
void resetStats(); void resetStats();
// Processor::Block
void prepare() override;
void process() override;
private: private:
IDeFormatter *m_pDataHandler;
Scrambler m_scrambler; Scrambler m_scrambler;
uint32_t m_dataCount; uint32_t m_dataCount;
uint16_t m_sync_preamble;
frame_hdr_t m_Hdr; frame_hdr_t m_Hdr;
uint8_t m_data[FRAME_NUM_BYTES_PER_FRAME]; uint8_t m_data[FRAME_NUM_BYTES_PER_FRAME];
frame_statistics_t m_frameStats; frame_statistics_t m_frameStats;
State m_state; State m_state;
void onData(data_t data) override; Processor::Buffer<uint8_t> *m_buf_in;
void onReset() override; Processor::Buffer<uint8_t> *m_buf_out;
void process_sync();
void process_header();
void process_data();
}; };
// -------------------------------------------------------------- // --------------------------------------------------------------
+26 -11
View File
@@ -5,8 +5,8 @@
#include "DeSymbolizer.hpp" #include "DeSymbolizer.hpp"
DeSymbolizer::DeSymbolizer(IData *pDataHandler) DeSymbolizer::DeSymbolizer()
: m_pDataHandler(pDataHandler) : Processor::Block(1, 1)
, m_dataBitCount(0) , m_dataBitCount(0)
, m_lastSymbol(0) , m_lastSymbol(0)
, m_symbolMask(0) , m_symbolMask(0)
@@ -15,10 +15,6 @@ DeSymbolizer::DeSymbolizer(IData *pDataHandler)
setNumBitsPerSymbol(8); setNumBitsPerSymbol(8);
} }
DeSymbolizer::~DeSymbolizer()
{
}
void DeSymbolizer::setNumBitsPerSymbol(uint32_t nBitsPerSym) void DeSymbolizer::setNumBitsPerSymbol(uint32_t nBitsPerSym)
{ {
m_nBitsPerSym = nBitsPerSym; m_nBitsPerSym = nBitsPerSym;
@@ -41,8 +37,9 @@ void DeSymbolizer::process(uint32_t src)
uint32_t symSync; uint32_t symSync;
src = differentialDecode(src); src = differentialDecode(src);
symSync = src; symSync = src;
const uint8_t preamble_bytes[2] = {(uint8_t)FRAME_PREAMBLE_IV, (uint8_t)(~FRAME_PREAMBLE_IV)};
preamble_soll = ((uint16_t)FRAME_PREAMBLE_IV << 8) | (~(uint16_t)FRAME_PREAMBLE_IV & 0xFF); preamble_soll = ((uint16_t)preamble_bytes[0] << 8) | ((uint16_t)preamble_bytes[1] & 0xFF);
j = 0; j = 0;
for (i=0; i < m_nBitsPerSym; i++) for (i=0; i < m_nBitsPerSym; i++)
@@ -52,12 +49,12 @@ void DeSymbolizer::process(uint32_t src)
symSync <<= 1; symSync <<= 1;
if (preamble == preamble_soll) if (preamble == preamble_soll)
{ {
preamble = 0; // We have bit sync
// We have data sync
m_dataBitCount = 0; m_dataBitCount = 0;
m_pDataHandler->onReset();
j = i + 1; j = i + 1;
src = symSync; src = symSync;
preamble = 0;
m_buf_out->write(preamble_bytes, sizeof(preamble_bytes));
} }
} }
@@ -70,13 +67,31 @@ void DeSymbolizer::process(uint32_t src)
m_dataBitCount++; m_dataBitCount++;
if (m_dataBitCount == SIZEOF_DATA_BITS) if (m_dataBitCount == SIZEOF_DATA_BITS)
{ {
m_pDataHandler->onData(dst); m_buf_out->write(&dst, 1);
m_dataBitCount = 0; m_dataBitCount = 0;
dst = 0; dst = 0;
} }
} }
} }
void DeSymbolizer::prepare()
{
// Get buffers
m_buf_in = buffer_in<symbol_t>();
m_buf_out = buffer_out<uint8_t>();
}
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 DeSymbolizer::differentialDecode(uint32_t symbol)
{ {
uint32_t res; uint32_t res;
+13 -5
View File
@@ -7,21 +7,29 @@
#include "DeFormatter.hpp" #include "DeFormatter.hpp"
class DeSymbolizer class DeSymbolizer : public Processor::Block
{ {
public: public:
DeSymbolizer(IData *pDataHandler); DeSymbolizer();
~DeSymbolizer(); virtual ~DeSymbolizer() = default;
void process(symbol_t src);
void setNumBitsPerSymbol(uint32_t nBitsPerSym); void setNumBitsPerSymbol(uint32_t nBitsPerSym);
void process(symbol_t src);
// Processor::Block
void prepare() override;
void process() override;
private: private:
uint32_t m_nBitsPerSym; uint32_t m_nBitsPerSym;
IData *m_pDataHandler;
uint32_t m_dataBitCount; uint32_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);
Processor::Buffer<symbol_t> *m_buf_in;
Processor::Buffer<uint8_t> *m_buf_out;
}; };
// -------------------------------------------------------------- // --------------------------------------------------------------
+32 -7
View File
@@ -5,21 +5,27 @@
#include <cstdint> #include <cstdint>
#include <radio/radio_types.h> #include <radio/radio_types.h>
#include <radio/cpx.h> #include <radio/cpx.h>
#include <cpp/radio/processor/src/Block.hpp>
#include "FrameDefs.hpp" #include "FrameDefs.hpp"
#include "Symbolizer.hpp" #include "Symbolizer.hpp"
#include "Formatter.hpp" #include "Formatter.hpp"
#include "DeSymbolizer.hpp" #include "DeSymbolizer.hpp"
#include "DeFormatter.hpp" #include "DeFormatter.hpp"
class FrameReceiver class FrameReceiver : public Processor::Block
{ {
public: public:
FrameReceiver(IDeFormatter *pRawFrameHandler) FrameReceiver()
: m_deformatter(pRawFrameHandler) : Processor::Block(1, 1)
, m_desymbolizer( &m_deformatter) , m_desymbolizer()
, m_deformatter()
, m_framesCount(0) , m_framesCount(0)
, m_byteCount(0) , m_byteCount(0)
, m_buf_symbol_in(nullptr)
, m_buf_byte_out(nullptr)
{ {
} }
~FrameReceiver() ~FrameReceiver()
@@ -42,16 +48,35 @@ public:
m_deformatter.resetStats(); m_deformatter.resetStats();
} }
void process(symbol_t symbol) void prepare()
{ {
m_desymbolizer.process(symbol); m_buf_symbol_in = buffer_in<symbol_t>();
// m_buf_byte_out = buffer_out<uint8_t>();
m_buf_byte_in.resize(2048);
m_desymbolizer.buffer_in_add(m_buf_symbol_in);
m_desymbolizer.buffer_out_add(&m_buf_byte_in);
m_desymbolizer.prepare();
m_deformatter.buffer_in_add(&m_buf_byte_in);
m_deformatter.buffer_out_add(m_buf_byte_out);
m_deformatter.prepare();
}
void process()
{
m_desymbolizer.process();
m_deformatter.process();
} }
private: private:
DeFormatter m_deformatter;
DeSymbolizer m_desymbolizer; DeSymbolizer m_desymbolizer;
DeFormatter m_deformatter;
uint32_t m_framesCount; uint32_t m_framesCount;
uint32_t m_byteCount; uint32_t m_byteCount;
Processor::Buffer<symbol_t> *m_buf_symbol_in;
Processor::Buffer<uint8_t> *m_buf_byte_out;
Processor::Buffer<uint8_t> m_buf_byte_in;
}; };
// -------------------------------------------------------------- // --------------------------------------------------------------