SDRdaemon: UDP channel sink (2)

pull/228/head
f4exb 2018-08-21 08:51:10 +02:00
rodzic dff02e944d
commit d2c3985de0
3 zmienionych plików z 62 dodań i 2 usunięć

Wyświetl plik

@ -20,6 +20,11 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <sys/time.h>
#include <unistd.h>
#include <boost/crc.hpp>
#include <boost/cstdint.hpp>
#include "util/simpleserializer.h" #include "util/simpleserializer.h"
#include "dsp/threadedbasebandsamplesink.h" #include "dsp/threadedbasebandsamplesink.h"
#include "dsp/downchannelizer.h" #include "dsp/downchannelizer.h"
@ -59,12 +64,63 @@ SDRDaemonChannelSink::~SDRDaemonChannelSink()
void SDRDaemonChannelSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst __attribute__((unused))) void SDRDaemonChannelSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst __attribute__((unused)))
{ {
qDebug("SDRDaemonChannelSink::feed: received %d samples", (int) (end - begin)); SampleVector::const_iterator it = begin;
while (it != end)
{
int inSamplesIndex = it - begin;
int inRemainingSamples = end - it;
if (m_txBlockIndex == 0)
{
struct timeval tv;
SDRDaemonMetaDataFEC metaData;
gettimeofday(&tv, 0);
metaData.m_centerFrequency = 0; // TODO
metaData.m_sampleRate = 48000; // TODO
metaData.m_sampleBytes = SDR_RX_SAMP_SZ/8;
metaData.m_sampleBits = SDR_RX_SAMP_SZ;
metaData.m_nbOriginalBlocks = SDRDaemonNbOrginalBlocks;
metaData.m_nbFECBlocks = 8; // TODO
metaData.m_tv_sec = tv.tv_sec;
metaData.m_tv_usec = tv.tv_usec;
boost::crc_32_type crc32;
crc32.process_bytes(&metaData, 20);
metaData.m_crc32 = crc32.checksum();
SDRDaemonSuperBlock& superBlock = m_dataBlock.m_superBlocks[0]; // first block
memset((void *) &superBlock, 0, SDRDaemonUdpSize);
superBlock.m_header.m_frameIndex = m_frameCount;
superBlock.m_header.m_blockIndex = m_txBlockIndex;
memcpy((void *) &superBlock.m_protectedBlock, (const void *) &metaData, sizeof(SDRDaemonMetaDataFEC));
if (!(metaData == m_currentMetaFEC))
{
qDebug() << "SDRDaemonChannelSink::feed: meta: "
<< "|" << metaData.m_centerFrequency
<< ":" << metaData.m_sampleRate
<< ":" << (int) (metaData.m_sampleBytes & 0xF)
<< ":" << (int) metaData.m_sampleBits
<< "|" << (int) metaData.m_nbOriginalBlocks
<< ":" << (int) metaData.m_nbFECBlocks
<< "|" << metaData.m_tv_sec
<< ":" << metaData.m_tv_usec;
m_currentMetaFEC = metaData;
}
m_txBlockIndex = 1; // next Tx block with data
}
}
} }
void SDRDaemonChannelSink::start() void SDRDaemonChannelSink::start()
{ {
qDebug("SDRDaemonChannelSink::start"); qDebug("SDRDaemonChannelSink::start");
memset((void *) &m_currentMetaFEC, 0, sizeof(SDRDaemonMetaDataFEC));
if (m_running) { stop(); } if (m_running) { stop(); }
m_sinkThread = new SDRDaemonChannelSinkThread(&m_dataQueue, m_cm256p); m_sinkThread = new SDRDaemonChannelSinkThread(&m_dataQueue, m_cm256p);
m_running = true; m_running = true;

Wyświetl plik

@ -28,6 +28,7 @@
#include "dsp/basebandsamplesink.h" #include "dsp/basebandsamplesink.h"
#include "channel/channelsinkapi.h" #include "channel/channelsinkapi.h"
#include "channel/sdrdaemondataqueue.h" #include "channel/sdrdaemondataqueue.h"
#include "channel/sdrdaemondatablock.h"
class DeviceSourceAPI; class DeviceSourceAPI;
class ThreadedBasebandSampleSink; class ThreadedBasebandSampleSink;
@ -70,6 +71,9 @@ private:
int m_txBlockIndex; //!< Current index in blocks to transmit in the Tx row int m_txBlockIndex; //!< Current index in blocks to transmit in the Tx row
uint16_t m_frameCount; //!< transmission frame count uint16_t m_frameCount; //!< transmission frame count
int m_sampleIndex; //!< Current sample index in protected block data int m_sampleIndex; //!< Current sample index in protected block data
SDRDaemonSuperBlock m_superBlock;
SDRDaemonMetaDataFEC m_currentMetaFEC;
SDRDaemonDataBlock m_dataBlock;
}; };
#endif /* SDRDAEMON_CHANNEL_SDRDAEMONCHANNELSINK_H_ */ #endif /* SDRDAEMON_CHANNEL_SDRDAEMONCHANNELSINK_H_ */

Wyświetl plik

@ -46,7 +46,7 @@ struct SDRDaemonMetaDataFEC
bool operator==(const SDRDaemonMetaDataFEC& rhs) bool operator==(const SDRDaemonMetaDataFEC& rhs)
{ {
return (memcmp((const void *) this, (const void *) &rhs, 16) == 0); // Only the 16 first bytes are relevant return (memcmp((const void *) this, (const void *) &rhs, 12) == 0); // Only the 12 first bytes are relevant
} }
void init() void init()