mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-15 12:51:49 -05:00
Migration of DaemonSink channel to RemoteSink
This commit is contained in:
parent
e5b23e9864
commit
5b04cf4b5a
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
@ -27,10 +27,10 @@ endif()
|
|||||||
|
|
||||||
find_package(CM256cc)
|
find_package(CM256cc)
|
||||||
if(CM256CC_FOUND)
|
if(CM256CC_FOUND)
|
||||||
add_subdirectory(daemonsink)
|
add_subdirectory(remotesink)
|
||||||
endif(CM256CC_FOUND)
|
endif(CM256CC_FOUND)
|
||||||
|
|
||||||
if (BUILD_DEBIAN)
|
if (BUILD_DEBIAN)
|
||||||
add_subdirectory(demoddsd)
|
add_subdirectory(demoddsd)
|
||||||
add_subdirectory(daemonsink)
|
add_subdirectory(remotesink)
|
||||||
endif (BUILD_DEBIAN)
|
endif (BUILD_DEBIAN)
|
||||||
|
@ -1,83 +0,0 @@
|
|||||||
project(daemonsink)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
|
|
||||||
if (HAS_SSSE3)
|
|
||||||
message(STATUS "DaemonSink: use SSSE3 SIMD" )
|
|
||||||
elseif (HAS_NEON)
|
|
||||||
message(STATUS "DaemonSink: use Neon SIMD" )
|
|
||||||
else()
|
|
||||||
message(STATUS "DaemonSink: Unsupported architecture")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(daemonsink_SOURCES
|
|
||||||
daemonsink.cpp
|
|
||||||
daemonsinkgui.cpp
|
|
||||||
daemonsinksettings.cpp
|
|
||||||
daemonsinkthread.cpp
|
|
||||||
daemonsinkplugin.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(daemonsink_HEADERS
|
|
||||||
daemonsink.h
|
|
||||||
daemonsinkgui.h
|
|
||||||
daemonsinksettings.h
|
|
||||||
daemonsinkthread.h
|
|
||||||
daemonsinkplugin.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(daemonsink_FORMS
|
|
||||||
daemonsinkgui.ui
|
|
||||||
)
|
|
||||||
|
|
||||||
#include(${QT_USE_FILE})
|
|
||||||
add_definitions(${QT_DEFINITIONS})
|
|
||||||
add_definitions(-DQT_PLUGIN)
|
|
||||||
add_definitions(-DQT_SHARED)
|
|
||||||
|
|
||||||
qt5_wrap_ui(daemonsink_FORMS_HEADERS ${daemonsink_FORMS})
|
|
||||||
|
|
||||||
add_library(daemonsink SHARED
|
|
||||||
${daemonsink_SOURCES}
|
|
||||||
${daemonsink_HEADERS_MOC}
|
|
||||||
${daemonsink_FORMS_HEADERS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (BUILD_DEBIAN)
|
|
||||||
target_include_directories(daemonsink PUBLIC
|
|
||||||
.
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
|
|
||||||
${LIBCM256CCSRC}
|
|
||||||
)
|
|
||||||
else (BUILD_DEBIAN)
|
|
||||||
target_include_directories(daemonsink PUBLIC
|
|
||||||
.
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
|
|
||||||
${CM256CC_INCLUDE_DIR}
|
|
||||||
)
|
|
||||||
endif (BUILD_DEBIAN)
|
|
||||||
|
|
||||||
if (BUILD_DEBIAN)
|
|
||||||
target_link_libraries(daemonsink
|
|
||||||
${QT_LIBRARIES}
|
|
||||||
cm256cc
|
|
||||||
sdrbase
|
|
||||||
sdrgui
|
|
||||||
swagger
|
|
||||||
)
|
|
||||||
else (BUILD_DEBIAN)
|
|
||||||
target_link_libraries(daemonsink
|
|
||||||
${QT_LIBRARIES}
|
|
||||||
${CM256CC_LIBRARIES}
|
|
||||||
sdrbase
|
|
||||||
sdrgui
|
|
||||||
swagger
|
|
||||||
)
|
|
||||||
endif (BUILD_DEBIAN)
|
|
||||||
|
|
||||||
target_link_libraries(daemonsink Qt5::Core Qt5::Widgets)
|
|
||||||
|
|
||||||
install(TARGETS daemonsink DESTINATION lib/plugins/channelrx)
|
|
83
plugins/channelrx/remotesink/CMakeLists.txt
Normal file
83
plugins/channelrx/remotesink/CMakeLists.txt
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
project(remotesink)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
|
||||||
|
if (HAS_SSSE3)
|
||||||
|
message(STATUS "RemoteSink: use SSSE3 SIMD" )
|
||||||
|
elseif (HAS_NEON)
|
||||||
|
message(STATUS "RemoteSink: use Neon SIMD" )
|
||||||
|
else()
|
||||||
|
message(STATUS "RemoteSink: Unsupported architecture")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(remotesink_SOURCES
|
||||||
|
remotesink.cpp
|
||||||
|
remotesinkgui.cpp
|
||||||
|
remotesinksettings.cpp
|
||||||
|
remotesinkthread.cpp
|
||||||
|
remotesinkplugin.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(remotesink_HEADERS
|
||||||
|
remotesink.h
|
||||||
|
remotesinkgui.h
|
||||||
|
remotesinksettings.h
|
||||||
|
remotesinkthread.h
|
||||||
|
remotesinkplugin.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(remotesink_FORMS
|
||||||
|
remotesinkgui.ui
|
||||||
|
)
|
||||||
|
|
||||||
|
#include(${QT_USE_FILE})
|
||||||
|
add_definitions(${QT_DEFINITIONS})
|
||||||
|
add_definitions(-DQT_PLUGIN)
|
||||||
|
add_definitions(-DQT_SHARED)
|
||||||
|
|
||||||
|
qt5_wrap_ui(remotesink_FORMS_HEADERS ${remotesink_FORMS})
|
||||||
|
|
||||||
|
add_library(remotesink SHARED
|
||||||
|
${remotesink_SOURCES}
|
||||||
|
${remotesink_HEADERS_MOC}
|
||||||
|
${remotesink_FORMS_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (BUILD_DEBIAN)
|
||||||
|
target_include_directories(remotesink PUBLIC
|
||||||
|
.
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
|
||||||
|
${LIBCM256CCSRC}
|
||||||
|
)
|
||||||
|
else (BUILD_DEBIAN)
|
||||||
|
target_include_directories(remotesink PUBLIC
|
||||||
|
.
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
|
||||||
|
${CM256CC_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
endif (BUILD_DEBIAN)
|
||||||
|
|
||||||
|
if (BUILD_DEBIAN)
|
||||||
|
target_link_libraries(remotesink
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
cm256cc
|
||||||
|
sdrbase
|
||||||
|
sdrgui
|
||||||
|
swagger
|
||||||
|
)
|
||||||
|
else (BUILD_DEBIAN)
|
||||||
|
target_link_libraries(remotesink
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
${CM256CC_LIBRARIES}
|
||||||
|
sdrbase
|
||||||
|
sdrgui
|
||||||
|
swagger
|
||||||
|
)
|
||||||
|
endif (BUILD_DEBIAN)
|
||||||
|
|
||||||
|
target_link_libraries(remotesink Qt5::Core Qt5::Widgets)
|
||||||
|
|
||||||
|
install(TARGETS remotesink DESTINATION lib/plugins/channelrx)
|
@ -1,4 +1,4 @@
|
|||||||
<h1>Daemon sink channel plugin</h1>
|
<h1>Remote sink channel plugin</h1>
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ The plugin will be built only if the [CM256cc library](https://github.com/f4exb/
|
|||||||
|
|
||||||
<h2>Interface</h2>
|
<h2>Interface</h2>
|
||||||
|
|
||||||
![Daemon sink channel plugin GUI](../../../doc/img/DaemonSink.png)
|
![Remote sink channel plugin GUI](../../../doc/img/RemoteSink.png)
|
||||||
|
|
||||||
<h3>1: Distant address</h2>
|
<h3>1: Distant address</h2>
|
||||||
|
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,6 +20,8 @@
|
|||||||
// 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 "remotesink.h"
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <boost/crc.hpp>
|
#include <boost/crc.hpp>
|
||||||
@ -36,16 +38,16 @@
|
|||||||
#include "dsp/downchannelizer.h"
|
#include "dsp/downchannelizer.h"
|
||||||
#include "dsp/dspcommands.h"
|
#include "dsp/dspcommands.h"
|
||||||
#include "device/devicesourceapi.h"
|
#include "device/devicesourceapi.h"
|
||||||
#include "daemonsinkthread.h"
|
|
||||||
#include "daemonsink.h"
|
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(DaemonSink::MsgConfigureDaemonSink, Message)
|
#include "../remotesink/remotesinkthread.h"
|
||||||
MESSAGE_CLASS_DEFINITION(DaemonSink::MsgSampleRateNotification, Message)
|
|
||||||
|
|
||||||
const QString DaemonSink::m_channelIdURI = "sdrangel.channel.daemonsink";
|
MESSAGE_CLASS_DEFINITION(RemoteSink::MsgConfigureRemoteSink, Message)
|
||||||
const QString DaemonSink::m_channelId = "DaemonSink";
|
MESSAGE_CLASS_DEFINITION(RemoteSink::MsgSampleRateNotification, Message)
|
||||||
|
|
||||||
DaemonSink::DaemonSink(DeviceSourceAPI *deviceAPI) :
|
const QString RemoteSink::m_channelIdURI = "sdrangel.channel.remotesink";
|
||||||
|
const QString RemoteSink::m_channelId = "RemoteSink";
|
||||||
|
|
||||||
|
RemoteSink::RemoteSink(DeviceSourceAPI *deviceAPI) :
|
||||||
ChannelSinkAPI(m_channelIdURI),
|
ChannelSinkAPI(m_channelIdURI),
|
||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
m_running(false),
|
m_running(false),
|
||||||
@ -72,7 +74,7 @@ DaemonSink::DaemonSink(DeviceSourceAPI *deviceAPI) :
|
|||||||
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
DaemonSink::~DaemonSink()
|
RemoteSink::~RemoteSink()
|
||||||
{
|
{
|
||||||
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
delete m_networkManager;
|
delete m_networkManager;
|
||||||
@ -89,26 +91,26 @@ DaemonSink::~DaemonSink()
|
|||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::setTxDelay(int txDelay, int nbBlocksFEC)
|
void RemoteSink::setTxDelay(int txDelay, int nbBlocksFEC)
|
||||||
{
|
{
|
||||||
double txDelayRatio = txDelay / 100.0;
|
double txDelayRatio = txDelay / 100.0;
|
||||||
int samplesPerBlock = SDRDaemonNbBytesPerBlock / sizeof(Sample);
|
int samplesPerBlock = SDRDaemonNbBytesPerBlock / sizeof(Sample);
|
||||||
double delay = m_sampleRate == 0 ? 1.0 : (127*samplesPerBlock*txDelayRatio) / m_sampleRate;
|
double delay = m_sampleRate == 0 ? 1.0 : (127*samplesPerBlock*txDelayRatio) / m_sampleRate;
|
||||||
delay /= 128 + nbBlocksFEC;
|
delay /= 128 + nbBlocksFEC;
|
||||||
m_txDelay = roundf(delay*1e6); // microseconds
|
m_txDelay = roundf(delay*1e6); // microseconds
|
||||||
qDebug() << "DaemonSink::setTxDelay:"
|
qDebug() << "RemoteSink::setTxDelay:"
|
||||||
<< " " << txDelay
|
<< " " << txDelay
|
||||||
<< "% m_txDelay: " << m_txDelay << "us"
|
<< "% m_txDelay: " << m_txDelay << "us"
|
||||||
<< " m_sampleRate: " << m_sampleRate << "S/s";
|
<< " m_sampleRate: " << m_sampleRate << "S/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::setNbBlocksFEC(int nbBlocksFEC)
|
void RemoteSink::setNbBlocksFEC(int nbBlocksFEC)
|
||||||
{
|
{
|
||||||
qDebug() << "DaemonSink::setNbBlocksFEC: nbBlocksFEC: " << nbBlocksFEC;
|
qDebug() << "RemoteSink::setNbBlocksFEC: nbBlocksFEC: " << nbBlocksFEC;
|
||||||
m_nbBlocksFEC = nbBlocksFEC;
|
m_nbBlocksFEC = nbBlocksFEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
|
void RemoteSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst)
|
||||||
{
|
{
|
||||||
(void) firstOfBurst;
|
(void) firstOfBurst;
|
||||||
SampleVector::const_iterator it = begin;
|
SampleVector::const_iterator it = begin;
|
||||||
@ -153,7 +155,7 @@ void DaemonSink::feed(const SampleVector::const_iterator& begin, const SampleVec
|
|||||||
|
|
||||||
if (!(metaData == m_currentMetaFEC))
|
if (!(metaData == m_currentMetaFEC))
|
||||||
{
|
{
|
||||||
qDebug() << "SDRDaemonChannelSink::feed: meta: "
|
qDebug() << "RemoteSink::feed: meta: "
|
||||||
<< "|" << metaData.m_centerFrequency
|
<< "|" << metaData.m_centerFrequency
|
||||||
<< ":" << metaData.m_sampleRate
|
<< ":" << metaData.m_sampleRate
|
||||||
<< ":" << (int) (metaData.m_sampleBytes & 0xF)
|
<< ":" << (int) (metaData.m_sampleBytes & 0xF)
|
||||||
@ -219,9 +221,9 @@ void DaemonSink::feed(const SampleVector::const_iterator& begin, const SampleVec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::start()
|
void RemoteSink::start()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSink::start");
|
qDebug("RemoteSink::start");
|
||||||
|
|
||||||
memset((void *) &m_currentMetaFEC, 0, sizeof(SDRDaemonMetaDataFEC));
|
memset((void *) &m_currentMetaFEC, 0, sizeof(SDRDaemonMetaDataFEC));
|
||||||
|
|
||||||
@ -229,7 +231,7 @@ void DaemonSink::start()
|
|||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sinkThread = new DaemonSinkThread();
|
m_sinkThread = new RemoteSinkThread();
|
||||||
connect(this,
|
connect(this,
|
||||||
SIGNAL(dataBlockAvailable(SDRDaemonDataBlock *)),
|
SIGNAL(dataBlockAvailable(SDRDaemonDataBlock *)),
|
||||||
m_sinkThread,
|
m_sinkThread,
|
||||||
@ -239,9 +241,9 @@ void DaemonSink::start()
|
|||||||
m_running = true;
|
m_running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::stop()
|
void RemoteSink::stop()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSink::stop");
|
qDebug("RemoteSink::stop");
|
||||||
|
|
||||||
if (m_sinkThread != 0)
|
if (m_sinkThread != 0)
|
||||||
{
|
{
|
||||||
@ -253,14 +255,14 @@ void DaemonSink::stop()
|
|||||||
m_running = false;
|
m_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DaemonSink::handleMessage(const Message& cmd)
|
bool RemoteSink::handleMessage(const Message& cmd)
|
||||||
{
|
{
|
||||||
(void) cmd;
|
(void) cmd;
|
||||||
if (DownChannelizer::MsgChannelizerNotification::match(cmd))
|
if (DownChannelizer::MsgChannelizerNotification::match(cmd))
|
||||||
{
|
{
|
||||||
DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd;
|
DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd;
|
||||||
|
|
||||||
qDebug() << "DaemonSink::handleMessage: MsgChannelizerNotification:"
|
qDebug() << "RemoteSink::handleMessage: MsgChannelizerNotification:"
|
||||||
<< " channelSampleRate: " << notif.getSampleRate()
|
<< " channelSampleRate: " << notif.getSampleRate()
|
||||||
<< " offsetFrequency: " << notif.getFrequencyOffset();
|
<< " offsetFrequency: " << notif.getFrequencyOffset();
|
||||||
|
|
||||||
@ -282,7 +284,7 @@ bool DaemonSink::handleMessage(const Message& cmd)
|
|||||||
{
|
{
|
||||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||||
|
|
||||||
qDebug() << "DaemonSink::handleMessage: DSPSignalNotification:"
|
qDebug() << "RemoteSink::handleMessage: DSPSignalNotification:"
|
||||||
<< " inputSampleRate: " << notif.getSampleRate()
|
<< " inputSampleRate: " << notif.getSampleRate()
|
||||||
<< " centerFrequency: " << notif.getCenterFrequency();
|
<< " centerFrequency: " << notif.getCenterFrequency();
|
||||||
|
|
||||||
@ -290,10 +292,10 @@ bool DaemonSink::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (MsgConfigureDaemonSink::match(cmd))
|
else if (MsgConfigureRemoteSink::match(cmd))
|
||||||
{
|
{
|
||||||
MsgConfigureDaemonSink& cfg = (MsgConfigureDaemonSink&) cmd;
|
MsgConfigureRemoteSink& cfg = (MsgConfigureRemoteSink&) cmd;
|
||||||
qDebug() << "DaemonSink::handleMessage: MsgConfigureDaemonSink";
|
qDebug() << "RemoteSink::handleMessage: MsgConfigureRemoteSink";
|
||||||
applySettings(cfg.getSettings(), cfg.getForce());
|
applySettings(cfg.getSettings(), cfg.getForce());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -304,32 +306,32 @@ bool DaemonSink::handleMessage(const Message& cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray DaemonSink::serialize() const
|
QByteArray RemoteSink::serialize() const
|
||||||
{
|
{
|
||||||
return m_settings.serialize();
|
return m_settings.serialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DaemonSink::deserialize(const QByteArray& data)
|
bool RemoteSink::deserialize(const QByteArray& data)
|
||||||
{
|
{
|
||||||
(void) data;
|
(void) data;
|
||||||
if (m_settings.deserialize(data))
|
if (m_settings.deserialize(data))
|
||||||
{
|
{
|
||||||
MsgConfigureDaemonSink *msg = MsgConfigureDaemonSink::create(m_settings, true);
|
MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true);
|
||||||
m_inputMessageQueue.push(msg);
|
m_inputMessageQueue.push(msg);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_settings.resetToDefaults();
|
m_settings.resetToDefaults();
|
||||||
MsgConfigureDaemonSink *msg = MsgConfigureDaemonSink::create(m_settings, true);
|
MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true);
|
||||||
m_inputMessageQueue.push(msg);
|
m_inputMessageQueue.push(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::applySettings(const DaemonSinkSettings& settings, bool force)
|
void RemoteSink::applySettings(const RemoteSinkSettings& settings, bool force)
|
||||||
{
|
{
|
||||||
qDebug() << "DaemonSink::applySettings:"
|
qDebug() << "RemoteSink::applySettings:"
|
||||||
<< " m_nbFECBlocks: " << settings.m_nbFECBlocks
|
<< " m_nbFECBlocks: " << settings.m_nbFECBlocks
|
||||||
<< " m_txDelay: " << settings.m_txDelay
|
<< " m_txDelay: " << settings.m_txDelay
|
||||||
<< " m_dataAddress: " << settings.m_dataAddress
|
<< " m_dataAddress: " << settings.m_dataAddress
|
||||||
@ -376,40 +378,40 @@ void DaemonSink::applySettings(const DaemonSinkSettings& settings, bool force)
|
|||||||
m_settings = settings;
|
m_settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DaemonSink::webapiSettingsGet(
|
int RemoteSink::webapiSettingsGet(
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
{
|
{
|
||||||
(void) errorMessage;
|
(void) errorMessage;
|
||||||
response.setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
|
response.setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
|
||||||
response.getDaemonSinkSettings()->init();
|
response.getRemoteSinkSettings()->init();
|
||||||
webapiFormatChannelSettings(response, m_settings);
|
webapiFormatChannelSettings(response, m_settings);
|
||||||
return 200;
|
return 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DaemonSink::webapiSettingsPutPatch(
|
int RemoteSink::webapiSettingsPutPatch(
|
||||||
bool force,
|
bool force,
|
||||||
const QStringList& channelSettingsKeys,
|
const QStringList& channelSettingsKeys,
|
||||||
SWGSDRangel::SWGChannelSettings& response,
|
SWGSDRangel::SWGChannelSettings& response,
|
||||||
QString& errorMessage)
|
QString& errorMessage)
|
||||||
{
|
{
|
||||||
(void) errorMessage;
|
(void) errorMessage;
|
||||||
DaemonSinkSettings settings = m_settings;
|
RemoteSinkSettings settings = m_settings;
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("nbFECBlocks"))
|
if (channelSettingsKeys.contains("nbFECBlocks"))
|
||||||
{
|
{
|
||||||
int nbFECBlocks = response.getDaemonSinkSettings()->getNbFecBlocks();
|
int nbFECBlocks = response.getRemoteSinkSettings()->getNbFecBlocks();
|
||||||
|
|
||||||
if ((nbFECBlocks < 0) || (nbFECBlocks > 127)) {
|
if ((nbFECBlocks < 0) || (nbFECBlocks > 127)) {
|
||||||
settings.m_nbFECBlocks = 8;
|
settings.m_nbFECBlocks = 8;
|
||||||
} else {
|
} else {
|
||||||
settings.m_nbFECBlocks = response.getDaemonSinkSettings()->getNbFecBlocks();
|
settings.m_nbFECBlocks = response.getRemoteSinkSettings()->getNbFecBlocks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("txDelay"))
|
if (channelSettingsKeys.contains("txDelay"))
|
||||||
{
|
{
|
||||||
int txDelay = response.getDaemonSinkSettings()->getTxDelay();
|
int txDelay = response.getRemoteSinkSettings()->getTxDelay();
|
||||||
|
|
||||||
if (txDelay < 0) {
|
if (txDelay < 0) {
|
||||||
settings.m_txDelay = 35;
|
settings.m_txDelay = 35;
|
||||||
@ -419,12 +421,12 @@ int DaemonSink::webapiSettingsPutPatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("dataAddress")) {
|
if (channelSettingsKeys.contains("dataAddress")) {
|
||||||
settings.m_dataAddress = *response.getDaemonSinkSettings()->getDataAddress();
|
settings.m_dataAddress = *response.getRemoteSinkSettings()->getDataAddress();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("dataPort"))
|
if (channelSettingsKeys.contains("dataPort"))
|
||||||
{
|
{
|
||||||
int dataPort = response.getDaemonSinkSettings()->getDataPort();
|
int dataPort = response.getRemoteSinkSettings()->getDataPort();
|
||||||
|
|
||||||
if ((dataPort < 1024) || (dataPort > 65535)) {
|
if ((dataPort < 1024) || (dataPort > 65535)) {
|
||||||
settings.m_dataPort = 9090;
|
settings.m_dataPort = 9090;
|
||||||
@ -434,34 +436,34 @@ int DaemonSink::webapiSettingsPutPatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("rgbColor")) {
|
if (channelSettingsKeys.contains("rgbColor")) {
|
||||||
settings.m_rgbColor = response.getDaemonSinkSettings()->getRgbColor();
|
settings.m_rgbColor = response.getRemoteSinkSettings()->getRgbColor();
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("title")) {
|
if (channelSettingsKeys.contains("title")) {
|
||||||
settings.m_title = *response.getDaemonSinkSettings()->getTitle();
|
settings.m_title = *response.getRemoteSinkSettings()->getTitle();
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("useReverseAPI")) {
|
if (channelSettingsKeys.contains("useReverseAPI")) {
|
||||||
settings.m_useReverseAPI = response.getDaemonSinkSettings()->getUseReverseApi() != 0;
|
settings.m_useReverseAPI = response.getRemoteSinkSettings()->getUseReverseApi() != 0;
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("reverseAPIAddress")) {
|
if (channelSettingsKeys.contains("reverseAPIAddress")) {
|
||||||
settings.m_reverseAPIAddress = *response.getDaemonSinkSettings()->getReverseApiAddress();
|
settings.m_reverseAPIAddress = *response.getRemoteSinkSettings()->getReverseApiAddress();
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("reverseAPIPort")) {
|
if (channelSettingsKeys.contains("reverseAPIPort")) {
|
||||||
settings.m_reverseAPIPort = response.getDaemonSinkSettings()->getReverseApiPort();
|
settings.m_reverseAPIPort = response.getRemoteSinkSettings()->getReverseApiPort();
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||||
settings.m_reverseAPIDeviceIndex = response.getDaemonSinkSettings()->getReverseApiDeviceIndex();
|
settings.m_reverseAPIDeviceIndex = response.getRemoteSinkSettings()->getReverseApiDeviceIndex();
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
||||||
settings.m_reverseAPIChannelIndex = response.getDaemonSinkSettings()->getReverseApiChannelIndex();
|
settings.m_reverseAPIChannelIndex = response.getRemoteSinkSettings()->getReverseApiChannelIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
MsgConfigureDaemonSink *msg = MsgConfigureDaemonSink::create(settings, force);
|
MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(settings, force);
|
||||||
m_inputMessageQueue.push(msg);
|
m_inputMessageQueue.push(msg);
|
||||||
|
|
||||||
qDebug("DaemonSink::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
qDebug("RemoteSink::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue);
|
||||||
if (m_guiMessageQueue) // forward to GUI if any
|
if (m_guiMessageQueue) // forward to GUI if any
|
||||||
{
|
{
|
||||||
MsgConfigureDaemonSink *msgToGUI = MsgConfigureDaemonSink::create(settings, force);
|
MsgConfigureRemoteSink *msgToGUI = MsgConfigureRemoteSink::create(settings, force);
|
||||||
m_guiMessageQueue->push(msgToGUI);
|
m_guiMessageQueue->push(msgToGUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,67 +472,67 @@ int DaemonSink::webapiSettingsPutPatch(
|
|||||||
return 200;
|
return 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const DaemonSinkSettings& settings)
|
void RemoteSink::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const RemoteSinkSettings& settings)
|
||||||
{
|
{
|
||||||
response.getDaemonSinkSettings()->setNbFecBlocks(settings.m_nbFECBlocks);
|
response.getRemoteSinkSettings()->setNbFecBlocks(settings.m_nbFECBlocks);
|
||||||
response.getDaemonSinkSettings()->setTxDelay(settings.m_txDelay);
|
response.getRemoteSinkSettings()->setTxDelay(settings.m_txDelay);
|
||||||
|
|
||||||
if (response.getDaemonSinkSettings()->getDataAddress()) {
|
if (response.getRemoteSinkSettings()->getDataAddress()) {
|
||||||
*response.getDaemonSinkSettings()->getDataAddress() = settings.m_dataAddress;
|
*response.getRemoteSinkSettings()->getDataAddress() = settings.m_dataAddress;
|
||||||
} else {
|
} else {
|
||||||
response.getDaemonSinkSettings()->setDataAddress(new QString(settings.m_dataAddress));
|
response.getRemoteSinkSettings()->setDataAddress(new QString(settings.m_dataAddress));
|
||||||
}
|
}
|
||||||
|
|
||||||
response.getDaemonSinkSettings()->setDataPort(settings.m_dataPort);
|
response.getRemoteSinkSettings()->setDataPort(settings.m_dataPort);
|
||||||
response.getDaemonSinkSettings()->setRgbColor(settings.m_rgbColor);
|
response.getRemoteSinkSettings()->setRgbColor(settings.m_rgbColor);
|
||||||
|
|
||||||
if (response.getDaemonSinkSettings()->getTitle()) {
|
if (response.getRemoteSinkSettings()->getTitle()) {
|
||||||
*response.getDaemonSinkSettings()->getTitle() = settings.m_title;
|
*response.getRemoteSinkSettings()->getTitle() = settings.m_title;
|
||||||
} else {
|
} else {
|
||||||
response.getDaemonSinkSettings()->setTitle(new QString(settings.m_title));
|
response.getRemoteSinkSettings()->setTitle(new QString(settings.m_title));
|
||||||
}
|
}
|
||||||
|
|
||||||
response.getDaemonSinkSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
|
response.getRemoteSinkSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
|
||||||
|
|
||||||
if (response.getDaemonSinkSettings()->getReverseApiAddress()) {
|
if (response.getRemoteSinkSettings()->getReverseApiAddress()) {
|
||||||
*response.getDaemonSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
|
*response.getRemoteSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
|
||||||
} else {
|
} else {
|
||||||
response.getDaemonSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
|
response.getRemoteSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
|
||||||
}
|
}
|
||||||
|
|
||||||
response.getDaemonSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
|
response.getRemoteSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
|
||||||
response.getDaemonSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
|
response.getRemoteSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
|
||||||
response.getDaemonSinkSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex);
|
response.getRemoteSinkSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DaemonSinkSettings& settings, bool force)
|
void RemoteSink::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const RemoteSinkSettings& settings, bool force)
|
||||||
{
|
{
|
||||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||||
swgChannelSettings->setTx(0);
|
swgChannelSettings->setTx(0);
|
||||||
swgChannelSettings->setChannelType(new QString("DaemonSink"));
|
swgChannelSettings->setChannelType(new QString("RemoteSink"));
|
||||||
swgChannelSettings->setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
|
swgChannelSettings->setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
|
||||||
SWGSDRangel::SWGDaemonSinkSettings *swgDaemonSinkSettings = swgChannelSettings->getDaemonSinkSettings();
|
SWGSDRangel::SWGRemoteSinkSettings *swgRemoteSinkSettings = swgChannelSettings->getRemoteSinkSettings();
|
||||||
|
|
||||||
// transfer data that has been modified. When force is on transfer all data except reverse API data
|
// transfer data that has been modified. When force is on transfer all data except reverse API data
|
||||||
|
|
||||||
if (channelSettingsKeys.contains("nbFECBlocks") || force) {
|
if (channelSettingsKeys.contains("nbFECBlocks") || force) {
|
||||||
swgDaemonSinkSettings->setNbFecBlocks(settings.m_nbFECBlocks);
|
swgRemoteSinkSettings->setNbFecBlocks(settings.m_nbFECBlocks);
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("txDelay") || force)
|
if (channelSettingsKeys.contains("txDelay") || force)
|
||||||
{
|
{
|
||||||
swgDaemonSinkSettings->setTxDelay(settings.m_txDelay);
|
swgRemoteSinkSettings->setTxDelay(settings.m_txDelay);
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("dataAddress") || force) {
|
if (channelSettingsKeys.contains("dataAddress") || force) {
|
||||||
swgDaemonSinkSettings->setDataAddress(new QString(settings.m_dataAddress));
|
swgRemoteSinkSettings->setDataAddress(new QString(settings.m_dataAddress));
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("dataPort") || force) {
|
if (channelSettingsKeys.contains("dataPort") || force) {
|
||||||
swgDaemonSinkSettings->setDataPort(settings.m_dataPort);
|
swgRemoteSinkSettings->setDataPort(settings.m_dataPort);
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("rgbColor") || force) {
|
if (channelSettingsKeys.contains("rgbColor") || force) {
|
||||||
swgDaemonSinkSettings->setRgbColor(settings.m_rgbColor);
|
swgRemoteSinkSettings->setRgbColor(settings.m_rgbColor);
|
||||||
}
|
}
|
||||||
if (channelSettingsKeys.contains("title") || force) {
|
if (channelSettingsKeys.contains("title") || force) {
|
||||||
swgDaemonSinkSettings->setTitle(new QString(settings.m_title));
|
swgRemoteSinkSettings->setTitle(new QString(settings.m_title));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||||
@ -552,13 +554,13 @@ void DaemonSink::webapiReverseSendSettings(QList<QString>& channelSettingsKeys,
|
|||||||
delete swgChannelSettings;
|
delete swgChannelSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSink::networkManagerFinished(QNetworkReply *reply)
|
void RemoteSink::networkManagerFinished(QNetworkReply *reply)
|
||||||
{
|
{
|
||||||
QNetworkReply::NetworkError replyError = reply->error();
|
QNetworkReply::NetworkError replyError = reply->error();
|
||||||
|
|
||||||
if (replyError)
|
if (replyError)
|
||||||
{
|
{
|
||||||
qWarning() << "DaemonSink::networkManagerFinished:"
|
qWarning() << "RemoteSink::networkManagerFinished:"
|
||||||
<< " error(" << (int) replyError
|
<< " error(" << (int) replyError
|
||||||
<< "): " << replyError
|
<< "): " << replyError
|
||||||
<< ": " << reply->errorString();
|
<< ": " << reply->errorString();
|
||||||
@ -567,5 +569,5 @@ void DaemonSink::networkManagerFinished(QNetworkReply *reply)
|
|||||||
|
|
||||||
QString answer = reply->readAll();
|
QString answer = reply->readAll();
|
||||||
answer.chop(1); // remove last \n
|
answer.chop(1); // remove last \n
|
||||||
qDebug("DaemonSink::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
|
qDebug("RemoteSink::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
|
||||||
}
|
}
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,8 +20,8 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef INCLUDE_DAEMONSINK_H_
|
#ifndef INCLUDE_REMOTESINK_H_
|
||||||
#define INCLUDE_DAEMONSINK_H_
|
#define INCLUDE_REMOTESINK_H_
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
@ -30,35 +30,36 @@
|
|||||||
#include "dsp/basebandsamplesink.h"
|
#include "dsp/basebandsamplesink.h"
|
||||||
#include "channel/channelsinkapi.h"
|
#include "channel/channelsinkapi.h"
|
||||||
#include "channel/sdrdaemondatablock.h"
|
#include "channel/sdrdaemondatablock.h"
|
||||||
#include "daemonsinksettings.h"
|
|
||||||
|
#include "../remotesink/remotesinksettings.h"
|
||||||
|
|
||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
class DeviceSourceAPI;
|
class DeviceSourceAPI;
|
||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
class DaemonSinkThread;
|
class RemoteSinkThread;
|
||||||
|
|
||||||
class DaemonSink : public BasebandSampleSink, public ChannelSinkAPI {
|
class RemoteSink : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
class MsgConfigureDaemonSink : public Message {
|
class MsgConfigureRemoteSink : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const DaemonSinkSettings& getSettings() const { return m_settings; }
|
const RemoteSinkSettings& getSettings() const { return m_settings; }
|
||||||
bool getForce() const { return m_force; }
|
bool getForce() const { return m_force; }
|
||||||
|
|
||||||
static MsgConfigureDaemonSink* create(const DaemonSinkSettings& settings, bool force)
|
static MsgConfigureRemoteSink* create(const RemoteSinkSettings& settings, bool force)
|
||||||
{
|
{
|
||||||
return new MsgConfigureDaemonSink(settings, force);
|
return new MsgConfigureRemoteSink(settings, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DaemonSinkSettings m_settings;
|
RemoteSinkSettings m_settings;
|
||||||
bool m_force;
|
bool m_force;
|
||||||
|
|
||||||
MsgConfigureDaemonSink(const DaemonSinkSettings& settings, bool force) :
|
MsgConfigureRemoteSink(const RemoteSinkSettings& settings, bool force) :
|
||||||
Message(),
|
Message(),
|
||||||
m_settings(settings),
|
m_settings(settings),
|
||||||
m_force(force)
|
m_force(force)
|
||||||
@ -85,8 +86,8 @@ public:
|
|||||||
int m_sampleRate;
|
int m_sampleRate;
|
||||||
};
|
};
|
||||||
|
|
||||||
DaemonSink(DeviceSourceAPI *deviceAPI);
|
RemoteSink(DeviceSourceAPI *deviceAPI);
|
||||||
virtual ~DaemonSink();
|
virtual ~RemoteSink();
|
||||||
virtual void destroy() { delete this; }
|
virtual void destroy() { delete this; }
|
||||||
|
|
||||||
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po);
|
virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po);
|
||||||
@ -95,7 +96,7 @@ public:
|
|||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||||
virtual void getTitle(QString& title) { title = "SDRDaemon Sink"; }
|
virtual void getTitle(QString& title) { title = "Remote Sink"; }
|
||||||
virtual qint64 getCenterFrequency() const { return 0; }
|
virtual qint64 getCenterFrequency() const { return 0; }
|
||||||
|
|
||||||
virtual QByteArray serialize() const;
|
virtual QByteArray serialize() const;
|
||||||
@ -134,8 +135,8 @@ private:
|
|||||||
DownChannelizer* m_channelizer;
|
DownChannelizer* m_channelizer;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
|
||||||
DaemonSinkSettings m_settings;
|
RemoteSinkSettings m_settings;
|
||||||
DaemonSinkThread *m_sinkThread;
|
RemoteSinkThread *m_sinkThread;
|
||||||
|
|
||||||
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
|
||||||
@ -154,12 +155,12 @@ private:
|
|||||||
QNetworkAccessManager *m_networkManager;
|
QNetworkAccessManager *m_networkManager;
|
||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
|
||||||
void applySettings(const DaemonSinkSettings& settings, bool force = false);
|
void applySettings(const RemoteSinkSettings& settings, bool force = false);
|
||||||
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const DaemonSinkSettings& settings);
|
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const RemoteSinkSettings& settings);
|
||||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DaemonSinkSettings& settings, bool force);
|
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const RemoteSinkSettings& settings, bool force);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INCLUDE_DAEMONSINK_H_ */
|
#endif /* INCLUDE_REMOTESINK_H_ */
|
@ -9,7 +9,7 @@ CONFIG += plugin
|
|||||||
|
|
||||||
QT += core gui widgets multimedia network opengl
|
QT += core gui widgets multimedia network opengl
|
||||||
|
|
||||||
TARGET = daemonsink
|
TARGET = remotesink
|
||||||
|
|
||||||
CONFIG(MINGW32):LIBCM256CCSRC = "C:\softs\cm256cc"
|
CONFIG(MINGW32):LIBCM256CCSRC = "C:\softs\cm256cc"
|
||||||
CONFIG(MSVC):LIBCM256CCSRC = "C:\softs\cm256cc"
|
CONFIG(MSVC):LIBCM256CCSRC = "C:\softs\cm256cc"
|
||||||
@ -38,19 +38,19 @@ CONFIG(MINGW32):INCLUDEPATH += "C:\softs\boost_1_66_0"
|
|||||||
CONFIG(MSVC):INCLUDEPATH += "C:\softs\boost_1_66_0"
|
CONFIG(MSVC):INCLUDEPATH += "C:\softs\boost_1_66_0"
|
||||||
CONFIG(macx):INCLUDEPATH += "../../../boost_1_69_0"
|
CONFIG(macx):INCLUDEPATH += "../../../boost_1_69_0"
|
||||||
|
|
||||||
SOURCES += daemonsink.cpp\
|
SOURCES += remotesink.cpp\
|
||||||
daemonsinkgui.cpp\
|
remotesinkgui.cpp\
|
||||||
daemonsinksettings.cpp\
|
remotesinksettings.cpp\
|
||||||
daemonsinkplugin.cpp\
|
remotesinkplugin.cpp\
|
||||||
daemonsinkthread.cpp
|
remotesinkthread.cpp
|
||||||
|
|
||||||
HEADERS += daemonsink.h\
|
HEADERS += remotesink.h\
|
||||||
daemonsinkgui.h\
|
remotesinkgui.h\
|
||||||
daemonsinksettings.h\
|
remotesinksettings.h\
|
||||||
daemonsinkplugin.h\
|
remotesinkplugin.h\
|
||||||
daemonsinkthread.h
|
remotesinkthread.h
|
||||||
|
|
||||||
FORMS += daemonsinkgui.ui
|
FORMS += remotesinkgui.ui
|
||||||
|
|
||||||
LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
|
LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
|
||||||
LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui
|
LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui
|
@ -14,58 +14,59 @@
|
|||||||
// 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 "remotesinkgui.h"
|
||||||
|
|
||||||
#include "device/devicesourceapi.h"
|
#include "device/devicesourceapi.h"
|
||||||
#include "device/deviceuiset.h"
|
#include "device/deviceuiset.h"
|
||||||
#include "gui/basicchannelsettingsdialog.h"
|
#include "gui/basicchannelsettingsdialog.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
#include "daemonsink.h"
|
#include "remotesink.h"
|
||||||
#include "ui_daemonsinkgui.h"
|
#include "ui_remotesinkgui.h"
|
||||||
#include "daemonsinkgui.h"
|
|
||||||
|
|
||||||
DaemonSinkGUI* DaemonSinkGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *channelRx)
|
RemoteSinkGUI* RemoteSinkGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *channelRx)
|
||||||
{
|
{
|
||||||
DaemonSinkGUI* gui = new DaemonSinkGUI(pluginAPI, deviceUISet, channelRx);
|
RemoteSinkGUI* gui = new RemoteSinkGUI(pluginAPI, deviceUISet, channelRx);
|
||||||
return gui;
|
return gui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::destroy()
|
void RemoteSinkGUI::destroy()
|
||||||
{
|
{
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::setName(const QString& name)
|
void RemoteSinkGUI::setName(const QString& name)
|
||||||
{
|
{
|
||||||
setObjectName(name);
|
setObjectName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DaemonSinkGUI::getName() const
|
QString RemoteSinkGUI::getName() const
|
||||||
{
|
{
|
||||||
return objectName();
|
return objectName();
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 DaemonSinkGUI::getCenterFrequency() const {
|
qint64 RemoteSinkGUI::getCenterFrequency() const {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::setCenterFrequency(qint64 centerFrequency)
|
void RemoteSinkGUI::setCenterFrequency(qint64 centerFrequency)
|
||||||
{
|
{
|
||||||
(void) centerFrequency;
|
(void) centerFrequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::resetToDefaults()
|
void RemoteSinkGUI::resetToDefaults()
|
||||||
{
|
{
|
||||||
m_settings.resetToDefaults();
|
m_settings.resetToDefaults();
|
||||||
displaySettings();
|
displaySettings();
|
||||||
applySettings(true);
|
applySettings(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray DaemonSinkGUI::serialize() const
|
QByteArray RemoteSinkGUI::serialize() const
|
||||||
{
|
{
|
||||||
return m_settings.serialize();
|
return m_settings.serialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DaemonSinkGUI::deserialize(const QByteArray& data)
|
bool RemoteSinkGUI::deserialize(const QByteArray& data)
|
||||||
{
|
{
|
||||||
if(m_settings.deserialize(data)) {
|
if(m_settings.deserialize(data)) {
|
||||||
displaySettings();
|
displaySettings();
|
||||||
@ -77,19 +78,19 @@ bool DaemonSinkGUI::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DaemonSinkGUI::handleMessage(const Message& message)
|
bool RemoteSinkGUI::handleMessage(const Message& message)
|
||||||
{
|
{
|
||||||
if (DaemonSink::MsgSampleRateNotification::match(message))
|
if (RemoteSink::MsgSampleRateNotification::match(message))
|
||||||
{
|
{
|
||||||
DaemonSink::MsgSampleRateNotification& notif = (DaemonSink::MsgSampleRateNotification&) message;
|
RemoteSink::MsgSampleRateNotification& notif = (RemoteSink::MsgSampleRateNotification&) message;
|
||||||
m_channelMarker.setBandwidth(notif.getSampleRate());
|
m_channelMarker.setBandwidth(notif.getSampleRate());
|
||||||
m_sampleRate = notif.getSampleRate();
|
m_sampleRate = notif.getSampleRate();
|
||||||
updateTxDelayTime();
|
updateTxDelayTime();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (DaemonSink::MsgConfigureDaemonSink::match(message))
|
else if (RemoteSink::MsgConfigureRemoteSink::match(message))
|
||||||
{
|
{
|
||||||
const DaemonSink::MsgConfigureDaemonSink& cfg = (DaemonSink::MsgConfigureDaemonSink&) message;
|
const RemoteSink::MsgConfigureRemoteSink& cfg = (RemoteSink::MsgConfigureRemoteSink&) message;
|
||||||
m_settings = cfg.getSettings();
|
m_settings = cfg.getSettings();
|
||||||
blockApplySettings(true);
|
blockApplySettings(true);
|
||||||
displaySettings();
|
displaySettings();
|
||||||
@ -102,9 +103,9 @@ bool DaemonSinkGUI::handleMessage(const Message& message)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DaemonSinkGUI::DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *channelrx, QWidget* parent) :
|
RemoteSinkGUI::RemoteSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *channelrx, QWidget* parent) :
|
||||||
RollupWidget(parent),
|
RollupWidget(parent),
|
||||||
ui(new Ui::DaemonSinkGUI),
|
ui(new Ui::RemoteSinkGUI),
|
||||||
m_pluginAPI(pluginAPI),
|
m_pluginAPI(pluginAPI),
|
||||||
m_deviceUISet(deviceUISet),
|
m_deviceUISet(deviceUISet),
|
||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
@ -115,19 +116,19 @@ DaemonSinkGUI::DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas
|
|||||||
connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
|
connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
|
||||||
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
|
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
|
||||||
|
|
||||||
m_daemonSink = (DaemonSink*) channelrx;
|
m_remoteSink = (RemoteSink*) channelrx;
|
||||||
m_daemonSink->setMessageQueueToGUI(getInputMessageQueue());
|
m_remoteSink->setMessageQueueToGUI(getInputMessageQueue());
|
||||||
|
|
||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setColor(m_settings.m_rgbColor);
|
m_channelMarker.setColor(m_settings.m_rgbColor);
|
||||||
m_channelMarker.setCenterFrequency(0);
|
m_channelMarker.setCenterFrequency(0);
|
||||||
m_channelMarker.setTitle("Daemon source");
|
m_channelMarker.setTitle("Remote source");
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
m_channelMarker.setVisible(true); // activate signal on the last setting only
|
m_channelMarker.setVisible(true); // activate signal on the last setting only
|
||||||
|
|
||||||
m_settings.setChannelMarker(&m_channelMarker);
|
m_settings.setChannelMarker(&m_channelMarker);
|
||||||
|
|
||||||
m_deviceUISet->registerRxChannelInstance(DaemonSink::m_channelIdURI, this);
|
m_deviceUISet->registerRxChannelInstance(RemoteSink::m_channelIdURI, this);
|
||||||
m_deviceUISet->addChannelMarker(&m_channelMarker);
|
m_deviceUISet->addChannelMarker(&m_channelMarker);
|
||||||
m_deviceUISet->addRollupWidget(this);
|
m_deviceUISet->addRollupWidget(this);
|
||||||
|
|
||||||
@ -140,29 +141,29 @@ DaemonSinkGUI::DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas
|
|||||||
applySettings(true);
|
applySettings(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
DaemonSinkGUI::~DaemonSinkGUI()
|
RemoteSinkGUI::~RemoteSinkGUI()
|
||||||
{
|
{
|
||||||
m_deviceUISet->removeRxChannelInstance(this);
|
m_deviceUISet->removeRxChannelInstance(this);
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::blockApplySettings(bool block)
|
void RemoteSinkGUI::blockApplySettings(bool block)
|
||||||
{
|
{
|
||||||
m_doApplySettings = !block;
|
m_doApplySettings = !block;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::applySettings(bool force)
|
void RemoteSinkGUI::applySettings(bool force)
|
||||||
{
|
{
|
||||||
if (m_doApplySettings)
|
if (m_doApplySettings)
|
||||||
{
|
{
|
||||||
setTitleColor(m_channelMarker.getColor());
|
setTitleColor(m_channelMarker.getColor());
|
||||||
|
|
||||||
DaemonSink::MsgConfigureDaemonSink* message = DaemonSink::MsgConfigureDaemonSink::create(m_settings, force);
|
RemoteSink::MsgConfigureRemoteSink* message = RemoteSink::MsgConfigureRemoteSink::create(m_settings, force);
|
||||||
m_daemonSink->getInputMessageQueue()->push(message);
|
m_remoteSink->getInputMessageQueue()->push(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::displaySettings()
|
void RemoteSinkGUI::displaySettings()
|
||||||
{
|
{
|
||||||
m_channelMarker.blockSignals(true);
|
m_channelMarker.blockSignals(true);
|
||||||
m_channelMarker.setCenterFrequency(0);
|
m_channelMarker.setCenterFrequency(0);
|
||||||
@ -186,17 +187,17 @@ void DaemonSinkGUI::displaySettings()
|
|||||||
blockApplySettings(false);
|
blockApplySettings(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::leaveEvent(QEvent*)
|
void RemoteSinkGUI::leaveEvent(QEvent*)
|
||||||
{
|
{
|
||||||
m_channelMarker.setHighlighted(false);
|
m_channelMarker.setHighlighted(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::enterEvent(QEvent*)
|
void RemoteSinkGUI::enterEvent(QEvent*)
|
||||||
{
|
{
|
||||||
m_channelMarker.setHighlighted(true);
|
m_channelMarker.setHighlighted(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::handleSourceMessages()
|
void RemoteSinkGUI::handleSourceMessages()
|
||||||
{
|
{
|
||||||
Message* message;
|
Message* message;
|
||||||
|
|
||||||
@ -209,13 +210,13 @@ void DaemonSinkGUI::handleSourceMessages()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
void RemoteSinkGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||||
{
|
{
|
||||||
(void) widget;
|
(void) widget;
|
||||||
(void) rollDown;
|
(void) rollDown;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::onMenuDialogCalled(const QPoint &p)
|
void RemoteSinkGUI::onMenuDialogCalled(const QPoint &p)
|
||||||
{
|
{
|
||||||
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
|
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
|
||||||
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
|
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
|
||||||
@ -241,13 +242,13 @@ void DaemonSinkGUI::onMenuDialogCalled(const QPoint &p)
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::on_dataAddress_returnPressed()
|
void RemoteSinkGUI::on_dataAddress_returnPressed()
|
||||||
{
|
{
|
||||||
m_settings.m_dataAddress = ui->dataAddress->text();
|
m_settings.m_dataAddress = ui->dataAddress->text();
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::on_dataPort_returnPressed()
|
void RemoteSinkGUI::on_dataPort_returnPressed()
|
||||||
{
|
{
|
||||||
bool dataOk;
|
bool dataOk;
|
||||||
int dataPort = ui->dataPort->text().toInt(&dataOk);
|
int dataPort = ui->dataPort->text().toInt(&dataOk);
|
||||||
@ -264,7 +265,7 @@ void DaemonSinkGUI::on_dataPort_returnPressed()
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::on_dataApplyButton_clicked(bool checked)
|
void RemoteSinkGUI::on_dataApplyButton_clicked(bool checked)
|
||||||
{
|
{
|
||||||
(void) checked;
|
(void) checked;
|
||||||
m_settings.m_dataAddress = ui->dataAddress->text();
|
m_settings.m_dataAddress = ui->dataAddress->text();
|
||||||
@ -280,7 +281,7 @@ void DaemonSinkGUI::on_dataApplyButton_clicked(bool checked)
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::on_txDelay_valueChanged(int value)
|
void RemoteSinkGUI::on_txDelay_valueChanged(int value)
|
||||||
{
|
{
|
||||||
m_settings.m_txDelay = value; // percentage
|
m_settings.m_txDelay = value; // percentage
|
||||||
ui->txDelayText->setText(tr("%1%").arg(value));
|
ui->txDelayText->setText(tr("%1%").arg(value));
|
||||||
@ -288,7 +289,7 @@ void DaemonSinkGUI::on_txDelay_valueChanged(int value)
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::on_nbFECBlocks_valueChanged(int value)
|
void RemoteSinkGUI::on_nbFECBlocks_valueChanged(int value)
|
||||||
{
|
{
|
||||||
m_settings.m_nbFECBlocks = value;
|
m_settings.m_nbFECBlocks = value;
|
||||||
int nbOriginalBlocks = 128;
|
int nbOriginalBlocks = 128;
|
||||||
@ -300,7 +301,7 @@ void DaemonSinkGUI::on_nbFECBlocks_valueChanged(int value)
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::updateTxDelayTime()
|
void RemoteSinkGUI::updateTxDelayTime()
|
||||||
{
|
{
|
||||||
double txDelayRatio = m_settings.m_txDelay / 100.0;
|
double txDelayRatio = m_settings.m_txDelay / 100.0;
|
||||||
int samplesPerBlock = SDRDaemonNbBytesPerBlock / sizeof(Sample);
|
int samplesPerBlock = SDRDaemonNbBytesPerBlock / sizeof(Sample);
|
||||||
@ -309,7 +310,7 @@ void DaemonSinkGUI::updateTxDelayTime()
|
|||||||
ui->txDelayTime->setText(tr("%1µs").arg(QString::number(delay*1e6, 'f', 0)));
|
ui->txDelayTime->setText(tr("%1µs").arg(QString::number(delay*1e6, 'f', 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkGUI::tick()
|
void RemoteSinkGUI::tick()
|
||||||
{
|
{
|
||||||
if (++m_tickCount == 20) { // once per second
|
if (++m_tickCount == 20) { // once per second
|
||||||
m_tickCount = 0;
|
m_tickCount = 0;
|
@ -14,8 +14,8 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_
|
#ifndef PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_
|
||||||
#define PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_
|
#define PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -27,21 +27,21 @@
|
|||||||
#include "gui/rollupwidget.h"
|
#include "gui/rollupwidget.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
#include "daemonsinksettings.h"
|
#include "remotesinksettings.h"
|
||||||
|
|
||||||
class PluginAPI;
|
class PluginAPI;
|
||||||
class DeviceUISet;
|
class DeviceUISet;
|
||||||
class DaemonSink;
|
class RemoteSink;
|
||||||
class BasebandSampleSink;
|
class BasebandSampleSink;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class DaemonSinkGUI;
|
class RemoteSinkGUI;
|
||||||
}
|
}
|
||||||
|
|
||||||
class DaemonSinkGUI : public RollupWidget, public PluginInstanceGUI {
|
class RemoteSinkGUI : public RollupWidget, public PluginInstanceGUI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static DaemonSinkGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel);
|
static RemoteSinkGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel);
|
||||||
virtual void destroy();
|
virtual void destroy();
|
||||||
|
|
||||||
void setName(const QString& name);
|
void setName(const QString& name);
|
||||||
@ -56,23 +56,23 @@ public:
|
|||||||
virtual bool handleMessage(const Message& message);
|
virtual bool handleMessage(const Message& message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::DaemonSinkGUI* ui;
|
Ui::RemoteSinkGUI* ui;
|
||||||
PluginAPI* m_pluginAPI;
|
PluginAPI* m_pluginAPI;
|
||||||
DeviceUISet* m_deviceUISet;
|
DeviceUISet* m_deviceUISet;
|
||||||
ChannelMarker m_channelMarker;
|
ChannelMarker m_channelMarker;
|
||||||
DaemonSinkSettings m_settings;
|
RemoteSinkSettings m_settings;
|
||||||
int m_sampleRate;
|
int m_sampleRate;
|
||||||
quint64 m_deviceCenterFrequency; //!< Center frequency in device
|
quint64 m_deviceCenterFrequency; //!< Center frequency in device
|
||||||
bool m_doApplySettings;
|
bool m_doApplySettings;
|
||||||
|
|
||||||
DaemonSink* m_daemonSink;
|
RemoteSink* m_remoteSink;
|
||||||
MessageQueue m_inputMessageQueue;
|
MessageQueue m_inputMessageQueue;
|
||||||
|
|
||||||
QTime m_time;
|
QTime m_time;
|
||||||
uint32_t m_tickCount;
|
uint32_t m_tickCount;
|
||||||
|
|
||||||
explicit DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
explicit RemoteSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
||||||
virtual ~DaemonSinkGUI();
|
virtual ~RemoteSinkGUI();
|
||||||
|
|
||||||
void blockApplySettings(bool block);
|
void blockApplySettings(bool block);
|
||||||
void applySettings(bool force = false);
|
void applySettings(bool force = false);
|
||||||
@ -96,4 +96,4 @@ private slots:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_ */
|
#endif /* PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_ */
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>DaemonSinkGUI</class>
|
<class>RemoteSinkGUI</class>
|
||||||
<widget class="RollupWidget" name="DaemonSinkGUI">
|
<widget class="RollupWidget" name="RemoteSinkGUI">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Daemon sink</string>
|
<string>Remote sink</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="settingsContainer" native="true">
|
<widget class="QWidget" name="settingsContainer" native="true">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
|
// Copyright (C) 2016-2019 Edouard Griffiths, F4EXB //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -14,66 +14,66 @@
|
|||||||
// 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 "daemonsinkplugin.h"
|
#include "remotesinkplugin.h"
|
||||||
|
|
||||||
#include <QtPlugin>
|
#include <QtPlugin>
|
||||||
#include "plugin/pluginapi.h"
|
#include "plugin/pluginapi.h"
|
||||||
|
|
||||||
#ifndef SERVER_MODE
|
#ifndef SERVER_MODE
|
||||||
#include "daemonsinkgui.h"
|
#include "remotesinkgui.h"
|
||||||
#endif
|
#endif
|
||||||
#include "daemonsink.h"
|
#include "remotesink.h"
|
||||||
|
|
||||||
const PluginDescriptor DaemonSinkPlugin::m_pluginDescriptor = {
|
const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = {
|
||||||
QString("Daemon channel Sink"),
|
QString("Remote channel Sink"),
|
||||||
QString("4.3.2"),
|
QString("4.4.2"),
|
||||||
QString("(c) Edouard Griffiths, F4EXB"),
|
QString("(c) Edouard Griffiths, F4EXB"),
|
||||||
QString("https://github.com/f4exb/sdrangel"),
|
QString("https://github.com/f4exb/sdrangel"),
|
||||||
true,
|
true,
|
||||||
QString("https://github.com/f4exb/sdrangel")
|
QString("https://github.com/f4exb/sdrangel")
|
||||||
};
|
};
|
||||||
|
|
||||||
DaemonSinkPlugin::DaemonSinkPlugin(QObject* parent) :
|
RemoteSinkPlugin::RemoteSinkPlugin(QObject* parent) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
m_pluginAPI(0)
|
m_pluginAPI(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const PluginDescriptor& DaemonSinkPlugin::getPluginDescriptor() const
|
const PluginDescriptor& RemoteSinkPlugin::getPluginDescriptor() const
|
||||||
{
|
{
|
||||||
return m_pluginDescriptor;
|
return m_pluginDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkPlugin::initPlugin(PluginAPI* pluginAPI)
|
void RemoteSinkPlugin::initPlugin(PluginAPI* pluginAPI)
|
||||||
{
|
{
|
||||||
m_pluginAPI = pluginAPI;
|
m_pluginAPI = pluginAPI;
|
||||||
|
|
||||||
// register channel Source
|
// register channel Source
|
||||||
m_pluginAPI->registerRxChannel(DaemonSink::m_channelIdURI, DaemonSink::m_channelId, this);
|
m_pluginAPI->registerRxChannel(RemoteSink::m_channelIdURI, RemoteSink::m_channelId, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SERVER_MODE
|
#ifdef SERVER_MODE
|
||||||
PluginInstanceGUI* DaemonSinkPlugin::createRxChannelGUI(
|
PluginInstanceGUI* RemoteSinkPlugin::createRxChannelGUI(
|
||||||
DeviceUISet *deviceUISet __attribute__((unused)),
|
DeviceUISet *deviceUISet __attribute__((unused)),
|
||||||
BasebandSampleSink *rxChannel __attribute__((unused)))
|
BasebandSampleSink *rxChannel __attribute__((unused)))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
PluginInstanceGUI* DaemonSinkPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
|
PluginInstanceGUI* RemoteSinkPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
|
||||||
{
|
{
|
||||||
return DaemonSinkGUI::create(m_pluginAPI, deviceUISet, rxChannel);
|
return RemoteSinkGUI::create(m_pluginAPI, deviceUISet, rxChannel);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BasebandSampleSink* DaemonSinkPlugin::createRxChannelBS(DeviceSourceAPI *deviceAPI)
|
BasebandSampleSink* RemoteSinkPlugin::createRxChannelBS(DeviceSourceAPI *deviceAPI)
|
||||||
{
|
{
|
||||||
return new DaemonSink(deviceAPI);
|
return new RemoteSink(deviceAPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelSinkAPI* DaemonSinkPlugin::createRxChannelCS(DeviceSourceAPI *deviceAPI)
|
ChannelSinkAPI* RemoteSinkPlugin::createRxChannelCS(DeviceSourceAPI *deviceAPI)
|
||||||
{
|
{
|
||||||
return new DaemonSink(deviceAPI);
|
return new RemoteSink(deviceAPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
|
// Copyright (C) 2016-2019 Edouard Griffiths, F4EXB //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -14,8 +14,8 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_
|
#ifndef PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_
|
||||||
#define PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_
|
#define PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_
|
||||||
|
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
@ -24,13 +24,13 @@
|
|||||||
class DeviceUISet;
|
class DeviceUISet;
|
||||||
class BasebandSampleSink;
|
class BasebandSampleSink;
|
||||||
|
|
||||||
class DaemonSinkPlugin : public QObject, PluginInterface {
|
class RemoteSinkPlugin : public QObject, PluginInterface {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_INTERFACES(PluginInterface)
|
Q_INTERFACES(PluginInterface)
|
||||||
Q_PLUGIN_METADATA(IID "sdrangel.demod.daemonsink")
|
Q_PLUGIN_METADATA(IID "sdrangel.demod.remotesink")
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DaemonSinkPlugin(QObject* parent = 0);
|
explicit RemoteSinkPlugin(QObject* parent = 0);
|
||||||
|
|
||||||
const PluginDescriptor& getPluginDescriptor() const;
|
const PluginDescriptor& getPluginDescriptor() const;
|
||||||
void initPlugin(PluginAPI* pluginAPI);
|
void initPlugin(PluginAPI* pluginAPI);
|
||||||
@ -45,4 +45,4 @@ private:
|
|||||||
PluginAPI* m_pluginAPI;
|
PluginAPI* m_pluginAPI;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_ */
|
#endif /* PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_ */
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) main settings //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,25 +20,27 @@
|
|||||||
// 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 "remotesinksettings.h"
|
||||||
|
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
|
||||||
#include "util/simpleserializer.h"
|
#include "util/simpleserializer.h"
|
||||||
#include "settings/serializable.h"
|
#include "settings/serializable.h"
|
||||||
#include "daemonsinksettings.h"
|
|
||||||
|
|
||||||
DaemonSinkSettings::DaemonSinkSettings()
|
|
||||||
|
RemoteSinkSettings::RemoteSinkSettings()
|
||||||
{
|
{
|
||||||
resetToDefaults();
|
resetToDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkSettings::resetToDefaults()
|
void RemoteSinkSettings::resetToDefaults()
|
||||||
{
|
{
|
||||||
m_nbFECBlocks = 0;
|
m_nbFECBlocks = 0;
|
||||||
m_txDelay = 35;
|
m_txDelay = 35;
|
||||||
m_dataAddress = "127.0.0.1";
|
m_dataAddress = "127.0.0.1";
|
||||||
m_dataPort = 9090;
|
m_dataPort = 9090;
|
||||||
m_rgbColor = QColor(140, 4, 4).rgb();
|
m_rgbColor = QColor(140, 4, 4).rgb();
|
||||||
m_title = "Daemon sink";
|
m_title = "Remote sink";
|
||||||
m_channelMarker = nullptr;
|
m_channelMarker = nullptr;
|
||||||
m_useReverseAPI = false;
|
m_useReverseAPI = false;
|
||||||
m_reverseAPIAddress = "127.0.0.1";
|
m_reverseAPIAddress = "127.0.0.1";
|
||||||
@ -47,7 +49,7 @@ void DaemonSinkSettings::resetToDefaults()
|
|||||||
m_reverseAPIChannelIndex = 0;
|
m_reverseAPIChannelIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray DaemonSinkSettings::serialize() const
|
QByteArray RemoteSinkSettings::serialize() const
|
||||||
{
|
{
|
||||||
SimpleSerializer s(1);
|
SimpleSerializer s(1);
|
||||||
s.writeU32(1, m_nbFECBlocks);
|
s.writeU32(1, m_nbFECBlocks);
|
||||||
@ -65,7 +67,7 @@ QByteArray DaemonSinkSettings::serialize() const
|
|||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DaemonSinkSettings::deserialize(const QByteArray& data)
|
bool RemoteSinkSettings::deserialize(const QByteArray& data)
|
||||||
{
|
{
|
||||||
SimpleDeserializer d(data);
|
SimpleDeserializer d(data);
|
||||||
|
|
||||||
@ -99,7 +101,7 @@ bool DaemonSinkSettings::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
d.readU32(5, &m_rgbColor, QColor(0, 255, 255).rgb());
|
d.readU32(5, &m_rgbColor, QColor(0, 255, 255).rgb());
|
||||||
d.readString(6, &m_title, "Daemon sink");
|
d.readString(6, &m_title, "Remote sink");
|
||||||
d.readBool(7, &m_useReverseAPI, false);
|
d.readBool(7, &m_useReverseAPI, false);
|
||||||
d.readString(8, &m_reverseAPIAddress, "127.0.0.1");
|
d.readString(8, &m_reverseAPIAddress, "127.0.0.1");
|
||||||
d.readU32(9, &tmp, 0);
|
d.readU32(9, &tmp, 0);
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018-2019 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) main settings //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,14 +20,15 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifndef INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_
|
#ifndef INCLUDE_REMOTECHANNELSINKSETTINGS_H_
|
||||||
#define INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_
|
#define INCLUDE_REMOTECHANNELSINKSETTINGS_H_
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
class Serializable;
|
class Serializable;
|
||||||
|
|
||||||
struct DaemonSinkSettings
|
struct RemoteSinkSettings
|
||||||
{
|
{
|
||||||
uint16_t m_nbFECBlocks;
|
uint16_t m_nbFECBlocks;
|
||||||
uint32_t m_txDelay;
|
uint32_t m_txDelay;
|
||||||
@ -43,11 +44,11 @@ struct DaemonSinkSettings
|
|||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
|
|
||||||
DaemonSinkSettings();
|
RemoteSinkSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
|
||||||
QByteArray serialize() const;
|
QByteArray serialize() const;
|
||||||
bool deserialize(const QByteArray& data);
|
bool deserialize(const QByteArray& data);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_ */
|
#endif /* INCLUDE_REMOTECHANNELSINKSETTINGS_H_ */
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018-2019 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) UDP sender thread //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,16 +20,16 @@
|
|||||||
// 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 "remotesinkthread.h"
|
||||||
|
|
||||||
#include <QUdpSocket>
|
#include <QUdpSocket>
|
||||||
|
|
||||||
#include "channel/sdrdaemondatablock.h"
|
#include "channel/sdrdaemondatablock.h"
|
||||||
#include "daemonsinkthread.h"
|
|
||||||
|
|
||||||
#include "cm256.h"
|
#include "cm256.h"
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(DaemonSinkThread::MsgStartStop, Message)
|
MESSAGE_CLASS_DEFINITION(RemoteSinkThread::MsgStartStop, Message)
|
||||||
|
|
||||||
DaemonSinkThread::DaemonSinkThread(QObject* parent) :
|
RemoteSinkThread::RemoteSinkThread(QObject* parent) :
|
||||||
QThread(parent),
|
QThread(parent),
|
||||||
m_running(false),
|
m_running(false),
|
||||||
m_address(QHostAddress::LocalHost),
|
m_address(QHostAddress::LocalHost),
|
||||||
@ -40,20 +40,20 @@ DaemonSinkThread::DaemonSinkThread(QObject* parent) :
|
|||||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
DaemonSinkThread::~DaemonSinkThread()
|
RemoteSinkThread::~RemoteSinkThread()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSinkThread::~DaemonSinkThread");
|
qDebug("RemoteSinkThread::~RemoteSinkThread");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::startStop(bool start)
|
void RemoteSinkThread::startStop(bool start)
|
||||||
{
|
{
|
||||||
MsgStartStop *msg = MsgStartStop::create(start);
|
MsgStartStop *msg = MsgStartStop::create(start);
|
||||||
m_inputMessageQueue.push(msg);
|
m_inputMessageQueue.push(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::startWork()
|
void RemoteSinkThread::startWork()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSinkThread::startWork");
|
qDebug("RemoteSinkThread::startWork");
|
||||||
m_startWaitMutex.lock();
|
m_startWaitMutex.lock();
|
||||||
m_socket = new QUdpSocket(this);
|
m_socket = new QUdpSocket(this);
|
||||||
start();
|
start();
|
||||||
@ -62,18 +62,18 @@ void DaemonSinkThread::startWork()
|
|||||||
m_startWaitMutex.unlock();
|
m_startWaitMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::stopWork()
|
void RemoteSinkThread::stopWork()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSinkThread::stopWork");
|
qDebug("RemoteSinkThread::stopWork");
|
||||||
delete m_socket;
|
delete m_socket;
|
||||||
m_socket = 0;
|
m_socket = 0;
|
||||||
m_running = false;
|
m_running = false;
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::run()
|
void RemoteSinkThread::run()
|
||||||
{
|
{
|
||||||
qDebug("DaemonSinkThread::run: begin");
|
qDebug("RemoteSinkThread::run: begin");
|
||||||
m_running = true;
|
m_running = true;
|
||||||
m_startWaiter.wakeAll();
|
m_startWaiter.wakeAll();
|
||||||
|
|
||||||
@ -83,16 +83,16 @@ void DaemonSinkThread::run()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_running = false;
|
m_running = false;
|
||||||
qDebug("DaemonSinkThread::run: end");
|
qDebug("RemoteSinkThread::run: end");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::processDataBlock(SDRDaemonDataBlock *dataBlock)
|
void RemoteSinkThread::processDataBlock(SDRDaemonDataBlock *dataBlock)
|
||||||
{
|
{
|
||||||
handleDataBlock(*dataBlock);
|
handleDataBlock(*dataBlock);
|
||||||
delete dataBlock;
|
delete dataBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
|
void RemoteSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
|
||||||
{
|
{
|
||||||
CM256::cm256_encoder_params cm256Params; //!< Main interface with CM256 encoder
|
CM256::cm256_encoder_params cm256Params; //!< Main interface with CM256 encoder
|
||||||
CM256::cm256_block descriptorBlocks[256]; //!< Pointers to data for CM256 encoder
|
CM256::cm256_block descriptorBlocks[256]; //!< Pointers to data for CM256 encoder
|
||||||
@ -141,7 +141,7 @@ void DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
|
|||||||
// Encode FEC blocks
|
// Encode FEC blocks
|
||||||
if (m_cm256p->cm256_encode(cm256Params, descriptorBlocks, fecBlocks))
|
if (m_cm256p->cm256_encode(cm256Params, descriptorBlocks, fecBlocks))
|
||||||
{
|
{
|
||||||
qWarning("SDRDaemonChannelSinkThread::handleDataBlock: CM256 encode failed. No transmission.");
|
qWarning("RemoteSinkThread::handleDataBlock: CM256 encode failed. No transmission.");
|
||||||
// TODO: send without FEC changing meta data to set indication of no FEC
|
// TODO: send without FEC changing meta data to set indication of no FEC
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ void DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
|
|||||||
dataBlock.m_txControlBlock.m_processed = true;
|
dataBlock.m_txControlBlock.m_processed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DaemonSinkThread::handleInputMessages()
|
void RemoteSinkThread::handleInputMessages()
|
||||||
{
|
{
|
||||||
Message* message;
|
Message* message;
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ void DaemonSinkThread::handleInputMessages()
|
|||||||
if (MsgStartStop::match(*message))
|
if (MsgStartStop::match(*message))
|
||||||
{
|
{
|
||||||
MsgStartStop* notif = (MsgStartStop*) message;
|
MsgStartStop* notif = (MsgStartStop*) message;
|
||||||
qDebug("DaemonSinkThread::handleInputMessages: MsgStartStop: %s", notif->getStartStop() ? "start" : "stop");
|
qDebug("RemoteSinkThread::handleInputMessages: MsgStartStop: %s", notif->getStartStop() ? "start" : "stop");
|
||||||
|
|
||||||
if (notif->getStartStop()) {
|
if (notif->getStartStop()) {
|
||||||
startWork();
|
startWork();
|
@ -1,11 +1,11 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
// Copyright (C) 2018-2019 Edouard Griffiths, F4EXB. //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon sink channel (Rx) UDP sender thread //
|
// Remote sink channel (Rx) UDP sender thread //
|
||||||
// //
|
// //
|
||||||
// SDRdaemon is a detached SDR front end that handles the interface with a //
|
// SDRangel can work as a detached SDR front end. With this plugin it can //
|
||||||
// physical device and sends or receives the I/Q samples stream to or from a //
|
// sends the I/Q samples stream to another SDRangel instance via UDP. //
|
||||||
// SDRangel instance via UDP. It is controlled via a Web REST API. //
|
// It is controlled via a Web REST API. //
|
||||||
// //
|
// //
|
||||||
// This program is free software; you can redistribute it and/or modify //
|
// 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 //
|
// it under the terms of the GNU General Public License as published by //
|
||||||
@ -20,6 +20,9 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKTHREAD_H_
|
||||||
|
#define PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKTHREAD_H_
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QWaitCondition>
|
#include <QWaitCondition>
|
||||||
@ -34,7 +37,7 @@ class SDRDaemonDataBlock;
|
|||||||
class CM256;
|
class CM256;
|
||||||
class QUdpSocket;
|
class QUdpSocket;
|
||||||
|
|
||||||
class DaemonSinkThread : public QThread {
|
class RemoteSinkThread : public QThread {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -57,8 +60,8 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
DaemonSinkThread(QObject* parent = 0);
|
RemoteSinkThread(QObject* parent = 0);
|
||||||
~DaemonSinkThread();
|
~RemoteSinkThread();
|
||||||
|
|
||||||
void startStop(bool start);
|
void startStop(bool start);
|
||||||
|
|
||||||
@ -87,3 +90,6 @@ private:
|
|||||||
private slots:
|
private slots:
|
||||||
void handleInputMessages();
|
void handleInputMessages();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKTHREAD_H_
|
||||||
|
|
@ -9,7 +9,7 @@ endif()
|
|||||||
|
|
||||||
find_package(CM256cc)
|
find_package(CM256cc)
|
||||||
if(CM256CC_FOUND)
|
if(CM256CC_FOUND)
|
||||||
add_subdirectory(daemonsink)
|
add_subdirectory(remotesink)
|
||||||
endif(CM256CC_FOUND)
|
endif(CM256CC_FOUND)
|
||||||
|
|
||||||
add_subdirectory(demodnfm)
|
add_subdirectory(demodnfm)
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
project(daemonsink)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
|
||||||
set(PLUGIN_PREFIX "../../../plugins/channelrx/daemonsink")
|
|
||||||
|
|
||||||
set(daemonsink_SOURCES
|
|
||||||
${PLUGIN_PREFIX}/daemonsink.cpp
|
|
||||||
${PLUGIN_PREFIX}/daemonsinksettings.cpp
|
|
||||||
${PLUGIN_PREFIX}/daemonsinkthread.cpp
|
|
||||||
${PLUGIN_PREFIX}/daemonsinkplugin.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(daemonsink_HEADERS
|
|
||||||
${PLUGIN_PREFIX}/daemonsink.h
|
|
||||||
${PLUGIN_PREFIX}/daemonsinksettings.h
|
|
||||||
${PLUGIN_PREFIX}/daemonsinkthread.h
|
|
||||||
${PLUGIN_PREFIX}/daemonsinkplugin.h
|
|
||||||
)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
.
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
${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)
|
|
||||||
|
|
||||||
add_library(daemonsinksrv SHARED
|
|
||||||
${daemonsink_SOURCES}
|
|
||||||
${daemonsink_HEADERS_MOC}
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(daemonsinksrv
|
|
||||||
${QT_LIBRARIES}
|
|
||||||
${CM256CC_LIBRARIES}
|
|
||||||
sdrbase
|
|
||||||
swagger
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(daemonsinksrv Qt5::Core)
|
|
||||||
|
|
||||||
install(TARGETS daemonsinksrv DESTINATION lib/pluginssrv/channelrx)
|
|
46
pluginssrv/channelrx/remotesink/CMakeLists.txt
Normal file
46
pluginssrv/channelrx/remotesink/CMakeLists.txt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
project(remotesink)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
set(PLUGIN_PREFIX "../../../plugins/channelrx/remotesink")
|
||||||
|
|
||||||
|
set(remotesink_SOURCES
|
||||||
|
${PLUGIN_PREFIX}/remotesink.cpp
|
||||||
|
${PLUGIN_PREFIX}/remotesinksettings.cpp
|
||||||
|
${PLUGIN_PREFIX}/remotesinkthread.cpp
|
||||||
|
${PLUGIN_PREFIX}/remotesinkplugin.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(remotesink_HEADERS
|
||||||
|
${PLUGIN_PREFIX}/remotesink.h
|
||||||
|
${PLUGIN_PREFIX}/remotesinksettings.h
|
||||||
|
${PLUGIN_PREFIX}/remotesinkthread.h
|
||||||
|
${PLUGIN_PREFIX}/remotesinkplugin.h
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
.
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
${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)
|
||||||
|
|
||||||
|
add_library(remotesinksrv SHARED
|
||||||
|
${remotesink_SOURCES}
|
||||||
|
${remotesink_HEADERS_MOC}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(remotesinksrv
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
${CM256CC_LIBRARIES}
|
||||||
|
sdrbase
|
||||||
|
swagger
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(remotesinksrv Qt5::Core)
|
||||||
|
|
||||||
|
install(TARGETS remotesinksrv DESTINATION lib/pluginssrv/channelrx)
|
@ -22,7 +22,7 @@
|
|||||||
<file>webapi/doc/swagger/include/Perseus.yaml</file>
|
<file>webapi/doc/swagger/include/Perseus.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/PlutoSdr.yaml</file>
|
<file>webapi/doc/swagger/include/PlutoSdr.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/RtlSdr.yaml</file>
|
<file>webapi/doc/swagger/include/RtlSdr.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/DaemonSink.yaml</file>
|
<file>webapi/doc/swagger/include/RemoteSink.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/DaemonSource.yaml</file>
|
<file>webapi/doc/swagger/include/DaemonSource.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/SDRDaemonSource.yaml</file>
|
<file>webapi/doc/swagger/include/SDRDaemonSource.yaml</file>
|
||||||
<file>webapi/doc/swagger/include/SDRDaemonSink.yaml</file>
|
<file>webapi/doc/swagger/include/SDRDaemonSink.yaml</file>
|
||||||
|
@ -1813,8 +1813,8 @@ margin-bottom: 20px;
|
|||||||
"NFMModSettings" : {
|
"NFMModSettings" : {
|
||||||
"$ref" : "#/definitions/NFMModSettings"
|
"$ref" : "#/definitions/NFMModSettings"
|
||||||
},
|
},
|
||||||
"DaemonSinkSettings" : {
|
"RemoteSinkSettings" : {
|
||||||
"$ref" : "#/definitions/DaemonSinkSettings"
|
"$ref" : "#/definitions/RemoteSinkSettings"
|
||||||
},
|
},
|
||||||
"DaemonSourceSettings" : {
|
"DaemonSourceSettings" : {
|
||||||
"$ref" : "#/definitions/DaemonSourceSettings"
|
"$ref" : "#/definitions/DaemonSourceSettings"
|
||||||
@ -2047,49 +2047,6 @@ margin-bottom: 20px;
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "DV serial device details"
|
"description" : "DV serial device details"
|
||||||
};
|
|
||||||
defs.DaemonSinkSettings = {
|
|
||||||
"properties" : {
|
|
||||||
"nbFECBlocks" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Number of FEC blocks per frame"
|
|
||||||
},
|
|
||||||
"dataAddress" : {
|
|
||||||
"type" : "string",
|
|
||||||
"description" : "Receiving USB data address"
|
|
||||||
},
|
|
||||||
"dataPort" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Receiving USB data port"
|
|
||||||
},
|
|
||||||
"txDelay" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Minimum delay in ms between consecutive USB blocks transmissions"
|
|
||||||
},
|
|
||||||
"rgbColor" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"title" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"useReverseAPI" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
|
||||||
},
|
|
||||||
"reverseAPIAddress" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"reverseAPIPort" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"reverseAPIDeviceIndex" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"reverseAPIChannelIndex" : {
|
|
||||||
"type" : "integer"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"description" : "Daemon channel sink settings"
|
|
||||||
};
|
};
|
||||||
defs.DaemonSourceReport = {
|
defs.DaemonSourceReport = {
|
||||||
"properties" : {
|
"properties" : {
|
||||||
@ -3844,6 +3801,49 @@ margin-bottom: 20px;
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "An arbitrary range of floating point values"
|
"description" : "An arbitrary range of floating point values"
|
||||||
|
};
|
||||||
|
defs.RemoteSinkSettings = {
|
||||||
|
"properties" : {
|
||||||
|
"nbFECBlocks" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Number of FEC blocks per frame"
|
||||||
|
},
|
||||||
|
"dataAddress" : {
|
||||||
|
"type" : "string",
|
||||||
|
"description" : "Receiving USB data address"
|
||||||
|
},
|
||||||
|
"dataPort" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Receiving USB data port"
|
||||||
|
},
|
||||||
|
"txDelay" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Minimum delay in ms between consecutive USB blocks transmissions"
|
||||||
|
},
|
||||||
|
"rgbColor" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"title" : {
|
||||||
|
"type" : "string"
|
||||||
|
},
|
||||||
|
"useReverseAPI" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
||||||
|
},
|
||||||
|
"reverseAPIAddress" : {
|
||||||
|
"type" : "string"
|
||||||
|
},
|
||||||
|
"reverseAPIPort" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"reverseAPIDeviceIndex" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"reverseAPIChannelIndex" : {
|
||||||
|
"type" : "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description" : "Remote channel sink settings"
|
||||||
};
|
};
|
||||||
defs.RtlSdrReport = {
|
defs.RtlSdrReport = {
|
||||||
"properties" : {
|
"properties" : {
|
||||||
@ -24373,7 +24373,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2019-01-14T08:33:10.665+01:00
|
Generated 2019-01-22T23:24:38.456+01:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
DaemonSinkSettings:
|
RemoteSinkSettings:
|
||||||
description: "Daemon channel sink settings"
|
description: "Remote channel sink settings"
|
||||||
properties:
|
properties:
|
||||||
nbFECBlocks:
|
nbFECBlocks:
|
||||||
description: "Number of FEC blocks per frame"
|
description: "Number of FEC blocks per frame"
|
@ -1888,8 +1888,8 @@ definitions:
|
|||||||
$ref: "/doc/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
|
$ref: "/doc/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
|
||||||
NFMModSettings:
|
NFMModSettings:
|
||||||
$ref: "/doc/swagger/include/NFMMod.yaml#/NFMModSettings"
|
$ref: "/doc/swagger/include/NFMMod.yaml#/NFMModSettings"
|
||||||
DaemonSinkSettings:
|
RemoteSinkSettings:
|
||||||
$ref: "/doc/swagger/include/DaemonSink.yaml#/DaemonSinkSettings"
|
$ref: "/doc/swagger/include/RemoteSink.yaml#/RemoteSinkSettings"
|
||||||
DaemonSourceSettings:
|
DaemonSourceSettings:
|
||||||
$ref: "/doc/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
|
$ref: "/doc/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
|
||||||
SSBModSettings:
|
SSBModSettings:
|
||||||
|
@ -2252,14 +2252,14 @@ bool WebAPIRequestMapper::validateChannelSettings(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (*channelType == "DaemonSink")
|
else if (*channelType == "RemoteSink")
|
||||||
{
|
{
|
||||||
if (channelSettings.getTx() == 0)
|
if (channelSettings.getTx() == 0)
|
||||||
{
|
{
|
||||||
QJsonObject daemonChannelSinkSettingsJsonObject = jsonObject["DaemonSinkSettings"].toObject();
|
QJsonObject remoteChannelSinkSettingsJsonObject = jsonObject["RemoteSinkSettings"].toObject();
|
||||||
channelSettingsKeys = daemonChannelSinkSettingsJsonObject.keys();
|
channelSettingsKeys = remoteChannelSinkSettingsJsonObject.keys();
|
||||||
channelSettings.setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
|
channelSettings.setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
|
||||||
channelSettings.getDaemonSinkSettings()->fromJsonObject(daemonChannelSinkSettingsJsonObject);
|
channelSettings.getRemoteSinkSettings()->fromJsonObject(remoteChannelSinkSettingsJsonObject);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -2518,7 +2518,7 @@ void WebAPIRequestMapper::resetChannelSettings(SWGSDRangel::SWGChannelSettings&
|
|||||||
channelSettings.setDsdDemodSettings(0);
|
channelSettings.setDsdDemodSettings(0);
|
||||||
channelSettings.setNfmDemodSettings(0);
|
channelSettings.setNfmDemodSettings(0);
|
||||||
channelSettings.setNfmModSettings(0);
|
channelSettings.setNfmModSettings(0);
|
||||||
channelSettings.setDaemonSinkSettings(0);
|
channelSettings.setRemoteSinkSettings(0);
|
||||||
channelSettings.setDaemonSourceSettings(0);
|
channelSettings.setDaemonSourceSettings(0);
|
||||||
channelSettings.setSsbDemodSettings(0);
|
channelSettings.setSsbDemodSettings(0);
|
||||||
channelSettings.setSsbModSettings(0);
|
channelSettings.setSsbModSettings(0);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
DaemonSinkSettings:
|
RemoteSinkSettings:
|
||||||
description: "Daemon channel sink settings"
|
description: "Remote channel sink settings"
|
||||||
properties:
|
properties:
|
||||||
nbFECBlocks:
|
nbFECBlocks:
|
||||||
description: "Number of FEC blocks per frame"
|
description: "Number of FEC blocks per frame"
|
@ -1888,8 +1888,8 @@ definitions:
|
|||||||
$ref: "http://localhost:8081/api/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
|
$ref: "http://localhost:8081/api/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
|
||||||
NFMModSettings:
|
NFMModSettings:
|
||||||
$ref: "http://localhost:8081/api/swagger/include/NFMMod.yaml#/NFMModSettings"
|
$ref: "http://localhost:8081/api/swagger/include/NFMMod.yaml#/NFMModSettings"
|
||||||
DaemonSinkSettings:
|
RemoteSinkSettings:
|
||||||
$ref: "http://localhost:8081/api/swagger/include/DaemonSink.yaml#/DaemonSinkSettings"
|
$ref: "http://localhost:8081/api/swagger/include/RemoteSink.yaml#/RemoteSinkSettings"
|
||||||
DaemonSourceSettings:
|
DaemonSourceSettings:
|
||||||
$ref: "http://localhost:8081/api/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
|
$ref: "http://localhost:8081/api/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
|
||||||
SSBModSettings:
|
SSBModSettings:
|
||||||
|
@ -1813,8 +1813,8 @@ margin-bottom: 20px;
|
|||||||
"NFMModSettings" : {
|
"NFMModSettings" : {
|
||||||
"$ref" : "#/definitions/NFMModSettings"
|
"$ref" : "#/definitions/NFMModSettings"
|
||||||
},
|
},
|
||||||
"DaemonSinkSettings" : {
|
"RemoteSinkSettings" : {
|
||||||
"$ref" : "#/definitions/DaemonSinkSettings"
|
"$ref" : "#/definitions/RemoteSinkSettings"
|
||||||
},
|
},
|
||||||
"DaemonSourceSettings" : {
|
"DaemonSourceSettings" : {
|
||||||
"$ref" : "#/definitions/DaemonSourceSettings"
|
"$ref" : "#/definitions/DaemonSourceSettings"
|
||||||
@ -2047,49 +2047,6 @@ margin-bottom: 20px;
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "DV serial device details"
|
"description" : "DV serial device details"
|
||||||
};
|
|
||||||
defs.DaemonSinkSettings = {
|
|
||||||
"properties" : {
|
|
||||||
"nbFECBlocks" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Number of FEC blocks per frame"
|
|
||||||
},
|
|
||||||
"dataAddress" : {
|
|
||||||
"type" : "string",
|
|
||||||
"description" : "Receiving USB data address"
|
|
||||||
},
|
|
||||||
"dataPort" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Receiving USB data port"
|
|
||||||
},
|
|
||||||
"txDelay" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Minimum delay in ms between consecutive USB blocks transmissions"
|
|
||||||
},
|
|
||||||
"rgbColor" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"title" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"useReverseAPI" : {
|
|
||||||
"type" : "integer",
|
|
||||||
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
|
||||||
},
|
|
||||||
"reverseAPIAddress" : {
|
|
||||||
"type" : "string"
|
|
||||||
},
|
|
||||||
"reverseAPIPort" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"reverseAPIDeviceIndex" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"reverseAPIChannelIndex" : {
|
|
||||||
"type" : "integer"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"description" : "Daemon channel sink settings"
|
|
||||||
};
|
};
|
||||||
defs.DaemonSourceReport = {
|
defs.DaemonSourceReport = {
|
||||||
"properties" : {
|
"properties" : {
|
||||||
@ -3844,6 +3801,49 @@ margin-bottom: 20px;
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description" : "An arbitrary range of floating point values"
|
"description" : "An arbitrary range of floating point values"
|
||||||
|
};
|
||||||
|
defs.RemoteSinkSettings = {
|
||||||
|
"properties" : {
|
||||||
|
"nbFECBlocks" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Number of FEC blocks per frame"
|
||||||
|
},
|
||||||
|
"dataAddress" : {
|
||||||
|
"type" : "string",
|
||||||
|
"description" : "Receiving USB data address"
|
||||||
|
},
|
||||||
|
"dataPort" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Receiving USB data port"
|
||||||
|
},
|
||||||
|
"txDelay" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Minimum delay in ms between consecutive USB blocks transmissions"
|
||||||
|
},
|
||||||
|
"rgbColor" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"title" : {
|
||||||
|
"type" : "string"
|
||||||
|
},
|
||||||
|
"useReverseAPI" : {
|
||||||
|
"type" : "integer",
|
||||||
|
"description" : "Synchronize with reverse API (1 for yes, 0 for no)"
|
||||||
|
},
|
||||||
|
"reverseAPIAddress" : {
|
||||||
|
"type" : "string"
|
||||||
|
},
|
||||||
|
"reverseAPIPort" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"reverseAPIDeviceIndex" : {
|
||||||
|
"type" : "integer"
|
||||||
|
},
|
||||||
|
"reverseAPIChannelIndex" : {
|
||||||
|
"type" : "integer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description" : "Remote channel sink settings"
|
||||||
};
|
};
|
||||||
defs.RtlSdrReport = {
|
defs.RtlSdrReport = {
|
||||||
"properties" : {
|
"properties" : {
|
||||||
@ -24373,7 +24373,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2019-01-14T08:33:10.665+01:00
|
Generated 2019-01-22T23:24:38.456+01:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -46,8 +46,8 @@ SWGChannelSettings::SWGChannelSettings() {
|
|||||||
m_nfm_demod_settings_isSet = false;
|
m_nfm_demod_settings_isSet = false;
|
||||||
nfm_mod_settings = nullptr;
|
nfm_mod_settings = nullptr;
|
||||||
m_nfm_mod_settings_isSet = false;
|
m_nfm_mod_settings_isSet = false;
|
||||||
daemon_sink_settings = nullptr;
|
remote_sink_settings = nullptr;
|
||||||
m_daemon_sink_settings_isSet = false;
|
m_remote_sink_settings_isSet = false;
|
||||||
daemon_source_settings = nullptr;
|
daemon_source_settings = nullptr;
|
||||||
m_daemon_source_settings_isSet = false;
|
m_daemon_source_settings_isSet = false;
|
||||||
ssb_mod_settings = nullptr;
|
ssb_mod_settings = nullptr;
|
||||||
@ -88,8 +88,8 @@ SWGChannelSettings::init() {
|
|||||||
m_nfm_demod_settings_isSet = false;
|
m_nfm_demod_settings_isSet = false;
|
||||||
nfm_mod_settings = new SWGNFMModSettings();
|
nfm_mod_settings = new SWGNFMModSettings();
|
||||||
m_nfm_mod_settings_isSet = false;
|
m_nfm_mod_settings_isSet = false;
|
||||||
daemon_sink_settings = new SWGDaemonSinkSettings();
|
remote_sink_settings = new SWGRemoteSinkSettings();
|
||||||
m_daemon_sink_settings_isSet = false;
|
m_remote_sink_settings_isSet = false;
|
||||||
daemon_source_settings = new SWGDaemonSourceSettings();
|
daemon_source_settings = new SWGDaemonSourceSettings();
|
||||||
m_daemon_source_settings_isSet = false;
|
m_daemon_source_settings_isSet = false;
|
||||||
ssb_mod_settings = new SWGSSBModSettings();
|
ssb_mod_settings = new SWGSSBModSettings();
|
||||||
@ -133,8 +133,8 @@ SWGChannelSettings::cleanup() {
|
|||||||
if(nfm_mod_settings != nullptr) {
|
if(nfm_mod_settings != nullptr) {
|
||||||
delete nfm_mod_settings;
|
delete nfm_mod_settings;
|
||||||
}
|
}
|
||||||
if(daemon_sink_settings != nullptr) {
|
if(remote_sink_settings != nullptr) {
|
||||||
delete daemon_sink_settings;
|
delete remote_sink_settings;
|
||||||
}
|
}
|
||||||
if(daemon_source_settings != nullptr) {
|
if(daemon_source_settings != nullptr) {
|
||||||
delete daemon_source_settings;
|
delete daemon_source_settings;
|
||||||
@ -188,7 +188,7 @@ SWGChannelSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(&nfm_mod_settings, pJson["NFMModSettings"], "SWGNFMModSettings", "SWGNFMModSettings");
|
::SWGSDRangel::setValue(&nfm_mod_settings, pJson["NFMModSettings"], "SWGNFMModSettings", "SWGNFMModSettings");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&daemon_sink_settings, pJson["DaemonSinkSettings"], "SWGDaemonSinkSettings", "SWGDaemonSinkSettings");
|
::SWGSDRangel::setValue(&remote_sink_settings, pJson["RemoteSinkSettings"], "SWGRemoteSinkSettings", "SWGRemoteSinkSettings");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&daemon_source_settings, pJson["DaemonSourceSettings"], "SWGDaemonSourceSettings", "SWGDaemonSourceSettings");
|
::SWGSDRangel::setValue(&daemon_source_settings, pJson["DaemonSourceSettings"], "SWGDaemonSourceSettings", "SWGDaemonSourceSettings");
|
||||||
|
|
||||||
@ -247,8 +247,8 @@ SWGChannelSettings::asJsonObject() {
|
|||||||
if((nfm_mod_settings != nullptr) && (nfm_mod_settings->isSet())){
|
if((nfm_mod_settings != nullptr) && (nfm_mod_settings->isSet())){
|
||||||
toJsonValue(QString("NFMModSettings"), nfm_mod_settings, obj, QString("SWGNFMModSettings"));
|
toJsonValue(QString("NFMModSettings"), nfm_mod_settings, obj, QString("SWGNFMModSettings"));
|
||||||
}
|
}
|
||||||
if((daemon_sink_settings != nullptr) && (daemon_sink_settings->isSet())){
|
if((remote_sink_settings != nullptr) && (remote_sink_settings->isSet())){
|
||||||
toJsonValue(QString("DaemonSinkSettings"), daemon_sink_settings, obj, QString("SWGDaemonSinkSettings"));
|
toJsonValue(QString("RemoteSinkSettings"), remote_sink_settings, obj, QString("SWGRemoteSinkSettings"));
|
||||||
}
|
}
|
||||||
if((daemon_source_settings != nullptr) && (daemon_source_settings->isSet())){
|
if((daemon_source_settings != nullptr) && (daemon_source_settings->isSet())){
|
||||||
toJsonValue(QString("DaemonSourceSettings"), daemon_source_settings, obj, QString("SWGDaemonSourceSettings"));
|
toJsonValue(QString("DaemonSourceSettings"), daemon_source_settings, obj, QString("SWGDaemonSourceSettings"));
|
||||||
@ -365,14 +365,14 @@ SWGChannelSettings::setNfmModSettings(SWGNFMModSettings* nfm_mod_settings) {
|
|||||||
this->m_nfm_mod_settings_isSet = true;
|
this->m_nfm_mod_settings_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGDaemonSinkSettings*
|
SWGRemoteSinkSettings*
|
||||||
SWGChannelSettings::getDaemonSinkSettings() {
|
SWGChannelSettings::getRemoteSinkSettings() {
|
||||||
return daemon_sink_settings;
|
return remote_sink_settings;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGChannelSettings::setDaemonSinkSettings(SWGDaemonSinkSettings* daemon_sink_settings) {
|
SWGChannelSettings::setRemoteSinkSettings(SWGRemoteSinkSettings* remote_sink_settings) {
|
||||||
this->daemon_sink_settings = daemon_sink_settings;
|
this->remote_sink_settings = remote_sink_settings;
|
||||||
this->m_daemon_sink_settings_isSet = true;
|
this->m_remote_sink_settings_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGDaemonSourceSettings*
|
SWGDaemonSourceSettings*
|
||||||
@ -459,7 +459,7 @@ SWGChannelSettings::isSet(){
|
|||||||
if(dsd_demod_settings != nullptr && dsd_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
if(dsd_demod_settings != nullptr && dsd_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(nfm_demod_settings != nullptr && nfm_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
if(nfm_demod_settings != nullptr && nfm_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(nfm_mod_settings != nullptr && nfm_mod_settings->isSet()){ isObjectUpdated = true; break;}
|
if(nfm_mod_settings != nullptr && nfm_mod_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(daemon_sink_settings != nullptr && daemon_sink_settings->isSet()){ isObjectUpdated = true; break;}
|
if(remote_sink_settings != nullptr && remote_sink_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(daemon_source_settings != nullptr && daemon_source_settings->isSet()){ isObjectUpdated = true; break;}
|
if(daemon_source_settings != nullptr && daemon_source_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(ssb_mod_settings != nullptr && ssb_mod_settings->isSet()){ isObjectUpdated = true; break;}
|
if(ssb_mod_settings != nullptr && ssb_mod_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
if(ssb_demod_settings != nullptr && ssb_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
if(ssb_demod_settings != nullptr && ssb_demod_settings->isSet()){ isObjectUpdated = true; break;}
|
||||||
|
@ -27,10 +27,10 @@
|
|||||||
#include "SWGATVModSettings.h"
|
#include "SWGATVModSettings.h"
|
||||||
#include "SWGBFMDemodSettings.h"
|
#include "SWGBFMDemodSettings.h"
|
||||||
#include "SWGDSDDemodSettings.h"
|
#include "SWGDSDDemodSettings.h"
|
||||||
#include "SWGDaemonSinkSettings.h"
|
|
||||||
#include "SWGDaemonSourceSettings.h"
|
#include "SWGDaemonSourceSettings.h"
|
||||||
#include "SWGNFMDemodSettings.h"
|
#include "SWGNFMDemodSettings.h"
|
||||||
#include "SWGNFMModSettings.h"
|
#include "SWGNFMModSettings.h"
|
||||||
|
#include "SWGRemoteSinkSettings.h"
|
||||||
#include "SWGSSBDemodSettings.h"
|
#include "SWGSSBDemodSettings.h"
|
||||||
#include "SWGSSBModSettings.h"
|
#include "SWGSSBModSettings.h"
|
||||||
#include "SWGUDPSinkSettings.h"
|
#include "SWGUDPSinkSettings.h"
|
||||||
@ -84,8 +84,8 @@ public:
|
|||||||
SWGNFMModSettings* getNfmModSettings();
|
SWGNFMModSettings* getNfmModSettings();
|
||||||
void setNfmModSettings(SWGNFMModSettings* nfm_mod_settings);
|
void setNfmModSettings(SWGNFMModSettings* nfm_mod_settings);
|
||||||
|
|
||||||
SWGDaemonSinkSettings* getDaemonSinkSettings();
|
SWGRemoteSinkSettings* getRemoteSinkSettings();
|
||||||
void setDaemonSinkSettings(SWGDaemonSinkSettings* daemon_sink_settings);
|
void setRemoteSinkSettings(SWGRemoteSinkSettings* remote_sink_settings);
|
||||||
|
|
||||||
SWGDaemonSourceSettings* getDaemonSourceSettings();
|
SWGDaemonSourceSettings* getDaemonSourceSettings();
|
||||||
void setDaemonSourceSettings(SWGDaemonSourceSettings* daemon_source_settings);
|
void setDaemonSourceSettings(SWGDaemonSourceSettings* daemon_source_settings);
|
||||||
@ -139,8 +139,8 @@ private:
|
|||||||
SWGNFMModSettings* nfm_mod_settings;
|
SWGNFMModSettings* nfm_mod_settings;
|
||||||
bool m_nfm_mod_settings_isSet;
|
bool m_nfm_mod_settings_isSet;
|
||||||
|
|
||||||
SWGDaemonSinkSettings* daemon_sink_settings;
|
SWGRemoteSinkSettings* remote_sink_settings;
|
||||||
bool m_daemon_sink_settings_isSet;
|
bool m_remote_sink_settings_isSet;
|
||||||
|
|
||||||
SWGDaemonSourceSettings* daemon_source_settings;
|
SWGDaemonSourceSettings* daemon_source_settings;
|
||||||
bool m_daemon_source_settings_isSet;
|
bool m_daemon_source_settings_isSet;
|
||||||
|
@ -49,7 +49,6 @@
|
|||||||
#include "SWGDSDDemodSettings.h"
|
#include "SWGDSDDemodSettings.h"
|
||||||
#include "SWGDVSeralDevices.h"
|
#include "SWGDVSeralDevices.h"
|
||||||
#include "SWGDVSerialDevice.h"
|
#include "SWGDVSerialDevice.h"
|
||||||
#include "SWGDaemonSinkSettings.h"
|
|
||||||
#include "SWGDaemonSourceReport.h"
|
#include "SWGDaemonSourceReport.h"
|
||||||
#include "SWGDaemonSourceSettings.h"
|
#include "SWGDaemonSourceSettings.h"
|
||||||
#include "SWGDeviceListItem.h"
|
#include "SWGDeviceListItem.h"
|
||||||
@ -100,6 +99,7 @@
|
|||||||
#include "SWGRDSReport_altFrequencies.h"
|
#include "SWGRDSReport_altFrequencies.h"
|
||||||
#include "SWGRange.h"
|
#include "SWGRange.h"
|
||||||
#include "SWGRangeFloat.h"
|
#include "SWGRangeFloat.h"
|
||||||
|
#include "SWGRemoteSinkSettings.h"
|
||||||
#include "SWGRtlSdrReport.h"
|
#include "SWGRtlSdrReport.h"
|
||||||
#include "SWGRtlSdrSettings.h"
|
#include "SWGRtlSdrSettings.h"
|
||||||
#include "SWGSDRPlayReport.h"
|
#include "SWGSDRPlayReport.h"
|
||||||
@ -242,9 +242,6 @@ namespace SWGSDRangel {
|
|||||||
if(QString("SWGDVSerialDevice").compare(type) == 0) {
|
if(QString("SWGDVSerialDevice").compare(type) == 0) {
|
||||||
return new SWGDVSerialDevice();
|
return new SWGDVSerialDevice();
|
||||||
}
|
}
|
||||||
if(QString("SWGDaemonSinkSettings").compare(type) == 0) {
|
|
||||||
return new SWGDaemonSinkSettings();
|
|
||||||
}
|
|
||||||
if(QString("SWGDaemonSourceReport").compare(type) == 0) {
|
if(QString("SWGDaemonSourceReport").compare(type) == 0) {
|
||||||
return new SWGDaemonSourceReport();
|
return new SWGDaemonSourceReport();
|
||||||
}
|
}
|
||||||
@ -395,6 +392,9 @@ namespace SWGSDRangel {
|
|||||||
if(QString("SWGRangeFloat").compare(type) == 0) {
|
if(QString("SWGRangeFloat").compare(type) == 0) {
|
||||||
return new SWGRangeFloat();
|
return new SWGRangeFloat();
|
||||||
}
|
}
|
||||||
|
if(QString("SWGRemoteSinkSettings").compare(type) == 0) {
|
||||||
|
return new SWGRemoteSinkSettings();
|
||||||
|
}
|
||||||
if(QString("SWGRtlSdrReport").compare(type) == 0) {
|
if(QString("SWGRtlSdrReport").compare(type) == 0) {
|
||||||
return new SWGRtlSdrReport();
|
return new SWGRtlSdrReport();
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "SWGDaemonSinkSettings.h"
|
#include "SWGRemoteSinkSettings.h"
|
||||||
|
|
||||||
#include "SWGHelpers.h"
|
#include "SWGHelpers.h"
|
||||||
|
|
||||||
@ -22,12 +22,12 @@
|
|||||||
|
|
||||||
namespace SWGSDRangel {
|
namespace SWGSDRangel {
|
||||||
|
|
||||||
SWGDaemonSinkSettings::SWGDaemonSinkSettings(QString* json) {
|
SWGRemoteSinkSettings::SWGRemoteSinkSettings(QString* json) {
|
||||||
init();
|
init();
|
||||||
this->fromJson(*json);
|
this->fromJson(*json);
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGDaemonSinkSettings::SWGDaemonSinkSettings() {
|
SWGRemoteSinkSettings::SWGRemoteSinkSettings() {
|
||||||
nb_fec_blocks = 0;
|
nb_fec_blocks = 0;
|
||||||
m_nb_fec_blocks_isSet = false;
|
m_nb_fec_blocks_isSet = false;
|
||||||
data_address = nullptr;
|
data_address = nullptr;
|
||||||
@ -52,12 +52,12 @@ SWGDaemonSinkSettings::SWGDaemonSinkSettings() {
|
|||||||
m_reverse_api_channel_index_isSet = false;
|
m_reverse_api_channel_index_isSet = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGDaemonSinkSettings::~SWGDaemonSinkSettings() {
|
SWGRemoteSinkSettings::~SWGRemoteSinkSettings() {
|
||||||
this->cleanup();
|
this->cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::init() {
|
SWGRemoteSinkSettings::init() {
|
||||||
nb_fec_blocks = 0;
|
nb_fec_blocks = 0;
|
||||||
m_nb_fec_blocks_isSet = false;
|
m_nb_fec_blocks_isSet = false;
|
||||||
data_address = new QString("");
|
data_address = new QString("");
|
||||||
@ -83,7 +83,7 @@ SWGDaemonSinkSettings::init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::cleanup() {
|
SWGRemoteSinkSettings::cleanup() {
|
||||||
|
|
||||||
if(data_address != nullptr) {
|
if(data_address != nullptr) {
|
||||||
delete data_address;
|
delete data_address;
|
||||||
@ -103,8 +103,8 @@ SWGDaemonSinkSettings::cleanup() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SWGDaemonSinkSettings*
|
SWGRemoteSinkSettings*
|
||||||
SWGDaemonSinkSettings::fromJson(QString &json) {
|
SWGRemoteSinkSettings::fromJson(QString &json) {
|
||||||
QByteArray array (json.toStdString().c_str());
|
QByteArray array (json.toStdString().c_str());
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(array);
|
QJsonDocument doc = QJsonDocument::fromJson(array);
|
||||||
QJsonObject jsonObject = doc.object();
|
QJsonObject jsonObject = doc.object();
|
||||||
@ -113,7 +113,7 @@ SWGDaemonSinkSettings::fromJson(QString &json) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::fromJsonObject(QJsonObject &pJson) {
|
SWGRemoteSinkSettings::fromJsonObject(QJsonObject &pJson) {
|
||||||
::SWGSDRangel::setValue(&nb_fec_blocks, pJson["nbFECBlocks"], "qint32", "");
|
::SWGSDRangel::setValue(&nb_fec_blocks, pJson["nbFECBlocks"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&data_address, pJson["dataAddress"], "QString", "QString");
|
::SWGSDRangel::setValue(&data_address, pJson["dataAddress"], "QString", "QString");
|
||||||
@ -139,7 +139,7 @@ SWGDaemonSinkSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
SWGDaemonSinkSettings::asJson ()
|
SWGRemoteSinkSettings::asJson ()
|
||||||
{
|
{
|
||||||
QJsonObject* obj = this->asJsonObject();
|
QJsonObject* obj = this->asJsonObject();
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ SWGDaemonSinkSettings::asJson ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject*
|
QJsonObject*
|
||||||
SWGDaemonSinkSettings::asJsonObject() {
|
SWGRemoteSinkSettings::asJsonObject() {
|
||||||
QJsonObject* obj = new QJsonObject();
|
QJsonObject* obj = new QJsonObject();
|
||||||
if(m_nb_fec_blocks_isSet){
|
if(m_nb_fec_blocks_isSet){
|
||||||
obj->insert("nbFECBlocks", QJsonValue(nb_fec_blocks));
|
obj->insert("nbFECBlocks", QJsonValue(nb_fec_blocks));
|
||||||
@ -190,118 +190,118 @@ SWGDaemonSinkSettings::asJsonObject() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getNbFecBlocks() {
|
SWGRemoteSinkSettings::getNbFecBlocks() {
|
||||||
return nb_fec_blocks;
|
return nb_fec_blocks;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setNbFecBlocks(qint32 nb_fec_blocks) {
|
SWGRemoteSinkSettings::setNbFecBlocks(qint32 nb_fec_blocks) {
|
||||||
this->nb_fec_blocks = nb_fec_blocks;
|
this->nb_fec_blocks = nb_fec_blocks;
|
||||||
this->m_nb_fec_blocks_isSet = true;
|
this->m_nb_fec_blocks_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString*
|
QString*
|
||||||
SWGDaemonSinkSettings::getDataAddress() {
|
SWGRemoteSinkSettings::getDataAddress() {
|
||||||
return data_address;
|
return data_address;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setDataAddress(QString* data_address) {
|
SWGRemoteSinkSettings::setDataAddress(QString* data_address) {
|
||||||
this->data_address = data_address;
|
this->data_address = data_address;
|
||||||
this->m_data_address_isSet = true;
|
this->m_data_address_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getDataPort() {
|
SWGRemoteSinkSettings::getDataPort() {
|
||||||
return data_port;
|
return data_port;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setDataPort(qint32 data_port) {
|
SWGRemoteSinkSettings::setDataPort(qint32 data_port) {
|
||||||
this->data_port = data_port;
|
this->data_port = data_port;
|
||||||
this->m_data_port_isSet = true;
|
this->m_data_port_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getTxDelay() {
|
SWGRemoteSinkSettings::getTxDelay() {
|
||||||
return tx_delay;
|
return tx_delay;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setTxDelay(qint32 tx_delay) {
|
SWGRemoteSinkSettings::setTxDelay(qint32 tx_delay) {
|
||||||
this->tx_delay = tx_delay;
|
this->tx_delay = tx_delay;
|
||||||
this->m_tx_delay_isSet = true;
|
this->m_tx_delay_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getRgbColor() {
|
SWGRemoteSinkSettings::getRgbColor() {
|
||||||
return rgb_color;
|
return rgb_color;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setRgbColor(qint32 rgb_color) {
|
SWGRemoteSinkSettings::setRgbColor(qint32 rgb_color) {
|
||||||
this->rgb_color = rgb_color;
|
this->rgb_color = rgb_color;
|
||||||
this->m_rgb_color_isSet = true;
|
this->m_rgb_color_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString*
|
QString*
|
||||||
SWGDaemonSinkSettings::getTitle() {
|
SWGRemoteSinkSettings::getTitle() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setTitle(QString* title) {
|
SWGRemoteSinkSettings::setTitle(QString* title) {
|
||||||
this->title = title;
|
this->title = title;
|
||||||
this->m_title_isSet = true;
|
this->m_title_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getUseReverseApi() {
|
SWGRemoteSinkSettings::getUseReverseApi() {
|
||||||
return use_reverse_api;
|
return use_reverse_api;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setUseReverseApi(qint32 use_reverse_api) {
|
SWGRemoteSinkSettings::setUseReverseApi(qint32 use_reverse_api) {
|
||||||
this->use_reverse_api = use_reverse_api;
|
this->use_reverse_api = use_reverse_api;
|
||||||
this->m_use_reverse_api_isSet = true;
|
this->m_use_reverse_api_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString*
|
QString*
|
||||||
SWGDaemonSinkSettings::getReverseApiAddress() {
|
SWGRemoteSinkSettings::getReverseApiAddress() {
|
||||||
return reverse_api_address;
|
return reverse_api_address;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setReverseApiAddress(QString* reverse_api_address) {
|
SWGRemoteSinkSettings::setReverseApiAddress(QString* reverse_api_address) {
|
||||||
this->reverse_api_address = reverse_api_address;
|
this->reverse_api_address = reverse_api_address;
|
||||||
this->m_reverse_api_address_isSet = true;
|
this->m_reverse_api_address_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getReverseApiPort() {
|
SWGRemoteSinkSettings::getReverseApiPort() {
|
||||||
return reverse_api_port;
|
return reverse_api_port;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setReverseApiPort(qint32 reverse_api_port) {
|
SWGRemoteSinkSettings::setReverseApiPort(qint32 reverse_api_port) {
|
||||||
this->reverse_api_port = reverse_api_port;
|
this->reverse_api_port = reverse_api_port;
|
||||||
this->m_reverse_api_port_isSet = true;
|
this->m_reverse_api_port_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getReverseApiDeviceIndex() {
|
SWGRemoteSinkSettings::getReverseApiDeviceIndex() {
|
||||||
return reverse_api_device_index;
|
return reverse_api_device_index;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setReverseApiDeviceIndex(qint32 reverse_api_device_index) {
|
SWGRemoteSinkSettings::setReverseApiDeviceIndex(qint32 reverse_api_device_index) {
|
||||||
this->reverse_api_device_index = reverse_api_device_index;
|
this->reverse_api_device_index = reverse_api_device_index;
|
||||||
this->m_reverse_api_device_index_isSet = true;
|
this->m_reverse_api_device_index_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGDaemonSinkSettings::getReverseApiChannelIndex() {
|
SWGRemoteSinkSettings::getReverseApiChannelIndex() {
|
||||||
return reverse_api_channel_index;
|
return reverse_api_channel_index;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
SWGDaemonSinkSettings::setReverseApiChannelIndex(qint32 reverse_api_channel_index) {
|
SWGRemoteSinkSettings::setReverseApiChannelIndex(qint32 reverse_api_channel_index) {
|
||||||
this->reverse_api_channel_index = reverse_api_channel_index;
|
this->reverse_api_channel_index = reverse_api_channel_index;
|
||||||
this->m_reverse_api_channel_index_isSet = true;
|
this->m_reverse_api_channel_index_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
SWGDaemonSinkSettings::isSet(){
|
SWGRemoteSinkSettings::isSet(){
|
||||||
bool isObjectUpdated = false;
|
bool isObjectUpdated = false;
|
||||||
do{
|
do{
|
||||||
if(m_nb_fec_blocks_isSet){ isObjectUpdated = true; break;}
|
if(m_nb_fec_blocks_isSet){ isObjectUpdated = true; break;}
|
@ -11,13 +11,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SWGDaemonSinkSettings.h
|
* SWGRemoteSinkSettings.h
|
||||||
*
|
*
|
||||||
* Daemon channel sink settings
|
* Remote channel sink settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SWGDaemonSinkSettings_H_
|
#ifndef SWGRemoteSinkSettings_H_
|
||||||
#define SWGDaemonSinkSettings_H_
|
#define SWGRemoteSinkSettings_H_
|
||||||
|
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
|
||||||
@ -29,18 +29,18 @@
|
|||||||
|
|
||||||
namespace SWGSDRangel {
|
namespace SWGSDRangel {
|
||||||
|
|
||||||
class SWG_API SWGDaemonSinkSettings: public SWGObject {
|
class SWG_API SWGRemoteSinkSettings: public SWGObject {
|
||||||
public:
|
public:
|
||||||
SWGDaemonSinkSettings();
|
SWGRemoteSinkSettings();
|
||||||
SWGDaemonSinkSettings(QString* json);
|
SWGRemoteSinkSettings(QString* json);
|
||||||
virtual ~SWGDaemonSinkSettings();
|
virtual ~SWGRemoteSinkSettings();
|
||||||
void init();
|
void init();
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
virtual QString asJson () override;
|
virtual QString asJson () override;
|
||||||
virtual QJsonObject* asJsonObject() override;
|
virtual QJsonObject* asJsonObject() override;
|
||||||
virtual void fromJsonObject(QJsonObject &json) override;
|
virtual void fromJsonObject(QJsonObject &json) override;
|
||||||
virtual SWGDaemonSinkSettings* fromJson(QString &jsonString) override;
|
virtual SWGRemoteSinkSettings* fromJson(QString &jsonString) override;
|
||||||
|
|
||||||
qint32 getNbFecBlocks();
|
qint32 getNbFecBlocks();
|
||||||
void setNbFecBlocks(qint32 nb_fec_blocks);
|
void setNbFecBlocks(qint32 nb_fec_blocks);
|
||||||
@ -116,4 +116,4 @@ private:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* SWGDaemonSinkSettings_H_ */
|
#endif /* SWGRemoteSinkSettings_H_ */
|
Loading…
Reference in New Issue
Block a user