From 4fe16095d4ce4cdcf68e0da4375cb1c791119d64 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 3 Feb 2019 00:26:26 +0100 Subject: [PATCH] Rename SDRDaemonSource device plugin to RemoteInput (1) --- ...monFEC_plugin.xcf => RemoteFEC_plugin.xcf} | Bin ..._plugin_01.xcf => RemoteFEC_plugin_01.xcf} | Bin ..._plugin_04.xcf => RemoteFEC_plugin_04.xcf} | Bin ...urce_plugin.png => RemoteInput_plugin.png} | Bin ...urce_plugin.xcf => RemoteInput_plugin.xcf} | Bin ...lugin_01.png => RemoteInput_plugin_01.png} | Bin ...lugin_01.xcf => RemoteInput_plugin_01.xcf} | Bin ...lugin_02.png => RemoteInput_plugin_02.png} | Bin ...lugin_02.xcf => RemoteInput_plugin_02.xcf} | Bin ...lugin_04.png => RemoteInput_plugin_04.png} | Bin ...lugin_04.xcf => RemoteInput_plugin_04.xcf} | Bin ...lugin_05.png => RemoteInput_plugin_05.png} | Bin ...lugin_05.xcf => RemoteInput_plugin_05.xcf} | Bin ...lugin_06.png => RemoteInput_plugin_06.png} | Bin ...lugin_06.xcf => RemoteInput_plugin_06.xcf} | Bin doc/img/SDRdaemon_plugin.png | Bin 36985 -> 0 bytes doc/img/SDRdaemon_plugin.xcf | Bin 233738 -> 0 bytes doc/img/SDRdaemon_plugin_04.png | Bin 4643 -> 0 bytes doc/img/SDRdaemon_plugin_04.xcf | Bin 26493 -> 0 bytes doc/img/SDRdaemon_plugin_05.png | Bin 5989 -> 0 bytes doc/img/SDRdaemon_plugin_05.xcf | Bin 31862 -> 0 bytes doc/img/SDRdaemon_plugin_06.png | Bin 5731 -> 0 bytes doc/img/SDRdaemon_plugin_06.xcf | Bin 19147 -> 0 bytes doc/img/SDRdaemon_plugin_07.png | Bin 10762 -> 0 bytes doc/img/SDRdaemon_plugin_07.xcf | Bin 33552 -> 0 bytes plugins/samplesink/remoteoutput/readme.md | 4 +- plugins/samplesource/CMakeLists.txt | 4 +- .../samplesource/remoteinput/CMakeLists.txt | 85 ++++++++++ .../readme.md | 20 +-- .../remoteinput.cpp} | 138 ++++++++-------- .../remoteinput.h} | 73 ++++----- .../remoteinput.pro} | 28 ++-- .../remoteinputbuffer.cpp} | 38 ++--- .../remoteinputbuffer.h} | 22 +-- .../remoteinputgui.cpp} | 150 +++++++++--------- .../remoteinputgui.h} | 22 +-- .../remoteinputgui.ui} | 6 +- .../remoteinputplugin.cpp} | 36 ++--- .../remoteinputplugin.h} | 14 +- .../remoteinputsettings.cpp} | 10 +- .../remoteinputsettings.h} | 10 +- .../remoteinputudphandler.cpp} | 94 +++++------ .../remoteinputudphandler.h} | 24 +-- .../sdrdaemonsource/CMakeLists.txt | 86 ---------- pluginssrv/samplesource/CMakeLists.txt | 4 +- .../samplesource/remoteinput/CMakeLists.txt | 75 +++++++++ .../sdrdaemonsource/CMakeLists.txt | 75 --------- 47 files changed, 509 insertions(+), 509 deletions(-) rename doc/img/{SDRdaemonFEC_plugin.xcf => RemoteFEC_plugin.xcf} (100%) rename doc/img/{SDRdaemonFEC_plugin_01.xcf => RemoteFEC_plugin_01.xcf} (100%) rename doc/img/{SDRdaemonFEC_plugin_04.xcf => RemoteFEC_plugin_04.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin.png => RemoteInput_plugin.png} (100%) rename doc/img/{SDRdaemonSource_plugin.xcf => RemoteInput_plugin.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin_01.png => RemoteInput_plugin_01.png} (100%) rename doc/img/{SDRdaemonSource_plugin_01.xcf => RemoteInput_plugin_01.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin_02.png => RemoteInput_plugin_02.png} (100%) rename doc/img/{SDRdaemonSource_plugin_02.xcf => RemoteInput_plugin_02.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin_04.png => RemoteInput_plugin_04.png} (100%) rename doc/img/{SDRdaemonSource_plugin_04.xcf => RemoteInput_plugin_04.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin_05.png => RemoteInput_plugin_05.png} (100%) rename doc/img/{SDRdaemonSource_plugin_05.xcf => RemoteInput_plugin_05.xcf} (100%) rename doc/img/{SDRdaemonSource_plugin_06.png => RemoteInput_plugin_06.png} (100%) rename doc/img/{SDRdaemonSource_plugin_06.xcf => RemoteInput_plugin_06.xcf} (100%) delete mode 100644 doc/img/SDRdaemon_plugin.png delete mode 100644 doc/img/SDRdaemon_plugin.xcf delete mode 100644 doc/img/SDRdaemon_plugin_04.png delete mode 100644 doc/img/SDRdaemon_plugin_04.xcf delete mode 100644 doc/img/SDRdaemon_plugin_05.png delete mode 100644 doc/img/SDRdaemon_plugin_05.xcf delete mode 100644 doc/img/SDRdaemon_plugin_06.png delete mode 100644 doc/img/SDRdaemon_plugin_06.xcf delete mode 100644 doc/img/SDRdaemon_plugin_07.png delete mode 100644 doc/img/SDRdaemon_plugin_07.xcf create mode 100644 plugins/samplesource/remoteinput/CMakeLists.txt rename plugins/samplesource/{sdrdaemonsource => remoteinput}/readme.md (91%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceinput.cpp => remoteinput/remoteinput.cpp} (75%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceinput.h => remoteinput/remoteinput.h} (80%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsource.pro => remoteinput/remoteinput.pro} (78%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcebuffer.cpp => remoteinput/remoteinputbuffer.cpp} (91%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcebuffer.h => remoteinput/remoteinputbuffer.h} (92%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcegui.cpp => remoteinput/remoteinputgui.cpp} (73%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcegui.h => remoteinput/remoteinputgui.h} (89%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcegui.ui => remoteinput/remoteinputgui.ui} (99%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceplugin.cpp => remoteinput/remoteinputplugin.cpp} (68%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceplugin.h => remoteinput/remoteinputplugin.h} (83%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcesettings.cpp => remoteinput/remoteinputsettings.cpp} (92%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourcesettings.h => remoteinput/remoteinputsettings.h} (85%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceudphandler.cpp => remoteinput/remoteinputudphandler.cpp} (70%) rename plugins/samplesource/{sdrdaemonsource/sdrdaemonsourceudphandler.h => remoteinput/remoteinputudphandler.h} (80%) delete mode 100644 plugins/samplesource/sdrdaemonsource/CMakeLists.txt create mode 100644 pluginssrv/samplesource/remoteinput/CMakeLists.txt delete mode 100644 pluginssrv/samplesource/sdrdaemonsource/CMakeLists.txt diff --git a/doc/img/SDRdaemonFEC_plugin.xcf b/doc/img/RemoteFEC_plugin.xcf similarity index 100% rename from doc/img/SDRdaemonFEC_plugin.xcf rename to doc/img/RemoteFEC_plugin.xcf diff --git a/doc/img/SDRdaemonFEC_plugin_01.xcf b/doc/img/RemoteFEC_plugin_01.xcf similarity index 100% rename from doc/img/SDRdaemonFEC_plugin_01.xcf rename to doc/img/RemoteFEC_plugin_01.xcf diff --git a/doc/img/SDRdaemonFEC_plugin_04.xcf b/doc/img/RemoteFEC_plugin_04.xcf similarity index 100% rename from doc/img/SDRdaemonFEC_plugin_04.xcf rename to doc/img/RemoteFEC_plugin_04.xcf diff --git a/doc/img/SDRdaemonSource_plugin.png b/doc/img/RemoteInput_plugin.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin.png rename to doc/img/RemoteInput_plugin.png diff --git a/doc/img/SDRdaemonSource_plugin.xcf b/doc/img/RemoteInput_plugin.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin.xcf rename to doc/img/RemoteInput_plugin.xcf diff --git a/doc/img/SDRdaemonSource_plugin_01.png b/doc/img/RemoteInput_plugin_01.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin_01.png rename to doc/img/RemoteInput_plugin_01.png diff --git a/doc/img/SDRdaemonSource_plugin_01.xcf b/doc/img/RemoteInput_plugin_01.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin_01.xcf rename to doc/img/RemoteInput_plugin_01.xcf diff --git a/doc/img/SDRdaemonSource_plugin_02.png b/doc/img/RemoteInput_plugin_02.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin_02.png rename to doc/img/RemoteInput_plugin_02.png diff --git a/doc/img/SDRdaemonSource_plugin_02.xcf b/doc/img/RemoteInput_plugin_02.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin_02.xcf rename to doc/img/RemoteInput_plugin_02.xcf diff --git a/doc/img/SDRdaemonSource_plugin_04.png b/doc/img/RemoteInput_plugin_04.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin_04.png rename to doc/img/RemoteInput_plugin_04.png diff --git a/doc/img/SDRdaemonSource_plugin_04.xcf b/doc/img/RemoteInput_plugin_04.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin_04.xcf rename to doc/img/RemoteInput_plugin_04.xcf diff --git a/doc/img/SDRdaemonSource_plugin_05.png b/doc/img/RemoteInput_plugin_05.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin_05.png rename to doc/img/RemoteInput_plugin_05.png diff --git a/doc/img/SDRdaemonSource_plugin_05.xcf b/doc/img/RemoteInput_plugin_05.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin_05.xcf rename to doc/img/RemoteInput_plugin_05.xcf diff --git a/doc/img/SDRdaemonSource_plugin_06.png b/doc/img/RemoteInput_plugin_06.png similarity index 100% rename from doc/img/SDRdaemonSource_plugin_06.png rename to doc/img/RemoteInput_plugin_06.png diff --git a/doc/img/SDRdaemonSource_plugin_06.xcf b/doc/img/RemoteInput_plugin_06.xcf similarity index 100% rename from doc/img/SDRdaemonSource_plugin_06.xcf rename to doc/img/RemoteInput_plugin_06.xcf diff --git a/doc/img/SDRdaemon_plugin.png b/doc/img/SDRdaemon_plugin.png deleted file mode 100644 index 053c7e539d6934d0f52deda411d13611373d8881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36985 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 diff --git a/doc/img/SDRdaemon_plugin.xcf b/doc/img/SDRdaemon_plugin.xcf deleted file mode 100644 index 92222c408712684a8f96771351630d7f7a10ef09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233738 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 TZ-(W3tEMgcdMJneq!#&aW`(}s diff --git a/doc/img/SDRdaemon_plugin_04.png b/doc/img/SDRdaemon_plugin_04.png deleted file mode 100644 index 58b511e8d301ad1ec0af56ebf6ddb39fb2082614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4643 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 diff --git a/doc/img/SDRdaemon_plugin_04.xcf b/doc/img/SDRdaemon_plugin_04.xcf deleted file mode 100644 index fd9e8ea640dd55816c3ae4d17d50477ddc264390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26493 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 diff --git a/doc/img/SDRdaemon_plugin_06.png b/doc/img/SDRdaemon_plugin_06.png deleted file mode 100644 index 5241d8fcf924df71f0658171e45d5a2e802f11cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5731 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 SmlpJXA#zg6lBKVV1OEqeoBP86 diff --git a/doc/img/SDRdaemon_plugin_06.xcf b/doc/img/SDRdaemon_plugin_06.xcf deleted file mode 100644 index bd910c1740eda9805d18f6507cf95f6bb4eb4b5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19147 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 diff --git a/plugins/samplesink/remoteoutput/readme.md b/plugins/samplesink/remoteoutput/readme.md index 3ea096b6d..e3f53e7a1 100644 --- a/plugins/samplesink/remoteoutput/readme.md +++ b/plugins/samplesink/remoteoutput/readme.md @@ -115,7 +115,7 @@ This is the detail of the ratio shown in the gauge. Each frame block is a block

9: Distant server API address and port

-![SDR Remote input stream GUI](../../../doc/img/SDRdaemonSource_plugin_05.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_05.png)

9.1: API connection indicator

@@ -135,7 +135,7 @@ When the return key is hit within the address (9.2) or port (9.3) the changes ar

10: Local data address and port

-![SDR Remote input stream GUI](../../../doc/img/SDRdaemonSource_plugin_06.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_06.png)

10.1: Data IP address

diff --git a/plugins/samplesource/CMakeLists.txt b/plugins/samplesource/CMakeLists.txt index 2e09fe99c..d093126ec 100644 --- a/plugins/samplesource/CMakeLists.txt +++ b/plugins/samplesource/CMakeLists.txt @@ -67,7 +67,7 @@ endif(LIBUSB_FOUND AND LIBRTLSDR_FOUND) find_package(CM256cc) if(CM256CC_FOUND) - add_subdirectory(sdrdaemonsource) + add_subdirectory(remoteinput) endif(CM256CC_FOUND) find_package(LibMiriSDR) @@ -96,7 +96,7 @@ if (BUILD_DEBIAN) add_subdirectory(perseus) add_subdirectory(plutosdrinput) add_subdirectory(rtlsdr) - add_subdirectory(sdrdaemonsource) + add_subdirectory(remoteinput) add_subdirectory(sdrplay) add_subdirectory(soapysdrinput) endif (BUILD_DEBIAN) diff --git a/plugins/samplesource/remoteinput/CMakeLists.txt b/plugins/samplesource/remoteinput/CMakeLists.txt new file mode 100644 index 000000000..3010c931c --- /dev/null +++ b/plugins/samplesource/remoteinput/CMakeLists.txt @@ -0,0 +1,85 @@ +project(remoteinput) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +if (HAS_SSSE3) + message(STATUS "RemoteInput: use SSSE3 SIMD" ) +elseif (HAS_NEON) + message(STATUS "RemoteInput: use Neon SIMD" ) +else() + message(STATUS "RemoteInput: Unsupported architecture") + return() +endif() + +set(remoteinput_SOURCES + remoteinputbuffer.cpp + remoteinputudphandler.cpp + remoteinputgui.cpp + remoteinput.cpp + remoteinputsettings.cpp + remoteinputplugin.cpp +) + +set(sremoteinput_HEADERS + remoteinputbuffer.h + remoteinputudphandler.h + remoteinputgui.h + remoteinput.h + remoteinputsettings.h + remoteinputplugin.h +) + +set(remoteinput_FORMS + remoteinputgui.ui +) + +#include(${QT_USE_FILE}) +add_definitions(${QT_DEFINITIONS}) +add_definitions(-DQT_PLUGIN) +add_definitions(-DQT_SHARED) + +qt5_wrap_ui(remoteinput_FORMS_HEADERS ${remoteinput_FORMS}) + +add_library(inputremote SHARED + ${remoteinput_SOURCES} + ${remoteinput_HEADERS_MOC} + ${remoteinput_FORMS_HEADERS} +) + +if (BUILD_DEBIAN) +target_include_directories(inputremote PUBLIC + . + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${LIBCM256CCSRC} +) +else (BUILD_DEBIAN) +target_include_directories(inputremote 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(inputremote + ${QT_LIBRARIES} + cm256cc + sdrbase + sdrgui + swagger +) +else (BUILD_DEBIAN) +target_link_libraries(inputremote + ${QT_LIBRARIES} + ${CM256CC_LIBRARIES} + sdrbase + sdrgui + swagger +) +endif (BUILD_DEBIAN) + +target_link_libraries(inputremote Qt5::Core Qt5::Widgets) + +install(TARGETS inputremote DESTINATION lib/plugins/samplesource) diff --git a/plugins/samplesource/sdrdaemonsource/readme.md b/plugins/samplesource/remoteinput/readme.md similarity index 91% rename from plugins/samplesource/sdrdaemonsource/readme.md rename to plugins/samplesource/remoteinput/readme.md index 35849d50c..e6fe6a88f 100644 --- a/plugins/samplesource/sdrdaemonsource/readme.md +++ b/plugins/samplesource/remoteinput/readme.md @@ -1,8 +1,8 @@ -

SDRdaemon source plugin

+

Remote input plugin

Introduction

-This input sample source plugin gets its samples over tbe network from a SDRangel instance's Daemon channel sink using UDP connection. +This input sample source plugin gets its samples over tbe network from a SDRangel instance's Remote channel sink using UDP connection. Forward Error Correction with a Cauchy MDS block erasure codec is used to prevent block loss. This can make the UDP transmission more robust particularly over WiFi links. @@ -20,15 +20,15 @@ The plugin will be built only if the [CM256cc library](https://github.com/f4exb/

Interface

-![SDR Daemon source input plugin GUI](../../../doc/img/SDRdaemonSource_plugin.png) +![SDR Remote input plugin GUI](../../../doc/img/RemoteInput_plugin.png)

1: Common stream parameters

-![SDR Daemon source input stream GUI](../../../doc/img/SDRdaemonSource_plugin_01.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_01.png)

1.1: Frequency

-This is the center frequency in kHz sent in the meta data from the distant SDRdaemon instance and corresponds to the center frequency of reception. +This is the center frequency in kHz sent in the meta data from the distant SDRangel instance and corresponds to the center frequency of reception.

1.2: Start/Stop

@@ -47,7 +47,7 @@ Stream I/Q sample rate in kS/s

2: Auto correction options and stream status

-![SDR Daemon source input stream GUI](../../../doc/img/SDRdaemonSource_plugin_02.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_02.png)

2.1: Auto correction options

@@ -71,7 +71,7 @@ This corresponds to the value shown in the gauges above (9)

2.4: Date/time

-This is the current timestamp of the block of data sent from the receiver. It is refreshed about every second. The plugin tries to take into account the buffer that is used between the data received from the network and the data effectively used by the system however this may not be extremely accurate. It is based on the timestamps sent from the SDRdaemon utility at the other hand that does not take into account its own buffers. +This is the current timestamp of the block of data sent from the receiver. It is refreshed about every second. The plugin tries to take into account the buffer that is used between the data received from the network and the data effectively used by the system however this may not be extremely accurate. It is based on the timestamps sent from the Remote sink channel at the other hand that does not take into account its own buffers.

3: Main buffer R/W pointers gauge

@@ -84,7 +84,7 @@ The system tries to compensate read / write unbalance however at start or when a

4: Data stream status

-![SDR Daemon source input stream GUI](../../../doc/img/SDRdaemonSource_plugin_04.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_04.png)

4.1: Sample size

@@ -134,7 +134,7 @@ This HH:mm:ss time display shows the time since the reset events counters button

5: Distant server API address and port

-![SDR Daemon source input stream GUI](../../../doc/img/SDRdaemonSource_plugin_05.png) +![SDR Remote input stream GUI](../../../doc/img/RemoteInput_plugin_05.png)

5.1: API connection indicator

@@ -154,7 +154,7 @@ When the return key is hit within the address (5.2) or port (5.3) the changes ar

6: Local data address and port

-![SDR Daemon source input stream GUI](../../../doc/img/SDRdaemonSource_plugin_06.png) +![SDR Remote source input stream GUI](../../../doc/img/RemoteInput_plugin_06.png)

6.1: Data IP address

diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp b/plugins/samplesource/remoteinput/remoteinput.cpp similarity index 75% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp rename to plugins/samplesource/remoteinput/remoteinput.cpp index 3a2bc1e9f..7dd4470d2 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp +++ b/plugins/samplesource/remoteinput/remoteinput.cpp @@ -32,26 +32,26 @@ #include "device/devicesourceapi.h" #include "dsp/filerecord.h" -#include "sdrdaemonsourceinput.h" -#include "sdrdaemonsourceudphandler.h" +#include "remoteinput.h" +#include "remoteinputudphandler.h" -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgConfigureSDRdaemonSource, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgConfigureSDRdaemonStreamTiming, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgReportSDRdaemonAcquisition, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgFileRecord, Message) -MESSAGE_CLASS_DEFINITION(SDRdaemonSourceInput::MsgStartStop, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgConfigureRemoteInput, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgConfigureRemoteInputTiming, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgReportRemoteInputAcquisition, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgReportRemoteInputStreamData, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgReportRemoteInputStreamTiming, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgFileRecord, Message) +MESSAGE_CLASS_DEFINITION(RemoteInput::MsgStartStop, Message) -SDRdaemonSourceInput::SDRdaemonSourceInput(DeviceSourceAPI *deviceAPI) : +RemoteInput::RemoteInput(DeviceSourceAPI *deviceAPI) : m_deviceAPI(deviceAPI), m_settings(), - m_SDRdaemonUDPHandler(0), + m_remoteInputUDPHandler(0), m_deviceDescription(), m_startingTimeStamp(0) { m_sampleFifo.setSize(96000 * 4); - m_SDRdaemonUDPHandler = new SDRdaemonSourceUDPHandler(&m_sampleFifo, m_deviceAPI); + m_remoteInputUDPHandler = new RemoteInputUDPHandler(&m_sampleFifo, m_deviceAPI); m_fileSink = new FileRecord(QString("test_%1.sdriq").arg(m_deviceAPI->getDeviceUID())); m_deviceAPI->addSink(m_fileSink); @@ -60,45 +60,45 @@ SDRdaemonSourceInput::SDRdaemonSourceInput(DeviceSourceAPI *deviceAPI) : connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); } -SDRdaemonSourceInput::~SDRdaemonSourceInput() +RemoteInput::~RemoteInput() { disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; stop(); m_deviceAPI->removeSink(m_fileSink); delete m_fileSink; - delete m_SDRdaemonUDPHandler; + delete m_remoteInputUDPHandler; } -void SDRdaemonSourceInput::destroy() +void RemoteInput::destroy() { delete this; } -void SDRdaemonSourceInput::init() +void RemoteInput::init() { applySettings(m_settings, true); } -bool SDRdaemonSourceInput::start() +bool RemoteInput::start() { - qDebug() << "SDRdaemonSourceInput::start"; - m_SDRdaemonUDPHandler->start(); + qDebug() << "RemoteInput::start"; + m_remoteInputUDPHandler->start(); return true; } -void SDRdaemonSourceInput::stop() +void RemoteInput::stop() { - qDebug() << "SDRdaemonSourceInput::stop"; - m_SDRdaemonUDPHandler->stop(); + qDebug() << "RemoteInput::stop"; + m_remoteInputUDPHandler->stop(); } -QByteArray SDRdaemonSourceInput::serialize() const +QByteArray RemoteInput::serialize() const { return m_settings.serialize(); } -bool SDRdaemonSourceInput::deserialize(const QByteArray& data) +bool RemoteInput::deserialize(const QByteArray& data) { bool success = true; @@ -108,55 +108,55 @@ bool SDRdaemonSourceInput::deserialize(const QByteArray& data) success = false; } - MsgConfigureSDRdaemonSource* message = MsgConfigureSDRdaemonSource::create(m_settings, true); + MsgConfigureRemoteInput* message = MsgConfigureRemoteInput::create(m_settings, true); m_inputMessageQueue.push(message); if (m_guiMessageQueue) { - MsgConfigureSDRdaemonSource* messageToGUI = MsgConfigureSDRdaemonSource::create(m_settings, true); + MsgConfigureRemoteInput* messageToGUI = MsgConfigureRemoteInput::create(m_settings, true); m_guiMessageQueue->push(messageToGUI); } return success; } -void SDRdaemonSourceInput::setMessageQueueToGUI(MessageQueue *queue) +void RemoteInput::setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; - m_SDRdaemonUDPHandler->setMessageQueueToGUI(queue); + m_remoteInputUDPHandler->setMessageQueueToGUI(queue); } -const QString& SDRdaemonSourceInput::getDeviceDescription() const +const QString& RemoteInput::getDeviceDescription() const { return m_deviceDescription; } -int SDRdaemonSourceInput::getSampleRate() const +int RemoteInput::getSampleRate() const { - return m_SDRdaemonUDPHandler->getSampleRate(); + return m_remoteInputUDPHandler->getSampleRate(); } -quint64 SDRdaemonSourceInput::getCenterFrequency() const +quint64 RemoteInput::getCenterFrequency() const { - return m_SDRdaemonUDPHandler->getCenterFrequency(); + return m_remoteInputUDPHandler->getCenterFrequency(); } -void SDRdaemonSourceInput::setCenterFrequency(qint64 centerFrequency) +void RemoteInput::setCenterFrequency(qint64 centerFrequency) { (void) centerFrequency; } -std::time_t SDRdaemonSourceInput::getStartingTimeStamp() const +std::time_t RemoteInput::getStartingTimeStamp() const { return m_startingTimeStamp; } -bool SDRdaemonSourceInput::isStreaming() const +bool RemoteInput::isStreaming() const { - return m_SDRdaemonUDPHandler->isStreaming(); + return m_remoteInputUDPHandler->isStreaming(); } -bool SDRdaemonSourceInput::handleMessage(const Message& message) +bool RemoteInput::handleMessage(const Message& message) { if (DSPSignalNotification::match(message)) { @@ -166,7 +166,7 @@ bool SDRdaemonSourceInput::handleMessage(const Message& message) else if (MsgFileRecord::match(message)) { MsgFileRecord& conf = (MsgFileRecord&) message; - qDebug() << "SDRdaemonSourceInput::handleMessage: MsgFileRecord: " << conf.getStartStop(); + qDebug() << "RemoteInput::handleMessage: MsgFileRecord: " << conf.getStartStop(); if (conf.getStartStop()) { @@ -188,7 +188,7 @@ bool SDRdaemonSourceInput::handleMessage(const Message& message) else if (MsgStartStop::match(message)) { MsgStartStop& cmd = (MsgStartStop&) message; - qDebug() << "SDRdaemonSourceInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop"); + qDebug() << "RemoteInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop"); if (cmd.getStartStop()) { @@ -208,10 +208,10 @@ bool SDRdaemonSourceInput::handleMessage(const Message& message) return true; } - else if (MsgConfigureSDRdaemonSource::match(message)) + else if (MsgConfigureRemoteInput::match(message)) { - qDebug() << "SDRdaemonSourceInput::handleMessage:" << message.getIdentifier(); - MsgConfigureSDRdaemonSource& conf = (MsgConfigureSDRdaemonSource&) message; + qDebug() << "RemoteInput::handleMessage:" << message.getIdentifier(); + MsgConfigureRemoteInput& conf = (MsgConfigureRemoteInput&) message; applySettings(conf.getSettings(), conf.getForce()); return true; } @@ -221,12 +221,12 @@ bool SDRdaemonSourceInput::handleMessage(const Message& message) } } -void SDRdaemonSourceInput::applySettings(const SDRdaemonSourceSettings& settings, bool force) +void RemoteInput::applySettings(const RemoteInputSettings& settings, bool force) { QMutexLocker mutexLocker(&m_mutex); std::ostringstream os; QString remoteAddress; - m_SDRdaemonUDPHandler->getRemoteAddress(remoteAddress); + m_remoteInputUDPHandler->getRemoteAddress(remoteAddress); QList reverseAPIKeys; if ((m_settings.m_dcBlock != settings.m_dcBlock) || force) { @@ -254,13 +254,13 @@ void SDRdaemonSourceInput::applySettings(const SDRdaemonSourceSettings& settings if ((m_settings.m_dcBlock != settings.m_dcBlock) || (m_settings.m_iqCorrection != settings.m_iqCorrection) || force) { m_deviceAPI->configureCorrections(settings.m_dcBlock, settings.m_iqCorrection); - qDebug("SDRdaemonSourceInput::applySettings: corrections: DC block: %s IQ imbalance: %s", + qDebug("RemoteInput::applySettings: corrections: DC block: %s IQ imbalance: %s", settings.m_dcBlock ? "true" : "false", settings.m_iqCorrection ? "true" : "false"); } - m_SDRdaemonUDPHandler->configureUDPLink(settings.m_dataAddress, settings.m_dataPort); - m_SDRdaemonUDPHandler->getRemoteAddress(remoteAddress); + m_remoteInputUDPHandler->configureUDPLink(settings.m_dataAddress, settings.m_dataPort); + m_remoteInputUDPHandler->getRemoteAddress(remoteAddress); mutexLocker.unlock(); @@ -276,7 +276,7 @@ void SDRdaemonSourceInput::applySettings(const SDRdaemonSourceSettings& settings m_settings = settings; m_remoteAddress = remoteAddress; - qDebug() << "SDRdaemonSourceInput::applySettings: " + qDebug() << "RemoteInput::applySettings: " << " m_dataAddress: " << m_settings.m_dataAddress << " m_dataPort: " << m_settings.m_dataPort << " m_apiAddress: " << m_settings.m_apiAddress @@ -284,7 +284,7 @@ void SDRdaemonSourceInput::applySettings(const SDRdaemonSourceSettings& settings << " m_remoteAddress: " << m_remoteAddress; } -int SDRdaemonSourceInput::webapiRunGet( +int RemoteInput::webapiRunGet( SWGSDRangel::SWGDeviceState& response, QString& errorMessage) { @@ -293,7 +293,7 @@ int SDRdaemonSourceInput::webapiRunGet( return 200; } -int SDRdaemonSourceInput::webapiRun( +int RemoteInput::webapiRun( bool run, SWGSDRangel::SWGDeviceState& response, QString& errorMessage) @@ -312,7 +312,7 @@ int SDRdaemonSourceInput::webapiRun( return 200; } -int SDRdaemonSourceInput::webapiSettingsGet( +int RemoteInput::webapiSettingsGet( SWGSDRangel::SWGDeviceSettings& response, QString& errorMessage) { @@ -323,14 +323,14 @@ int SDRdaemonSourceInput::webapiSettingsGet( return 200; } -int SDRdaemonSourceInput::webapiSettingsPutPatch( +int RemoteInput::webapiSettingsPutPatch( bool force, const QStringList& deviceSettingsKeys, SWGSDRangel::SWGDeviceSettings& response, // query + response QString& errorMessage) { (void) errorMessage; - SDRdaemonSourceSettings settings = m_settings; + RemoteInputSettings settings = m_settings; if (deviceSettingsKeys.contains("apiAddress")) { settings.m_apiAddress = *response.getSdrDaemonSourceSettings()->getApiAddress(); @@ -366,12 +366,12 @@ int SDRdaemonSourceInput::webapiSettingsPutPatch( settings.m_reverseAPIDeviceIndex = response.getSdrDaemonSourceSettings()->getReverseApiDeviceIndex(); } - MsgConfigureSDRdaemonSource *msg = MsgConfigureSDRdaemonSource::create(settings, force); + MsgConfigureRemoteInput *msg = MsgConfigureRemoteInput::create(settings, force); m_inputMessageQueue.push(msg); if (m_guiMessageQueue) // forward to GUI if any { - MsgConfigureSDRdaemonSource *msgToGUI = MsgConfigureSDRdaemonSource::create(settings, force); + MsgConfigureRemoteInput *msgToGUI = MsgConfigureRemoteInput::create(settings, force); m_guiMessageQueue->push(msgToGUI); } @@ -379,7 +379,7 @@ int SDRdaemonSourceInput::webapiSettingsPutPatch( return 200; } -void SDRdaemonSourceInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const SDRdaemonSourceSettings& settings) +void RemoteInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const RemoteInputSettings& settings) { response.getSdrDaemonSourceSettings()->setApiAddress(new QString(settings.m_apiAddress)); response.getSdrDaemonSourceSettings()->setApiPort(settings.m_apiPort); @@ -406,7 +406,7 @@ void SDRdaemonSourceInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSett response.getSdrDaemonSourceSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex); } -int SDRdaemonSourceInput::webapiReportGet( +int RemoteInput::webapiReportGet( SWGSDRangel::SWGDeviceReport& response, QString& errorMessage) { @@ -417,20 +417,20 @@ int SDRdaemonSourceInput::webapiReportGet( return 200; } -void SDRdaemonSourceInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) +void RemoteInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) { - response.getSdrDaemonSourceReport()->setCenterFrequency(m_SDRdaemonUDPHandler->getCenterFrequency()); - response.getSdrDaemonSourceReport()->setSampleRate(m_SDRdaemonUDPHandler->getSampleRate()); - response.getSdrDaemonSourceReport()->setBufferRwBalance(m_SDRdaemonUDPHandler->getBufferGauge()); + response.getSdrDaemonSourceReport()->setCenterFrequency(m_remoteInputUDPHandler->getCenterFrequency()); + response.getSdrDaemonSourceReport()->setSampleRate(m_remoteInputUDPHandler->getSampleRate()); + response.getSdrDaemonSourceReport()->setBufferRwBalance(m_remoteInputUDPHandler->getBufferGauge()); - QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_SDRdaemonUDPHandler->getTVmSec()); + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_remoteInputUDPHandler->getTVmSec()); response.getSdrDaemonSourceReport()->setDaemonTimestamp(new QString(dt.toString("yyyy-MM-dd HH:mm:ss.zzz"))); - response.getSdrDaemonSourceReport()->setMinNbBlocks(m_SDRdaemonUDPHandler->getMinNbBlocks()); - response.getSdrDaemonSourceReport()->setMaxNbRecovery(m_SDRdaemonUDPHandler->getMaxNbRecovery()); + response.getSdrDaemonSourceReport()->setMinNbBlocks(m_remoteInputUDPHandler->getMinNbBlocks()); + response.getSdrDaemonSourceReport()->setMaxNbRecovery(m_remoteInputUDPHandler->getMaxNbRecovery()); } -void SDRdaemonSourceInput::webapiReverseSendSettings(QList& deviceSettingsKeys, const SDRdaemonSourceSettings& settings, bool force) +void RemoteInput::webapiReverseSendSettings(QList& deviceSettingsKeys, const RemoteInputSettings& settings, bool force) { SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings(); swgDeviceSettings->setTx(0); @@ -480,7 +480,7 @@ void SDRdaemonSourceInput::webapiReverseSendSettings(QList& deviceSetti delete swgDeviceSettings; } -void SDRdaemonSourceInput::webapiReverseSendStartStop(bool start) +void RemoteInput::webapiReverseSendStartStop(bool start) { QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/run") .arg(m_settings.m_reverseAPIAddress) @@ -495,13 +495,13 @@ void SDRdaemonSourceInput::webapiReverseSendStartStop(bool start) } } -void SDRdaemonSourceInput::networkManagerFinished(QNetworkReply *reply) +void RemoteInput::networkManagerFinished(QNetworkReply *reply) { QNetworkReply::NetworkError replyError = reply->error(); if (replyError) { - qWarning() << "SDRdaemonSourceInput::networkManagerFinished:" + qWarning() << "RemoteInput::networkManagerFinished:" << " error(" << (int) replyError << "): " << replyError << ": " << reply->errorString(); diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.h b/plugins/samplesource/remoteinput/remoteinput.h similarity index 80% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.h rename to plugins/samplesource/remoteinput/remoteinput.h index c0a1d7530..a3e5b9cdb 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.h +++ b/plugins/samplesource/remoteinput/remoteinput.h @@ -14,8 +14,8 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef INCLUDE_SDRDAEMONSOURCEINPUT_H -#define INCLUDE_SDRDAEMONSOURCEINPUT_H +#ifndef INCLUDE_REMOTEINPUT_H +#define INCLUDE_REMOTEINPUT_H #include #include @@ -26,79 +26,80 @@ #include #include -#include -#include "sdrdaemonsourcesettings.h" +#include "dsp/devicesamplesource.h" + +#include "remoteinputsettings.h" class QNetworkAccessManager; class QNetworkReply; class DeviceSourceAPI; -class SDRdaemonSourceUDPHandler; +class RemoteInputUDPHandler; class FileRecord; -class SDRdaemonSourceInput : public DeviceSampleSource { +class RemoteInput : public DeviceSampleSource { Q_OBJECT public: - class MsgConfigureSDRdaemonSource : public Message { + class MsgConfigureRemoteInput : public Message { MESSAGE_CLASS_DECLARATION public: - const SDRdaemonSourceSettings& getSettings() const { return m_settings; } + const RemoteInputSettings& getSettings() const { return m_settings; } bool getForce() const { return m_force; } - static MsgConfigureSDRdaemonSource* create(const SDRdaemonSourceSettings& settings, bool force = false) + static MsgConfigureRemoteInput* create(const RemoteInputSettings& settings, bool force = false) { - return new MsgConfigureSDRdaemonSource(settings, force); + return new MsgConfigureRemoteInput(settings, force); } private: - SDRdaemonSourceSettings m_settings; + RemoteInputSettings m_settings; bool m_force; - MsgConfigureSDRdaemonSource(const SDRdaemonSourceSettings& settings, bool force) : + MsgConfigureRemoteInput(const RemoteInputSettings& settings, bool force) : Message(), m_settings(settings), m_force(force) { } }; - class MsgConfigureSDRdaemonStreamTiming : public Message { + class MsgConfigureRemoteInputTiming : public Message { MESSAGE_CLASS_DECLARATION public: - static MsgConfigureSDRdaemonStreamTiming* create() + static MsgConfigureRemoteInputTiming* create() { - return new MsgConfigureSDRdaemonStreamTiming(); + return new MsgConfigureRemoteInputTiming(); } private: - MsgConfigureSDRdaemonStreamTiming() : + MsgConfigureRemoteInputTiming() : Message() { } }; - class MsgReportSDRdaemonAcquisition : public Message { + class MsgReportRemoteInputAcquisition : public Message { MESSAGE_CLASS_DECLARATION public: bool getAcquisition() const { return m_acquisition; } - static MsgReportSDRdaemonAcquisition* create(bool acquisition) + static MsgReportRemoteInputAcquisition* create(bool acquisition) { - return new MsgReportSDRdaemonAcquisition(acquisition); + return new MsgReportRemoteInputAcquisition(acquisition); } protected: bool m_acquisition; - MsgReportSDRdaemonAcquisition(bool acquisition) : + MsgReportRemoteInputAcquisition(bool acquisition) : Message(), m_acquisition(acquisition) { } }; - class MsgReportSDRdaemonSourceStreamData : public Message { + class MsgReportRemoteInputStreamData : public Message { MESSAGE_CLASS_DECLARATION public: @@ -106,9 +107,9 @@ public: quint64 getCenterFrequency() const { return m_centerFrequency; } uint32_t get_tv_msec() const { return m_tv_msec; } - static MsgReportSDRdaemonSourceStreamData* create(int sampleRate, quint64 centerFrequency, uint64_t tv_msec) + static MsgReportRemoteInputStreamData* create(int sampleRate, quint64 centerFrequency, uint64_t tv_msec) { - return new MsgReportSDRdaemonSourceStreamData(sampleRate, centerFrequency, tv_msec); + return new MsgReportRemoteInputStreamData(sampleRate, centerFrequency, tv_msec); } protected: @@ -116,7 +117,7 @@ public: quint64 m_centerFrequency; uint64_t m_tv_msec; - MsgReportSDRdaemonSourceStreamData(int sampleRate, quint64 centerFrequency, uint64_t tv_msec) : + MsgReportRemoteInputStreamData(int sampleRate, quint64 centerFrequency, uint64_t tv_msec) : Message(), m_sampleRate(sampleRate), m_centerFrequency(centerFrequency), @@ -124,7 +125,7 @@ public: { } }; - class MsgReportSDRdaemonSourceStreamTiming : public Message { + class MsgReportRemoteInputStreamTiming : public Message { MESSAGE_CLASS_DECLARATION public: @@ -144,7 +145,7 @@ public: int getSampleBits() const { return m_sampleBits; } int getSampleBytes() const { return m_sampleBytes; } - static MsgReportSDRdaemonSourceStreamTiming* create(uint64_t tv_msec, + static MsgReportRemoteInputStreamTiming* create(uint64_t tv_msec, float bufferLenSec, int32_t bufferGauge, int framesDecodingStatus, @@ -160,7 +161,7 @@ public: int sampleBits, int sampleBytes) { - return new MsgReportSDRdaemonSourceStreamTiming(tv_msec, + return new MsgReportRemoteInputStreamTiming(tv_msec, bufferLenSec, bufferGauge, framesDecodingStatus, @@ -194,7 +195,7 @@ public: int m_sampleBits; int m_sampleBytes; - MsgReportSDRdaemonSourceStreamTiming(uint64_t tv_msec, + MsgReportRemoteInputStreamTiming(uint64_t tv_msec, float bufferLenSec, int32_t bufferGauge, int framesDecodingStatus, @@ -266,8 +267,8 @@ public: { } }; - SDRdaemonSourceInput(DeviceSourceAPI *deviceAPI); - virtual ~SDRdaemonSourceInput(); + RemoteInput(DeviceSourceAPI *deviceAPI); + virtual ~RemoteInput(); virtual void destroy(); virtual void init(); @@ -313,8 +314,8 @@ public: private: DeviceSourceAPI *m_deviceAPI; QMutex m_mutex; - SDRdaemonSourceSettings m_settings; - SDRdaemonSourceUDPHandler* m_SDRdaemonUDPHandler; + RemoteInputSettings m_settings; + RemoteInputUDPHandler* m_remoteInputUDPHandler; QString m_remoteAddress; QString m_deviceDescription; std::time_t m_startingTimeStamp; @@ -322,14 +323,14 @@ private: QNetworkAccessManager *m_networkManager; QNetworkRequest m_networkRequest; - void applySettings(const SDRdaemonSourceSettings& settings, bool force = false); - void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const SDRdaemonSourceSettings& settings); + void applySettings(const RemoteInputSettings& settings, bool force = false); + void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const RemoteInputSettings& settings); void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response); - void webapiReverseSendSettings(QList& deviceSettingsKeys, const SDRdaemonSourceSettings& settings, bool force); + void webapiReverseSendSettings(QList& deviceSettingsKeys, const RemoteInputSettings& settings, bool force); void webapiReverseSendStartStop(bool start); private slots: void networkManagerFinished(QNetworkReply *reply); }; -#endif // INCLUDE_SDRDAEMONSOURCEINPUT_H +#endif // INCLUDE_REMOTEINPUT_H diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsource.pro b/plugins/samplesource/remoteinput/remoteinput.pro similarity index 78% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsource.pro rename to plugins/samplesource/remoteinput/remoteinput.pro index cb39701ce..99410fd73 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsource.pro +++ b/plugins/samplesource/remoteinput/remoteinput.pro @@ -9,7 +9,7 @@ CONFIG += plugin QT += core gui widgets multimedia network opengl -TARGET = inputsdrdaemonsource +TARGET = remoteinput CONFIG(MINGW32):LIBCM256CCSRC = "C:\softs\cm256cc" CONFIG(MSVC):LIBCM256CCSRC = "C:\softs\cm256cc" @@ -38,21 +38,21 @@ 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 += sdrdaemonsourcebuffer.cpp\ - sdrdaemonsourcegui.cpp\ - sdrdaemonsourceinput.cpp\ - sdrdaemonsourcesettings.cpp\ - sdrdaemonsourceplugin.cpp\ - sdrdaemonsourceudphandler.cpp +SOURCES += remoteinputbuffer.cpp\ + remoteinputgui.cpp\ + remoteinput.cpp\ + remoteinputsettings.cpp\ + remoteinputplugin.cpp\ + remoteinputeudphandler.cpp -HEADERS += sdrdaemonsourcebuffer.h\ - sdrdaemonsourcegui.h\ - sdrdaemonsourceinput.h\ - sdrdaemonsourcesettings.h\ - sdrdaemonsourceplugin.h\ - sdrdaemonsourceudphandler.h +HEADERS += remoteinputbuffer.h\ + remoteinputgui.h\ + remoteinput.h\ + remoteinputsettings.h\ + remoteinputplugin.h\ + remoteinputeudphandler.h -FORMS += sdrdaemonsourcegui.ui +FORMS += remoteinputgui.ui LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.cpp b/plugins/samplesource/remoteinput/remoteinputbuffer.cpp similarity index 91% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.cpp rename to plugins/samplesource/remoteinput/remoteinputbuffer.cpp index bdf67aec6..170049113 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.cpp +++ b/plugins/samplesource/remoteinput/remoteinputbuffer.cpp @@ -21,11 +21,11 @@ #include #include #include -#include "sdrdaemonsourcebuffer.h" +#include "remoteinputbuffer.h" -SDRdaemonSourceBuffer::SDRdaemonSourceBuffer() : +RemoteInputBuffer::RemoteInputBuffer() : m_decoderIndexHead(nbDecoderSlots/2), m_frameHead(0), m_curNbBlocks(0), @@ -55,7 +55,7 @@ SDRdaemonSourceBuffer::SDRdaemonSourceBuffer() : if (!m_cm256.isInitialized()) { m_cm256_OK = false; - qDebug() << "SDRdaemonSourceBuffer::SDRdaemonSourceBuffer: cannot initialize CM256 library"; + qDebug() << "RemoteInputBuffer::RemoteInputBuffer: cannot initialize CM256 library"; } else { m_cm256_OK = true; } @@ -64,14 +64,14 @@ SDRdaemonSourceBuffer::SDRdaemonSourceBuffer() : std::fill(m_frames, m_frames + nbDecoderSlots, BufferFrame()); } -SDRdaemonSourceBuffer::~SDRdaemonSourceBuffer() +RemoteInputBuffer::~RemoteInputBuffer() { if (m_readBuffer) { delete[] m_readBuffer; } } -void SDRdaemonSourceBuffer::initDecodeAllSlots() +void RemoteInputBuffer::initDecodeAllSlots() { for (int i = 0; i < nbDecoderSlots; i++) { @@ -85,7 +85,7 @@ void SDRdaemonSourceBuffer::initDecodeAllSlots() } } -void SDRdaemonSourceBuffer::initDecodeSlot(int slotIndex) +void RemoteInputBuffer::initDecodeSlot(int slotIndex) { // collect stats before voiding the slot @@ -121,7 +121,7 @@ void SDRdaemonSourceBuffer::initDecodeSlot(int slotIndex) memset((void *) m_decoderSlots[slotIndex].m_recoveryBlocks, 0, RemoteNbOrginalBlocks * sizeof(RemoteProtectedBlock)); } -void SDRdaemonSourceBuffer::initReadIndex() +void RemoteInputBuffer::initReadIndex() { m_readIndex = ((m_decoderIndexHead + (nbDecoderSlots/2)) % nbDecoderSlots) * sizeof(BufferFrame); m_wrDeltaEstimate = m_framesNbBytes / 2; @@ -129,7 +129,7 @@ void SDRdaemonSourceBuffer::initReadIndex() m_nbWrites = 0; } -void SDRdaemonSourceBuffer::rwCorrectionEstimate(int slotIndex) +void RemoteInputBuffer::rwCorrectionEstimate(int slotIndex) { if (m_nbReads >= 40) // check every ~1s as tick is ~50ms { @@ -162,7 +162,7 @@ void SDRdaemonSourceBuffer::rwCorrectionEstimate(int slotIndex) } } -void SDRdaemonSourceBuffer::checkSlotData(int slotIndex) +void RemoteInputBuffer::checkSlotData(int slotIndex) { int pseudoWriteIndex = slotIndex * sizeof(BufferFrame); m_wrDeltaEstimate = pseudoWriteIndex - m_readIndex; @@ -181,14 +181,14 @@ void SDRdaemonSourceBuffer::checkSlotData(int slotIndex) if (!m_decoderSlots[slotIndex].m_decoded) { - qDebug() << "SDRdaemonSourceBuffer::checkSlotData: incomplete frame:" + qDebug() << "RemoteInputBuffer::checkSlotData: incomplete frame:" << " slotIndex: " << slotIndex << " m_blockCount: " << m_decoderSlots[slotIndex].m_blockCount << " m_recoveryCount: " << m_decoderSlots[slotIndex].m_recoveryCount; } } -void SDRdaemonSourceBuffer::writeData(char *array) +void RemoteInputBuffer::writeData(char *array) { RemoteSuperBlock *superBlock = (RemoteSuperBlock *) array; int frameIndex = superBlock->m_header.m_frameIndex; @@ -258,7 +258,7 @@ void SDRdaemonSourceBuffer::writeData(char *array) if (m_cm256.cm256_decode(m_paramsCM256, m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks)) // CM256 decode { - qDebug() << "SDRdaemonSourceBuffer::writeData: decode CM256 error:" + qDebug() << "RemoteInputBuffer::writeData: decode CM256 error:" << " decoderIndex: " << decoderIndex << " m_blockCount: " << m_decoderSlots[decoderIndex].m_blockCount << " m_originalCount: " << m_decoderSlots[decoderIndex].m_originalCount @@ -266,7 +266,7 @@ void SDRdaemonSourceBuffer::writeData(char *array) } else { - qDebug() << "SDRdaemonSourceBuffer::writeData: decode CM256 success:" + qDebug() << "RemoteInputBuffer::writeData: decode CM256 success:" << " decoderIndex: " << decoderIndex << " m_blockCount: " << m_decoderSlots[decoderIndex].m_blockCount << " m_originalCount: " << m_decoderSlots[decoderIndex].m_originalCount @@ -288,17 +288,17 @@ void SDRdaemonSourceBuffer::writeData(char *array) if (crc32.checksum() == metaData->m_crc32) { m_decoderSlots[decoderIndex].m_metaRetrieved = true; - printMeta("SDRdaemonSourceBuffer::writeData: recovered meta", metaData); + printMeta("RemoteInputBuffer::writeData: recovered meta", metaData); } else { - qDebug() << "SDRdaemonSourceBuffer::writeData: recovered meta: invalid CRC32"; + qDebug() << "RemoteInputBuffer::writeData: recovered meta: invalid CRC32"; } } storeOriginalBlock(decoderIndex, blockIndex, *recoveredBlock); - qDebug() << "SDRdaemonSourceBuffer::writeData: recovered block #" << blockIndex; + qDebug() << "RemoteInputBuffer::writeData: recovered block #" << blockIndex; } // restore missing blocks } // CM256 decode } // recovery @@ -318,7 +318,7 @@ void SDRdaemonSourceBuffer::writeData(char *array) m_readNbBytes = (sampleRate * metaData->m_sampleBytes * 2) / 20; } - printMeta("SDRdaemonSourceBuffer::writeData: new meta", metaData); // print for change other than timestamp + printMeta("RemoteInputBuffer::writeData: new meta", metaData); // print for change other than timestamp } m_currentMeta = *metaData; // renew current meta @@ -326,7 +326,7 @@ void SDRdaemonSourceBuffer::writeData(char *array) } // decode } -uint8_t *SDRdaemonSourceBuffer::readData(int32_t length) +uint8_t *RemoteInputBuffer::readData(int32_t length) { uint8_t *buffer = (uint8_t *) m_frames; uint32_t readIndex = m_readIndex; @@ -368,7 +368,7 @@ uint8_t *SDRdaemonSourceBuffer::readData(int32_t length) } } -void SDRdaemonSourceBuffer::printMeta(const QString& header, RemoteMetaDataFEC *metaData) +void RemoteInputBuffer::printMeta(const QString& header, RemoteMetaDataFEC *metaData) { qDebug() << header << ": " << "|" << metaData->m_centerFrequency diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.h b/plugins/samplesource/remoteinput/remoteinputbuffer.h similarity index 92% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.h rename to plugins/samplesource/remoteinput/remoteinputbuffer.h index ef9872944..b9fcdcfdb 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcebuffer.h +++ b/plugins/samplesource/remoteinput/remoteinputbuffer.h @@ -14,8 +14,8 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEBUFFER_H_ -#define PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEBUFFER_H_ +#ifndef PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTBUFFER_H_ +#define PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTBUFFER_H_ #include #include @@ -25,15 +25,15 @@ #include "util/movingaverage.h" -#define SDRDAEMONSOURCE_UDPSIZE 512 // UDP payload size -#define SDRDAEMONSOURCE_NBORIGINALBLOCKS 128 // number of sample blocks per frame excluding FEC blocks -#define SDRDAEMONSOURCE_NBDECODERSLOTS 16 // power of two sub multiple of uint16_t size. A too large one is superfluous. +#define REMOTEINPUT_UDPSIZE 512 // UDP payload size +#define REMOTEINPUT_NBORIGINALBLOCKS 128 // number of sample blocks per frame excluding FEC blocks +#define REMOTEINPUT_NBDECODERSLOTS 16 // power of two sub multiple of uint16_t size. A too large one is superfluous. -class SDRdaemonSourceBuffer +class RemoteInputBuffer { public: - SDRdaemonSourceBuffer(); - ~SDRdaemonSourceBuffer(); + RemoteInputBuffer(); + ~RemoteInputBuffer(); // R/W operations void writeData(char *array); //!< Write data into buffer. @@ -105,10 +105,10 @@ public: } } - static const int framesSize = SDRDAEMONSOURCE_NBDECODERSLOTS * (RemoteNbOrginalBlocks - 1) * RemoteNbBytesPerBlock; + static const int framesSize = REMOTEINPUT_NBDECODERSLOTS * (RemoteNbOrginalBlocks - 1) * RemoteNbBytesPerBlock; private: - static const int nbDecoderSlots = SDRDAEMONSOURCE_NBDECODERSLOTS; + static const int nbDecoderSlots = REMOTEINPUT_NBDECODERSLOTS; #pragma pack(push, 1) struct BufferFrame @@ -215,4 +215,4 @@ private: -#endif /* PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEBUFFER_H_ */ +#endif /* PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTBUFFER_H_ */ diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp b/plugins/samplesource/remoteinput/remoteinputgui.cpp similarity index 73% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp rename to plugins/samplesource/remoteinput/remoteinputgui.cpp index b785bd62c..78a14e4ca 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.cpp +++ b/plugins/samplesource/remoteinput/remoteinputgui.cpp @@ -29,7 +29,7 @@ #include #include -#include "ui_sdrdaemonsourcegui.h" +#include "ui_remoteinputgui.h" #include "gui/colormapper.h" #include "gui/glspectrum.h" #include "gui/crightclickenabler.h" @@ -40,12 +40,12 @@ #include "util/simpleserializer.h" #include "device/devicesourceapi.h" #include "device/deviceuiset.h" +#include "remoteinputgui.h" -#include "sdrdaemonsourcegui.h" -SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : +RemoteInputGui::RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent) : QWidget(parent), - ui(new Ui::SDRdaemonSourceGui), + ui(new Ui::RemoteInputGui), m_deviceUISet(deviceUISet), m_settings(), m_sampleSource(0), @@ -88,7 +88,7 @@ SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent m_statusTimer.start(500); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); - m_sampleSource = (SDRdaemonSourceInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); + m_sampleSource = (RemoteInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); @@ -104,34 +104,34 @@ SDRdaemonSourceGui::SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent sendSettings(); } -SDRdaemonSourceGui::~SDRdaemonSourceGui() +RemoteInputGui::~RemoteInputGui() { disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); delete m_networkManager; delete ui; } -void SDRdaemonSourceGui::blockApplySettings(bool block) +void RemoteInputGui::blockApplySettings(bool block) { m_doApplySettings = !block; } -void SDRdaemonSourceGui::destroy() +void RemoteInputGui::destroy() { delete this; } -void SDRdaemonSourceGui::setName(const QString& name) +void RemoteInputGui::setName(const QString& name) { setObjectName(name); } -QString SDRdaemonSourceGui::getName() const +QString RemoteInputGui::getName() const { return objectName(); } -void SDRdaemonSourceGui::resetToDefaults() +void RemoteInputGui::resetToDefaults() { m_settings.resetToDefaults(); displaySettings(); @@ -139,14 +139,14 @@ void SDRdaemonSourceGui::resetToDefaults() sendSettings(); } -QByteArray SDRdaemonSourceGui::serialize() const +QByteArray RemoteInputGui::serialize() const { return m_settings.serialize(); } -bool SDRdaemonSourceGui::deserialize(const QByteArray& data) +bool RemoteInputGui::deserialize(const QByteArray& data) { - qDebug("SDRdaemonSourceGui::deserialize"); + qDebug("RemoteInputGui::deserialize"); if (m_settings.deserialize(data)) { @@ -162,61 +162,61 @@ bool SDRdaemonSourceGui::deserialize(const QByteArray& data) } } -qint64 SDRdaemonSourceGui::getCenterFrequency() const +qint64 RemoteInputGui::getCenterFrequency() const { return m_streamCenterFrequency; } -void SDRdaemonSourceGui::setCenterFrequency(qint64 centerFrequency) +void RemoteInputGui::setCenterFrequency(qint64 centerFrequency) { (void) centerFrequency; } -bool SDRdaemonSourceGui::handleMessage(const Message& message) +bool RemoteInputGui::handleMessage(const Message& message) { - if (SDRdaemonSourceInput::MsgConfigureSDRdaemonSource::match(message)) + if (RemoteInput::MsgConfigureRemoteInput::match(message)) { - const SDRdaemonSourceInput::MsgConfigureSDRdaemonSource& cfg = (SDRdaemonSourceInput::MsgConfigureSDRdaemonSource&) message; + const RemoteInput::MsgConfigureRemoteInput& cfg = (RemoteInput::MsgConfigureRemoteInput&) message; m_settings = cfg.getSettings(); blockApplySettings(true); displaySettings(); blockApplySettings(false); return true; } - else if (SDRdaemonSourceInput::MsgReportSDRdaemonAcquisition::match(message)) + else if (RemoteInput::MsgReportRemoteInputAcquisition::match(message)) { - m_acquisition = ((SDRdaemonSourceInput::MsgReportSDRdaemonAcquisition&)message).getAcquisition(); + m_acquisition = ((RemoteInput::MsgReportRemoteInputAcquisition&)message).getAcquisition(); updateWithAcquisition(); return true; } - else if (SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData::match(message)) + else if (RemoteInput::MsgReportRemoteInputStreamData::match(message)) { - m_startingTimeStampms = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData&)message).get_tv_msec(); + m_startingTimeStampms = ((RemoteInput::MsgReportRemoteInputStreamData&)message).get_tv_msec(); - qDebug() << "SDRdaemonSourceGui::handleMessage: SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData: " + qDebug() << "RemoteInputGui::handleMessage: RemoteInput::MsgReportRemoteInputStreamData: " << " : " << m_startingTimeStampms << " ms"; updateWithStreamTime(); return true; } - else if (SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming::match(message)) + else if (RemoteInput::MsgReportRemoteInputStreamTiming::match(message)) { - m_startingTimeStampms = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).get_tv_msec(); - m_framesDecodingStatus = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getFramesDecodingStatus(); - m_allBlocksReceived = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).allBlocksReceived(); - m_bufferLengthInSecs = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getBufferLengthInSecs(); - m_bufferGauge = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getBufferGauge(); - m_minNbBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getMinNbBlocks(); - m_minNbOriginalBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getMinNbOriginalBlocks(); - m_maxNbRecovery = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getMaxNbRecovery(); - m_avgNbBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getAvgNbBlocks(); - m_avgNbOriginalBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getAvgNbOriginalBlocks(); - m_avgNbRecovery = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getAvgNbRecovery(); - m_nbOriginalBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getNbOriginalBlocksPerFrame(); - m_sampleBits = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getSampleBits(); - m_sampleBytes = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getSampleBytes(); + m_startingTimeStampms = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).get_tv_msec(); + m_framesDecodingStatus = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getFramesDecodingStatus(); + m_allBlocksReceived = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).allBlocksReceived(); + m_bufferLengthInSecs = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getBufferLengthInSecs(); + m_bufferGauge = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getBufferGauge(); + m_minNbBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getMinNbBlocks(); + m_minNbOriginalBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getMinNbOriginalBlocks(); + m_maxNbRecovery = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getMaxNbRecovery(); + m_avgNbBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getAvgNbBlocks(); + m_avgNbOriginalBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getAvgNbOriginalBlocks(); + m_avgNbRecovery = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getAvgNbRecovery(); + m_nbOriginalBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getNbOriginalBlocksPerFrame(); + m_sampleBits = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getSampleBits(); + m_sampleBytes = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getSampleBytes(); - int nbFECBlocks = ((SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming&)message).getNbFECBlocksPerFrame(); + int nbFECBlocks = ((RemoteInput::MsgReportRemoteInputStreamTiming&)message).getNbFECBlocksPerFrame(); if (m_nbFECBlocks != nbFECBlocks) { m_nbFECBlocks = nbFECBlocks; @@ -225,9 +225,9 @@ bool SDRdaemonSourceGui::handleMessage(const Message& message) updateWithStreamTime(); return true; } - else if (SDRdaemonSourceInput::MsgStartStop::match(message)) + else if (RemoteInput::MsgStartStop::match(message)) { - SDRdaemonSourceInput::MsgStartStop& notif = (SDRdaemonSourceInput::MsgStartStop&) message; + RemoteInput::MsgStartStop& notif = (RemoteInput::MsgStartStop&) message; blockApplySettings(true); ui->startStop->setChecked(notif.getStartStop()); blockApplySettings(false); @@ -240,13 +240,13 @@ bool SDRdaemonSourceGui::handleMessage(const Message& message) } } -void SDRdaemonSourceGui::handleInputMessages() +void RemoteInputGui::handleInputMessages() { Message* message; while ((message = m_inputMessageQueue.pop()) != 0) { - //qDebug("SDRdaemonGui::handleInputMessages: message: %s", message->getIdentifier()); + //qDebug("RemoteInputGui::handleInputMessages: message: %s", message->getIdentifier()); if (DSPSignalNotification::match(*message)) { @@ -258,7 +258,7 @@ void SDRdaemonSourceGui::handleInputMessages() m_streamCenterFrequency = notif->getCenterFrequency(); - qDebug("SDRdaemonGui::handleInputMessages: DSPSignalNotification: SampleRate:%d, CenterFrequency:%llu", notif->getSampleRate(), notif->getCenterFrequency()); + qDebug("RemoteInputGui::handleInputMessages: DSPSignalNotification: SampleRate:%d, CenterFrequency:%llu", notif->getSampleRate(), notif->getCenterFrequency()); updateSampleRateAndFrequency(); DSPSignalNotification *fwd = new DSPSignalNotification(*notif); @@ -276,7 +276,7 @@ void SDRdaemonSourceGui::handleInputMessages() } } -void SDRdaemonSourceGui::updateSampleRateAndFrequency() +void RemoteInputGui::updateSampleRateAndFrequency() { m_deviceUISet->getSpectrum()->setSampleRate(m_streamSampleRate); m_deviceUISet->getSpectrum()->setCenterFrequency(m_streamCenterFrequency); @@ -286,7 +286,7 @@ void SDRdaemonSourceGui::updateSampleRateAndFrequency() blockApplySettings(false); } -void SDRdaemonSourceGui::displaySettings() +void RemoteInputGui::displaySettings() { blockApplySettings(true); @@ -304,13 +304,13 @@ void SDRdaemonSourceGui::displaySettings() blockApplySettings(false); } -void SDRdaemonSourceGui::sendSettings() +void RemoteInputGui::sendSettings() { if(!m_updateTimer.isActive()) m_updateTimer.start(100); } -void SDRdaemonSourceGui::on_apiApplyButton_clicked(bool checked) +void RemoteInputGui::on_apiApplyButton_clicked(bool checked) { (void) checked; m_settings.m_apiAddress = ui->apiAddress->text(); @@ -329,7 +329,7 @@ void SDRdaemonSourceGui::on_apiApplyButton_clicked(bool checked) m_networkManager->get(m_networkRequest); } -void SDRdaemonSourceGui::on_dataApplyButton_clicked(bool checked) +void RemoteInputGui::on_dataApplyButton_clicked(bool checked) { (void) checked; m_settings.m_dataAddress = ui->dataAddress->text(); @@ -344,7 +344,7 @@ void SDRdaemonSourceGui::on_dataApplyButton_clicked(bool checked) sendSettings(); } -void SDRdaemonSourceGui::on_apiAddress_returnPressed() +void RemoteInputGui::on_apiAddress_returnPressed() { m_settings.m_apiAddress = ui->apiAddress->text(); @@ -355,13 +355,13 @@ void SDRdaemonSourceGui::on_apiAddress_returnPressed() sendSettings(); } -void SDRdaemonSourceGui::on_dataAddress_returnPressed() +void RemoteInputGui::on_dataAddress_returnPressed() { m_settings.m_dataAddress = ui->dataAddress->text(); sendSettings(); } -void SDRdaemonSourceGui::on_dataPort_returnPressed() +void RemoteInputGui::on_dataPort_returnPressed() { bool dataOk; int udpDataPort = ui->dataPort->text().toInt(&dataOk); @@ -377,7 +377,7 @@ void SDRdaemonSourceGui::on_dataPort_returnPressed() } } -void SDRdaemonSourceGui::on_apiPort_returnPressed() +void RemoteInputGui::on_apiPort_returnPressed() { bool ctlOk; int udpApiPort = ui->apiPort->text().toInt(&ctlOk); @@ -398,28 +398,28 @@ void SDRdaemonSourceGui::on_apiPort_returnPressed() } } -void SDRdaemonSourceGui::on_dcOffset_toggled(bool checked) +void RemoteInputGui::on_dcOffset_toggled(bool checked) { m_settings.m_dcBlock = checked; sendSettings(); } -void SDRdaemonSourceGui::on_iqImbalance_toggled(bool checked) +void RemoteInputGui::on_iqImbalance_toggled(bool checked) { m_settings.m_iqCorrection = checked; sendSettings(); } -void SDRdaemonSourceGui::on_startStop_toggled(bool checked) +void RemoteInputGui::on_startStop_toggled(bool checked) { if (m_doApplySettings) { - SDRdaemonSourceInput::MsgStartStop *message = SDRdaemonSourceInput::MsgStartStop::create(checked); + RemoteInput::MsgStartStop *message = RemoteInput::MsgStartStop::create(checked); m_sampleSource->getInputMessageQueue()->push(message); } } -void SDRdaemonSourceGui::on_record_toggled(bool checked) +void RemoteInputGui::on_record_toggled(bool checked) { if (checked) { ui->record->setStyleSheet("QToolButton { background-color : red; }"); @@ -427,11 +427,11 @@ void SDRdaemonSourceGui::on_record_toggled(bool checked) ui->record->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } - SDRdaemonSourceInput::MsgFileRecord* message = SDRdaemonSourceInput::MsgFileRecord::create(checked); + RemoteInput::MsgFileRecord* message = RemoteInput::MsgFileRecord::create(checked); m_sampleSource->getInputMessageQueue()->push(message); } -void SDRdaemonSourceGui::on_eventCountsReset_clicked(bool checked) +void RemoteInputGui::on_eventCountsReset_clicked(bool checked) { (void) checked; m_countUnrecoverable = 0; @@ -441,7 +441,7 @@ void SDRdaemonSourceGui::on_eventCountsReset_clicked(bool checked) displayEventTimer(); } -void SDRdaemonSourceGui::displayEventCounts() +void RemoteInputGui::displayEventCounts() { QString nstr = QString("%1").arg(m_countUnrecoverable, 3, 10, QChar('0')); ui->eventUnrecText->setText(nstr); @@ -449,7 +449,7 @@ void SDRdaemonSourceGui::displayEventCounts() ui->eventRecText->setText(nstr); } -void SDRdaemonSourceGui::displayEventTimer() +void RemoteInputGui::displayEventTimer() { int elapsedTimeMillis = m_eventsTime.elapsed(); QTime recordLength(0, 0, 0, 0); @@ -458,11 +458,11 @@ void SDRdaemonSourceGui::displayEventTimer() ui->eventCountsTimeText->setText(s_time); } -void SDRdaemonSourceGui::updateWithAcquisition() +void RemoteInputGui::updateWithAcquisition() { } -void SDRdaemonSourceGui::updateWithStreamTime() +void RemoteInputGui::updateWithStreamTime() { bool updateEventCounts = false; QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_startingTimeStampms); @@ -515,20 +515,20 @@ void SDRdaemonSourceGui::updateWithStreamTime() displayEventTimer(); } -void SDRdaemonSourceGui::updateHardware() +void RemoteInputGui::updateHardware() { if (m_doApplySettings) { - qDebug() << "SDRdaemonSinkGui::updateHardware"; - SDRdaemonSourceInput::MsgConfigureSDRdaemonSource* message = - SDRdaemonSourceInput::MsgConfigureSDRdaemonSource::create(m_settings, m_forceSettings); + qDebug() << "RemoteInputGui::updateHardware"; + RemoteInput::MsgConfigureRemoteInput* message = + RemoteInput::MsgConfigureRemoteInput::create(m_settings, m_forceSettings); m_sampleSource->getInputMessageQueue()->push(message); m_forceSettings = false; m_updateTimer.stop(); } } -void SDRdaemonSourceGui::updateStatus() +void RemoteInputGui::updateStatus() { if (m_sampleSource->isStreaming()) { @@ -568,7 +568,7 @@ void SDRdaemonSourceGui::updateStatus() } } -void SDRdaemonSourceGui::networkManagerFinished(QNetworkReply *reply) +void RemoteInputGui::networkManagerFinished(QNetworkReply *reply) { if (reply->error()) { @@ -596,7 +596,7 @@ void SDRdaemonSourceGui::networkManagerFinished(QNetworkReply *reply) ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }"); QString errorMsg = QString("Reply JSON error: ") + error.errorString() + QString(" at offset ") + QString::number(error.offset); ui->statusText->setText(QString("JSON error. See log")); - qInfo().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg; + qInfo().noquote() << "RemoteInputGui::networkManagerFinished" << errorMsg; } } catch (const std::exception& ex) @@ -604,11 +604,11 @@ void SDRdaemonSourceGui::networkManagerFinished(QNetworkReply *reply) ui->apiAddressLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }"); QString errorMsg = QString("Error parsing request: ") + ex.what(); ui->statusText->setText("Error parsing request. See log for details"); - qInfo().noquote() << "SDRdaemonSinkGui::networkManagerFinished" << errorMsg; + qInfo().noquote() << "RemoteInputGui::networkManagerFinished" << errorMsg; } } -void SDRdaemonSourceGui::analyzeApiReply(const QJsonObject& jsonObject) +void RemoteInputGui::analyzeApiReply(const QJsonObject& jsonObject) { QString infoLine; @@ -637,7 +637,7 @@ void SDRdaemonSourceGui::analyzeApiReply(const QJsonObject& jsonObject) } } -void SDRdaemonSourceGui::openDeviceSettingsDialog(const QPoint& p) +void RemoteInputGui::openDeviceSettingsDialog(const QPoint& p) { BasicDeviceSettingsDialog dialog(this); dialog.setUseReverseAPI(m_settings.m_useReverseAPI); diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h b/plugins/samplesource/remoteinput/remoteinputgui.h similarity index 89% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h rename to plugins/samplesource/remoteinput/remoteinputgui.h index ace89a564..263f94450 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.h +++ b/plugins/samplesource/remoteinput/remoteinputgui.h @@ -14,8 +14,8 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef INCLUDE_SDRDAEMONSOURCEGUI_H -#define INCLUDE_SDRDAEMONSOURCEGUI_H +#ifndef INCLUDE_REMOTEINPUTGUI_H +#define INCLUDE_REMOTEINPUTGUI_H #include #include @@ -24,7 +24,7 @@ #include "plugin/plugininstancegui.h" #include "util/messagequeue.h" -#include "sdrdaemonsourceinput.h" +#include "remoteinput.h" class DeviceUISet; class QNetworkAccessManager; @@ -32,15 +32,15 @@ class QNetworkReply; class QJsonObject; namespace Ui { - class SDRdaemonSourceGui; + class RemoteInputGui; } -class SDRdaemonSourceGui : public QWidget, public PluginInstanceGUI { +class RemoteInputGui : public QWidget, public PluginInstanceGUI { Q_OBJECT public: - explicit SDRdaemonSourceGui(DeviceUISet *deviceUISet, QWidget* parent = 0); - virtual ~SDRdaemonSourceGui(); + explicit RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); + virtual ~RemoteInputGui(); virtual void destroy(); void setName(const QString& name); @@ -55,11 +55,11 @@ public: virtual bool handleMessage(const Message& message); private: - Ui::SDRdaemonSourceGui* ui; + Ui::RemoteInputGui* ui; DeviceUISet* m_deviceUISet; - SDRdaemonSourceSettings m_settings; //!< current settings - SDRdaemonSourceInput* m_sampleSource; + RemoteInputSettings m_settings; //!< current settings + RemoteInput* m_sampleSource; bool m_acquisition; int m_streamSampleRate; //!< Sample rate of received stream quint64 m_streamCenterFrequency; //!< Center frequency of received stream @@ -136,4 +136,4 @@ private slots: void openDeviceSettingsDialog(const QPoint& p); }; -#endif // INCLUDE_SDRDAEMONSOURCEGUI_H +#endif // INCLUDE_REMOTEINPUTGUI_H diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui b/plugins/samplesource/remoteinput/remoteinputgui.ui similarity index 99% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui rename to plugins/samplesource/remoteinput/remoteinputgui.ui index 118f06235..637ce4ed1 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcegui.ui +++ b/plugins/samplesource/remoteinput/remoteinputgui.ui @@ -1,7 +1,7 @@ - SDRdaemonSourceGui - + RemoteInputGui + 0 @@ -23,7 +23,7 @@ - SDRdaemon Source + Remote Input diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp b/plugins/samplesource/remoteinput/remoteinputplugin.cpp similarity index 68% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp rename to plugins/samplesource/remoteinput/remoteinputplugin.cpp index 749a22e2c..484ed2805 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.cpp +++ b/plugins/samplesource/remoteinput/remoteinputplugin.cpp @@ -21,45 +21,45 @@ #include "device/devicesourceapi.h" #ifdef SERVER_MODE -#include "sdrdaemonsourceinput.h" +#include "remoteinput.h" #else -#include "sdrdaemonsourcegui.h" +#include "remoteinputgui.h" #endif -#include "sdrdaemonsourceplugin.h" +#include "remoteinputplugin.h" -const PluginDescriptor SDRdaemonSourcePlugin::m_pluginDescriptor = { - QString("SDRdaemon source input"), - QString("4.4.1"), +const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = { + QString("Remote input"), + QString("4.4.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, QString("https://github.com/f4exb/sdrangel") }; -const QString SDRdaemonSourcePlugin::m_hardwareID = "SDRdaemonSource"; -const QString SDRdaemonSourcePlugin::m_deviceTypeID = SDRDAEMONSOURCE_DEVICE_TYPE_ID; +const QString RemoteInputPlugin::m_hardwareID = "RemoteInput"; +const QString RemoteInputPlugin::m_deviceTypeID = REMOTEINPUT_DEVICE_TYPE_ID; -SDRdaemonSourcePlugin::SDRdaemonSourcePlugin(QObject* parent) : +RemoteInputPlugin::RemoteInputPlugin(QObject* parent) : QObject(parent) { } -const PluginDescriptor& SDRdaemonSourcePlugin::getPluginDescriptor() const +const PluginDescriptor& RemoteInputPlugin::getPluginDescriptor() const { return m_pluginDescriptor; } -void SDRdaemonSourcePlugin::initPlugin(PluginAPI* pluginAPI) +void RemoteInputPlugin::initPlugin(PluginAPI* pluginAPI) { pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices SDRdaemonSourcePlugin::enumSampleSources() +PluginInterface::SamplingDevices RemoteInputPlugin::enumSampleSources() { SamplingDevices result; result.append(SamplingDevice( - "SDRdaemonSource", + "RemoteInput", m_hardwareID, m_deviceTypeID, QString::null, @@ -73,7 +73,7 @@ PluginInterface::SamplingDevices SDRdaemonSourcePlugin::enumSampleSources() } #ifdef SERVER_MODE -PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI( +PluginInstanceGUI* RemoteInputPlugin::createSampleSourcePluginInstanceGUI( const QString& sourceId __attribute((unused)), QWidget **widget __attribute((unused)), DeviceUISet *deviceUISet __attribute((unused))) @@ -81,14 +81,14 @@ PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI( return 0; } #else -PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI( +PluginInstanceGUI* RemoteInputPlugin::createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, DeviceUISet *deviceUISet) { if(sourceId == m_deviceTypeID) { - SDRdaemonSourceGui* gui = new SDRdaemonSourceGui(deviceUISet); + RemoteInputGui* gui = new RemoteInputGui(deviceUISet); *widget = gui; return gui; } @@ -99,11 +99,11 @@ PluginInstanceGUI* SDRdaemonSourcePlugin::createSampleSourcePluginInstanceGUI( } #endif -DeviceSampleSource *SDRdaemonSourcePlugin::createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI) +DeviceSampleSource *RemoteInputPlugin::createSampleSourcePluginInstanceInput(const QString& sourceId, DeviceSourceAPI *deviceAPI) { if (sourceId == m_deviceTypeID) { - SDRdaemonSourceInput* input = new SDRdaemonSourceInput(deviceAPI); + RemoteInput* input = new RemoteInput(deviceAPI); return input; } else diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h b/plugins/samplesource/remoteinput/remoteinputplugin.h similarity index 83% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h rename to plugins/samplesource/remoteinput/remoteinputplugin.h index 1381ea617..5e0a35b8d 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceplugin.h +++ b/plugins/samplesource/remoteinput/remoteinputplugin.h @@ -14,23 +14,23 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef INCLUDE_SDRDAEMONSOURCEPLUGIN_H -#define INCLUDE_SDRDAEMONSOURCEPLUGIN_H +#ifndef INCLUDE_REMOTEINPUTPLUGIN_H +#define INCLUDE_REMOTEINPUTPLUGIN_H #include #include "plugin/plugininterface.h" -#define SDRDAEMONSOURCE_DEVICE_TYPE_ID "sdrangel.samplesource.sdrdaemonsource" +#define REMOTEINPUT_DEVICE_TYPE_ID "sdrangel.samplesource.remoteinput" class PluginAPI; -class SDRdaemonSourcePlugin : public QObject, public PluginInterface { +class RemoteInputPlugin : public QObject, public PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) - Q_PLUGIN_METADATA(IID SDRDAEMONSOURCE_DEVICE_TYPE_ID) + Q_PLUGIN_METADATA(IID REMOTEINPUT_DEVICE_TYPE_ID) public: - explicit SDRdaemonSourcePlugin(QObject* parent = NULL); + explicit RemoteInputPlugin(QObject* parent = NULL); const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); @@ -49,4 +49,4 @@ private: static const PluginDescriptor m_pluginDescriptor; }; -#endif // INCLUDE_SDRDAEMONSOURCEPLUGIN_H +#endif // INCLUDE_REMOTEINPUTPLUGIN_H diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.cpp b/plugins/samplesource/remoteinput/remoteinputsettings.cpp similarity index 92% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.cpp rename to plugins/samplesource/remoteinput/remoteinputsettings.cpp index 2b6b939f4..061bb0370 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.cpp +++ b/plugins/samplesource/remoteinput/remoteinputsettings.cpp @@ -15,14 +15,14 @@ /////////////////////////////////////////////////////////////////////////////////// #include "util/simpleserializer.h" -#include "sdrdaemonsourcesettings.h" +#include "remoteinputsettings.h" -SDRdaemonSourceSettings::SDRdaemonSourceSettings() +RemoteInputSettings::RemoteInputSettings() { resetToDefaults(); } -void SDRdaemonSourceSettings::resetToDefaults() +void RemoteInputSettings::resetToDefaults() { m_apiAddress = "127.0.0.1"; m_apiPort = 9091; @@ -37,7 +37,7 @@ void SDRdaemonSourceSettings::resetToDefaults() m_reverseAPIDeviceIndex = 0; } -QByteArray SDRdaemonSourceSettings::serialize() const +QByteArray RemoteInputSettings::serialize() const { SimpleSerializer s(1); @@ -55,7 +55,7 @@ QByteArray SDRdaemonSourceSettings::serialize() const return s.final(); } -bool SDRdaemonSourceSettings::deserialize(const QByteArray& data) +bool RemoteInputSettings::deserialize(const QByteArray& data) { SimpleDeserializer d(data); diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.h b/plugins/samplesource/remoteinput/remoteinputsettings.h similarity index 85% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.h rename to plugins/samplesource/remoteinput/remoteinputsettings.h index 1dd3d9469..556675479 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourcesettings.h +++ b/plugins/samplesource/remoteinput/remoteinputsettings.h @@ -14,13 +14,13 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCESETTINGS_H_ -#define PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCESETTINGS_H_ +#ifndef PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTSETTINGS_H_ +#define PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTSETTINGS_H_ #include #include -struct SDRdaemonSourceSettings { +struct RemoteInputSettings { QString m_apiAddress; quint16 m_apiPort; QString m_dataAddress; @@ -33,10 +33,10 @@ struct SDRdaemonSourceSettings { uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; - SDRdaemonSourceSettings(); + RemoteInputSettings(); void resetToDefaults(); QByteArray serialize() const; bool deserialize(const QByteArray& data); }; -#endif /* PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCESETTINGS_H_ */ +#endif /* PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTSETTINGS_H_ */ diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.cpp b/plugins/samplesource/remoteinput/remoteinputudphandler.cpp similarity index 70% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.cpp rename to plugins/samplesource/remoteinput/remoteinputudphandler.cpp index 1f49896e4..cd7fd2e9f 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.cpp +++ b/plugins/samplesource/remoteinput/remoteinputudphandler.cpp @@ -22,15 +22,15 @@ #include "dsp/dspengine.h" #include -#include "sdrdaemonsourceinput.h" -#include "sdrdaemonsourceudphandler.h" +#include "remoteinputudphandler.h" +#include "remoteinput.h" -SDRdaemonSourceUDPHandler::SDRdaemonSourceUDPHandler(SampleSinkFifo *sampleFifo, DeviceSourceAPI *deviceAPI) : +RemoteInputUDPHandler::RemoteInputUDPHandler(SampleSinkFifo *sampleFifo, DeviceSourceAPI *deviceAPI) : m_deviceAPI(deviceAPI), m_masterTimer(deviceAPI->getMasterTimer()), m_masterTimerConnected(false), m_running(false), - m_rateDivider(1000/SDRDAEMONSOURCE_THROTTLE_MS), + m_rateDivider(1000/REMOTEINPUT_THROTTLE_MS), m_dataSocket(0), m_dataAddress(QHostAddress::LocalHost), m_remoteAddress(QHostAddress::LocalHost), @@ -46,7 +46,7 @@ SDRdaemonSourceUDPHandler::SDRdaemonSourceUDPHandler(SampleSinkFifo *sampleFifo, m_tickCount(0), m_samplesCount(0), m_timer(0), - m_throttlems(SDRDAEMONSOURCE_THROTTLE_MS), + m_throttlems(REMOTEINPUT_THROTTLE_MS), m_readLengthSamples(0), m_readLength(0), m_converterBuffer(0), @@ -67,7 +67,7 @@ SDRdaemonSourceUDPHandler::SDRdaemonSourceUDPHandler(SampleSinkFifo *sampleFifo, m_rateDivider = 1000 / m_throttlems; } -SDRdaemonSourceUDPHandler::~SDRdaemonSourceUDPHandler() +RemoteInputUDPHandler::~RemoteInputUDPHandler() { stop(); delete[] m_udpBuf; @@ -79,9 +79,9 @@ SDRdaemonSourceUDPHandler::~SDRdaemonSourceUDPHandler() #endif } -void SDRdaemonSourceUDPHandler::start() +void RemoteInputUDPHandler::start() { - qDebug("SDRdaemonSourceUDPHandler::start"); + qDebug("RemoteInputUDPHandler::start"); if (m_running) { return; @@ -98,12 +98,12 @@ void SDRdaemonSourceUDPHandler::start() if (m_dataSocket->bind(m_dataAddress, m_dataPort)) { - qDebug("SDRdaemonSourceUDPHandler::start: bind data socket to %s:%d", m_dataAddress.toString().toStdString().c_str(), m_dataPort); + qDebug("RemoteInputUDPHandler::start: bind data socket to %s:%d", m_dataAddress.toString().toStdString().c_str(), m_dataPort); m_dataConnected = true; } else { - qWarning("SDRdaemonSourceUDPHandler::start: cannot bind data port %d", m_dataPort); + qWarning("RemoteInputUDPHandler::start: cannot bind data port %d", m_dataPort); disconnect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); m_dataConnected = false; } @@ -113,9 +113,9 @@ void SDRdaemonSourceUDPHandler::start() m_running = true; } -void SDRdaemonSourceUDPHandler::stop() +void RemoteInputUDPHandler::stop() { - qDebug("SDRdaemonSourceUDPHandler::stop"); + qDebug("RemoteInputUDPHandler::stop"); if (!m_running) { return; @@ -140,14 +140,14 @@ void SDRdaemonSourceUDPHandler::stop() m_running = false; } -void SDRdaemonSourceUDPHandler::configureUDPLink(const QString& address, quint16 port) +void RemoteInputUDPHandler::configureUDPLink(const QString& address, quint16 port) { - qDebug("SDRdaemonSourceUDPHandler::configureUDPLink: %s:%d", address.toStdString().c_str(), port); + qDebug("RemoteInputUDPHandler::configureUDPLink: %s:%d", address.toStdString().c_str(), port); bool addressOK = m_dataAddress.setAddress(address); if (!addressOK) { - qWarning("SDRdaemonSourceUDPHandler::configureUDPLink: invalid address %s. Set to localhost.", address.toStdString().c_str()); + qWarning("RemoteInputUDPHandler::configureUDPLink: invalid address %s. Set to localhost.", address.toStdString().c_str()); m_dataAddress = QHostAddress::LocalHost; } @@ -156,7 +156,7 @@ void SDRdaemonSourceUDPHandler::configureUDPLink(const QString& address, quint16 start(); } -void SDRdaemonSourceUDPHandler::dataReadyRead() +void RemoteInputUDPHandler::dataReadyRead() { m_udpReadBytes = 0; @@ -172,13 +172,13 @@ void SDRdaemonSourceUDPHandler::dataReadyRead() } } -void SDRdaemonSourceUDPHandler::processData() +void RemoteInputUDPHandler::processData() { - m_sdrDaemonBuffer.writeData(m_udpBuf); - const RemoteMetaDataFEC& metaData = m_sdrDaemonBuffer.getCurrentMeta(); + m_remoteInputBuffer.writeData(m_udpBuf); + const RemoteMetaDataFEC& metaData = m_remoteInputBuffer.getCurrentMeta(); bool change = false; - m_tv_msec = m_sdrDaemonBuffer.getTVOutMSec(); + m_tv_msec = m_remoteInputBuffer.getTVOutMSec(); if (m_centerFrequency != metaData.m_centerFrequency) { @@ -194,14 +194,14 @@ void SDRdaemonSourceUDPHandler::processData() if (change && (m_samplerate != 0)) { - qDebug("SDRdaemonSourceUDPHandler::processData: m_samplerate: %u m_centerFrequency: %u kHz", m_samplerate, m_centerFrequency); + qDebug("RemoteInputUDPHandler::processData: m_samplerate: %u m_centerFrequency: %u kHz", m_samplerate, m_centerFrequency); DSPSignalNotification *notif = new DSPSignalNotification(m_samplerate, m_centerFrequency * 1000); // Frequency in Hz for the DSP engine m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); if (m_outputMessageQueueToGUI) { - SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData *report = SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamData::create( + RemoteInput::MsgReportRemoteInputStreamData *report = RemoteInput::MsgReportRemoteInputStreamData::create( m_samplerate, m_centerFrequency * 1000, // Frequency in Hz for the GUI m_tv_msec); @@ -213,11 +213,11 @@ void SDRdaemonSourceUDPHandler::processData() } } -void SDRdaemonSourceUDPHandler::connectTimer() +void RemoteInputUDPHandler::connectTimer() { if (!m_masterTimerConnected) { - qDebug() << "SDRdaemonSourceUDPHandler::connectTimer"; + qDebug() << "RemoteInputUDPHandler::connectTimer"; #ifdef USE_INTERNAL_TIMER #warning "Uses internal timer" connect(m_timer, SIGNAL(timeout()), this, SLOT(tick())); @@ -228,11 +228,11 @@ void SDRdaemonSourceUDPHandler::connectTimer() } } -void SDRdaemonSourceUDPHandler::disconnectTimer() +void RemoteInputUDPHandler::disconnectTimer() { if (m_masterTimerConnected) { - qDebug() << "SDRdaemonSourceUDPHandler::disconnectTimer"; + qDebug() << "RemoteInputUDPHandler::disconnectTimer"; #ifdef USE_INTERNAL_TIMER #warning "Uses internal timer" disconnect(m_timer, SIGNAL(timeout()), this, SLOT(tick())); @@ -243,7 +243,7 @@ void SDRdaemonSourceUDPHandler::disconnectTimer() } } -void SDRdaemonSourceUDPHandler::tick() +void RemoteInputUDPHandler::tick() { // auto throttling int throttlems = m_elapsedTimer.restart(); @@ -251,15 +251,15 @@ void SDRdaemonSourceUDPHandler::tick() if (throttlems != m_throttlems) { m_throttlems = throttlems; - m_readLengthSamples = (m_sdrDaemonBuffer.getCurrentMeta().m_sampleRate * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000; + m_readLengthSamples = (m_remoteInputBuffer.getCurrentMeta().m_sampleRate * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000; m_throttleToggle = !m_throttleToggle; } if (m_autoCorrBuffer) { - m_readLengthSamples += m_sdrDaemonBuffer.getRWBalanceCorrection(); + m_readLengthSamples += m_remoteInputBuffer.getRWBalanceCorrection(); } - const RemoteMetaDataFEC& metaData = m_sdrDaemonBuffer.getCurrentMeta(); + const RemoteMetaDataFEC& metaData = m_remoteInputBuffer.getCurrentMeta(); m_readLength = m_readLengthSamples * (metaData.m_sampleBytes & 0xF) * 2; if ((metaData.m_sampleBits == 16) && (SDR_RX_SAMP_SZ == 24)) // 16 -> 24 bits @@ -270,7 +270,7 @@ void SDRdaemonSourceUDPHandler::tick() m_converterBuffer = new int32_t[m_readLengthSamples*2]; } - uint8_t *buf = m_sdrDaemonBuffer.readData(m_readLength); + uint8_t *buf = m_remoteInputBuffer.readData(m_readLength); for (unsigned int is = 0; is < m_readLengthSamples; is++) { @@ -290,7 +290,7 @@ void SDRdaemonSourceUDPHandler::tick() m_converterBuffer = new int32_t[m_readLengthSamples]; } - uint8_t *buf = m_sdrDaemonBuffer.readData(m_readLength); + uint8_t *buf = m_remoteInputBuffer.readData(m_readLength); for (unsigned int is = 0; is < m_readLengthSamples; is++) { @@ -304,12 +304,12 @@ void SDRdaemonSourceUDPHandler::tick() else if ((metaData.m_sampleBits == 16) || (metaData.m_sampleBits == 24)) // same sample size and valid size { // read samples directly feeding the SampleFifo (no callback) - m_sampleFifo->write(reinterpret_cast(m_sdrDaemonBuffer.readData(m_readLength)), m_readLength); + m_sampleFifo->write(reinterpret_cast(m_remoteInputBuffer.readData(m_readLength)), m_readLength); m_samplesCount += m_readLengthSamples; } else // invalid size { - qWarning("SDRdaemonSourceUDPHandler::tick: unexpected sample size in stream: %d bits", (int) metaData.m_sampleBits); + qWarning("RemoteInputUDPHandler::tick: unexpected sample size in stream: %d bits", (int) metaData.m_sampleBits); } if (m_tickCount < m_rateDivider) @@ -323,12 +323,12 @@ void SDRdaemonSourceUDPHandler::tick() if (m_outputMessageQueueToGUI) { int framesDecodingStatus; - int minNbBlocks = m_sdrDaemonBuffer.getMinNbBlocks(); - int minNbOriginalBlocks = m_sdrDaemonBuffer.getMinOriginalBlocks(); - int nbOriginalBlocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbOriginalBlocks; - int nbFECblocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbFECBlocks; - int sampleBits = m_sdrDaemonBuffer.getCurrentMeta().m_sampleBits; - int sampleBytes = m_sdrDaemonBuffer.getCurrentMeta().m_sampleBytes; + int minNbBlocks = m_remoteInputBuffer.getMinNbBlocks(); + int minNbOriginalBlocks = m_remoteInputBuffer.getMinOriginalBlocks(); + int nbOriginalBlocks = m_remoteInputBuffer.getCurrentMeta().m_nbOriginalBlocks; + int nbFECblocks = m_remoteInputBuffer.getCurrentMeta().m_nbFECBlocks; + int sampleBits = m_remoteInputBuffer.getCurrentMeta().m_sampleBits; + int sampleBytes = m_remoteInputBuffer.getCurrentMeta().m_sampleBytes; //framesDecodingStatus = (minNbOriginalBlocks == nbOriginalBlocks ? 2 : (minNbOriginalBlocks < nbOriginalBlocks - nbFECblocks ? 0 : 1)); if (minNbBlocks < nbOriginalBlocks) { @@ -339,18 +339,18 @@ void SDRdaemonSourceUDPHandler::tick() framesDecodingStatus = 2; } - SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming *report = SDRdaemonSourceInput::MsgReportSDRdaemonSourceStreamTiming::create( + RemoteInput::MsgReportRemoteInputStreamTiming *report = RemoteInput::MsgReportRemoteInputStreamTiming::create( m_tv_msec, - m_sdrDaemonBuffer.getBufferLengthInSecs(), - m_sdrDaemonBuffer.getBufferGauge(), + m_remoteInputBuffer.getBufferLengthInSecs(), + m_remoteInputBuffer.getBufferGauge(), framesDecodingStatus, minNbBlocks == nbOriginalBlocks + nbFECblocks, minNbBlocks, minNbOriginalBlocks, - m_sdrDaemonBuffer.getMaxNbRecovery(), - m_sdrDaemonBuffer.getAvgNbBlocks(), - m_sdrDaemonBuffer.getAvgOriginalBlocks(), - m_sdrDaemonBuffer.getAvgNbRecovery(), + m_remoteInputBuffer.getMaxNbRecovery(), + m_remoteInputBuffer.getAvgNbBlocks(), + m_remoteInputBuffer.getAvgOriginalBlocks(), + m_remoteInputBuffer.getAvgNbRecovery(), nbOriginalBlocks, nbFECblocks, sampleBits, diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.h b/plugins/samplesource/remoteinput/remoteinputudphandler.h similarity index 80% rename from plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.h rename to plugins/samplesource/remoteinput/remoteinputudphandler.h index dd47f1566..4646a67de 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceudphandler.h +++ b/plugins/samplesource/remoteinput/remoteinputudphandler.h @@ -14,8 +14,8 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#ifndef PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEUDPHANDLER_H_ -#define PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEUDPHANDLER_H_ +#ifndef PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTUDPHANDLER_H_ +#define PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTUDPHANDLER_H_ #include #include @@ -23,21 +23,21 @@ #include #include -#include "sdrdaemonsourcebuffer.h" +#include "remoteinputbuffer.h" -#define SDRDAEMONSOURCE_THROTTLE_MS 50 +#define REMOTEINPUT_THROTTLE_MS 50 class SampleSinkFifo; class MessageQueue; class QTimer; class DeviceSourceAPI; -class SDRdaemonSourceUDPHandler : public QObject +class RemoteInputUDPHandler : public QObject { Q_OBJECT public: - SDRdaemonSourceUDPHandler(SampleSinkFifo* sampleFifo, DeviceSourceAPI *deviceAPI); - ~SDRdaemonSourceUDPHandler(); + RemoteInputUDPHandler(SampleSinkFifo* sampleFifo, DeviceSourceAPI *deviceAPI); + ~RemoteInputUDPHandler(); void setMessageQueueToGUI(MessageQueue *queue) { m_outputMessageQueueToGUI = queue; } void start(); void stop(); @@ -47,10 +47,10 @@ public: bool isStreaming() const { return m_masterTimerConnected; } int getSampleRate() const { return m_samplerate; } int getCenterFrequency() const { return m_centerFrequency * 1000; } - int getBufferGauge() const { return m_sdrDaemonBuffer.getBufferGauge(); } + int getBufferGauge() const { return m_remoteInputBuffer.getBufferGauge(); } uint64_t getTVmSec() const { return m_tv_msec; } - int getMinNbBlocks() { return m_sdrDaemonBuffer.getMinNbBlocks(); } - int getMaxNbRecovery() { return m_sdrDaemonBuffer.getMaxNbRecovery(); } + int getMinNbBlocks() { return m_remoteInputBuffer.getMinNbBlocks(); } + int getMaxNbRecovery() { return m_remoteInputBuffer.getMaxNbRecovery(); } public slots: void dataReadyRead(); @@ -60,7 +60,7 @@ private: bool m_masterTimerConnected; bool m_running; uint32_t m_rateDivider; - SDRdaemonSourceBuffer m_sdrDaemonBuffer; + RemoteInputBuffer m_remoteInputBuffer; QUdpSocket *m_dataSocket; QHostAddress m_dataAddress; QHostAddress m_remoteAddress; @@ -96,4 +96,4 @@ private slots: -#endif /* PLUGINS_SAMPLESOURCE_SDRDAEMONSOURCE_SDRDAEMONSOURCEUDPHANDLER_H_ */ +#endif /* PLUGINS_SAMPLESOURCE_REMOTEINPUT_REMOTEINPUTUDPHANDLER_H_ */ diff --git a/plugins/samplesource/sdrdaemonsource/CMakeLists.txt b/plugins/samplesource/sdrdaemonsource/CMakeLists.txt deleted file mode 100644 index 387ad4ed9..000000000 --- a/plugins/samplesource/sdrdaemonsource/CMakeLists.txt +++ /dev/null @@ -1,86 +0,0 @@ -project(sdrdaemonsource) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") - -if (HAS_SSSE3) - message(STATUS "SDRdaemonSource: use SSSE3 SIMD" ) -elseif (HAS_NEON) - message(STATUS "SDRdaemonSource: use Neon SIMD" ) -else() - message(STATUS "SDRdaemonSource: Unsupported architecture") - return() -endif() - -set(sdrdaemonsource_SOURCES - sdrdaemonsourcebuffer.cpp - sdrdaemonsourcegui.cpp - sdrdaemonsourceinput.cpp - sdrdaemonsourcesettings.cpp - sdrdaemonsourceplugin.cpp - sdrdaemonsourceudphandler.cpp -) - -set(sdrdaemonsource_HEADERS - sdrdaemonsourcebuffer.h - sdrdaemonsourcegui.h - sdrdaemonsourceinput.h - sdrdaemonsourcesettings.h - sdrdaemonsourceplugin.h - sdrdaemonsourceudphandler.h -) - -set(sdrdaemonsource_FORMS - sdrdaemonsourcegui.ui -) - -#include(${QT_USE_FILE}) -add_definitions(${QT_DEFINITIONS}) -add_definitions(-DQT_PLUGIN) -add_definitions(-DQT_SHARED) - -#qt4_wrap_cpp(sdrdaemonsource_HEADERS_MOC ${sdrdaemonsource_HEADERS}) -qt5_wrap_ui(sdrdaemonsource_FORMS_HEADERS ${sdrdaemonsource_FORMS}) - -add_library(inputsdrdaemonsource SHARED - ${sdrdaemonsource_SOURCES} - ${sdrdaemonsource_HEADERS_MOC} - ${sdrdaemonsource_FORMS_HEADERS} -) - -if (BUILD_DEBIAN) -target_include_directories(inputsdrdaemonsource PUBLIC - . - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client - ${LIBCM256CCSRC} -) -else (BUILD_DEBIAN) -target_include_directories(inputsdrdaemonsource 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(inputsdrdaemonsource - ${QT_LIBRARIES} - cm256cc - sdrbase - sdrgui - swagger -) -else (BUILD_DEBIAN) -target_link_libraries(inputsdrdaemonsource - ${QT_LIBRARIES} - ${CM256CC_LIBRARIES} - sdrbase - sdrgui - swagger -) -endif (BUILD_DEBIAN) - -target_link_libraries(inputsdrdaemonsource Qt5::Core Qt5::Widgets) - -install(TARGETS inputsdrdaemonsource DESTINATION lib/plugins/samplesource) diff --git a/pluginssrv/samplesource/CMakeLists.txt b/pluginssrv/samplesource/CMakeLists.txt index 966ad8227..1e58cfec9 100644 --- a/pluginssrv/samplesource/CMakeLists.txt +++ b/pluginssrv/samplesource/CMakeLists.txt @@ -71,7 +71,7 @@ endif(LIBUSB_FOUND AND LIBRTLSDR_FOUND) find_package(CM256cc) if(CM256CC_FOUND) - add_subdirectory(sdrdaemonsource) + add_subdirectory(remoteinput) endif(CM256CC_FOUND) find_package(LibMiriSDR) @@ -100,7 +100,7 @@ if (BUILD_DEBIAN) add_subdirectory(perseus) add_subdirectory(plutosdrinput) add_subdirectory(rtlsdr) - add_subdirectory(sdrdaemonsource) + add_subdirectory(remoteinput) add_subdirectory(sdrplay) endif (BUILD_DEBIAN) diff --git a/pluginssrv/samplesource/remoteinput/CMakeLists.txt b/pluginssrv/samplesource/remoteinput/CMakeLists.txt new file mode 100644 index 000000000..906e71668 --- /dev/null +++ b/pluginssrv/samplesource/remoteinput/CMakeLists.txt @@ -0,0 +1,75 @@ +project(remoteinput) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(PLUGIN_PREFIX "../../../plugins/samplesource/remoteinput") + +if (HAS_SSSE3) + message(STATUS "RemoteInput: use SSSE3 SIMD" ) +elseif (HAS_NEON) + message(STATUS "RemoteInput: use Neon SIMD" ) +else() + message(STATUS "RemoteInput: Unsupported architecture") + return() +endif() + +set(remoteinput_SOURCES + ${PLUGIN_PREFIX}/remoteinputbuffer.cpp + ${PLUGIN_PREFIX}/remoteinputudphandler.cpp + ${PLUGIN_PREFIX}/remoteinput.cpp + ${PLUGIN_PREFIX}/remoteinputsettings.cpp + ${PLUGIN_PREFIX}/remoteinputplugin.cpp +) + +set(remoteinput_HEADERS + ${PLUGIN_PREFIX}/remoteinputbuffer.h + ${PLUGIN_PREFIX}/remoteinputudphandler.h + ${PLUGIN_PREFIX}/remoteinput.h + ${PLUGIN_PREFIX}/remoteinputsettings.h + ${PLUGIN_PREFIX}/remoteinputplugin.h +) + + +add_definitions(${QT_DEFINITIONS}) +add_definitions(-DQT_PLUGIN) +add_definitions(-DQT_SHARED) + +add_library(inputremotesrv SHARED + ${remoteinput_SOURCES} + ${remoteinput_HEADERS_MOC} +) + +if (BUILD_DEBIAN) +target_include_directories(inputremotesrv PUBLIC + . + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${LIBCM256CCSRC} +) +else (BUILD_DEBIAN) +target_include_directories(inputremotesrv 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(inputremotesrv + ${QT_LIBRARIES} + cm256cc + sdrbase + swagger +) +else (BUILD_DEBIAN) +target_link_libraries(inputremotesrv + ${QT_LIBRARIES} + ${CM256CC_LIBRARIES} + sdrbase + swagger +) +endif (BUILD_DEBIAN) + +target_link_libraries(inputremotesrv Qt5::Core) + +install(TARGETS inputremotesrv DESTINATION lib/pluginssrv/samplesource) diff --git a/pluginssrv/samplesource/sdrdaemonsource/CMakeLists.txt b/pluginssrv/samplesource/sdrdaemonsource/CMakeLists.txt deleted file mode 100644 index 98de7ca6d..000000000 --- a/pluginssrv/samplesource/sdrdaemonsource/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -project(sdrdaemonsource) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -set(PLUGIN_PREFIX "../../../plugins/samplesource/sdrdaemonsource") - -if (HAS_SSSE3) - message(STATUS "SDRdaemonSource: use SSSE3 SIMD" ) -elseif (HAS_NEON) - message(STATUS "SDRdaemonSource: use Neon SIMD" ) -else() - message(STATUS "SDRdaemonSource: Unsupported architecture") - return() -endif() - -set(sdrdaemonsource_SOURCES - ${PLUGIN_PREFIX}/sdrdaemonsourcebuffer.cpp - ${PLUGIN_PREFIX}/sdrdaemonsourceinput.cpp - ${PLUGIN_PREFIX}/sdrdaemonsourcesettings.cpp - ${PLUGIN_PREFIX}/sdrdaemonsourceplugin.cpp - ${PLUGIN_PREFIX}/sdrdaemonsourceudphandler.cpp -) - -set(sdrdaemonsource_HEADERS - ${PLUGIN_PREFIX}/sdrdaemonsourcebuffer.h - ${PLUGIN_PREFIX}/sdrdaemonsourceinput.h - ${PLUGIN_PREFIX}/sdrdaemonsourcesettings.h - ${PLUGIN_PREFIX}/sdrdaemonsourceplugin.h - ${PLUGIN_PREFIX}/sdrdaemonsourceudphandler.h -) - - -add_definitions(${QT_DEFINITIONS}) -add_definitions(-DQT_PLUGIN) -add_definitions(-DQT_SHARED) - -add_library(inputsdrdaemonsourcesrv SHARED - ${sdrdaemonsource_SOURCES} - ${sdrdaemonsource_HEADERS_MOC} -) - -if (BUILD_DEBIAN) -target_include_directories(inputsdrdaemonsourcesrv PUBLIC - . - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client - ${LIBCM256CCSRC} -) -else (BUILD_DEBIAN) -target_include_directories(inputsdrdaemonsourcesrv 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(inputsdrdaemonsourcesrv - ${QT_LIBRARIES} - cm256cc - sdrbase - swagger -) -else (BUILD_DEBIAN) -target_link_libraries(inputsdrdaemonsourcesrv - ${QT_LIBRARIES} - ${CM256CC_LIBRARIES} - sdrbase - swagger -) -endif (BUILD_DEBIAN) - -target_link_libraries(inputsdrdaemonsourcesrv Qt5::Core) - -install(TARGETS inputsdrdaemonsourcesrv DESTINATION lib/pluginssrv/samplesource)