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);
};