diff --git a/plugins/channeltx/sdrdaemonchannelsource/CMakeLists.txt b/plugins/channeltx/sdrdaemonchannelsource/CMakeLists.txt
deleted file mode 100644
index dc9629b31..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/CMakeLists.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-project(sdrdaemonchannelsource)
-
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-
-set(sdrdaemonchannelsource_SOURCES
- sdrdaemonchannelsource.cpp
- sdrdaemonchannelsourcethread.cpp
- sdrdaemonchannelsourcegui.cpp
- sdrdaemonchannelsourceplugin.cpp
- sdrdaemonchannelsourcesettings.cpp
-)
-
-set(sdrdaemonchannelsource_HEADERS
- sdrdaemonchannelsource.h
- sdrdaemonchannelsourcethread.h
- sdrdaemonchannelsourcegui.h
- sdrdaemonchannelsourceplugin.h
- sdrdaemonchannelsourcesettings.h
-)
-
-set(sdrdaemonchannelsource_FORMS
- sdrdaemonchannelsourcegui.ui
-)
-
-include_directories(
- .
- ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/sdrdaemon
- ${CM256CC_INCLUDE_DIR}
- ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
-)
-
-#include(${QT_USE_FILE})
-add_definitions(${QT_DEFINITIONS})
-add_definitions(-DQT_PLUGIN)
-add_definitions(-DQT_SHARED)
-
-qt5_wrap_ui(sdrdaemonchannelsource_FORMS_HEADERS ${sdrdaemonchannelsource_FORMS})
-
-add_library(sdrdaemonchannelsource SHARED
- ${sdrdaemonchannelsource_SOURCES}
- ${sdrdaemonchannelsource_HEADERS_MOC}
- ${sdrdaemonchannelsource_FORMS_HEADERS}
-)
-
-target_link_libraries(sdrdaemonchannelsource
- ${QT_LIBRARIES}
- ${CM256CC_LIBRARIES}
- sdrbase
- sdrdaemon
- sdrgui
- swagger
-)
-
-target_link_libraries(sdrdaemonchannelsource Qt5::Core Qt5::Widgets Qt5::Network)
-
-install(TARGETS sdrdaemonchannelsource DESTINATION lib/plugins/channeltx)
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.cpp b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.cpp
deleted file mode 100644
index 580d2ecba..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.cpp
+++ /dev/null
@@ -1,413 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include "SWGChannelSettings.h"
-#include "SWGChannelReport.h"
-#include "SWGSDRDaemonChannelSourceReport.h"
-
-#include "util/simpleserializer.h"
-#include "dsp/threadedbasebandsamplesource.h"
-#include "dsp/upchannelizer.h"
-#include "dsp/devicesamplesink.h"
-#include "device/devicesinkapi.h"
-#include "sdrdaemonchannelsource.h"
-#include "channel/sdrdaemonchannelsourcethread.h"
-#include "channel/sdrdaemondatablock.h"
-
-MESSAGE_CLASS_DEFINITION(SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource, Message)
-
-const QString SDRDaemonChannelSource::m_channelIdURI = "sdrangel.channel.sdrdaemonsource";
-const QString SDRDaemonChannelSource::m_channelId = "SDRDaemonChannelSource";
-
-SDRDaemonChannelSource::SDRDaemonChannelSource(DeviceSinkAPI *deviceAPI) :
- ChannelSourceAPI(m_channelIdURI),
- m_deviceAPI(deviceAPI),
- m_sourceThread(0),
- m_running(false),
- m_nbCorrectableErrors(0),
- m_nbUncorrectableErrors(0)
-{
- setObjectName(m_channelId);
-
- m_channelizer = new UpChannelizer(this);
- m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this);
- m_deviceAPI->addThreadedSource(m_threadedChannelizer);
- m_deviceAPI->addChannelAPI(this);
-
- connect(&m_dataQueue, SIGNAL(dataBlockEnqueued()), this, SLOT(handleData()), Qt::QueuedConnection);
- m_cm256p = m_cm256.isInitialized() ? &m_cm256 : 0;
- m_currentMeta.init();
-}
-
-SDRDaemonChannelSource::~SDRDaemonChannelSource()
-{
- m_deviceAPI->removeChannelAPI(this);
- m_deviceAPI->removeThreadedSource(m_threadedChannelizer);
- delete m_threadedChannelizer;
- delete m_channelizer;
-}
-
-void SDRDaemonChannelSource::pull(Sample& sample)
-{
- m_dataReadQueue.readSample(sample);
-}
-
-void SDRDaemonChannelSource::start()
-{
- qDebug("SDRDaemonChannelSink::start");
-
- if (m_running) {
- stop();
- }
-
- m_sourceThread = new SDRDaemonChannelSourceThread(&m_dataQueue);
- m_sourceThread->startStop(true);
- m_sourceThread->dataBind(m_settings.m_dataAddress, m_settings.m_dataPort);
- m_running = true;
-}
-
-void SDRDaemonChannelSource::stop()
-{
- qDebug("SDRDaemonChannelSink::stop");
-
- if (m_sourceThread != 0)
- {
- m_sourceThread->startStop(false);
- m_sourceThread->deleteLater();
- m_sourceThread = 0;
- }
-
- m_running = false;
-}
-
-void SDRDaemonChannelSource::setDataLink(const QString& dataAddress, uint16_t dataPort)
-{
- SDRDaemonChannelSourceSettings settings = m_settings;
- settings.m_dataAddress = dataAddress;
- settings.m_dataPort = dataPort;
-
- MsgConfigureSDRDaemonChannelSource *msg = MsgConfigureSDRDaemonChannelSource::create(settings, false);
- m_inputMessageQueue.push(msg);
-}
-
-bool SDRDaemonChannelSource::handleMessage(const Message& cmd __attribute__((unused)))
-{
- if (UpChannelizer::MsgChannelizerNotification::match(cmd))
- {
- UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
- qDebug() << "SDRDaemonChannelSource::handleMessage: UpChannelizer::MsgChannelizerNotification:"
- << " basebandSampleRate: " << notif.getBasebandSampleRate()
- << " outputSampleRate: " << notif.getSampleRate()
- << " inputFrequencyOffset: " << notif.getFrequencyOffset();
-
- //applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
-
- return true;
- }
- else if (MsgConfigureSDRDaemonChannelSource::match(cmd))
- {
- MsgConfigureSDRDaemonChannelSource& cfg = (MsgConfigureSDRDaemonChannelSource&) cmd;
- qDebug() << "SDRDaemonChannelSource::handleMessage: MsgConfigureSDRDaemonChannelSource";
- applySettings(cfg.getSettings(), cfg.getForce());
-
- return true;
- }
- else
- {
- return false;
- }
-}
-
-QByteArray SDRDaemonChannelSource::serialize() const
-{
- return m_settings.serialize();
-}
-
-bool SDRDaemonChannelSource::deserialize(const QByteArray& data __attribute__((unused)))
-{
- if (m_settings.deserialize(data))
- {
- MsgConfigureSDRDaemonChannelSource *msg = MsgConfigureSDRDaemonChannelSource::create(m_settings, true);
- m_inputMessageQueue.push(msg);
- return true;
- }
- else
- {
- m_settings.resetToDefaults();
- MsgConfigureSDRDaemonChannelSource *msg = MsgConfigureSDRDaemonChannelSource::create(m_settings, true);
- m_inputMessageQueue.push(msg);
- return false;
- }
-}
-
-void SDRDaemonChannelSource::applySettings(const SDRDaemonChannelSourceSettings& settings, bool force)
-{
- qDebug() << "SDRDaemonChannelSource::applySettings:"
- << " m_dataAddress: " << settings.m_dataAddress
- << " m_dataPort: " << settings.m_dataPort
- << " force: " << force;
-
- bool change = false;
-
- if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) {
- change = true;
- }
-
- if ((m_settings.m_dataPort != settings.m_dataPort) || force) {
- change = true;
- }
-
- if (change && m_sourceThread) {
- m_sourceThread->dataBind(settings.m_dataAddress, settings.m_dataPort);
- }
-
- m_settings = settings;
-}
-
-void SDRDaemonChannelSource::handleDataBlock(SDRDaemonDataBlock* dataBlock)
-{
- if (dataBlock->m_rxControlBlock.m_blockCount < SDRDaemonNbOrginalBlocks)
- {
- qWarning("SDRDaemonChannelSource::handleDataBlock: incomplete data block: not processing");
- }
- else
- {
- int blockCount = 0;
-
- for (int blockIndex = 0; blockIndex < 256; blockIndex++)
- {
- if ((blockIndex == 0) && (dataBlock->m_rxControlBlock.m_metaRetrieved))
- {
- m_cm256DescriptorBlocks[blockCount].Index = 0;
- m_cm256DescriptorBlocks[blockCount].Block = (void *) &(dataBlock->m_superBlocks[0].m_protectedBlock);
- blockCount++;
- }
- else if (dataBlock->m_superBlocks[blockIndex].m_header.m_blockIndex != 0)
- {
- m_cm256DescriptorBlocks[blockCount].Index = dataBlock->m_superBlocks[blockIndex].m_header.m_blockIndex;
- m_cm256DescriptorBlocks[blockCount].Block = (void *) &(dataBlock->m_superBlocks[blockIndex].m_protectedBlock);
- blockCount++;
- }
- }
-
- //qDebug("SDRDaemonChannelSource::handleDataBlock: frame: %u blocks: %d", dataBlock.m_rxControlBlock.m_frameIndex, blockCount);
-
- // Need to use the CM256 recovery
- if (m_cm256p &&(dataBlock->m_rxControlBlock.m_originalCount < SDRDaemonNbOrginalBlocks))
- {
- qDebug("SDRDaemonChannelSource::handleDataBlock: %d recovery blocks", dataBlock->m_rxControlBlock.m_recoveryCount);
- CM256::cm256_encoder_params paramsCM256;
- paramsCM256.BlockBytes = sizeof(SDRDaemonProtectedBlock); // never changes
- paramsCM256.OriginalCount = SDRDaemonNbOrginalBlocks; // never changes
-
- if (m_currentMeta.m_tv_sec == 0) {
- paramsCM256.RecoveryCount = dataBlock->m_rxControlBlock.m_recoveryCount;
- } else {
- paramsCM256.RecoveryCount = m_currentMeta.m_nbFECBlocks;
- }
-
- // update counters
- if (dataBlock->m_rxControlBlock.m_originalCount < SDRDaemonNbOrginalBlocks - paramsCM256.RecoveryCount) {
- m_nbUncorrectableErrors += SDRDaemonNbOrginalBlocks - paramsCM256.RecoveryCount - dataBlock->m_rxControlBlock.m_originalCount;
- } else {
- m_nbCorrectableErrors += dataBlock->m_rxControlBlock.m_recoveryCount;
- }
-
- if (m_cm256.cm256_decode(paramsCM256, m_cm256DescriptorBlocks)) // CM256 decode
- {
- qWarning() << "SDRDaemonChannelSource::handleDataBlock: decode CM256 error:"
- << " m_originalCount: " << dataBlock->m_rxControlBlock.m_originalCount
- << " m_recoveryCount: " << dataBlock->m_rxControlBlock.m_recoveryCount;
- }
- else
- {
- for (int ir = 0; ir < dataBlock->m_rxControlBlock.m_recoveryCount; ir++) // restore missing blocks
- {
- int recoveryIndex = SDRDaemonNbOrginalBlocks - dataBlock->m_rxControlBlock.m_recoveryCount + ir;
- int blockIndex = m_cm256DescriptorBlocks[recoveryIndex].Index;
- SDRDaemonProtectedBlock *recoveredBlock =
- (SDRDaemonProtectedBlock *) m_cm256DescriptorBlocks[recoveryIndex].Block;
- memcpy((void *) &(dataBlock->m_superBlocks[blockIndex].m_protectedBlock), recoveredBlock, sizeof(SDRDaemonProtectedBlock));
- if ((blockIndex == 0) && !dataBlock->m_rxControlBlock.m_metaRetrieved) {
- dataBlock->m_rxControlBlock.m_metaRetrieved = true;
- }
- }
- }
- }
-
- // Validate block zero and retrieve its data
- if (dataBlock->m_rxControlBlock.m_metaRetrieved)
- {
- SDRDaemonMetaDataFEC *metaData = (SDRDaemonMetaDataFEC *) &(dataBlock->m_superBlocks[0].m_protectedBlock);
- boost::crc_32_type crc32;
- crc32.process_bytes(metaData, 20);
-
- if (crc32.checksum() == metaData->m_crc32)
- {
- if (!(m_currentMeta == *metaData))
- {
- printMeta("SDRDaemonChannelSource::handleDataBlock", metaData);
-
- if (m_currentMeta.m_centerFrequency != metaData->m_centerFrequency) {
- m_deviceAPI->getSampleSink()->setCenterFrequency(metaData->m_centerFrequency*1000); // frequency is in kHz
- }
-
- if (m_currentMeta.m_sampleRate != metaData->m_sampleRate)
- {
- m_channelizer->configure(m_channelizer->getInputMessageQueue(), metaData->m_sampleRate, 0);
- m_dataReadQueue.setSize(calculateDataReadQueueSize(metaData->m_sampleRate));
- }
- }
-
- m_currentMeta = *metaData;
- }
- else
- {
- qWarning() << "SDRDaemonChannelSource::handleDataBlock: recovered meta: invalid CRC32";
- }
- }
-
- m_dataReadQueue.push(dataBlock); // Push into R/W buffer
- }
-}
-
-void SDRDaemonChannelSource::handleData()
-{
- SDRDaemonDataBlock* dataBlock;
-
- while (m_running && ((dataBlock = m_dataQueue.pop()) != 0)) {
- handleDataBlock(dataBlock);
- }
-}
-
-void SDRDaemonChannelSource::printMeta(const QString& header, SDRDaemonMetaDataFEC *metaData)
-{
- qDebug().noquote() << header << ": "
- << "|" << 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
- << "|";
-}
-
-uint32_t SDRDaemonChannelSource::calculateDataReadQueueSize(int sampleRate)
-{
- // scale for 20 blocks at 48 kS/s. Take next even number.
- uint32_t maxSize = sampleRate / 2400;
- maxSize = (maxSize % 2 == 0) ? maxSize : maxSize + 1;
- qDebug("SDRDaemonChannelSource::calculateDataReadQueueSize: set max queue size to %u blocks", maxSize);
- return maxSize;
-}
-
-int SDRDaemonChannelSource::webapiSettingsGet(
- SWGSDRangel::SWGChannelSettings& response,
- QString& errorMessage __attribute__((unused)))
-{
- response.setSdrDaemonChannelSourceSettings(new SWGSDRangel::SWGSDRDaemonChannelSourceSettings());
- response.getSdrDaemonChannelSourceSettings()->init();
- webapiFormatChannelSettings(response, m_settings);
- return 200;
-}
-
-int SDRDaemonChannelSource::webapiSettingsPutPatch(
- bool force,
- const QStringList& channelSettingsKeys,
- SWGSDRangel::SWGChannelSettings& response,
- QString& errorMessage __attribute__((unused)))
-{
- SDRDaemonChannelSourceSettings settings = m_settings;
-
- if (channelSettingsKeys.contains("dataAddress")) {
- settings.m_dataAddress = *response.getSdrDaemonChannelSourceSettings()->getDataAddress();
- }
-
- if (channelSettingsKeys.contains("dataPort"))
- {
- int dataPort = response.getSdrDaemonChannelSourceSettings()->getDataPort();
-
- if ((dataPort < 1024) || (dataPort > 65535)) {
- settings.m_dataPort = 9090;
- } else {
- settings.m_dataPort = dataPort;
- }
- }
-
- MsgConfigureSDRDaemonChannelSource *msg = MsgConfigureSDRDaemonChannelSource::create(settings, force);
- m_inputMessageQueue.push(msg);
-
- qDebug("SDRDaemonChannelSource::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
- if (m_guiMessageQueue) // forward to GUI if any
- {
- MsgConfigureSDRDaemonChannelSource *msgToGUI = MsgConfigureSDRDaemonChannelSource::create(settings, force);
- m_guiMessageQueue->push(msgToGUI);
- }
-
- webapiFormatChannelSettings(response, settings);
-
- return 200;
-}
-
-int SDRDaemonChannelSource::webapiReportGet(
- SWGSDRangel::SWGChannelReport& response,
- QString& errorMessage __attribute__((unused)))
-{
- response.setSdrDaemonChannelSourceReport(new SWGSDRangel::SWGSDRDaemonChannelSourceReport());
- response.getSdrDaemonChannelSourceReport()->init();
- webapiFormatChannelReport(response);
- return 200;
-}
-
-void SDRDaemonChannelSource::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const SDRDaemonChannelSourceSettings& settings)
-{
- if (response.getSdrDaemonChannelSourceSettings()->getDataAddress()) {
- *response.getSdrDaemonChannelSourceSettings()->getDataAddress() = settings.m_dataAddress;
- } else {
- response.getSdrDaemonChannelSourceSettings()->setDataAddress(new QString(settings.m_dataAddress));
- }
-
- response.getSdrDaemonChannelSourceSettings()->setDataPort(settings.m_dataPort);
-}
-
-void SDRDaemonChannelSource::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
-{
- struct timeval tv;
- gettimeofday(&tv, 0);
-
- response.getSdrDaemonChannelSourceReport()->setTvSec(tv.tv_sec);
- response.getSdrDaemonChannelSourceReport()->setTvUSec(tv.tv_usec);
- response.getSdrDaemonChannelSourceReport()->setQueueSize(m_dataReadQueue.size());
- response.getSdrDaemonChannelSourceReport()->setQueueLength(m_dataReadQueue.length());
- response.getSdrDaemonChannelSourceReport()->setSamplesCount(m_dataReadQueue.readSampleCount());
- response.getSdrDaemonChannelSourceReport()->setCorrectableErrorsCount(m_nbCorrectableErrors);
- response.getSdrDaemonChannelSourceReport()->setUncorrectableErrorsCount(m_nbUncorrectableErrors);
-}
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.h b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.h
deleted file mode 100644
index cf51177c2..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsource.h
+++ /dev/null
@@ -1,135 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef CHANNEL_TX_SDRDAEMONCHANNELSOURCE_H_
-#define CHANNEL_TX_SDRDAEMONCHANNELSOURCE_H_
-
-#include "cm256.h"
-
-#include "dsp/basebandsamplesource.h"
-#include "channel/channelsourceapi.h"
-#include "util/message.h"
-#include "sdrdaemonchannelsourcesettings.h"
-#include "channel/sdrdaemondataqueue.h"
-#include "channel/sdrdaemondatablock.h"
-#include "channel/sdrdaemondatareadqueue.h"
-
-class ThreadedBasebandSampleSource;
-class UpChannelizer;
-class DeviceSinkAPI;
-class SDRDaemonChannelSourceThread;
-class SDRDaemonDataBlock;
-
-class SDRDaemonChannelSource : public BasebandSampleSource, public ChannelSourceAPI {
- Q_OBJECT
-public:
- class MsgConfigureSDRDaemonChannelSource : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- const SDRDaemonChannelSourceSettings& getSettings() const { return m_settings; }
- bool getForce() const { return m_force; }
-
- static MsgConfigureSDRDaemonChannelSource* create(const SDRDaemonChannelSourceSettings& settings, bool force)
- {
- return new MsgConfigureSDRDaemonChannelSource(settings, force);
- }
-
- private:
- SDRDaemonChannelSourceSettings m_settings;
- bool m_force;
-
- MsgConfigureSDRDaemonChannelSource(const SDRDaemonChannelSourceSettings& settings, bool force) :
- Message(),
- m_settings(settings),
- m_force(force)
- { }
- };
-
- SDRDaemonChannelSource(DeviceSinkAPI *deviceAPI);
- ~SDRDaemonChannelSource();
- virtual void destroy() { delete this; }
-
- virtual void pull(Sample& sample);
- virtual void start();
- virtual void stop();
- virtual bool handleMessage(const Message& cmd);
-
- virtual void getIdentifier(QString& id) { id = objectName(); }
- virtual void getTitle(QString& title) { title = "SDRDaemon Source"; }
- virtual qint64 getCenterFrequency() const { return 0; }
-
- virtual QByteArray serialize() const;
- virtual bool deserialize(const QByteArray& data);
-
- virtual int webapiSettingsGet(
- SWGSDRangel::SWGChannelSettings& response,
- QString& errorMessage);
-
- virtual int webapiSettingsPutPatch(
- bool force,
- const QStringList& channelSettingsKeys,
- SWGSDRangel::SWGChannelSettings& response,
- QString& errorMessage);
-
- virtual int webapiReportGet(
- SWGSDRangel::SWGChannelReport& response,
- QString& errorMessage);
-
- void setDataLink(const QString& dataAddress, uint16_t dataPort);
-
- static const QString m_channelIdURI;
- static const QString m_channelId;
-
-private:
- DeviceSinkAPI *m_deviceAPI;
- ThreadedBasebandSampleSource* m_threadedChannelizer;
- UpChannelizer* m_channelizer;
- SDRDaemonDataQueue m_dataQueue;
- SDRDaemonChannelSourceThread *m_sourceThread;
- CM256 m_cm256;
- CM256 *m_cm256p;
- bool m_running;
-
- SDRDaemonChannelSourceSettings m_settings;
-
- CM256::cm256_block m_cm256DescriptorBlocks[2*SDRDaemonNbOrginalBlocks]; //!< CM256 decoder descriptors (block addresses and block indexes)
- SDRDaemonMetaDataFEC m_currentMeta;
-
- SDRDaemonDataReadQueue m_dataReadQueue;
-
- uint32_t m_nbCorrectableErrors; //!< count of correctable errors in number of blocks
- uint32_t m_nbUncorrectableErrors; //!< count of uncorrectable errors in number of blocks
-
- void applySettings(const SDRDaemonChannelSourceSettings& settings, bool force = false);
- void handleDataBlock(SDRDaemonDataBlock *dataBlock);
- void printMeta(const QString& header, SDRDaemonMetaDataFEC *metaData);
- uint32_t calculateDataReadQueueSize(int sampleRate);
- void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const SDRDaemonChannelSourceSettings& settings);
- void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
-
-private slots:
- void handleData();
-};
-
-
-#endif /* CHANNEL_TX_SDRDAEMONCHANNELSOURCE_H_ */
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.cpp b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.cpp
deleted file mode 100644
index ff46c1914..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) GUI //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-#include
-
-#include "device/devicesinkapi.h"
-#include "device/deviceuiset.h"
-#include "plugin/pluginapi.h"
-#include "util/simpleserializer.h"
-#include "gui/basicchannelsettingsdialog.h"
-#include "mainwindow.h"
-
-#include "ui_sdrdaemonchannelsourcegui.h"
-#include "sdrdaemonchannelsource.h"
-#include "sdrdaemonchannelsourcegui.h"
-
-
-SDRDaemonChannelSourceGUI* SDRDaemonChannelSourceGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx)
-{
- SDRDaemonChannelSourceGUI* gui = new SDRDaemonChannelSourceGUI(pluginAPI, deviceUISet, channelTx);
- return gui;
-}
-
-void SDRDaemonChannelSourceGUI::destroy()
-{
- delete this;
-}
-
-void SDRDaemonChannelSourceGUI::setName(const QString& name)
-{
- setObjectName(name);
-}
-
-QString SDRDaemonChannelSourceGUI::getName() const
-{
- return objectName();
-}
-
-qint64 SDRDaemonChannelSourceGUI::getCenterFrequency() const {
- return m_channelMarker.getCenterFrequency();
-}
-
-void SDRDaemonChannelSourceGUI::setCenterFrequency(qint64 centerFrequency __attribute__((unused)))
-{
- // you can't do that center frquency is fixed to zero
- // m_channelMarker.setCenterFrequency(centerFrequency);
- // applySettings();
-}
-
-void SDRDaemonChannelSourceGUI::resetToDefaults()
-{
- m_settings.resetToDefaults();
- displaySettings();
- applySettings(true);
-}
-
-QByteArray SDRDaemonChannelSourceGUI::serialize() const
-{
- return m_settings.serialize();
-}
-
-bool SDRDaemonChannelSourceGUI::deserialize(const QByteArray& data)
-{
- if(m_settings.deserialize(data)) {
- displaySettings();
- applySettings(true);
- return true;
- } else {
- resetToDefaults();
- return false;
- }
-}
-
-bool SDRDaemonChannelSourceGUI::handleMessage(const Message& message)
-{
- if (SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource::match(message))
- {
- const SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource& cfg = (SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource&) message;
- m_settings = cfg.getSettings();
- blockApplySettings(true);
- displaySettings();
- blockApplySettings(false);
- return true;
- }
- else
- {
- return false;
- }
-}
-
-void SDRDaemonChannelSourceGUI::handleSourceMessages()
-{
- Message* message;
-
- while ((message = getInputMessageQueue()->pop()) != 0)
- {
- if (handleMessage(*message))
- {
- delete message;
- }
- }
-}
-
-void SDRDaemonChannelSourceGUI::onWidgetRolled(QWidget* widget __attribute__((unused)), bool rollDown __attribute__((unused)))
-{
-}
-
-void SDRDaemonChannelSourceGUI::onMenuDialogCalled(const QPoint &p)
-{
- BasicChannelSettingsDialog dialog(&m_channelMarker, this);
- dialog.move(p);
- dialog.exec();
-
- m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
- m_settings.m_title = m_channelMarker.getTitle();
-
- setWindowTitle(m_settings.m_title);
- setTitleColor(m_settings.m_rgbColor);
-
- applySettings();
-}
-
-SDRDaemonChannelSourceGUI::SDRDaemonChannelSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent) :
- RollupWidget(parent),
- ui(new Ui::SDRDaemonChannelSourceGUI),
- m_pluginAPI(pluginAPI),
- m_deviceUISet(deviceUISet),
- m_channelMarker(this),
- m_doApplySettings(true),
- m_tickCount(0)
-{
- ui->setupUi(this);
- setAttribute(Qt::WA_DeleteOnClose, true);
- connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
- connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
-
- m_sdrDaemonChannelSource = (SDRDaemonChannelSource*) channelTx;
- m_sdrDaemonChannelSource->setMessageQueueToGUI(getInputMessageQueue());
-
- connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
-
- m_channelMarker.blockSignals(true);
- m_channelMarker.setColor(Qt::cyan);
- m_channelMarker.setBandwidth(5000);
- m_channelMarker.setCenterFrequency(0);
- m_channelMarker.setTitle("SDRDaemon sink");
- m_channelMarker.blockSignals(false);
- m_channelMarker.setVisible(true); // activate signal on the last setting only
-
- m_settings.setChannelMarker(&m_channelMarker);
-
- m_deviceUISet->registerTxChannelInstance(SDRDaemonChannelSource::m_channelIdURI, this);
- m_deviceUISet->addChannelMarker(&m_channelMarker);
- m_deviceUISet->addRollupWidget(this);
-
- connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
-
- displaySettings();
- applySettings(true);
-}
-
-SDRDaemonChannelSourceGUI::~SDRDaemonChannelSourceGUI()
-{
- m_deviceUISet->removeTxChannelInstance(this);
- delete m_sdrDaemonChannelSource; // TODO: check this: when the GUI closes it has to delete the channel
- delete ui;
-}
-
-void SDRDaemonChannelSourceGUI::blockApplySettings(bool block)
-{
- m_doApplySettings = !block;
-}
-
-void SDRDaemonChannelSourceGUI::applySettings(bool force)
-{
- if (m_doApplySettings)
- {
- setTitleColor(m_channelMarker.getColor());
-
- SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource* message = SDRDaemonChannelSource::MsgConfigureSDRDaemonChannelSource::create(m_settings, force);
- m_sdrDaemonChannelSource->getInputMessageQueue()->push(message);
- }
-}
-
-void SDRDaemonChannelSourceGUI::displaySettings()
-{
- m_channelMarker.blockSignals(true);
- m_channelMarker.setCenterFrequency(0);
- m_channelMarker.setTitle(m_settings.m_title);
- m_channelMarker.setBandwidth(5000); // TODO
- m_channelMarker.blockSignals(false);
- m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
-
- setTitleColor(m_settings.m_rgbColor);
- setWindowTitle(m_channelMarker.getTitle());
-
- blockApplySettings(true);
-
- // TODO
-
- blockApplySettings(false);
-}
-
-void SDRDaemonChannelSourceGUI::leaveEvent(QEvent*)
-{
- m_channelMarker.setHighlighted(false);
-}
-
-void SDRDaemonChannelSourceGUI::enterEvent(QEvent*)
-{
- m_channelMarker.setHighlighted(true);
-}
-
-void SDRDaemonChannelSourceGUI::tick()
-{
- // TODO if anything useful
-}
-
-void SDRDaemonChannelSourceGUI::on_dataAddress_returnPressed()
-{
- m_settings.m_dataAddress = ui->dataAddress->text();
- applySettings();
-}
-
-void SDRDaemonChannelSourceGUI::on_dataPort_returnPressed()
-{
- bool dataOk;
- int dataPort = ui->dataPort->text().toInt(&dataOk);
-
- if((!dataOk) || (dataPort < 1024) || (dataPort > 65535))
- {
- return;
- }
- else
- {
- m_settings.m_dataPort = dataPort;
- }
-
- applySettings();
-}
-
-void SDRDaemonChannelSourceGUI::on_dataApplyButton_clicked(bool checked __attribute__((unused)))
-{
- m_settings.m_dataAddress = ui->dataAddress->text();
-
- bool dataOk;
- int udpDataPort = ui->dataPort->text().toInt(&dataOk);
-
- if((dataOk) && (udpDataPort >= 1024) && (udpDataPort < 65535))
- {
- m_settings.m_dataPort = udpDataPort;
- }
-
- applySettings();
-}
\ No newline at end of file
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.h b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.h
deleted file mode 100644
index 08ecf3423..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.h
+++ /dev/null
@@ -1,92 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) GUI //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef CHANNEL_TX_SDRDAEMONCHANNELSOURCEGUI_H_
-#define CHANNEL_TX_SDRDAEMONCHANNELSOURCEGUI_H_
-
-#include "plugin/plugininstancegui.h"
-#include "gui/rollupwidget.h"
-#include "dsp/channelmarker.h"
-#include "util/messagequeue.h"
-
-#include "sdrdaemonchannelsourcesettings.h"
-
-class PluginAPI;
-class DeviceUISet;
-class SDRDaemonChannelSource;
-class BasebandSampleSource;
-
-namespace Ui {
- class SDRDaemonChannelSourceGUI;
-}
-
-class SDRDaemonChannelSourceGUI : public RollupWidget, public PluginInstanceGUI {
- Q_OBJECT
-
-public:
- static SDRDaemonChannelSourceGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceAPI, BasebandSampleSource *channelTx);
- virtual void destroy();
-
- void setName(const QString& name);
- QString getName() const;
- virtual qint64 getCenterFrequency() const;
- virtual void setCenterFrequency(qint64 centerFrequency);
-
- void resetToDefaults();
- QByteArray serialize() const;
- bool deserialize(const QByteArray& data);
- virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
- virtual bool handleMessage(const Message& message);
-
-private:
- Ui::SDRDaemonChannelSourceGUI* ui;
- PluginAPI* m_pluginAPI;
- DeviceUISet* m_deviceUISet;
- ChannelMarker m_channelMarker;
- SDRDaemonChannelSourceSettings m_settings;
- bool m_doApplySettings;
- int m_tickCount;
-
- SDRDaemonChannelSource* m_sdrDaemonChannelSource;
- MessageQueue m_inputMessageQueue;
-
- explicit SDRDaemonChannelSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent = 0);
- virtual ~SDRDaemonChannelSourceGUI();
-
- void blockApplySettings(bool block);
- void applySettings(bool force = false);
- void displaySettings();
-
- void leaveEvent(QEvent*);
- void enterEvent(QEvent*);
-
-private slots:
- void handleSourceMessages();
- void on_dataAddress_returnPressed();
- void on_dataPort_returnPressed();
- void on_dataApplyButton_clicked(bool checked);
- void onWidgetRolled(QWidget* widget, bool rollDown);
- void onMenuDialogCalled(const QPoint& p);
- void tick();
-};
-
-#endif // CHANNEL_TX_SDRDAEMONCHANNELSOURCEGUI_H_
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.ui b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.ui
deleted file mode 100644
index 67e75a9ea..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcegui.ui
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
- SDRDaemonChannelSourceGUI
-
-
-
- 0
- 0
- 320
- 90
-
-
-
-
- 0
- 0
-
-
-
-
- 320
- 90
-
-
-
-
- Liberation Sans
- 9
-
-
-
- LoRa Demodulator
-
-
-
-
- 10
- 10
- 301
- 61
-
-
-
- Settings
-
-
-
- 3
-
-
- 2
-
-
- 2
-
-
- 2
-
-
- 2
-
- -
-
-
-
-
-
-
- 30
- 0
-
-
-
- Data
-
-
-
- -
-
-
-
- 120
- 0
-
-
-
- Local data listener address
-
-
- 000.000.000.000
-
-
- 0...
-
-
-
- -
-
-
- :
-
-
-
- -
-
-
-
- 50
- 16777215
-
-
-
- Local data listener port
-
-
- 00000
-
-
- 0
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 30
- 16777215
-
-
-
- Set local data listener address and port
-
-
- Set
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
-
-
-
-
- RollupWidget
- QWidget
-
- 1
-
-
-
-
-
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.cpp b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.cpp
deleted file mode 100644
index 7415d6215..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-#include "plugin/pluginapi.h"
-
-#ifndef SERVER_MODE
-#include "sdrdaemonchannelsourcegui.h"
-#endif
-#include "sdrdaemonchannelsource.h"
-#include "sdrdaemonchannelsourceplugin.h"
-
-const PluginDescriptor SDRDaemonChannelSourcePlugin::m_pluginDescriptor = {
- QString("SDRDaemon source"),
- QString("4.1.0"),
- QString("(c) Edouard Griffiths, F4EXB"),
- QString("https://github.com/f4exb/sdrangel"),
- true,
- QString("https://github.com/f4exb/sdrangel")
-};
-
-SDRDaemonChannelSourcePlugin::SDRDaemonChannelSourcePlugin(QObject* parent) :
- QObject(parent),
- m_pluginAPI(0)
-{
-}
-
-const PluginDescriptor& SDRDaemonChannelSourcePlugin::getPluginDescriptor() const
-{
- return m_pluginDescriptor;
-}
-
-void SDRDaemonChannelSourcePlugin::initPlugin(PluginAPI* pluginAPI)
-{
- m_pluginAPI = pluginAPI;
-
- // register
- m_pluginAPI->registerTxChannel(SDRDaemonChannelSource::m_channelIdURI, SDRDaemonChannelSource::m_channelId, this);
-}
-
-#ifdef SERVER_MODE
-PluginInstanceGUI* SDRDaemonChannelSourcePlugin::createTxChannelGUI(
- DeviceUISet *deviceUISet __attribute__((unused)),
- BasebandSampleSource *txChannel __attribute__((unused)))
-{
- return 0;
-}
-#else
-PluginInstanceGUI* SDRDaemonChannelSourcePlugin::createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel)
-{
- return SDRDaemonChannelSourceGUI::create(m_pluginAPI, deviceUISet, txChannel);
-}
-#endif
-
-BasebandSampleSource* SDRDaemonChannelSourcePlugin::createTxChannelBS(DeviceSinkAPI *deviceAPI)
-{
- return new SDRDaemonChannelSource(deviceAPI);
-}
-
-ChannelSourceAPI* SDRDaemonChannelSourcePlugin::createTxChannelCS(DeviceSinkAPI *deviceAPI)
-{
- return new SDRDaemonChannelSource(deviceAPI);
-}
-
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.h b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.h
deleted file mode 100644
index fb0a07036..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourceplugin.h
+++ /dev/null
@@ -1,47 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef INCLUDE_SDRDAEMONCHANNELSOURCEPLUGIN_H
-#define INCLUDE_SDRDAEMONCHANNELSOURCEPLUGIN_H
-
-#include
-#include "plugin/plugininterface.h"
-
-class DeviceUISet;
-class BasebandSampleSource;
-
-class SDRDaemonChannelSourcePlugin : public QObject, PluginInterface {
- Q_OBJECT
- Q_INTERFACES(PluginInterface)
- Q_PLUGIN_METADATA(IID "sdrangel.channeltx.sdrdaemonsource")
-
-public:
- explicit SDRDaemonChannelSourcePlugin(QObject* parent = 0);
-
- const PluginDescriptor& getPluginDescriptor() const;
- void initPlugin(PluginAPI* pluginAPI);
-
- virtual PluginInstanceGUI* createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel);
- virtual BasebandSampleSource* createTxChannelBS(DeviceSinkAPI *deviceAPI);
- virtual ChannelSourceAPI* createTxChannelCS(DeviceSinkAPI *deviceAPI);
-
-private:
- static const PluginDescriptor m_pluginDescriptor;
-
- PluginAPI* m_pluginAPI;
-};
-
-#endif // INCLUDE_SDRDAEMONCHANNELSOURCEPLUGIN_H
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.cpp b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.cpp
deleted file mode 100644
index 85892e7fb..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon sink channel (Rx) main settings //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-
-#include "util/simpleserializer.h"
-#include "settings/serializable.h"
-#include "sdrdaemonchannelsourcesettings.h"
-
-SDRDaemonChannelSourceSettings::SDRDaemonChannelSourceSettings()
-{
- resetToDefaults();
-}
-
-void SDRDaemonChannelSourceSettings::resetToDefaults()
-{
- m_dataAddress = "127.0.0.1";
- m_dataPort = 9090;
- m_rgbColor = QColor(0, 255, 255).rgb();
- m_title = "SDRDaemon sink";
-
-}
-
-QByteArray SDRDaemonChannelSourceSettings::serialize() const
-{
- SimpleSerializer s(1);
- s.writeString(1, m_dataAddress);
- s.writeU32(2, m_dataPort);
- s.writeU32(3, m_rgbColor);
- s.writeString(4, m_title);
-
- return s.final();
-}
-
-bool SDRDaemonChannelSourceSettings::deserialize(const QByteArray& data)
-{
- SimpleDeserializer d(data);
-
- if(!d.isValid())
- {
- resetToDefaults();
- return false;
- }
-
- if(d.getVersion() == 1)
- {
- uint32_t tmp;
- QString strtmp;
-
- d.readString(1, &m_dataAddress, "127.0.0.1");
- d.readU32(2, &tmp, 0);
-
- if ((tmp > 1023) && (tmp < 65535)) {
- m_dataPort = tmp;
- } else {
- m_dataPort = 9090;
- }
-
- d.readU32(3, &m_rgbColor, QColor(0, 255, 255).rgb());
- d.readString(4, &m_title, "AM Modulator");
-
- return true;
- }
- else
- {
- resetToDefaults();
- return false;
- }
-}
-
-
-
-
-
-
-
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.h b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.h
deleted file mode 100644
index ea3f5311c..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcesettings.h
+++ /dev/null
@@ -1,48 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) main settings //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef CHANNEL_TX_SDRDAEMONCHANNELSOURCESETTINGS_H_
-#define CHANNEL_TX_SDRDAEMONCHANNELSOURCESETTINGS_H_
-
-#include
-#include
-
-class Serializable;
-
-struct SDRDaemonChannelSourceSettings
-{
- QString m_dataAddress; //!< Listening (local) data address
- uint16_t m_dataPort; //!< Listening data port
- quint32 m_rgbColor;
- QString m_title;
-
- Serializable *m_channelMarker;
-
- SDRDaemonChannelSourceSettings();
- void resetToDefaults();
- void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
- QByteArray serialize() const;
- bool deserialize(const QByteArray& data);
-};
-
-
-#endif /* CHANNEL_TX_SDRDAEMONCHANNELSOURCESETTINGS_H_ */
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.cpp b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.cpp
deleted file mode 100644
index 3b2d55998..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) UDP receiver thread //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-
-#include
-
-#include "channel/sdrdaemondataqueue.h"
-#include "channel/sdrdaemondatablock.h"
-#include "channel/sdrdaemonchannelsourcethread.h"
-
-#include "cm256.h"
-
-MESSAGE_CLASS_DEFINITION(SDRDaemonChannelSourceThread::MsgStartStop, Message)
-MESSAGE_CLASS_DEFINITION(SDRDaemonChannelSourceThread::MsgDataBind, Message)
-
-SDRDaemonChannelSourceThread::SDRDaemonChannelSourceThread(SDRDaemonDataQueue *dataQueue, QObject* parent) :
- QThread(parent),
- m_running(false),
- m_dataQueue(dataQueue),
- m_address(QHostAddress::LocalHost),
- m_socket(0)
-{
- std::fill(m_dataBlocks, m_dataBlocks+4, (SDRDaemonDataBlock *) 0);
- connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
-}
-
-SDRDaemonChannelSourceThread::~SDRDaemonChannelSourceThread()
-{
- qDebug("SDRDaemonChannelSourceThread::~SDRDaemonChannelSourceThread");
-}
-
-void SDRDaemonChannelSourceThread::startStop(bool start)
-{
- MsgStartStop *msg = MsgStartStop::create(start);
- m_inputMessageQueue.push(msg);
-}
-
-void SDRDaemonChannelSourceThread::dataBind(const QString& address, uint16_t port)
-{
- MsgDataBind *msg = MsgDataBind::create(address, port);
- m_inputMessageQueue.push(msg);
-}
-
-void SDRDaemonChannelSourceThread::startWork()
-{
- qDebug("SDRDaemonChannelSourceThread::startWork");
- m_startWaitMutex.lock();
- m_socket = new QUdpSocket(this);
- start();
- while(!m_running)
- m_startWaiter.wait(&m_startWaitMutex, 100);
- m_startWaitMutex.unlock();
-}
-
-void SDRDaemonChannelSourceThread::stopWork()
-{
- qDebug("SDRDaemonChannelSourceThread::stopWork");
- delete m_socket;
- m_socket = 0;
- m_running = false;
- wait();
-}
-
-void SDRDaemonChannelSourceThread::run()
-{
- qDebug("SDRDaemonChannelSourceThread::run: begin");
- m_running = true;
- m_startWaiter.wakeAll();
-
- while (m_running)
- {
- sleep(1); // Do nothing as everything is in the data handler (dequeuer)
- }
-
- m_running = false;
- qDebug("SDRDaemonChannelSourceThread::run: end");
-}
-
-
-void SDRDaemonChannelSourceThread::handleInputMessages()
-{
- Message* message;
-
- while ((message = m_inputMessageQueue.pop()) != 0)
- {
- if (MsgStartStop::match(*message))
- {
- MsgStartStop* notif = (MsgStartStop*) message;
- qDebug("SDRDaemonChannelSourceThread::handleInputMessages: MsgStartStop: %s", notif->getStartStop() ? "start" : "stop");
-
- if (notif->getStartStop()) {
- startWork();
- } else {
- stopWork();
- }
-
- delete message;
- }
- else if (MsgDataBind::match(*message))
- {
- MsgDataBind* notif = (MsgDataBind*) message;
- qDebug("SDRDaemonChannelSourceThread::handleInputMessages: MsgDataBind: %s:%d", qPrintable(notif->getAddress().toString()), notif->getPort());
-
- if (m_socket)
- {
- disconnect(m_socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
- m_socket->bind(notif->getAddress(), notif->getPort());
- connect(m_socket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
- }
- }
- }
-}
-
-void SDRDaemonChannelSourceThread::readPendingDatagrams()
-{
- SDRDaemonSuperBlock superBlock;
- qint64 size;
-
- while (m_socket->hasPendingDatagrams())
- {
- QHostAddress sender;
- quint16 senderPort = 0;
- //qint64 pendingDataSize = m_socket->pendingDatagramSize();
- size = m_socket->readDatagram((char *) &superBlock, (long long int) sizeof(SDRDaemonSuperBlock), &sender, &senderPort);
-
- if (size == sizeof(SDRDaemonSuperBlock))
- {
- unsigned int dataBlockIndex = superBlock.m_header.m_frameIndex % m_nbDataBlocks;
-
- // create the first block for this index
- if (m_dataBlocks[dataBlockIndex] == 0) {
- m_dataBlocks[dataBlockIndex] = new SDRDaemonDataBlock();
- }
-
- if (m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_frameIndex < 0)
- {
- // initialize virgin block with the frame index
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_frameIndex = superBlock.m_header.m_frameIndex;
- }
- else
- {
- // if the frame index is not the same for the same slot it means we are starting a new frame
- uint32_t frameIndex = m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_frameIndex;
-
- if (superBlock.m_header.m_frameIndex != frameIndex)
- {
- //qDebug("SDRDaemonChannelSourceThread::readPendingDatagrams: push frame %u", frameIndex);
- m_dataQueue->push(m_dataBlocks[dataBlockIndex]);
- m_dataBlocks[dataBlockIndex] = new SDRDaemonDataBlock();
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_frameIndex = superBlock.m_header.m_frameIndex;
- }
- }
-
- m_dataBlocks[dataBlockIndex]->m_superBlocks[superBlock.m_header.m_blockIndex] = superBlock;
-
- if (superBlock.m_header.m_blockIndex == 0) {
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_metaRetrieved = true;
- }
-
- if (superBlock.m_header.m_blockIndex < SDRDaemonNbOrginalBlocks) {
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_originalCount++;
- } else {
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_recoveryCount++;
- }
-
- m_dataBlocks[dataBlockIndex]->m_rxControlBlock.m_blockCount++;
- }
- else
- {
- qWarning("SDRDaemonChannelSourceThread::readPendingDatagrams: wrong super block size not processing");
- }
- }
-}
diff --git a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.h b/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.h
deleted file mode 100644
index fed573f2e..000000000
--- a/plugins/channeltx/sdrdaemonchannelsource/sdrdaemonchannelsourcethread.h
+++ /dev/null
@@ -1,115 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
-// //
-// SDRdaemon source channel (Tx) UDP receiver thread //
-// //
-// SDRdaemon is a detached SDR front end that handles the interface with a //
-// physical device and sends or receives the I/Q samples stream to or from a //
-// SDRangel instance via UDP. It is controlled via a Web REST API. //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef CHANNEL_TX_SDRDAEMONCHANNELSOURCETHREAD_H_
-#define CHANNEL_TX_SDRDAEMONCHANNELSOURCETHREAD_H_
-
-#include
-#include
-#include
-#include
-
-#include "util/message.h"
-#include "util/messagequeue.h"
-
-class SDRDaemonDataQueue;
-class SDRDaemonDataBlock;
-class QUdpSocket;
-
-class SDRDaemonChannelSourceThread : public QThread {
- Q_OBJECT
-public:
- class MsgStartStop : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- bool getStartStop() const { return m_startStop; }
-
- static MsgStartStop* create(bool startStop) {
- return new MsgStartStop(startStop);
- }
-
- protected:
- bool m_startStop;
-
- MsgStartStop(bool startStop) :
- Message(),
- m_startStop(startStop)
- { }
- };
-
- class MsgDataBind : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- QHostAddress getAddress() const { return m_address; }
- uint16_t getPort() const { return m_port; }
-
- static MsgDataBind* create(const QString& address, uint16_t port) {
- return new MsgDataBind(address, port);
- }
-
- protected:
- QHostAddress m_address;
- uint16_t m_port;
-
- MsgDataBind(const QString& address, uint16_t port) :
- Message(),
- m_port(port)
- {
- m_address.setAddress(address);
- }
- };
-
- SDRDaemonChannelSourceThread(SDRDaemonDataQueue *dataQueue, QObject* parent = 0);
- ~SDRDaemonChannelSourceThread();
-
- void startStop(bool start);
- void dataBind(const QString& address, uint16_t port);
-
-private:
- QMutex m_startWaitMutex;
- QWaitCondition m_startWaiter;
- bool m_running;
-
- MessageQueue m_inputMessageQueue;
- SDRDaemonDataQueue *m_dataQueue;
-
- QHostAddress m_address;
- QUdpSocket *m_socket;
-
- static const uint32_t m_nbDataBlocks = 4; //!< number of data blocks in the ring buffer
- SDRDaemonDataBlock *m_dataBlocks[m_nbDataBlocks]; //!< ring buffer of data blocks indexed by frame affinity
-
- void startWork();
- void stopWork();
-
- void run();
-
-private slots:
- void handleInputMessages();
- void readPendingDatagrams();
-};
-
-
-
-#endif /* CHANNEL_TX_SDRDAEMONCHANNELSOURCETHREAD_H_ */