Migration of DaemonSink channel to RemoteSink

pull/283/head
f4exb 2019-01-22 23:39:12 +01:00
rodzic e5b23e9864
commit 5b04cf4b5a
34 zmienionych plików z 581 dodań i 568 usunięć

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Wyświetl plik

@ -27,10 +27,10 @@ endif()
find_package(CM256cc)
if(CM256CC_FOUND)
add_subdirectory(daemonsink)
add_subdirectory(remotesink)
endif(CM256CC_FOUND)
if (BUILD_DEBIAN)
add_subdirectory(demoddsd)
add_subdirectory(daemonsink)
add_subdirectory(remotesink)
endif (BUILD_DEBIAN)

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)

Wyświetl plik

@ -1,4 +1,4 @@
<h1>Daemon sink channel plugin</h1>
<h1>Remote sink channel plugin</h1>
<h2>Introduction</h2>
@ -12,7 +12,7 @@ The plugin will be built only if the [CM256cc library](https://github.com/f4exb/
<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>

Wyświetl plik

@ -1,11 +1,11 @@
///////////////////////////////////////////////////////////////////////////////////
// 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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,6 +20,8 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "remotesink.h"
#include <sys/time.h>
#include <unistd.h>
#include <boost/crc.hpp>
@ -36,16 +38,16 @@
#include "dsp/downchannelizer.h"
#include "dsp/dspcommands.h"
#include "device/devicesourceapi.h"
#include "daemonsinkthread.h"
#include "daemonsink.h"
MESSAGE_CLASS_DEFINITION(DaemonSink::MsgConfigureDaemonSink, Message)
MESSAGE_CLASS_DEFINITION(DaemonSink::MsgSampleRateNotification, Message)
#include "../remotesink/remotesinkthread.h"
const QString DaemonSink::m_channelIdURI = "sdrangel.channel.daemonsink";
const QString DaemonSink::m_channelId = "DaemonSink";
MESSAGE_CLASS_DEFINITION(RemoteSink::MsgConfigureRemoteSink, Message)
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),
m_deviceAPI(deviceAPI),
m_running(false),
@ -72,7 +74,7 @@ DaemonSink::DaemonSink(DeviceSourceAPI *deviceAPI) :
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
}
DaemonSink::~DaemonSink()
RemoteSink::~RemoteSink()
{
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
delete m_networkManager;
@ -89,26 +91,26 @@ DaemonSink::~DaemonSink()
delete m_channelizer;
}
void DaemonSink::setTxDelay(int txDelay, int nbBlocksFEC)
void RemoteSink::setTxDelay(int txDelay, int nbBlocksFEC)
{
double txDelayRatio = txDelay / 100.0;
int samplesPerBlock = SDRDaemonNbBytesPerBlock / sizeof(Sample);
double delay = m_sampleRate == 0 ? 1.0 : (127*samplesPerBlock*txDelayRatio) / m_sampleRate;
delay /= 128 + nbBlocksFEC;
m_txDelay = roundf(delay*1e6); // microseconds
qDebug() << "DaemonSink::setTxDelay:"
qDebug() << "RemoteSink::setTxDelay:"
<< " " << txDelay
<< "% m_txDelay: " << m_txDelay << "us"
<< " 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;
}
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;
SampleVector::const_iterator it = begin;
@ -153,7 +155,7 @@ void DaemonSink::feed(const SampleVector::const_iterator& begin, const SampleVec
if (!(metaData == m_currentMetaFEC))
{
qDebug() << "SDRDaemonChannelSink::feed: meta: "
qDebug() << "RemoteSink::feed: meta: "
<< "|" << metaData.m_centerFrequency
<< ":" << metaData.m_sampleRate
<< ":" << (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));
@ -229,7 +231,7 @@ void DaemonSink::start()
stop();
}
m_sinkThread = new DaemonSinkThread();
m_sinkThread = new RemoteSinkThread();
connect(this,
SIGNAL(dataBlockAvailable(SDRDaemonDataBlock *)),
m_sinkThread,
@ -239,9 +241,9 @@ void DaemonSink::start()
m_running = true;
}
void DaemonSink::stop()
void RemoteSink::stop()
{
qDebug("DaemonSink::stop");
qDebug("RemoteSink::stop");
if (m_sinkThread != 0)
{
@ -253,14 +255,14 @@ void DaemonSink::stop()
m_running = false;
}
bool DaemonSink::handleMessage(const Message& cmd)
bool RemoteSink::handleMessage(const Message& cmd)
{
(void) cmd;
if (DownChannelizer::MsgChannelizerNotification::match(cmd))
{
DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd;
qDebug() << "DaemonSink::handleMessage: MsgChannelizerNotification:"
qDebug() << "RemoteSink::handleMessage: MsgChannelizerNotification:"
<< " channelSampleRate: " << notif.getSampleRate()
<< " offsetFrequency: " << notif.getFrequencyOffset();
@ -282,7 +284,7 @@ bool DaemonSink::handleMessage(const Message& cmd)
{
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
qDebug() << "DaemonSink::handleMessage: DSPSignalNotification:"
qDebug() << "RemoteSink::handleMessage: DSPSignalNotification:"
<< " inputSampleRate: " << notif.getSampleRate()
<< " centerFrequency: " << notif.getCenterFrequency();
@ -290,10 +292,10 @@ bool DaemonSink::handleMessage(const Message& cmd)
return true;
}
else if (MsgConfigureDaemonSink::match(cmd))
else if (MsgConfigureRemoteSink::match(cmd))
{
MsgConfigureDaemonSink& cfg = (MsgConfigureDaemonSink&) cmd;
qDebug() << "DaemonSink::handleMessage: MsgConfigureDaemonSink";
MsgConfigureRemoteSink& cfg = (MsgConfigureRemoteSink&) cmd;
qDebug() << "RemoteSink::handleMessage: MsgConfigureRemoteSink";
applySettings(cfg.getSettings(), cfg.getForce());
return true;
@ -304,32 +306,32 @@ bool DaemonSink::handleMessage(const Message& cmd)
}
}
QByteArray DaemonSink::serialize() const
QByteArray RemoteSink::serialize() const
{
return m_settings.serialize();
}
bool DaemonSink::deserialize(const QByteArray& data)
bool RemoteSink::deserialize(const QByteArray& data)
{
(void) data;
if (m_settings.deserialize(data))
{
MsgConfigureDaemonSink *msg = MsgConfigureDaemonSink::create(m_settings, true);
MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true);
m_inputMessageQueue.push(msg);
return true;
}
else
{
m_settings.resetToDefaults();
MsgConfigureDaemonSink *msg = MsgConfigureDaemonSink::create(m_settings, true);
MsgConfigureRemoteSink *msg = MsgConfigureRemoteSink::create(m_settings, true);
m_inputMessageQueue.push(msg);
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_txDelay: " << settings.m_txDelay
<< " m_dataAddress: " << settings.m_dataAddress
@ -376,40 +378,40 @@ void DaemonSink::applySettings(const DaemonSinkSettings& settings, bool force)
m_settings = settings;
}
int DaemonSink::webapiSettingsGet(
int RemoteSink::webapiSettingsGet(
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
{
(void) errorMessage;
response.setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
response.getDaemonSinkSettings()->init();
response.setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
response.getRemoteSinkSettings()->init();
webapiFormatChannelSettings(response, m_settings);
return 200;
}
int DaemonSink::webapiSettingsPutPatch(
int RemoteSink::webapiSettingsPutPatch(
bool force,
const QStringList& channelSettingsKeys,
SWGSDRangel::SWGChannelSettings& response,
QString& errorMessage)
{
(void) errorMessage;
DaemonSinkSettings settings = m_settings;
RemoteSinkSettings settings = m_settings;
if (channelSettingsKeys.contains("nbFECBlocks"))
{
int nbFECBlocks = response.getDaemonSinkSettings()->getNbFecBlocks();
int nbFECBlocks = response.getRemoteSinkSettings()->getNbFecBlocks();
if ((nbFECBlocks < 0) || (nbFECBlocks > 127)) {
settings.m_nbFECBlocks = 8;
} else {
settings.m_nbFECBlocks = response.getDaemonSinkSettings()->getNbFecBlocks();
settings.m_nbFECBlocks = response.getRemoteSinkSettings()->getNbFecBlocks();
}
}
if (channelSettingsKeys.contains("txDelay"))
{
int txDelay = response.getDaemonSinkSettings()->getTxDelay();
int txDelay = response.getRemoteSinkSettings()->getTxDelay();
if (txDelay < 0) {
settings.m_txDelay = 35;
@ -419,12 +421,12 @@ int DaemonSink::webapiSettingsPutPatch(
}
if (channelSettingsKeys.contains("dataAddress")) {
settings.m_dataAddress = *response.getDaemonSinkSettings()->getDataAddress();
settings.m_dataAddress = *response.getRemoteSinkSettings()->getDataAddress();
}
if (channelSettingsKeys.contains("dataPort"))
{
int dataPort = response.getDaemonSinkSettings()->getDataPort();
int dataPort = response.getRemoteSinkSettings()->getDataPort();
if ((dataPort < 1024) || (dataPort > 65535)) {
settings.m_dataPort = 9090;
@ -434,34 +436,34 @@ int DaemonSink::webapiSettingsPutPatch(
}
if (channelSettingsKeys.contains("rgbColor")) {
settings.m_rgbColor = response.getDaemonSinkSettings()->getRgbColor();
settings.m_rgbColor = response.getRemoteSinkSettings()->getRgbColor();
}
if (channelSettingsKeys.contains("title")) {
settings.m_title = *response.getDaemonSinkSettings()->getTitle();
settings.m_title = *response.getRemoteSinkSettings()->getTitle();
}
if (channelSettingsKeys.contains("useReverseAPI")) {
settings.m_useReverseAPI = response.getDaemonSinkSettings()->getUseReverseApi() != 0;
settings.m_useReverseAPI = response.getRemoteSinkSettings()->getUseReverseApi() != 0;
}
if (channelSettingsKeys.contains("reverseAPIAddress")) {
settings.m_reverseAPIAddress = *response.getDaemonSinkSettings()->getReverseApiAddress();
settings.m_reverseAPIAddress = *response.getRemoteSinkSettings()->getReverseApiAddress();
}
if (channelSettingsKeys.contains("reverseAPIPort")) {
settings.m_reverseAPIPort = response.getDaemonSinkSettings()->getReverseApiPort();
settings.m_reverseAPIPort = response.getRemoteSinkSettings()->getReverseApiPort();
}
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
settings.m_reverseAPIDeviceIndex = response.getDaemonSinkSettings()->getReverseApiDeviceIndex();
settings.m_reverseAPIDeviceIndex = response.getRemoteSinkSettings()->getReverseApiDeviceIndex();
}
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);
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
{
MsgConfigureDaemonSink *msgToGUI = MsgConfigureDaemonSink::create(settings, force);
MsgConfigureRemoteSink *msgToGUI = MsgConfigureRemoteSink::create(settings, force);
m_guiMessageQueue->push(msgToGUI);
}
@ -470,67 +472,67 @@ int DaemonSink::webapiSettingsPutPatch(
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.getDaemonSinkSettings()->setTxDelay(settings.m_txDelay);
response.getRemoteSinkSettings()->setNbFecBlocks(settings.m_nbFECBlocks);
response.getRemoteSinkSettings()->setTxDelay(settings.m_txDelay);
if (response.getDaemonSinkSettings()->getDataAddress()) {
*response.getDaemonSinkSettings()->getDataAddress() = settings.m_dataAddress;
if (response.getRemoteSinkSettings()->getDataAddress()) {
*response.getRemoteSinkSettings()->getDataAddress() = settings.m_dataAddress;
} else {
response.getDaemonSinkSettings()->setDataAddress(new QString(settings.m_dataAddress));
response.getRemoteSinkSettings()->setDataAddress(new QString(settings.m_dataAddress));
}
response.getDaemonSinkSettings()->setDataPort(settings.m_dataPort);
response.getDaemonSinkSettings()->setRgbColor(settings.m_rgbColor);
response.getRemoteSinkSettings()->setDataPort(settings.m_dataPort);
response.getRemoteSinkSettings()->setRgbColor(settings.m_rgbColor);
if (response.getDaemonSinkSettings()->getTitle()) {
*response.getDaemonSinkSettings()->getTitle() = settings.m_title;
if (response.getRemoteSinkSettings()->getTitle()) {
*response.getRemoteSinkSettings()->getTitle() = settings.m_title;
} 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()) {
*response.getDaemonSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
if (response.getRemoteSinkSettings()->getReverseApiAddress()) {
*response.getRemoteSinkSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
} else {
response.getDaemonSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
response.getRemoteSinkSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
}
response.getDaemonSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
response.getDaemonSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
response.getDaemonSinkSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex);
response.getRemoteSinkSettings()->setReverseApiPort(settings.m_reverseAPIPort);
response.getRemoteSinkSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
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();
swgChannelSettings->setTx(0);
swgChannelSettings->setChannelType(new QString("DaemonSink"));
swgChannelSettings->setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
SWGSDRangel::SWGDaemonSinkSettings *swgDaemonSinkSettings = swgChannelSettings->getDaemonSinkSettings();
swgChannelSettings->setChannelType(new QString("RemoteSink"));
swgChannelSettings->setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
SWGSDRangel::SWGRemoteSinkSettings *swgRemoteSinkSettings = swgChannelSettings->getRemoteSinkSettings();
// transfer data that has been modified. When force is on transfer all data except reverse API data
if (channelSettingsKeys.contains("nbFECBlocks") || force) {
swgDaemonSinkSettings->setNbFecBlocks(settings.m_nbFECBlocks);
swgRemoteSinkSettings->setNbFecBlocks(settings.m_nbFECBlocks);
}
if (channelSettingsKeys.contains("txDelay") || force)
{
swgDaemonSinkSettings->setTxDelay(settings.m_txDelay);
swgRemoteSinkSettings->setTxDelay(settings.m_txDelay);
}
if (channelSettingsKeys.contains("dataAddress") || force) {
swgDaemonSinkSettings->setDataAddress(new QString(settings.m_dataAddress));
swgRemoteSinkSettings->setDataAddress(new QString(settings.m_dataAddress));
}
if (channelSettingsKeys.contains("dataPort") || force) {
swgDaemonSinkSettings->setDataPort(settings.m_dataPort);
swgRemoteSinkSettings->setDataPort(settings.m_dataPort);
}
if (channelSettingsKeys.contains("rgbColor") || force) {
swgDaemonSinkSettings->setRgbColor(settings.m_rgbColor);
swgRemoteSinkSettings->setRgbColor(settings.m_rgbColor);
}
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")
@ -552,13 +554,13 @@ void DaemonSink::webapiReverseSendSettings(QList<QString>& channelSettingsKeys,
delete swgChannelSettings;
}
void DaemonSink::networkManagerFinished(QNetworkReply *reply)
void RemoteSink::networkManagerFinished(QNetworkReply *reply)
{
QNetworkReply::NetworkError replyError = reply->error();
if (replyError)
{
qWarning() << "DaemonSink::networkManagerFinished:"
qWarning() << "RemoteSink::networkManagerFinished:"
<< " error(" << (int) replyError
<< "): " << replyError
<< ": " << reply->errorString();
@ -567,5 +569,5 @@ void DaemonSink::networkManagerFinished(QNetworkReply *reply)
QString answer = reply->readAll();
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());
}

Wyświetl plik

@ -1,11 +1,11 @@
///////////////////////////////////////////////////////////////////////////////////
// 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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,8 +20,8 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_DAEMONSINK_H_
#define INCLUDE_DAEMONSINK_H_
#ifndef INCLUDE_REMOTESINK_H_
#define INCLUDE_REMOTESINK_H_
#include <QObject>
#include <QMutex>
@ -30,35 +30,36 @@
#include "dsp/basebandsamplesink.h"
#include "channel/channelsinkapi.h"
#include "channel/sdrdaemondatablock.h"
#include "daemonsinksettings.h"
#include "../remotesink/remotesinksettings.h"
class QNetworkAccessManager;
class QNetworkReply;
class DeviceSourceAPI;
class ThreadedBasebandSampleSink;
class DownChannelizer;
class DaemonSinkThread;
class RemoteSinkThread;
class DaemonSink : public BasebandSampleSink, public ChannelSinkAPI {
class RemoteSink : public BasebandSampleSink, public ChannelSinkAPI {
Q_OBJECT
public:
class MsgConfigureDaemonSink : public Message {
class MsgConfigureRemoteSink : public Message {
MESSAGE_CLASS_DECLARATION
public:
const DaemonSinkSettings& getSettings() const { return m_settings; }
const RemoteSinkSettings& getSettings() const { return m_settings; }
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:
DaemonSinkSettings m_settings;
RemoteSinkSettings m_settings;
bool m_force;
MsgConfigureDaemonSink(const DaemonSinkSettings& settings, bool force) :
MsgConfigureRemoteSink(const RemoteSinkSettings& settings, bool force) :
Message(),
m_settings(settings),
m_force(force)
@ -85,8 +86,8 @@ public:
int m_sampleRate;
};
DaemonSink(DeviceSourceAPI *deviceAPI);
virtual ~DaemonSink();
RemoteSink(DeviceSourceAPI *deviceAPI);
virtual ~RemoteSink();
virtual void destroy() { delete this; }
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 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 QByteArray serialize() const;
@ -134,8 +135,8 @@ private:
DownChannelizer* m_channelizer;
bool m_running;
DaemonSinkSettings m_settings;
DaemonSinkThread *m_sinkThread;
RemoteSinkSettings m_settings;
RemoteSinkThread *m_sinkThread;
int m_txBlockIndex; //!< Current index in blocks to transmit in the Tx row
uint16_t m_frameCount; //!< transmission frame count
@ -154,12 +155,12 @@ private:
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
void applySettings(const DaemonSinkSettings& settings, bool force = false);
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const DaemonSinkSettings& settings);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const DaemonSinkSettings& settings, bool force);
void applySettings(const RemoteSinkSettings& settings, bool force = false);
void webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const RemoteSinkSettings& settings);
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const RemoteSinkSettings& settings, bool force);
private slots:
void networkManagerFinished(QNetworkReply *reply);
};
#endif /* INCLUDE_DAEMONSINK_H_ */
#endif /* INCLUDE_REMOTESINK_H_ */

Wyświetl plik

@ -9,7 +9,7 @@ CONFIG += plugin
QT += core gui widgets multimedia network opengl
TARGET = daemonsink
TARGET = remotesink
CONFIG(MINGW32):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(macx):INCLUDEPATH += "../../../boost_1_69_0"
SOURCES += daemonsink.cpp\
daemonsinkgui.cpp\
daemonsinksettings.cpp\
daemonsinkplugin.cpp\
daemonsinkthread.cpp
SOURCES += remotesink.cpp\
remotesinkgui.cpp\
remotesinksettings.cpp\
remotesinkplugin.cpp\
remotesinkthread.cpp
HEADERS += daemonsink.h\
daemonsinkgui.h\
daemonsinksettings.h\
daemonsinkplugin.h\
daemonsinkthread.h
HEADERS += remotesink.h\
remotesinkgui.h\
remotesinksettings.h\
remotesinkplugin.h\
remotesinkthread.h
FORMS += daemonsinkgui.ui
FORMS += remotesinkgui.ui
LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui

Wyświetl plik

@ -14,58 +14,59 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "remotesinkgui.h"
#include "device/devicesourceapi.h"
#include "device/deviceuiset.h"
#include "gui/basicchannelsettingsdialog.h"
#include "mainwindow.h"
#include "daemonsink.h"
#include "ui_daemonsinkgui.h"
#include "daemonsinkgui.h"
#include "remotesink.h"
#include "ui_remotesinkgui.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;
}
void DaemonSinkGUI::destroy()
void RemoteSinkGUI::destroy()
{
delete this;
}
void DaemonSinkGUI::setName(const QString& name)
void RemoteSinkGUI::setName(const QString& name)
{
setObjectName(name);
}
QString DaemonSinkGUI::getName() const
QString RemoteSinkGUI::getName() const
{
return objectName();
}
qint64 DaemonSinkGUI::getCenterFrequency() const {
qint64 RemoteSinkGUI::getCenterFrequency() const {
return 0;
}
void DaemonSinkGUI::setCenterFrequency(qint64 centerFrequency)
void RemoteSinkGUI::setCenterFrequency(qint64 centerFrequency)
{
(void) centerFrequency;
}
void DaemonSinkGUI::resetToDefaults()
void RemoteSinkGUI::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
applySettings(true);
}
QByteArray DaemonSinkGUI::serialize() const
QByteArray RemoteSinkGUI::serialize() const
{
return m_settings.serialize();
}
bool DaemonSinkGUI::deserialize(const QByteArray& data)
bool RemoteSinkGUI::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
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_sampleRate = notif.getSampleRate();
updateTxDelayTime();
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();
blockApplySettings(true);
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),
ui(new Ui::DaemonSinkGUI),
ui(new Ui::RemoteSinkGUI),
m_pluginAPI(pluginAPI),
m_deviceUISet(deviceUISet),
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(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
m_daemonSink = (DaemonSink*) channelrx;
m_daemonSink->setMessageQueueToGUI(getInputMessageQueue());
m_remoteSink = (RemoteSink*) channelrx;
m_remoteSink->setMessageQueueToGUI(getInputMessageQueue());
m_channelMarker.blockSignals(true);
m_channelMarker.setColor(m_settings.m_rgbColor);
m_channelMarker.setCenterFrequency(0);
m_channelMarker.setTitle("Daemon source");
m_channelMarker.setTitle("Remote source");
m_channelMarker.blockSignals(false);
m_channelMarker.setVisible(true); // activate signal on the last setting only
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->addRollupWidget(this);
@ -140,29 +141,29 @@ DaemonSinkGUI::DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas
applySettings(true);
}
DaemonSinkGUI::~DaemonSinkGUI()
RemoteSinkGUI::~RemoteSinkGUI()
{
m_deviceUISet->removeRxChannelInstance(this);
delete ui;
}
void DaemonSinkGUI::blockApplySettings(bool block)
void RemoteSinkGUI::blockApplySettings(bool block)
{
m_doApplySettings = !block;
}
void DaemonSinkGUI::applySettings(bool force)
void RemoteSinkGUI::applySettings(bool force)
{
if (m_doApplySettings)
{
setTitleColor(m_channelMarker.getColor());
DaemonSink::MsgConfigureDaemonSink* message = DaemonSink::MsgConfigureDaemonSink::create(m_settings, force);
m_daemonSink->getInputMessageQueue()->push(message);
RemoteSink::MsgConfigureRemoteSink* message = RemoteSink::MsgConfigureRemoteSink::create(m_settings, force);
m_remoteSink->getInputMessageQueue()->push(message);
}
}
void DaemonSinkGUI::displaySettings()
void RemoteSinkGUI::displaySettings()
{
m_channelMarker.blockSignals(true);
m_channelMarker.setCenterFrequency(0);
@ -186,17 +187,17 @@ void DaemonSinkGUI::displaySettings()
blockApplySettings(false);
}
void DaemonSinkGUI::leaveEvent(QEvent*)
void RemoteSinkGUI::leaveEvent(QEvent*)
{
m_channelMarker.setHighlighted(false);
}
void DaemonSinkGUI::enterEvent(QEvent*)
void RemoteSinkGUI::enterEvent(QEvent*)
{
m_channelMarker.setHighlighted(true);
}
void DaemonSinkGUI::handleSourceMessages()
void RemoteSinkGUI::handleSourceMessages()
{
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) rollDown;
}
void DaemonSinkGUI::onMenuDialogCalled(const QPoint &p)
void RemoteSinkGUI::onMenuDialogCalled(const QPoint &p)
{
BasicChannelSettingsDialog dialog(&m_channelMarker, this);
dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
@ -241,13 +242,13 @@ void DaemonSinkGUI::onMenuDialogCalled(const QPoint &p)
applySettings();
}
void DaemonSinkGUI::on_dataAddress_returnPressed()
void RemoteSinkGUI::on_dataAddress_returnPressed()
{
m_settings.m_dataAddress = ui->dataAddress->text();
applySettings();
}
void DaemonSinkGUI::on_dataPort_returnPressed()
void RemoteSinkGUI::on_dataPort_returnPressed()
{
bool dataOk;
int dataPort = ui->dataPort->text().toInt(&dataOk);
@ -264,7 +265,7 @@ void DaemonSinkGUI::on_dataPort_returnPressed()
applySettings();
}
void DaemonSinkGUI::on_dataApplyButton_clicked(bool checked)
void RemoteSinkGUI::on_dataApplyButton_clicked(bool checked)
{
(void) checked;
m_settings.m_dataAddress = ui->dataAddress->text();
@ -280,7 +281,7 @@ void DaemonSinkGUI::on_dataApplyButton_clicked(bool checked)
applySettings();
}
void DaemonSinkGUI::on_txDelay_valueChanged(int value)
void RemoteSinkGUI::on_txDelay_valueChanged(int value)
{
m_settings.m_txDelay = value; // percentage
ui->txDelayText->setText(tr("%1%").arg(value));
@ -288,7 +289,7 @@ void DaemonSinkGUI::on_txDelay_valueChanged(int value)
applySettings();
}
void DaemonSinkGUI::on_nbFECBlocks_valueChanged(int value)
void RemoteSinkGUI::on_nbFECBlocks_valueChanged(int value)
{
m_settings.m_nbFECBlocks = value;
int nbOriginalBlocks = 128;
@ -300,7 +301,7 @@ void DaemonSinkGUI::on_nbFECBlocks_valueChanged(int value)
applySettings();
}
void DaemonSinkGUI::updateTxDelayTime()
void RemoteSinkGUI::updateTxDelayTime()
{
double txDelayRatio = m_settings.m_txDelay / 100.0;
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)));
}
void DaemonSinkGUI::tick()
void RemoteSinkGUI::tick()
{
if (++m_tickCount == 20) { // once per second
m_tickCount = 0;

Wyświetl plik

@ -14,8 +14,8 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_
#define PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_
#ifndef PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_
#define PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_
#include <stdint.h>
@ -27,21 +27,21 @@
#include "gui/rollupwidget.h"
#include "util/messagequeue.h"
#include "daemonsinksettings.h"
#include "remotesinksettings.h"
class PluginAPI;
class DeviceUISet;
class DaemonSink;
class RemoteSink;
class BasebandSampleSink;
namespace Ui {
class DaemonSinkGUI;
class RemoteSinkGUI;
}
class DaemonSinkGUI : public RollupWidget, public PluginInstanceGUI {
class RemoteSinkGUI : public RollupWidget, public PluginInstanceGUI {
Q_OBJECT
public:
static DaemonSinkGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel);
static RemoteSinkGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel);
virtual void destroy();
void setName(const QString& name);
@ -56,23 +56,23 @@ public:
virtual bool handleMessage(const Message& message);
private:
Ui::DaemonSinkGUI* ui;
Ui::RemoteSinkGUI* ui;
PluginAPI* m_pluginAPI;
DeviceUISet* m_deviceUISet;
ChannelMarker m_channelMarker;
DaemonSinkSettings m_settings;
RemoteSinkSettings m_settings;
int m_sampleRate;
quint64 m_deviceCenterFrequency; //!< Center frequency in device
bool m_doApplySettings;
DaemonSink* m_daemonSink;
RemoteSink* m_remoteSink;
MessageQueue m_inputMessageQueue;
QTime m_time;
uint32_t m_tickCount;
explicit DaemonSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
virtual ~DaemonSinkGUI();
explicit RemoteSinkGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
virtual ~RemoteSinkGUI();
void blockApplySettings(bool block);
void applySettings(bool force = false);
@ -96,4 +96,4 @@ private slots:
#endif /* PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKGUI_H_ */
#endif /* PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKGUI_H_ */

Wyświetl plik

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DaemonSinkGUI</class>
<widget class="RollupWidget" name="DaemonSinkGUI">
<class>RemoteSinkGUI</class>
<widget class="RollupWidget" name="RemoteSinkGUI">
<property name="geometry">
<rect>
<x>0</x>
@ -35,7 +35,7 @@
</font>
</property>
<property name="windowTitle">
<string>Daemon sink</string>
<string>Remote sink</string>
</property>
<widget class="QWidget" name="settingsContainer" native="true">
<property name="geometry">

Wyświetl plik

@ -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 //
// 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/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "daemonsinkplugin.h"
#include "remotesinkplugin.h"
#include <QtPlugin>
#include "plugin/pluginapi.h"
#ifndef SERVER_MODE
#include "daemonsinkgui.h"
#include "remotesinkgui.h"
#endif
#include "daemonsink.h"
#include "remotesink.h"
const PluginDescriptor DaemonSinkPlugin::m_pluginDescriptor = {
QString("Daemon channel Sink"),
QString("4.3.2"),
const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = {
QString("Remote channel Sink"),
QString("4.4.2"),
QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"),
true,
QString("https://github.com/f4exb/sdrangel")
};
DaemonSinkPlugin::DaemonSinkPlugin(QObject* parent) :
RemoteSinkPlugin::RemoteSinkPlugin(QObject* parent) :
QObject(parent),
m_pluginAPI(0)
{
}
const PluginDescriptor& DaemonSinkPlugin::getPluginDescriptor() const
const PluginDescriptor& RemoteSinkPlugin::getPluginDescriptor() const
{
return m_pluginDescriptor;
}
void DaemonSinkPlugin::initPlugin(PluginAPI* pluginAPI)
void RemoteSinkPlugin::initPlugin(PluginAPI* pluginAPI)
{
m_pluginAPI = pluginAPI;
// 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
PluginInstanceGUI* DaemonSinkPlugin::createRxChannelGUI(
PluginInstanceGUI* RemoteSinkPlugin::createRxChannelGUI(
DeviceUISet *deviceUISet __attribute__((unused)),
BasebandSampleSink *rxChannel __attribute__((unused)))
{
return 0;
}
#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
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);
}

Wyświetl plik

@ -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 //
// 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/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_
#define PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_
#ifndef PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_
#define PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_
#include <QObject>
@ -24,13 +24,13 @@
class DeviceUISet;
class BasebandSampleSink;
class DaemonSinkPlugin : public QObject, PluginInterface {
class RemoteSinkPlugin : public QObject, PluginInterface {
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_PLUGIN_METADATA(IID "sdrangel.demod.daemonsink")
Q_PLUGIN_METADATA(IID "sdrangel.demod.remotesink")
public:
explicit DaemonSinkPlugin(QObject* parent = 0);
explicit RemoteSinkPlugin(QObject* parent = 0);
const PluginDescriptor& getPluginDescriptor() const;
void initPlugin(PluginAPI* pluginAPI);
@ -45,4 +45,4 @@ private:
PluginAPI* m_pluginAPI;
};
#endif /* PLUGINS_CHANNELRX_DAEMONSINK_DAEMONSINKPLUGIN_H_ */
#endif /* PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKPLUGIN_H_ */

Wyświetl plik

@ -1,11 +1,11 @@
///////////////////////////////////////////////////////////////////////////////////
// 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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,25 +20,27 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "remotesinksettings.h"
#include <QColor>
#include "util/simpleserializer.h"
#include "settings/serializable.h"
#include "daemonsinksettings.h"
DaemonSinkSettings::DaemonSinkSettings()
RemoteSinkSettings::RemoteSinkSettings()
{
resetToDefaults();
}
void DaemonSinkSettings::resetToDefaults()
void RemoteSinkSettings::resetToDefaults()
{
m_nbFECBlocks = 0;
m_txDelay = 35;
m_dataAddress = "127.0.0.1";
m_dataPort = 9090;
m_rgbColor = QColor(140, 4, 4).rgb();
m_title = "Daemon sink";
m_title = "Remote sink";
m_channelMarker = nullptr;
m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1";
@ -47,7 +49,7 @@ void DaemonSinkSettings::resetToDefaults()
m_reverseAPIChannelIndex = 0;
}
QByteArray DaemonSinkSettings::serialize() const
QByteArray RemoteSinkSettings::serialize() const
{
SimpleSerializer s(1);
s.writeU32(1, m_nbFECBlocks);
@ -65,7 +67,7 @@ QByteArray DaemonSinkSettings::serialize() const
return s.final();
}
bool DaemonSinkSettings::deserialize(const QByteArray& data)
bool RemoteSinkSettings::deserialize(const QByteArray& 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.readString(6, &m_title, "Daemon sink");
d.readString(6, &m_title, "Remote sink");
d.readBool(7, &m_useReverseAPI, false);
d.readString(8, &m_reverseAPIAddress, "127.0.0.1");
d.readU32(9, &tmp, 0);

Wyświetl plik

@ -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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,14 +20,15 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_
#define INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_
#ifndef INCLUDE_REMOTECHANNELSINKSETTINGS_H_
#define INCLUDE_REMOTECHANNELSINKSETTINGS_H_
#include <QByteArray>
#include <QString>
class Serializable;
struct DaemonSinkSettings
struct RemoteSinkSettings
{
uint16_t m_nbFECBlocks;
uint32_t m_txDelay;
@ -43,11 +44,11 @@ struct DaemonSinkSettings
Serializable *m_channelMarker;
DaemonSinkSettings();
RemoteSinkSettings();
void resetToDefaults();
void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
QByteArray serialize() const;
bool deserialize(const QByteArray& data);
};
#endif /* INCLUDE_SDRDAEMONCHANNELSINKSETTINGS_H_ */
#endif /* INCLUDE_REMOTECHANNELSINKSETTINGS_H_ */

Wyświetl plik

@ -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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,16 +20,16 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "remotesinkthread.h"
#include <QUdpSocket>
#include "channel/sdrdaemondatablock.h"
#include "daemonsinkthread.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),
m_running(false),
m_address(QHostAddress::LocalHost),
@ -40,20 +40,20 @@ DaemonSinkThread::DaemonSinkThread(QObject* parent) :
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);
m_inputMessageQueue.push(msg);
}
void DaemonSinkThread::startWork()
void RemoteSinkThread::startWork()
{
qDebug("DaemonSinkThread::startWork");
qDebug("RemoteSinkThread::startWork");
m_startWaitMutex.lock();
m_socket = new QUdpSocket(this);
start();
@ -62,18 +62,18 @@ void DaemonSinkThread::startWork()
m_startWaitMutex.unlock();
}
void DaemonSinkThread::stopWork()
void RemoteSinkThread::stopWork()
{
qDebug("DaemonSinkThread::stopWork");
qDebug("RemoteSinkThread::stopWork");
delete m_socket;
m_socket = 0;
m_running = false;
wait();
}
void DaemonSinkThread::run()
void RemoteSinkThread::run()
{
qDebug("DaemonSinkThread::run: begin");
qDebug("RemoteSinkThread::run: begin");
m_running = true;
m_startWaiter.wakeAll();
@ -83,16 +83,16 @@ void DaemonSinkThread::run()
}
m_running = false;
qDebug("DaemonSinkThread::run: end");
qDebug("RemoteSinkThread::run: end");
}
void DaemonSinkThread::processDataBlock(SDRDaemonDataBlock *dataBlock)
void RemoteSinkThread::processDataBlock(SDRDaemonDataBlock *dataBlock)
{
handleDataBlock(*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_block descriptorBlocks[256]; //!< Pointers to data for CM256 encoder
@ -141,7 +141,7 @@ void DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
// Encode FEC blocks
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
}
@ -166,7 +166,7 @@ void DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock)
dataBlock.m_txControlBlock.m_processed = true;
}
void DaemonSinkThread::handleInputMessages()
void RemoteSinkThread::handleInputMessages()
{
Message* message;
@ -175,7 +175,7 @@ void DaemonSinkThread::handleInputMessages()
if (MsgStartStop::match(*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()) {
startWork();

Wyświetl plik

@ -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 //
// physical device and sends or receives the I/Q samples stream to or from a //
// SDRangel instance via UDP. It is controlled via a Web REST API. //
// SDRangel can work as a detached SDR front end. With this plugin it can //
// sends the I/Q samples stream to another SDRangel instance via UDP. //
// It is controlled via a Web REST API. //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
@ -20,6 +20,9 @@
// 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 <QMutex>
#include <QWaitCondition>
@ -34,7 +37,7 @@ class SDRDaemonDataBlock;
class CM256;
class QUdpSocket;
class DaemonSinkThread : public QThread {
class RemoteSinkThread : public QThread {
Q_OBJECT
public:
@ -57,8 +60,8 @@ public:
{ }
};
DaemonSinkThread(QObject* parent = 0);
~DaemonSinkThread();
RemoteSinkThread(QObject* parent = 0);
~RemoteSinkThread();
void startStop(bool start);
@ -87,3 +90,6 @@ private:
private slots:
void handleInputMessages();
};
#endif // PLUGINS_CHANNELRX_REMOTESINK_REMOTESINKTHREAD_H_

Wyświetl plik

@ -9,7 +9,7 @@ endif()
find_package(CM256cc)
if(CM256CC_FOUND)
add_subdirectory(daemonsink)
add_subdirectory(remotesink)
endif(CM256CC_FOUND)
add_subdirectory(demodnfm)

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)

Wyświetl plik

@ -22,7 +22,7 @@
<file>webapi/doc/swagger/include/Perseus.yaml</file>
<file>webapi/doc/swagger/include/PlutoSdr.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/SDRDaemonSource.yaml</file>
<file>webapi/doc/swagger/include/SDRDaemonSink.yaml</file>

Wyświetl plik

@ -1813,8 +1813,8 @@ margin-bottom: 20px;
"NFMModSettings" : {
"$ref" : "#/definitions/NFMModSettings"
},
"DaemonSinkSettings" : {
"$ref" : "#/definitions/DaemonSinkSettings"
"RemoteSinkSettings" : {
"$ref" : "#/definitions/RemoteSinkSettings"
},
"DaemonSourceSettings" : {
"$ref" : "#/definitions/DaemonSourceSettings"
@ -2047,49 +2047,6 @@ margin-bottom: 20px;
}
},
"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 = {
"properties" : {
@ -3844,6 +3801,49 @@ margin-bottom: 20px;
}
},
"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 = {
"properties" : {
@ -24373,7 +24373,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2019-01-14T08:33:10.665+01:00
Generated 2019-01-22T23:24:38.456+01:00
</div>
</div>
</div>

Wyświetl plik

@ -1,5 +1,5 @@
DaemonSinkSettings:
description: "Daemon channel sink settings"
RemoteSinkSettings:
description: "Remote channel sink settings"
properties:
nbFECBlocks:
description: "Number of FEC blocks per frame"

Wyświetl plik

@ -1888,8 +1888,8 @@ definitions:
$ref: "/doc/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
NFMModSettings:
$ref: "/doc/swagger/include/NFMMod.yaml#/NFMModSettings"
DaemonSinkSettings:
$ref: "/doc/swagger/include/DaemonSink.yaml#/DaemonSinkSettings"
RemoteSinkSettings:
$ref: "/doc/swagger/include/RemoteSink.yaml#/RemoteSinkSettings"
DaemonSourceSettings:
$ref: "/doc/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
SSBModSettings:

Wyświetl plik

@ -2252,14 +2252,14 @@ bool WebAPIRequestMapper::validateChannelSettings(
return false;
}
}
else if (*channelType == "DaemonSink")
else if (*channelType == "RemoteSink")
{
if (channelSettings.getTx() == 0)
{
QJsonObject daemonChannelSinkSettingsJsonObject = jsonObject["DaemonSinkSettings"].toObject();
channelSettingsKeys = daemonChannelSinkSettingsJsonObject.keys();
channelSettings.setDaemonSinkSettings(new SWGSDRangel::SWGDaemonSinkSettings());
channelSettings.getDaemonSinkSettings()->fromJsonObject(daemonChannelSinkSettingsJsonObject);
QJsonObject remoteChannelSinkSettingsJsonObject = jsonObject["RemoteSinkSettings"].toObject();
channelSettingsKeys = remoteChannelSinkSettingsJsonObject.keys();
channelSettings.setRemoteSinkSettings(new SWGSDRangel::SWGRemoteSinkSettings());
channelSettings.getRemoteSinkSettings()->fromJsonObject(remoteChannelSinkSettingsJsonObject);
return true;
}
else {
@ -2518,7 +2518,7 @@ void WebAPIRequestMapper::resetChannelSettings(SWGSDRangel::SWGChannelSettings&
channelSettings.setDsdDemodSettings(0);
channelSettings.setNfmDemodSettings(0);
channelSettings.setNfmModSettings(0);
channelSettings.setDaemonSinkSettings(0);
channelSettings.setRemoteSinkSettings(0);
channelSettings.setDaemonSourceSettings(0);
channelSettings.setSsbDemodSettings(0);
channelSettings.setSsbModSettings(0);

Wyświetl plik

@ -1,5 +1,5 @@
DaemonSinkSettings:
description: "Daemon channel sink settings"
RemoteSinkSettings:
description: "Remote channel sink settings"
properties:
nbFECBlocks:
description: "Number of FEC blocks per frame"

Wyświetl plik

@ -1888,8 +1888,8 @@ definitions:
$ref: "http://localhost:8081/api/swagger/include/NFMDemod.yaml#/NFMDemodSettings"
NFMModSettings:
$ref: "http://localhost:8081/api/swagger/include/NFMMod.yaml#/NFMModSettings"
DaemonSinkSettings:
$ref: "http://localhost:8081/api/swagger/include/DaemonSink.yaml#/DaemonSinkSettings"
RemoteSinkSettings:
$ref: "http://localhost:8081/api/swagger/include/RemoteSink.yaml#/RemoteSinkSettings"
DaemonSourceSettings:
$ref: "http://localhost:8081/api/swagger/include/DaemonSource.yaml#/DaemonSourceSettings"
SSBModSettings:

Wyświetl plik

@ -1813,8 +1813,8 @@ margin-bottom: 20px;
"NFMModSettings" : {
"$ref" : "#/definitions/NFMModSettings"
},
"DaemonSinkSettings" : {
"$ref" : "#/definitions/DaemonSinkSettings"
"RemoteSinkSettings" : {
"$ref" : "#/definitions/RemoteSinkSettings"
},
"DaemonSourceSettings" : {
"$ref" : "#/definitions/DaemonSourceSettings"
@ -2047,49 +2047,6 @@ margin-bottom: 20px;
}
},
"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 = {
"properties" : {
@ -3844,6 +3801,49 @@ margin-bottom: 20px;
}
},
"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 = {
"properties" : {
@ -24373,7 +24373,7 @@ except ApiException as e:
</div>
<div id="generator">
<div class="content">
Generated 2019-01-14T08:33:10.665+01:00
Generated 2019-01-22T23:24:38.456+01:00
</div>
</div>
</div>

Wyświetl plik

@ -46,8 +46,8 @@ SWGChannelSettings::SWGChannelSettings() {
m_nfm_demod_settings_isSet = false;
nfm_mod_settings = nullptr;
m_nfm_mod_settings_isSet = false;
daemon_sink_settings = nullptr;
m_daemon_sink_settings_isSet = false;
remote_sink_settings = nullptr;
m_remote_sink_settings_isSet = false;
daemon_source_settings = nullptr;
m_daemon_source_settings_isSet = false;
ssb_mod_settings = nullptr;
@ -88,8 +88,8 @@ SWGChannelSettings::init() {
m_nfm_demod_settings_isSet = false;
nfm_mod_settings = new SWGNFMModSettings();
m_nfm_mod_settings_isSet = false;
daemon_sink_settings = new SWGDaemonSinkSettings();
m_daemon_sink_settings_isSet = false;
remote_sink_settings = new SWGRemoteSinkSettings();
m_remote_sink_settings_isSet = false;
daemon_source_settings = new SWGDaemonSourceSettings();
m_daemon_source_settings_isSet = false;
ssb_mod_settings = new SWGSSBModSettings();
@ -133,8 +133,8 @@ SWGChannelSettings::cleanup() {
if(nfm_mod_settings != nullptr) {
delete nfm_mod_settings;
}
if(daemon_sink_settings != nullptr) {
delete daemon_sink_settings;
if(remote_sink_settings != nullptr) {
delete remote_sink_settings;
}
if(daemon_source_settings != nullptr) {
delete daemon_source_settings;
@ -188,7 +188,7 @@ SWGChannelSettings::fromJsonObject(QJsonObject &pJson) {
::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");
@ -247,8 +247,8 @@ SWGChannelSettings::asJsonObject() {
if((nfm_mod_settings != nullptr) && (nfm_mod_settings->isSet())){
toJsonValue(QString("NFMModSettings"), nfm_mod_settings, obj, QString("SWGNFMModSettings"));
}
if((daemon_sink_settings != nullptr) && (daemon_sink_settings->isSet())){
toJsonValue(QString("DaemonSinkSettings"), daemon_sink_settings, obj, QString("SWGDaemonSinkSettings"));
if((remote_sink_settings != nullptr) && (remote_sink_settings->isSet())){
toJsonValue(QString("RemoteSinkSettings"), remote_sink_settings, obj, QString("SWGRemoteSinkSettings"));
}
if((daemon_source_settings != nullptr) && (daemon_source_settings->isSet())){
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;
}
SWGDaemonSinkSettings*
SWGChannelSettings::getDaemonSinkSettings() {
return daemon_sink_settings;
SWGRemoteSinkSettings*
SWGChannelSettings::getRemoteSinkSettings() {
return remote_sink_settings;
}
void
SWGChannelSettings::setDaemonSinkSettings(SWGDaemonSinkSettings* daemon_sink_settings) {
this->daemon_sink_settings = daemon_sink_settings;
this->m_daemon_sink_settings_isSet = true;
SWGChannelSettings::setRemoteSinkSettings(SWGRemoteSinkSettings* remote_sink_settings) {
this->remote_sink_settings = remote_sink_settings;
this->m_remote_sink_settings_isSet = true;
}
SWGDaemonSourceSettings*
@ -459,7 +459,7 @@ SWGChannelSettings::isSet(){
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_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(ssb_mod_settings != nullptr && ssb_mod_settings->isSet()){ isObjectUpdated = true; break;}
if(ssb_demod_settings != nullptr && ssb_demod_settings->isSet()){ isObjectUpdated = true; break;}

Wyświetl plik

@ -27,10 +27,10 @@
#include "SWGATVModSettings.h"
#include "SWGBFMDemodSettings.h"
#include "SWGDSDDemodSettings.h"
#include "SWGDaemonSinkSettings.h"
#include "SWGDaemonSourceSettings.h"
#include "SWGNFMDemodSettings.h"
#include "SWGNFMModSettings.h"
#include "SWGRemoteSinkSettings.h"
#include "SWGSSBDemodSettings.h"
#include "SWGSSBModSettings.h"
#include "SWGUDPSinkSettings.h"
@ -84,8 +84,8 @@ public:
SWGNFMModSettings* getNfmModSettings();
void setNfmModSettings(SWGNFMModSettings* nfm_mod_settings);
SWGDaemonSinkSettings* getDaemonSinkSettings();
void setDaemonSinkSettings(SWGDaemonSinkSettings* daemon_sink_settings);
SWGRemoteSinkSettings* getRemoteSinkSettings();
void setRemoteSinkSettings(SWGRemoteSinkSettings* remote_sink_settings);
SWGDaemonSourceSettings* getDaemonSourceSettings();
void setDaemonSourceSettings(SWGDaemonSourceSettings* daemon_source_settings);
@ -139,8 +139,8 @@ private:
SWGNFMModSettings* nfm_mod_settings;
bool m_nfm_mod_settings_isSet;
SWGDaemonSinkSettings* daemon_sink_settings;
bool m_daemon_sink_settings_isSet;
SWGRemoteSinkSettings* remote_sink_settings;
bool m_remote_sink_settings_isSet;
SWGDaemonSourceSettings* daemon_source_settings;
bool m_daemon_source_settings_isSet;

Wyświetl plik

@ -49,7 +49,6 @@
#include "SWGDSDDemodSettings.h"
#include "SWGDVSeralDevices.h"
#include "SWGDVSerialDevice.h"
#include "SWGDaemonSinkSettings.h"
#include "SWGDaemonSourceReport.h"
#include "SWGDaemonSourceSettings.h"
#include "SWGDeviceListItem.h"
@ -100,6 +99,7 @@
#include "SWGRDSReport_altFrequencies.h"
#include "SWGRange.h"
#include "SWGRangeFloat.h"
#include "SWGRemoteSinkSettings.h"
#include "SWGRtlSdrReport.h"
#include "SWGRtlSdrSettings.h"
#include "SWGSDRPlayReport.h"
@ -242,9 +242,6 @@ namespace SWGSDRangel {
if(QString("SWGDVSerialDevice").compare(type) == 0) {
return new SWGDVSerialDevice();
}
if(QString("SWGDaemonSinkSettings").compare(type) == 0) {
return new SWGDaemonSinkSettings();
}
if(QString("SWGDaemonSourceReport").compare(type) == 0) {
return new SWGDaemonSourceReport();
}
@ -395,6 +392,9 @@ namespace SWGSDRangel {
if(QString("SWGRangeFloat").compare(type) == 0) {
return new SWGRangeFloat();
}
if(QString("SWGRemoteSinkSettings").compare(type) == 0) {
return new SWGRemoteSinkSettings();
}
if(QString("SWGRtlSdrReport").compare(type) == 0) {
return new SWGRtlSdrReport();
}

Wyświetl plik

@ -11,7 +11,7 @@
*/
#include "SWGDaemonSinkSettings.h"
#include "SWGRemoteSinkSettings.h"
#include "SWGHelpers.h"
@ -22,12 +22,12 @@
namespace SWGSDRangel {
SWGDaemonSinkSettings::SWGDaemonSinkSettings(QString* json) {
SWGRemoteSinkSettings::SWGRemoteSinkSettings(QString* json) {
init();
this->fromJson(*json);
}
SWGDaemonSinkSettings::SWGDaemonSinkSettings() {
SWGRemoteSinkSettings::SWGRemoteSinkSettings() {
nb_fec_blocks = 0;
m_nb_fec_blocks_isSet = false;
data_address = nullptr;
@ -52,12 +52,12 @@ SWGDaemonSinkSettings::SWGDaemonSinkSettings() {
m_reverse_api_channel_index_isSet = false;
}
SWGDaemonSinkSettings::~SWGDaemonSinkSettings() {
SWGRemoteSinkSettings::~SWGRemoteSinkSettings() {
this->cleanup();
}
void
SWGDaemonSinkSettings::init() {
SWGRemoteSinkSettings::init() {
nb_fec_blocks = 0;
m_nb_fec_blocks_isSet = false;
data_address = new QString("");
@ -83,7 +83,7 @@ SWGDaemonSinkSettings::init() {
}
void
SWGDaemonSinkSettings::cleanup() {
SWGRemoteSinkSettings::cleanup() {
if(data_address != nullptr) {
delete data_address;
@ -103,8 +103,8 @@ SWGDaemonSinkSettings::cleanup() {
}
SWGDaemonSinkSettings*
SWGDaemonSinkSettings::fromJson(QString &json) {
SWGRemoteSinkSettings*
SWGRemoteSinkSettings::fromJson(QString &json) {
QByteArray array (json.toStdString().c_str());
QJsonDocument doc = QJsonDocument::fromJson(array);
QJsonObject jsonObject = doc.object();
@ -113,7 +113,7 @@ SWGDaemonSinkSettings::fromJson(QString &json) {
}
void
SWGDaemonSinkSettings::fromJsonObject(QJsonObject &pJson) {
SWGRemoteSinkSettings::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&nb_fec_blocks, pJson["nbFECBlocks"], "qint32", "");
::SWGSDRangel::setValue(&data_address, pJson["dataAddress"], "QString", "QString");
@ -139,7 +139,7 @@ SWGDaemonSinkSettings::fromJsonObject(QJsonObject &pJson) {
}
QString
SWGDaemonSinkSettings::asJson ()
SWGRemoteSinkSettings::asJson ()
{
QJsonObject* obj = this->asJsonObject();
@ -150,7 +150,7 @@ SWGDaemonSinkSettings::asJson ()
}
QJsonObject*
SWGDaemonSinkSettings::asJsonObject() {
SWGRemoteSinkSettings::asJsonObject() {
QJsonObject* obj = new QJsonObject();
if(m_nb_fec_blocks_isSet){
obj->insert("nbFECBlocks", QJsonValue(nb_fec_blocks));
@ -190,118 +190,118 @@ SWGDaemonSinkSettings::asJsonObject() {
}
qint32
SWGDaemonSinkSettings::getNbFecBlocks() {
SWGRemoteSinkSettings::getNbFecBlocks() {
return nb_fec_blocks;
}
void
SWGDaemonSinkSettings::setNbFecBlocks(qint32 nb_fec_blocks) {
SWGRemoteSinkSettings::setNbFecBlocks(qint32 nb_fec_blocks) {
this->nb_fec_blocks = nb_fec_blocks;
this->m_nb_fec_blocks_isSet = true;
}
QString*
SWGDaemonSinkSettings::getDataAddress() {
SWGRemoteSinkSettings::getDataAddress() {
return data_address;
}
void
SWGDaemonSinkSettings::setDataAddress(QString* data_address) {
SWGRemoteSinkSettings::setDataAddress(QString* data_address) {
this->data_address = data_address;
this->m_data_address_isSet = true;
}
qint32
SWGDaemonSinkSettings::getDataPort() {
SWGRemoteSinkSettings::getDataPort() {
return data_port;
}
void
SWGDaemonSinkSettings::setDataPort(qint32 data_port) {
SWGRemoteSinkSettings::setDataPort(qint32 data_port) {
this->data_port = data_port;
this->m_data_port_isSet = true;
}
qint32
SWGDaemonSinkSettings::getTxDelay() {
SWGRemoteSinkSettings::getTxDelay() {
return tx_delay;
}
void
SWGDaemonSinkSettings::setTxDelay(qint32 tx_delay) {
SWGRemoteSinkSettings::setTxDelay(qint32 tx_delay) {
this->tx_delay = tx_delay;
this->m_tx_delay_isSet = true;
}
qint32
SWGDaemonSinkSettings::getRgbColor() {
SWGRemoteSinkSettings::getRgbColor() {
return rgb_color;
}
void
SWGDaemonSinkSettings::setRgbColor(qint32 rgb_color) {
SWGRemoteSinkSettings::setRgbColor(qint32 rgb_color) {
this->rgb_color = rgb_color;
this->m_rgb_color_isSet = true;
}
QString*
SWGDaemonSinkSettings::getTitle() {
SWGRemoteSinkSettings::getTitle() {
return title;
}
void
SWGDaemonSinkSettings::setTitle(QString* title) {
SWGRemoteSinkSettings::setTitle(QString* title) {
this->title = title;
this->m_title_isSet = true;
}
qint32
SWGDaemonSinkSettings::getUseReverseApi() {
SWGRemoteSinkSettings::getUseReverseApi() {
return use_reverse_api;
}
void
SWGDaemonSinkSettings::setUseReverseApi(qint32 use_reverse_api) {
SWGRemoteSinkSettings::setUseReverseApi(qint32 use_reverse_api) {
this->use_reverse_api = use_reverse_api;
this->m_use_reverse_api_isSet = true;
}
QString*
SWGDaemonSinkSettings::getReverseApiAddress() {
SWGRemoteSinkSettings::getReverseApiAddress() {
return reverse_api_address;
}
void
SWGDaemonSinkSettings::setReverseApiAddress(QString* reverse_api_address) {
SWGRemoteSinkSettings::setReverseApiAddress(QString* reverse_api_address) {
this->reverse_api_address = reverse_api_address;
this->m_reverse_api_address_isSet = true;
}
qint32
SWGDaemonSinkSettings::getReverseApiPort() {
SWGRemoteSinkSettings::getReverseApiPort() {
return reverse_api_port;
}
void
SWGDaemonSinkSettings::setReverseApiPort(qint32 reverse_api_port) {
SWGRemoteSinkSettings::setReverseApiPort(qint32 reverse_api_port) {
this->reverse_api_port = reverse_api_port;
this->m_reverse_api_port_isSet = true;
}
qint32
SWGDaemonSinkSettings::getReverseApiDeviceIndex() {
SWGRemoteSinkSettings::getReverseApiDeviceIndex() {
return reverse_api_device_index;
}
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->m_reverse_api_device_index_isSet = true;
}
qint32
SWGDaemonSinkSettings::getReverseApiChannelIndex() {
SWGRemoteSinkSettings::getReverseApiChannelIndex() {
return reverse_api_channel_index;
}
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->m_reverse_api_channel_index_isSet = true;
}
bool
SWGDaemonSinkSettings::isSet(){
SWGRemoteSinkSettings::isSet(){
bool isObjectUpdated = false;
do{
if(m_nb_fec_blocks_isSet){ isObjectUpdated = true; break;}

Wyświetl plik

@ -11,13 +11,13 @@
*/
/*
* SWGDaemonSinkSettings.h
* SWGRemoteSinkSettings.h
*
* Daemon channel sink settings
* Remote channel sink settings
*/
#ifndef SWGDaemonSinkSettings_H_
#define SWGDaemonSinkSettings_H_
#ifndef SWGRemoteSinkSettings_H_
#define SWGRemoteSinkSettings_H_
#include <QJsonObject>
@ -29,18 +29,18 @@
namespace SWGSDRangel {
class SWG_API SWGDaemonSinkSettings: public SWGObject {
class SWG_API SWGRemoteSinkSettings: public SWGObject {
public:
SWGDaemonSinkSettings();
SWGDaemonSinkSettings(QString* json);
virtual ~SWGDaemonSinkSettings();
SWGRemoteSinkSettings();
SWGRemoteSinkSettings(QString* json);
virtual ~SWGRemoteSinkSettings();
void init();
void cleanup();
virtual QString asJson () override;
virtual QJsonObject* asJsonObject() override;
virtual void fromJsonObject(QJsonObject &json) override;
virtual SWGDaemonSinkSettings* fromJson(QString &jsonString) override;
virtual SWGRemoteSinkSettings* fromJson(QString &jsonString) override;
qint32 getNbFecBlocks();
void setNbFecBlocks(qint32 nb_fec_blocks);
@ -116,4 +116,4 @@ private:
}
#endif /* SWGDaemonSinkSettings_H_ */
#endif /* SWGRemoteSinkSettings_H_ */