From 2a72b57f5bf297c6368790eb4998dceb9c156228 Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 8 Feb 2018 06:32:17 +0100 Subject: [PATCH] Perseus support (7) --- plugins/samplesource/perseus/CMakeLists.txt | 10 +- plugins/samplesource/perseus/perseusinput.cpp | 209 +++++++++++++++++- plugins/samplesource/perseus/perseusinput.h | 4 +- 3 files changed, 214 insertions(+), 9 deletions(-) diff --git a/plugins/samplesource/perseus/CMakeLists.txt b/plugins/samplesource/perseus/CMakeLists.txt index 0d1e3f918..b6c415333 100644 --- a/plugins/samplesource/perseus/CMakeLists.txt +++ b/plugins/samplesource/perseus/CMakeLists.txt @@ -4,7 +4,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(perseus_SOURCES # perseusgui.cpp -# perseusinput.cpp + perseusinput.cpp # perseusplugin.cpp perseussettings.cpp perseusthread.cpp @@ -12,7 +12,7 @@ set(perseus_SOURCES set(perseus_HEADERS # perseusgui.h -# perseusinput.h + perseusinput.h # perseusplugin.h perseussettings.h perseusthread.h @@ -26,7 +26,8 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${CMAKE_SOURCE_DIR}/devices ${LIBPERSEUSSRC} ${LIBPERSEUSSRC}/libperseus/src ) @@ -34,7 +35,8 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${CMAKE_SOURCE_DIR}/devices ${LIBPERSEUS_INCLUDE_DIR} ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesource/perseus/perseusinput.cpp b/plugins/samplesource/perseus/perseusinput.cpp index 5f89f4c60..ff1296638 100644 --- a/plugins/samplesource/perseus/perseusinput.cpp +++ b/plugins/samplesource/perseus/perseusinput.cpp @@ -14,6 +14,8 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// +#include + #include "SWGDeviceSettings.h" #include "SWGDeviceState.h" @@ -21,6 +23,7 @@ #include "dsp/dspcommands.h" #include "dsp/dspengine.h" #include "device/devicesourceapi.h" +#include "perseus/deviceperseus.h" #include "perseusinput.h" #include "perseusthread.h" @@ -69,15 +72,15 @@ bool PerseusInput::start() // start / stop streaming is done in the thread. - if ((m_plutoSDRInputThread = new PlutoSDRInputThread(PLUTOSDR_BLOCKSIZE_SAMPLES, m_deviceShared.m_deviceParams->getBox(), &m_sampleFifo)) == 0) + if ((m_perseusThread = new PerseusThread(m_perseusDescriptor, &m_sampleFifo)) == 0) { - qFatal("PlutoSDRInput::start: cannot create thread"); + qFatal("PerseusInput::start: cannot create thread"); stop(); return false; } else { - qDebug("PlutoSDRInput::start: thread created"); + qDebug("PerseusInput::start: thread created"); } m_perseusThread->setLog2Decimation(m_settings.m_log2Decim); @@ -133,7 +136,11 @@ const QString& PerseusInput::getDeviceDescription() const } int PerseusInput::getSampleRate() const { - return (m_settings.m_devSampleRate / (1<initAcquisition()) + { + m_deviceAPI->startAcquisition(); + DSPEngine::instance()->startAudioOutput(); + } + } + else + { + m_deviceAPI->stopAcquisition(); + DSPEngine::instance()->stopAudioOutput(); + } + + return true; + } + else if (MsgFileRecord::match(message)) + { + MsgFileRecord& conf = (MsgFileRecord&) message; + qDebug() << "PerseusInput::handleMessage: MsgFileRecord: " << conf.getStartStop(); + + if (conf.getStartStop()) { + m_fileSink->startRecording(); + } else { + m_fileSink->stopRecording(); + } + + return true; + } + else + { + return false; + } +} + bool PerseusInput::openDevice() { m_deviceAPI->getSampleSourceSerial(); @@ -197,3 +259,142 @@ void PerseusInput::closeDevice() } } +void PerseusInput::setDeviceCenterFrequency(quint64 freq_hz, const PerseusSettings& settings) +{ + qint64 df = ((qint64)freq_hz * settings.m_LOppmTenths) / 10000000LL; + freq_hz += df; + + int rc = perseus_set_ddc_center_freq(m_perseusDescriptor, freq_hz, settings.m_wideBand ? 1 : 0); + + if (rc < 0) { + qWarning("PerseusInput::setDeviceCenterFrequency: could not set frequency to %llu Hz: %s", freq_hz, perseus_errorstr()); + } else { + qDebug("PerseusInput::setDeviceCenterFrequency: frequency set to %llu Hz", freq_hz); + } +} + +bool PerseusInput::applySettings(const PerseusSettings& settings, bool force) +{ + QMutexLocker mutexLocker(&m_mutex); + + bool forwardChange = false; + int sampleRateIndex = settings.m_devSampleRateIndex; + + if ((m_settings.m_devSampleRateIndex != settings.m_devSampleRateIndex) || force) + { + forwardChange = true; + + if (settings.m_devSampleRateIndex >= m_sampleRates.size()) { + sampleRateIndex = m_sampleRates.size() - 1; + } + + if (m_perseusDescriptor != 0) + { + int rate = m_sampleRates[m_settings.m_devSampleRateIndex < m_sampleRates.size() ? m_settings.m_devSampleRateIndex: 0]; + int rc = perseus_set_sampling_rate(m_perseusDescriptor, rate); + + if (rc < 0) { + qCritical("PerseusInput::applySettings: could not set sample rate index %u (%d S/s): %s", + settings.m_devSampleRateIndex, rate, perseus_errorstr()); + } + else if (m_perseusDescriptor != 0) + { + qDebug("PerseusInput::applySettings: sample rate set to index: %u (%d S/s)", settings.m_devSampleRateIndex, rate); + m_perseusThread->setSamplerate(rate); + } + } + } + + if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) + { + forwardChange = true; + + if (m_perseusThread != 0) + { + m_perseusThread->setLog2Decimation(settings.m_log2Decim); + qDebug("PerseusInput: set decimation to %d", (1<handleMessage(*notif); // forward to file sink + m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); + } + + m_settings = settings; + m_settings.m_devSampleRateIndex = sampleRateIndex; + return true; +} + +int PerseusInput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int PerseusInput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + MsgStartStop *message = MsgStartStop::create(run); + m_inputMessageQueue.push(message); + + if (m_guiMessageQueue) // forward to GUI if any + { + MsgStartStop *msgToGUI = MsgStartStop::create(run); + m_guiMessageQueue->push(msgToGUI); + } + + return 200; +} diff --git a/plugins/samplesource/perseus/perseusinput.h b/plugins/samplesource/perseus/perseusinput.h index 96168a7fe..9f647eff1 100644 --- a/plugins/samplesource/perseus/perseusinput.h +++ b/plugins/samplesource/perseus/perseusinput.h @@ -18,6 +18,8 @@ #define PLUGINS_SAMPLESOURCE_PERSEUS_PERSEUSINPUT_H_ #include +#include "perseus-sdr.h" + #include "dsp/devicesamplesource.h" #include "util/message.h" #include "perseussettings.h" @@ -25,7 +27,6 @@ class DeviceSourceAPI; class FileRecord; class PerseusThread; -struct perseus_descr; class PerseusInput : public DeviceSampleSource { public: @@ -131,6 +132,7 @@ private: bool openDevice(); void closeDevice(); + void setDeviceCenterFrequency(quint64 freq, const PerseusSettings& settings); bool applySettings(const PerseusSettings& settings, bool force = false); };