diff --git a/sdrdaemon/channel/sdrdaemonchannelsinkthread.cpp b/sdrdaemon/channel/sdrdaemonchannelsinkthread.cpp
index f8876a96d..ad2ad6407 100644
--- a/sdrdaemon/channel/sdrdaemonchannelsinkthread.cpp
+++ b/sdrdaemon/channel/sdrdaemonchannelsinkthread.cpp
@@ -20,6 +20,7 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
+#include
#include "channel/sdrdaemondataqueue.h"
#include "channel/sdrdaemondatablock.h"
@@ -31,14 +32,18 @@ SDRDaemonChannelSinkThread::SDRDaemonChannelSinkThread(SDRDaemonDataQueue *dataQ
QThread(parent),
m_running(false),
m_dataQueue(dataQueue),
- m_cm256(cm256)
+ m_cm256(cm256),
+ m_address(QHostAddress::LocalHost),
+ m_port(9090)
{
+ m_socket = new QUdpSocket(this);
connect(m_dataQueue, SIGNAL(dataBlockEnqueued()), this, SLOT(handleData()));
}
SDRDaemonChannelSinkThread::~SDRDaemonChannelSinkThread()
{
stopWork();
+ delete m_socket;
}
void SDRDaemonChannelSinkThread::startWork()
@@ -69,7 +74,7 @@ void SDRDaemonChannelSinkThread::run()
sleep(1); // Do nothing as everything is in the data handler (dequeuer)
}
- m_running = false;
+ m_running = false;
qDebug("SDRDaemonChannelSinkThread::run: end");
}
@@ -88,7 +93,8 @@ bool SDRDaemonChannelSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
{
for (int i = 0; i < SDRDaemonNbOrginalBlocks; i++)
{
- // TODO: send block via UDP here
+ // send block via UDP
+ m_socket->writeDatagram((const char*)&txBlockx[i], (qint64 ) SDRDaemonUdpSize, m_address, m_port);
usleep(txDelay);
}
}
@@ -109,7 +115,7 @@ bool SDRDaemonChannelSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
txBlockx[i].m_header.m_blockIndex = i;
descriptorBlocks[i].Block = (void *) &(txBlockx[i].m_protectedBlock);
descriptorBlocks[i].Index = txBlockx[i].m_header.m_blockIndex;
- }
+ }
// Encode FEC blocks
if (m_cm256->cm256_encode(cm256Params, descriptorBlocks, fecBlocks))
@@ -117,7 +123,7 @@ bool SDRDaemonChannelSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
qWarning("SDRDaemonChannelSinkThread::handleDataBlock: CM256 encode failed. No transmission.");
// TODO: send without FEC changing meta data to set indication of no FEC
return true;
- }
+ }
// Merge FEC with data to transmit
for (int i = 0; i < cm256Params.RecoveryCount; i++)
@@ -128,7 +134,8 @@ bool SDRDaemonChannelSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
// Transmit all blocks
for (int i = 0; i < cm256Params.OriginalCount + cm256Params.RecoveryCount; i++)
{
- // TODO: send block via UDP here
+ // send block via UDP
+ m_socket->writeDatagram((const char*)&txBlockx[i], (qint64 ) SDRDaemonUdpSize, m_address, m_port);
usleep(txDelay);
}
}
@@ -147,5 +154,5 @@ void SDRDaemonChannelSinkThread::handleData()
{
delete dataBlock;
}
- }
-}
\ No newline at end of file
+ }
+}
diff --git a/sdrdaemon/channel/sdrdaemonchannelsinkthread.h b/sdrdaemon/channel/sdrdaemonchannelsinkthread.h
index afa11524d..a64115363 100644
--- a/sdrdaemon/channel/sdrdaemonchannelsinkthread.h
+++ b/sdrdaemon/channel/sdrdaemonchannelsinkthread.h
@@ -23,10 +23,12 @@
#include
#include
#include
+#include
class SDRDaemonDataQueue;
class SDRDaemonDataBlock;
class CM256;
+class QUdpSocket;
class SDRDaemonChannelSinkThread : public QThread {
Q_OBJECT
@@ -38,18 +40,24 @@ public:
void startWork();
void stopWork();
+ void setAddress(QString& address) { m_address.setAddress(address); }
+ void setPort(unsigned int port) { m_port = port; }
+
private:
QMutex m_startWaitMutex;
QWaitCondition m_startWaiter;
bool m_running;
SDRDaemonDataQueue *m_dataQueue;
-
CM256 *m_cm256; //!< CM256 library object
+ QHostAddress m_address;
+ unsigned int m_port;
+ QUdpSocket *m_socket;
+
void run();
bool handleDataBlock(SDRDaemonDataBlock& dataBlock);
private slots:
void handleData();
-};
\ No newline at end of file
+};