1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-23 08:28:36 -05:00

SDRdaemonFEC support: full compile

This commit is contained in:
f4exb 2016-06-20 01:32:32 +02:00
parent eb3fedecda
commit 0812ab0d13
6 changed files with 19 additions and 78 deletions

View File

@ -22,7 +22,6 @@
#include "sdrdaemonfecbuffer.h"
const int SDRdaemonFECBuffer::m_udpPayloadSize = 512;
const int SDRdaemonFECBuffer::m_sampleSize = 2;
const int SDRdaemonFECBuffer::m_iqSampleSize = 2 * m_sampleSize;
const int SDRdaemonFECBuffer::m_rawBufferLengthSeconds = 8; // should be even
@ -55,7 +54,7 @@ void SDRdaemonFECBuffer::initDecoderSlotsAddresses()
{
for (int i = 0; i < nbDecoderSlots; i++)
{
for (int j = 0; j < nbOriginalBlocks - 1; j++)
for (int j = 0; j < m_nbOriginalBlocks - 1; j++)
{
m_decoderSlots[i].m_originalBlockPtrs[j] = &m_frames[i].m_blocks[j];
}
@ -94,12 +93,12 @@ void SDRdaemonFECBuffer::initDecodeSlot(int slotIndex)
m_decoderSlots[slotIndex].m_decoded = false;
m_decoderSlots[slotIndex].m_blockZero.m_metaData.init();
memset((void *) m_decoderSlots[slotIndex].m_blockZero.m_samples, 0, samplesPerBlockZero * sizeof(Sample));
memset((void *) m_frames[slotIndex].m_blocks, 0, (nbOriginalBlocks - 1) * samplesPerBlock * sizeof(Sample));
memset((void *) m_frames[slotIndex].m_blocks, 0, (m_nbOriginalBlocks - 1) * samplesPerBlock * sizeof(Sample));
}
void SDRdaemonFECBuffer::writeData(char *array, uint32_t length)
{
assert(length == udpSize);
assert(length == m_udpPayloadSize);
bool dataAvailable = false;
SuperBlock *superBlock = (SuperBlock *) array;
@ -160,7 +159,7 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length)
int blockIndex = superBlock->header.blockIndex;
int blockHead = m_decoderSlots[decoderIndex].m_blockCount;
if (blockHead < nbOriginalBlocks) // not enough blocks to decode -> store data
if (blockHead < m_nbOriginalBlocks) // not enough blocks to decode -> store data
{
if (blockIndex == 0) // first block with meta
{
@ -171,7 +170,7 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length)
(const void *) m_decoderSlots[decoderIndex].m_blockZero.m_samples,
samplesPerBlockZero * sizeof(Sample));
}
else if (blockIndex < nbOriginalBlocks) // normal block
else if (blockIndex < m_nbOriginalBlocks) // normal block
{
m_frames[decoderIndex].m_blocks[blockIndex - 1] = superBlock->protectedBlock;
m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[blockHead].Block = (void *) &m_frames[decoderIndex].m_blocks[blockIndex - 1];

View File

@ -138,15 +138,14 @@ public:
}
}
static const int m_udpPayloadSize;
static const int m_udpPayloadSize = SDRDAEMONFEC_UDPSIZE;
static const int m_nbOriginalBlocks = SDRDAEMONFEC_NBORIGINALBLOCKS;
static const int m_sampleSize;
static const int m_iqSampleSize;
static const int m_rawBufferLengthSeconds;
static const int m_rawBufferMinNbFrames; //!< Minimum number of frames for the length of buffer
private:
static const int udpSize = SDRDAEMONFEC_UDPSIZE;
static const int nbOriginalBlocks = SDRDAEMONFEC_NBORIGINALBLOCKS;
static const int nbDecoderSlots = SDRDAEMONFEC_NBDECODERSLOTS;
#pragma pack(push, 1)
@ -158,16 +157,16 @@ private:
struct BufferFrame
{
BufferBlockZero m_blockZero;
ProtectedBlock m_blocks[nbOriginalBlocks - 1];
ProtectedBlock m_blocks[m_nbOriginalBlocks - 1];
};
#pragma pack(pop)
struct DecoderSlot
{
ProtectedBlockZero m_blockZero;
ProtectedBlock* m_originalBlockPtrs[nbOriginalBlocks];
ProtectedBlock m_recoveryBlocks[nbOriginalBlocks]; // max size
cm256_block m_cm256DescriptorBlocks[nbOriginalBlocks];
ProtectedBlock* m_originalBlockPtrs[m_nbOriginalBlocks];
ProtectedBlock m_recoveryBlocks[m_nbOriginalBlocks]; // max size
cm256_block m_cm256DescriptorBlocks[m_nbOriginalBlocks];
int m_blockCount; //!< total number of blocks received for this frame
int m_recoveryCount; //!< number of recovery blocks received
bool m_decoded; //!< true if decoded

View File

@ -32,8 +32,6 @@
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonUDPLink, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonAutoCorr, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonWork, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonAutoFollowPolicy, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonResetIndexes, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgConfigureSDRdaemonStreamTiming, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgReportSDRdaemonAcquisition, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonFECInput::MsgReportSDRdaemonStreamData, Message)
@ -128,26 +126,6 @@ bool SDRdaemonFECInput::handleMessage(const Message& message)
m_deviceAPI->configureCorrections(dcBlock, iqImbalance);
return true;
}
else if (MsgConfigureSDRdaemonAutoFollowPolicy::match(message))
{
MsgConfigureSDRdaemonAutoFollowPolicy& conf = (MsgConfigureSDRdaemonAutoFollowPolicy&) message;
bool autoFollowRate = conf.autoFollowRate();
bool autoCorrBuffer = conf.autoCorrBuffer();
if (autoFollowRate != m_autoFollowRate) {
m_SDRdaemonUDPHandler->setAutoFollowRate(autoFollowRate);
m_autoFollowRate = autoFollowRate;
}
if (autoCorrBuffer != m_autoCorrBuffer) {
m_SDRdaemonUDPHandler->setAutoCorrBuffer(autoCorrBuffer);
m_autoCorrBuffer = autoCorrBuffer;
}
return true;
}
else if (MsgConfigureSDRdaemonResetIndexes::match(message))
{
m_SDRdaemonUDPHandler->resetIndexes();
return true;
}
else if (MsgConfigureSDRdaemonWork::match(message))
{
MsgConfigureSDRdaemonWork& conf = (MsgConfigureSDRdaemonWork&) message;

View File

@ -94,43 +94,6 @@ public:
{ }
};
class MsgConfigureSDRdaemonAutoFollowPolicy : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool autoFollowRate() const { return m_autoFollowRate; }
bool autoCorrBuffer() const { return m_autoCorrBuffer; }
static MsgConfigureSDRdaemonAutoFollowPolicy* create(bool autoFollowRate, bool autoCorrBuffer)
{
return new MsgConfigureSDRdaemonAutoFollowPolicy(autoFollowRate, autoCorrBuffer);
}
private:
bool m_autoFollowRate;
bool m_autoCorrBuffer;
MsgConfigureSDRdaemonAutoFollowPolicy(bool autoFollowRate, bool autoCorrBuffer) :
Message(),
m_autoFollowRate(autoFollowRate),
m_autoCorrBuffer(autoCorrBuffer)
{ }
};
class MsgConfigureSDRdaemonResetIndexes : public Message {
MESSAGE_CLASS_DECLARATION
public:
static MsgConfigureSDRdaemonResetIndexes* create()
{
return new MsgConfigureSDRdaemonResetIndexes();
}
private:
MsgConfigureSDRdaemonResetIndexes() :
Message()
{ }
};
class MsgConfigureSDRdaemonStreamTiming : public Message {
MESSAGE_CLASS_DECLARATION
@ -218,6 +181,7 @@ public:
uint32_t tv_usec,
float bufferLenSec,
int32_t bufferGauge,
int nbOriginalBlocks,
int curNbBlocks,
int curNbRecovery,
float avgNbBlocks,
@ -227,6 +191,7 @@ public:
tv_usec,
bufferLenSec,
bufferGauge,
nbOriginalBlocks,
curNbBlocks,
curNbRecovery,
avgNbBlocks,
@ -248,6 +213,7 @@ public:
uint32_t tv_usec,
float bufferLenSec,
int32_t bufferGauge,
int nbOriginalBlocks,
int curNbBlocks,
int curNbRecovery,
float avgNbBlocks,
@ -255,7 +221,7 @@ public:
Message(),
m_tv_sec(tv_sec),
m_tv_usec(tv_usec),
m_framesComplete(curNbBlocks == SDRdaemonFECBuffer::nbOriginalBlocks),
m_framesComplete(curNbBlocks == nbOriginalBlocks),
m_bufferLenSec(bufferLenSec),
m_bufferGauge(bufferGauge),
m_curNbBlocks(curNbBlocks),

View File

@ -134,7 +134,7 @@ void SDRdaemonFECUDPHandler::dataReadyRead()
qint64 pendingDataSize = m_dataSocket->pendingDatagramSize();
m_udpReadBytes = m_dataSocket->readDatagram(m_udpBuf, pendingDataSize, &m_remoteAddress, 0);
if (m_udpReadBytes == SDRdaemonFECBuffer::udpSize) {
if (m_udpReadBytes == SDRdaemonFECBuffer::m_udpPayloadSize) {
processData();
}
}
@ -178,7 +178,7 @@ void SDRdaemonFECUDPHandler::tick()
if (throttlems != m_throttlems)
{
m_throttlems = throttlems;
m_readLengthSamples = (m_sdrDaemonBuffer.getSampleRate() * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000;
m_readLengthSamples = (m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000;
m_readLength = m_readLengthSamples * SDRdaemonFECBuffer::m_iqSampleSize;
m_throttleToggle = !m_throttleToggle;
}
@ -199,6 +199,7 @@ void SDRdaemonFECUDPHandler::tick()
m_tv_usec,
m_sdrDaemonBuffer.getBufferLengthInSecs(),
m_sdrDaemonBuffer.getBufferGauge(),
m_sdrDaemonBuffer.getCurNbBlocks() == SDRdaemonFECBuffer::m_nbOriginalBlocks,
m_sdrDaemonBuffer.getCurNbBlocks(),
m_sdrDaemonBuffer.getCurNbRecovery(),
m_sdrDaemonBuffer.getAvgNbBlocks(),

View File

@ -43,9 +43,7 @@ public:
void stop();
void configureUDPLink(const QString& address, quint16 port);
void getRemoteAddress(QString& s) const { s = m_remoteAddress.toString(); }
void setAutoFollowRate(bool autoFollowRate) { m_sdrDaemonBuffer.setAutoFollowRate(autoFollowRate); }
void setAutoCorrBuffer(bool autoCorrBuffer) { m_autoCorrBuffer = autoCorrBuffer; m_sdrDaemonBuffer.setAutoCorrBuffer(autoCorrBuffer); }
void resetIndexes() { m_sdrDaemonBuffer.setResetIndexes(); }
int getNbOriginalBlocks() const { return SDRdaemonFECBuffer::m_nbOriginalBlocks; }
public slots:
void dataReadyRead();