diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
index 7da77d43d..84bac4c75 100644
--- a/plugins/CMakeLists.txt
+++ b/plugins/CMakeLists.txt
@@ -34,6 +34,5 @@ endif()
add_subdirectory(channelrx)
add_subdirectory(channeltx)
-add_subdirectory(samplemimo)
add_subdirectory(samplesource)
add_subdirectory(samplesink)
diff --git a/plugins/samplemimo/CMakeLists.txt b/plugins/samplemimo/CMakeLists.txt
deleted file mode 100644
index acc069928..000000000
--- a/plugins/samplemimo/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-project(samplemimo)
-
-add_subdirectory(testmi)
diff --git a/plugins/samplemimo/testmi/CMakeLists.txt b/plugins/samplemimo/testmi/CMakeLists.txt
deleted file mode 100644
index 2da1dfa95..000000000
--- a/plugins/samplemimo/testmi/CMakeLists.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-project(testmi)
-
-set(testmi_SOURCES
- testmi.cpp
- testmiplugin.cpp
- testmithread.cpp
- testmisettings.cpp
- testmiwebapiadapter.cpp
-)
-
-set(testmi_HEADERS
- testmi.h
- testmiplugin.h
- testmithread.h
- testmisettings.h
- testmiwebapiadapter.h
-)
-
-include_directories(
- ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
-)
-
-if (NOT SERVER_MODE)
- set (testmi_SOURCES
- ${testmi_SOURCES}
- testmigui.cpp
- testmigui.ui
- )
- set(testmi_HEADERS
- ${testmi_HEADERS}
- testsourcegui.h
- )
- set(TARGET_NAME mimotestmi)
- set(TARGET_LIB "Qt5::Widgets")
- set(TARGET_LIB_GUI "sdrgui")
- set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR})
-else()
- set(TARGET_NAME mimotestmisrv)
- set(TARGET_LIB "")
- set(TARGET_LIB_GUI "")
- set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR})
-endif()
-
-add_library(${TARGET_NAME} SHARED
- ${testmi_SOURCES}
-)
-
-target_link_libraries(${TARGET_NAME}
- Qt5::Core
- ${TARGET_LIB}
- sdrbase
- ${TARGET_LIB_GUI}
- swagger
-)
-
-install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
diff --git a/plugins/samplemimo/testmi/readme.md b/plugins/samplemimo/testmi/readme.md
deleted file mode 100644
index 979a42991..000000000
--- a/plugins/samplemimo/testmi/readme.md
+++ /dev/null
@@ -1,134 +0,0 @@
-
Test source input plugin
-
-Introduction
-
-This input sample source plugin is an internal continuous wave generator that can be used to carry out test of software internals.
-
-Build
-
-The plugin is present in the core of the software and thus is always present in the list of sources.
-
-Interface
-
-![Test source input plugin GUI](../../../doc/img/TestSourceInput_plugin.png)
-
-1: Common stream parameters
-
-![Remote source input stream GUI](../../../doc/img/RemoteInput_plugin_01.png)
-
-1.1: Frequency
-
-This is the center frequency of reception in kHz.
-
-1.2: Start/Stop
-
-Device start / stop button.
-
- - Blue triangle icon: device is ready and can be started
- - Green square icon: device is running and can be stopped
- - Magenta (or pink) square icon: an error occurred. In the case the device was accidentally disconnected you may click on the icon, plug back in and start again.
-
-1.3: Record
-
-Record baseband I/Q stream toggle button
-
-1.4: Stream sample rate
-
-Baseband I/Q sample rate in kS/s. This is the device to host sample rate (3) divided by the decimation factor (4).
-
-2: Various options
-
-![Test source input plugin GUI 2](../../../doc/img/TestSourceInput_plugin_2.png)
-
-2.1: Auto corrections
-
-This combo box control the local DSP auto correction options:
-
- - **None**: no correction
- - **DC**: auto remove DC component
- - **DC+IQ**: auto remove DC component and correct I/Q balance.
-
-2.2: Decimation factor
-
-The I/Q stream from the generator is downsampled by a power of two before being sent to the passband. Possible values are increasing powers of two: 1 (no decimation), 2, 4, 8, 16, 32. This exercises the decimation chain.
-
-This exercises the decimation chain.
-
-2.3: Baseband center frequency position relative the center frequency
-
- - **Cen**: the decimation operation takes place around the center frequency Fs
- - **Inf**: the decimation operation takes place around Fs - Fc.
- - **Sup**: the decimation operation takes place around Fs + Fc.
-
-With SR as the sample rate before decimation Fc is calculated as:
-
- - if decimation n is 4 or lower: Fc = SR/2^(log2(n)-1). The device center frequency is on the side of the baseband. You need a RF filter bandwidth at least twice the baseband.
- - if decimation n is 8 or higher: Fc = SR/n. The device center frequency is half the baseband away from the side of the baseband. You need a RF filter bandwidth at least 3 times the baseband.
-
-2.4: Sample size
-
-This is the sample size in number of bits. It corresponds to the actual sample size used by the devices supported:
-
- - **8**: RTL-SDR, HackRF
- - **12**: Airspy, BladeRF, LimeSDR, PlutoSDR, SDRplay
- - **16**: Airspy HF+, FCD Pro, FCD Pro+
-
-3: Sample rate
-
-This controls the generator sample rate in samples per second.
-
-4: Modulation
-
- - **No**: No modulation
- - **AM**: Amplitude modulation (AM)
- - **FM**: Frequency modulation (FM)
- - **P0**: Pattern 0 is a binary pattern
- - Pulse width: 150 samples
- - Sync pattern: 010 at full amplitude
- - Binary pattern LSB first on 3 bits from 0 to 7 at 0.3 amplitude
- - **P1**: Pattern 1 is a sawtooth pattern
- - Pulse width: 1000 samples
- - Starts at full amplitude then amplitude decreases linearly down to zero
- - **P2**: Pattern 2 is a 50% duty cycle square pattern
- - Pulse width: 1000 samples
- - Starts with a full amplitude pulse then down to zero for the duration of one pulse
-
-5: Modulating tone frequency
-
-This controls the modulating tone frequency in kHz in 10 Hz steps.
-
-6: Carrier shift from center frequency
-
-Use this control to set the offset of the carrier from the center frequency of reception.
-
-7: AM modulation factor
-
-This controls the AM modulation factor from 0 to 99%
-
-8: FM deviation
-
-This controls the frequency modulation deviation in kHz in 100 Hz steps. It cannot exceed the sample rate.
-
-9: Amplitude coarse control
-
-This slider controls the number of amplitude bits by steps of 100 bits. The total number of amplitude bits appear on the right.
-
-10: Amplitude fine control
-
-This slider controls the number of amplitude bits by steps of 1 bit. The signal power in dB relative to the maximum power (full bit range) appear on the right.
-
-11: DC bias
-
-Use this slider to give a DC component in percentage of maximum amplitude.
-
-12: I bias
-
-Use this slider to give an in-phase (I) bias in percentage of maximum amplitude.
-
-13: Q bias
-
-Use this slider to give an quadrature-phase (Q) bias in percentage of maximum amplitude.
-
-14: Phase imbalance
-
-Use this slider to introduce a phase imbalance in percentage of full period (continuous wave) or percentage of I signal injected in Q (AM, FM).
diff --git a/plugins/samplemimo/testmi/testmi.cpp b/plugins/samplemimo/testmi/testmi.cpp
deleted file mode 100644
index d47fb6167..000000000
--- a/plugins/samplemimo/testmi/testmi.cpp
+++ /dev/null
@@ -1,906 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-#include "SWGDeviceSettings.h"
-#include "SWGDeviceState.h"
-#include "SWGTestMISettings.h"
-
-#include "device/deviceapi.h"
-#include "dsp/dspcommands.h"
-#include "dsp/dspengine.h"
-#include "dsp/dspdevicemimoengine.h"
-#include "dsp/devicesamplesource.h"
-#include "dsp/filerecord.h"
-
-#include "testmithread.h"
-#include "testmi.h"
-
-MESSAGE_CLASS_DEFINITION(TestMI::MsgConfigureTestSource, Message)
-MESSAGE_CLASS_DEFINITION(TestMI::MsgFileRecord, Message)
-MESSAGE_CLASS_DEFINITION(TestMI::MsgStartStop, Message)
-
-
-TestMI::TestMI(DeviceAPI *deviceAPI) :
- m_deviceAPI(deviceAPI),
- m_settings(),
- m_deviceDescription("TestMI"),
- m_running(false),
- m_masterTimer(deviceAPI->getMasterTimer())
-{
- m_mimoType = MIMOAsynchronous;
- m_sampleMIFifo.init(2, 96000 * 4);
- //m_sampleSinkVectors.resize(2);
- m_deviceAPI->setNbSourceStreams(2);
- m_networkManager = new QNetworkAccessManager();
- connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
-}
-
-TestMI::~TestMI()
-{
- disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
- delete m_networkManager;
-
- if (m_running) {
- stopRx();
- }
-
- std::vector::iterator it = m_fileSinks.begin();
- int istream = 0;
-
- for (; it != m_fileSinks.end(); ++it, istream++)
- {
- m_deviceAPI->removeAncillarySink(*it, istream);
- delete *it;
- }
-}
-
-void TestMI::destroy()
-{
- delete this;
-}
-
-void TestMI::init()
-{
- m_fileSinks.push_back(new FileRecord(QString("test_0_%1.sdriq").arg(m_deviceAPI->getDeviceUID())));
- m_fileSinks.push_back(new FileRecord(QString("test_1_%1.sdriq").arg(m_deviceAPI->getDeviceUID())));
- m_deviceAPI->addAncillarySink(m_fileSinks[0], 0);
- m_deviceAPI->addAncillarySink(m_fileSinks[1], 1);
-
- applySettings(m_settings, true);
-}
-
-bool TestMI::startRx()
-{
- qDebug("TestMI::startRx");
- QMutexLocker mutexLocker(&m_mutex);
-
- if (m_running) {
- stopRx();
- }
-
- m_testSourceThreads.push_back(new TestMIThread(&m_sampleMIFifo, 0));
- m_testSourceThreads.back()->setSamplerate(m_settings.m_streams[0].m_sampleRate);
- m_testSourceThreads.back()->startStop(true);
-
- m_testSourceThreads.push_back(new TestMIThread(&m_sampleMIFifo, 1));
- m_testSourceThreads.back()->setSamplerate(m_settings.m_streams[1].m_sampleRate);
- m_testSourceThreads.back()->startStop(true);
-
- mutexLocker.unlock();
-
- applySettings(m_settings, true);
- m_running = true;
-
- return true;
-}
-
-bool TestMI::startTx()
-{
- qDebug("TestMI::startTx");
- return false;
-}
-
-void TestMI::stopRx()
-{
- qDebug("TestMI::stopRx");
- QMutexLocker mutexLocker(&m_mutex);
-
- std::vector::iterator it = m_testSourceThreads.begin();
-
- for (; it != m_testSourceThreads.end(); ++it)
- {
- (*it)->startStop(false);
- (*it)->deleteLater();
- }
-
- m_testSourceThreads.clear();
- m_running = false;
-}
-
-void TestMI::stopTx()
-{
- qDebug("TestMI::stopTx");
-}
-
-QByteArray TestMI::serialize() const
-{
- return m_settings.serialize();
-}
-
-bool TestMI::deserialize(const QByteArray& data)
-{
- bool success = true;
-
- if (!m_settings.deserialize(data))
- {
- m_settings.resetToDefaults();
- success = false;
- }
-
- MsgConfigureTestSource* message = MsgConfigureTestSource::create(m_settings, true);
- m_inputMessageQueue.push(message);
-
- if (m_guiMessageQueue)
- {
- MsgConfigureTestSource* messageToGUI = MsgConfigureTestSource::create(m_settings, true);
- m_guiMessageQueue->push(messageToGUI);
- }
-
- return success;
-}
-
-const QString& TestMI::getDeviceDescription() const
-{
- return m_deviceDescription;
-}
-
-int TestMI::getSourceSampleRate(int index) const
-{
- if (index < (int) m_settings.m_streams.size()) {
- return m_settings.m_streams[index].m_sampleRate/(1<push(messageToGUI);
- }
- }
-}
-
-bool TestMI::handleMessage(const Message& message)
-{
- if (MsgConfigureTestSource::match(message))
- {
- MsgConfigureTestSource& conf = (MsgConfigureTestSource&) message;
- qDebug() << "TestMI::handleMessage: MsgConfigureTestSource";
-
- bool success = applySettings(conf.getSettings(), conf.getForce());
-
- if (!success)
- {
- qDebug("TestMI::handleMessage: config error");
- }
-
- return true;
- }
- else if (MsgFileRecord::match(message))
- {
- MsgFileRecord& conf = (MsgFileRecord&) message;
- qDebug() << "TestMI::handleMessage: MsgFileRecord: " << conf.getStartStop();
- int istream = conf.getStreamIndex();
-
- if (conf.getStartStop())
- {
- if (m_settings.m_fileRecordName.size() != 0) {
- m_fileSinks[istream]->setFileName(m_settings.m_fileRecordName + "_0.sdriq");
- } else {
- m_fileSinks[istream]->genUniqueFileName(m_deviceAPI->getDeviceUID(), istream);
- }
-
- m_fileSinks[istream]->startRecording();
- }
- else
- {
- m_fileSinks[istream]->stopRecording();
- }
-
- return true;
- }
- else if (MsgStartStop::match(message))
- {
- MsgStartStop& cmd = (MsgStartStop&) message;
- qDebug() << "TestMI::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
-
- if (cmd.getStartStop())
- {
- if (m_deviceAPI->initDeviceEngine())
- {
- m_deviceAPI->startDeviceEngine();
- }
- }
- else
- {
- m_deviceAPI->stopDeviceEngine();
- }
-
- if (m_settings.m_useReverseAPI) {
- webapiReverseSendStartStop(cmd.getStartStop());
- }
-
- return true;
- }
- else
- {
- return false;
- }
-}
-
-bool TestMI::applySettings(const TestMISettings& settings, bool force)
-{
- DeviceSettingsKeys deviceSettingsKeys;
-
- qDebug() << "TestMI::applySettings: common: "
- << " m_fileRecordName: " << settings.m_fileRecordName
- << " m_useReverseAPI: " << settings.m_useReverseAPI
- << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress
- << " m_reverseAPIPort: " << settings.m_reverseAPIPort
- << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex;
-
- for (unsigned int istream = 0; (istream < m_settings.m_streams.size()) && (istream < settings.m_streams.size()); istream++)
- {
- qDebug() << "TestMI::applySettings: stream #" << istream << ": "
- << " m_centerFrequency: " << settings.m_streams[istream].m_centerFrequency
- << " m_frequencyShift: " << settings.m_streams[istream].m_frequencyShift
- << " m_sampleRate: " << settings.m_streams[istream].m_sampleRate
- << " m_log2Decim: " << settings.m_streams[istream].m_log2Decim
- << " m_fcPos: " << settings.m_streams[istream].m_fcPos
- << " m_amplitudeBits: " << settings.m_streams[istream].m_amplitudeBits
- << " m_sampleSizeIndex: " << settings.m_streams[istream].m_sampleSizeIndex
- << " m_autoCorrOptions: " << settings.m_streams[istream].m_autoCorrOptions
- << " m_dcFactor: " << settings.m_streams[istream].m_dcFactor
- << " m_iFactor: " << settings.m_streams[istream].m_iFactor
- << " m_qFactor: " << settings.m_streams[istream].m_qFactor
- << " m_phaseImbalance: " << settings.m_streams[istream].m_phaseImbalance
- << " m_modulation: " << settings.m_streams[istream].m_modulation
- << " m_amModulation: " << settings.m_streams[istream].m_amModulation
- << " m_fmDeviation: " << settings.m_streams[istream].m_fmDeviation
- << " m_modulationTone: " << settings.m_streams[istream].m_modulationTone;
-
- deviceSettingsKeys.m_streamsSettingsKeys.push_back(QList());
- QList& reverseAPIKeys = deviceSettingsKeys.m_streamsSettingsKeys.back();
-
- if ((m_settings.m_streams[istream].m_autoCorrOptions != settings.m_streams[istream].m_autoCorrOptions) || force)
- {
- reverseAPIKeys.append("autoCorrOptions");
-
- switch(settings.m_streams[istream].m_autoCorrOptions)
- {
- case TestMIStreamSettings::AutoCorrDC:
- m_deviceAPI->configureCorrections(true, false, istream);
- break;
- case TestMIStreamSettings::AutoCorrDCAndIQ:
- m_deviceAPI->configureCorrections(true, true, istream);
- break;
- case TestMIStreamSettings::AutoCorrNone:
- default:
- m_deviceAPI->configureCorrections(false, false, istream);
- break;
- }
- }
-
- if ((m_settings.m_streams[istream].m_sampleRate != settings.m_streams[istream].m_sampleRate) || force)
- {
- reverseAPIKeys.append("sampleRate");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream]))
- {
- m_testSourceThreads[istream]->setSamplerate(settings.m_streams[istream].m_sampleRate);
- qDebug("TestMI::applySettings: thread on stream: %u sample rate set to %d",
- istream, settings.m_streams[istream].m_sampleRate);
- }
- }
-
- if ((m_settings.m_streams[istream].m_log2Decim != settings.m_streams[istream].m_log2Decim) || force)
- {
- reverseAPIKeys.append("log2Decim");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream]))
- {
- m_testSourceThreads[istream]->setLog2Decimation(settings.m_streams[istream].m_log2Decim);
- qDebug("TestMI::applySettings: thread on stream: %u set decimation to %d",
- istream, (1<setFcPos((int) settings.m_streams[istream].m_fcPos);
- m_testSourceThreads[istream]->setFrequencyShift(frequencyShift);
- qDebug() << "TestMI::applySettings:"
- << " thread on istream: " << istream
- << " center freq: " << settings.m_streams[istream].m_centerFrequency << " Hz"
- << " device center freq: " << deviceCenterFrequency << " Hz"
- << " device sample rate: " << devSampleRate << "Hz"
- << " Actual sample rate: " << devSampleRate/(1<setAmplitudeBits(settings.m_streams[istream].m_amplitudeBits);
- }
- }
-
- if ((m_settings.m_streams[istream].m_dcFactor != settings.m_streams[istream].m_dcFactor) || force)
- {
- reverseAPIKeys.append("dcFactor");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setDCFactor(settings.m_streams[istream].m_dcFactor);
- }
- }
-
- if ((m_settings.m_streams[istream].m_iFactor != settings.m_streams[istream].m_iFactor) || force)
- {
- reverseAPIKeys.append("iFactor");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setIFactor(settings.m_streams[istream].m_iFactor);
- }
- }
-
- if ((m_settings.m_streams[istream].m_qFactor != settings.m_streams[istream].m_qFactor) || force)
- {
- reverseAPIKeys.append("qFactor");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setQFactor(settings.m_streams[istream].m_qFactor);
- }
- }
-
- if ((m_settings.m_streams[istream].m_phaseImbalance != settings.m_streams[istream].m_phaseImbalance) || force)
- {
- reverseAPIKeys.append("phaseImbalance");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setPhaseImbalance(settings.m_streams[istream].m_phaseImbalance);
- }
- }
-
- if ((m_settings.m_streams[istream].m_sampleSizeIndex != settings.m_streams[istream].m_sampleSizeIndex) || force)
- {
- reverseAPIKeys.append("sampleSizeIndex");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setBitSize(settings.m_streams[istream].m_sampleSizeIndex);
- }
- }
-
- if ((m_settings.m_streams[istream].m_sampleRate != settings.m_streams[istream].m_sampleRate)
- || (m_settings.m_streams[istream].m_centerFrequency != settings.m_streams[istream].m_centerFrequency)
- || (m_settings.m_streams[istream].m_log2Decim != settings.m_streams[istream].m_log2Decim)
- || (m_settings.m_streams[istream].m_fcPos != settings.m_streams[istream].m_fcPos) || force)
- {
- int sampleRate = settings.m_streams[istream].m_sampleRate/(1<handleMessage(notif); // forward to file sink
- DSPMIMOSignalNotification *engineNotif = new DSPMIMOSignalNotification(
- sampleRate, settings.m_streams[istream].m_centerFrequency, true, istream);
- m_deviceAPI->getDeviceEngineInputMessageQueue()->push(engineNotif);
- }
-
- if ((m_settings.m_streams[istream].m_modulationTone != settings.m_streams[istream].m_modulationTone) || force)
- {
- reverseAPIKeys.append("modulationTone");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setToneFrequency(settings.m_streams[istream].m_modulationTone * 10);
- }
- }
-
- if ((m_settings.m_streams[istream].m_modulation != settings.m_streams[istream].m_modulation) || force)
- {
- reverseAPIKeys.append("modulation");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream]))
- {
- m_testSourceThreads[istream]->setModulation(settings.m_streams[istream].m_modulation);
-
- if (settings.m_streams[istream].m_modulation == TestMIStreamSettings::ModulationPattern0) {
- m_testSourceThreads[istream]->setPattern0();
- } else if (settings.m_streams[istream].m_modulation == TestMIStreamSettings::ModulationPattern1) {
- m_testSourceThreads[istream]->setPattern1();
- } else if (settings.m_streams[istream].m_modulation == TestMIStreamSettings::ModulationPattern2) {
- m_testSourceThreads[istream]->setPattern2();
- }
- }
- }
-
- if ((m_settings.m_streams[istream].m_amModulation != settings.m_streams[istream].m_amModulation) || force)
- {
- reverseAPIKeys.append("amModulation");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setAMModulation(settings.m_streams[istream].m_amModulation / 100.0f);
- }
- }
-
- if ((m_settings.m_streams[istream].m_fmDeviation != settings.m_streams[istream].m_fmDeviation) || force)
- {
- reverseAPIKeys.append("fmDeviation");
-
- if ((istream < m_testSourceThreads.size()) && (m_testSourceThreads[istream])) {
- m_testSourceThreads[istream]->setFMDeviation(settings.m_streams[istream].m_fmDeviation * 100.0f);
- }
- }
- } // for each stream index
-
- if (settings.m_useReverseAPI)
- {
- qDebug("TestMI::applySettings: call webapiReverseSendSettings");
- bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) ||
- (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) ||
- (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) ||
- (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex);
- webapiReverseSendSettings(deviceSettingsKeys, settings, fullUpdate || force);
- }
-
- m_settings = settings;
- return true;
-}
-
-int TestMI::webapiRunGet(
- int subsystemIndex,
- SWGSDRangel::SWGDeviceState& response,
- QString& errorMessage)
-{
- if (subsystemIndex == 0)
- {
- m_deviceAPI->getDeviceEngineStateStr(*response.getState()); // Rx only
- return 200;
- }
- else
- {
- errorMessage = QString("Subsystem index invalid: expect 0 (Rx) only");
- return 404;
- }
-}
-
-int TestMI::webapiRun(
- bool run,
- int subsystemIndex,
- SWGSDRangel::SWGDeviceState& response,
- QString& errorMessage)
-{
- if (subsystemIndex == 0)
- {
- m_deviceAPI->getDeviceEngineStateStr(*response.getState()); // Rx only
- 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;
- }
- else
- {
- errorMessage = QString("Subsystem index invalid: expect 0 (Rx) only");
- return 404;
- }
-
-}
-
-int TestMI::webapiSettingsGet(
- SWGSDRangel::SWGDeviceSettings& response,
- QString& errorMessage)
-{
- (void) errorMessage;
- response.setTestMiSettings(new SWGSDRangel::SWGTestMISettings());
- response.getTestMiSettings()->init();
- webapiFormatDeviceSettings(response, m_settings);
- return 200;
-}
-
-int TestMI::webapiSettingsPutPatch(
- bool force,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response, // query + response
- QString& errorMessage)
-{
- (void) errorMessage;
- TestMISettings settings = m_settings;
- webapiUpdateDeviceSettings(settings, deviceSettingsKeys, response);
-
- MsgConfigureTestSource *msg = MsgConfigureTestSource::create(settings, force);
- m_inputMessageQueue.push(msg);
-
- if (m_guiMessageQueue) // forward to GUI if any
- {
- MsgConfigureTestSource *msgToGUI = MsgConfigureTestSource::create(settings, force);
- m_guiMessageQueue->push(msgToGUI);
- }
-
- webapiFormatDeviceSettings(response, settings);
- return 200;
-}
-
-void TestMI::webapiUpdateDeviceSettings(
- TestMISettings& settings,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response)
-{
- if (deviceSettingsKeys.contains("streams"))
- {
- QList *streamsSettings = response.getTestMiSettings()->getStreams();
- QList::const_iterator it = streamsSettings->begin();
-
- for (; it != streamsSettings->end(); ++it)
- {
- int istream = (*it)->getStreamIndex();
-
- if (deviceSettingsKeys.contains(QString("streams[%1].centerFrequency").arg(istream))) {
- settings.m_streams[istream].m_centerFrequency = (*it)->getCenterFrequency();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].frequencyShift").arg(istream))) {
- settings.m_streams[istream].m_frequencyShift = (*it)->getFrequencyShift();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].sampleRate").arg(istream))) {
- settings.m_streams[istream].m_sampleRate = (*it)->getSampleRate();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].log2Decim").arg(istream))) {
- settings.m_streams[istream].m_log2Decim = (*it)->getLog2Decim();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].fcPos").arg(istream))) {
- int fcPos = (*it)->getFcPos();
- fcPos = fcPos < 0 ? 0 : fcPos > 2 ? 2 : fcPos;
- settings.m_streams[istream].m_fcPos = (TestMIStreamSettings::fcPos_t) fcPos;
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].sampleSizeIndex").arg(istream))) {
- int sampleSizeIndex = (*it)->getSampleSizeIndex();
- sampleSizeIndex = sampleSizeIndex < 0 ? 0 : sampleSizeIndex > 1 ? 2 : sampleSizeIndex;
- settings.m_streams[istream].m_sampleSizeIndex = sampleSizeIndex;
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].amplitudeBits").arg(istream))) {
- settings.m_streams[istream].m_amplitudeBits = (*it)->getAmplitudeBits();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].autoCorrOptions").arg(istream))) {
- int autoCorrOptions = (*it)->getAutoCorrOptions();
- autoCorrOptions = autoCorrOptions < 0 ? 0 : autoCorrOptions >= TestMIStreamSettings::AutoCorrLast ? TestMIStreamSettings::AutoCorrLast-1 : autoCorrOptions;
- settings.m_streams[istream].m_sampleSizeIndex = (TestMIStreamSettings::AutoCorrOptions) autoCorrOptions;
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].modulation").arg(istream))) {
- int modulation = (*it)->getModulation();
- modulation = modulation < 0 ? 0 : modulation >= TestMIStreamSettings::ModulationLast ? TestMIStreamSettings::ModulationLast-1 : modulation;
- settings.m_streams[istream].m_modulation = (TestMIStreamSettings::Modulation) modulation;
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].modulationTone").arg(istream))) {
- settings.m_streams[istream].m_modulationTone = (*it)->getModulationTone();
- }
- if (deviceSettingsKeys.contains(QString("streams[%1].amModulation").arg(istream))) {
- settings.m_streams[istream].m_amModulation = (*it)->getAmModulation();
- };
- if (deviceSettingsKeys.contains(QString("streams[%1].fmDeviation").arg(istream))) {
- settings.m_streams[istream].m_fmDeviation = (*it)->getFmDeviation();
- };
- if (deviceSettingsKeys.contains(QString("streams[%1].dcFactor").arg(istream))) {
- settings.m_streams[istream].m_dcFactor = (*it)->getDcFactor();
- };
- if (deviceSettingsKeys.contains(QString("streams[%1].iFactor").arg(istream))) {
- settings.m_streams[istream].m_iFactor = (*it)->getIFactor();
- };
- if (deviceSettingsKeys.contains(QString("streams[%1].qFactor").arg(istream))) {
- settings.m_streams[istream].m_qFactor = (*it)->getQFactor();
- };
- if (deviceSettingsKeys.contains(QString("streams[%1].phaseImbalance").arg(istream))) {
- settings.m_streams[istream].m_phaseImbalance = (*it)->getPhaseImbalance();
- };
- }
-
- }
-
- if (deviceSettingsKeys.contains("fileRecordName")) {
- settings.m_fileRecordName = *response.getTestMiSettings()->getFileRecordName();
- }
- if (deviceSettingsKeys.contains("useReverseAPI")) {
- settings.m_useReverseAPI = response.getTestMiSettings()->getUseReverseApi() != 0;
- }
- if (deviceSettingsKeys.contains("reverseAPIAddress")) {
- settings.m_reverseAPIAddress = *response.getTestMiSettings()->getReverseApiAddress();
- }
- if (deviceSettingsKeys.contains("reverseAPIPort")) {
- settings.m_reverseAPIPort = response.getTestMiSettings()->getReverseApiPort();
- }
- if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
- settings.m_reverseAPIDeviceIndex = response.getTestMiSettings()->getReverseApiDeviceIndex();
- }
-}
-
-void TestMI::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const TestMISettings& settings)
-{
- std::vector::const_iterator it = settings.m_streams.begin();
- int istream = 0;
-
- for (; it != settings.m_streams.end(); ++it, istream++)
- {
- QList *streams = response.getTestMiSettings()->getStreams();
- streams->append(new SWGSDRangel::SWGTestMiStreamSettings);
- streams->back()->init();
- streams->back()->setStreamIndex(istream);
- streams->back()->setCenterFrequency(it->m_centerFrequency);
- streams->back()->setFrequencyShift(it->m_frequencyShift);
- streams->back()->setSampleRate(it->m_sampleRate);
- streams->back()->setLog2Decim(it->m_log2Decim);
- streams->back()->setFcPos((int) it->m_fcPos);
- streams->back()->setSampleSizeIndex((int) it->m_sampleSizeIndex);
- streams->back()->setAmplitudeBits(it->m_amplitudeBits);
- streams->back()->setAutoCorrOptions((int) it->m_autoCorrOptions);
- streams->back()->setModulation((int) it->m_modulation);
- streams->back()->setModulationTone(it->m_modulationTone);
- streams->back()->setAmModulation(it->m_amModulation);
- streams->back()->setFmDeviation(it->m_fmDeviation);
- streams->back()->setDcFactor(it->m_dcFactor);
- streams->back()->setIFactor(it->m_iFactor);
- streams->back()->setQFactor(it->m_qFactor);
- streams->back()->setPhaseImbalance(it->m_phaseImbalance);
- }
-
- if (response.getTestMiSettings()->getFileRecordName()) {
- *response.getTestMiSettings()->getFileRecordName() = settings.m_fileRecordName;
- } else {
- response.getTestMiSettings()->setFileRecordName(new QString(settings.m_fileRecordName));
- }
-
- response.getTestMiSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0);
-
- if (response.getTestMiSettings()->getReverseApiAddress()) {
- *response.getTestMiSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress;
- } else {
- response.getTestMiSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress));
- }
-
- response.getTestMiSettings()->setReverseApiPort(settings.m_reverseAPIPort);
- response.getTestMiSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
-}
-
-void TestMI::webapiReverseSendSettings(const DeviceSettingsKeys& deviceSettingsKeys, const TestMISettings& settings, bool force)
-{
- SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
- swgDeviceSettings->setDirection(0); // single Rx
- swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
- swgDeviceSettings->setDeviceHwType(new QString("TestSource"));
- swgDeviceSettings->setTestMiSettings(new SWGSDRangel::SWGTestMISettings());
- SWGSDRangel::SWGTestMISettings *swgTestMISettings = swgDeviceSettings->getTestMiSettings();
-
- // transfer data that has been modified. When force is on transfer all data except reverse API data
-
- QList>::const_iterator it = deviceSettingsKeys.m_streamsSettingsKeys.begin();
- int istream = 0;
-
- for (; it != deviceSettingsKeys.m_streamsSettingsKeys.end(); ++it, istream++)
- {
- if ((it->size() > 0) || force)
- {
- QList *streams = swgTestMISettings->getStreams();
- streams->append(new SWGSDRangel::SWGTestMiStreamSettings);
- streams->back()->init();
- streams->back()->setStreamIndex(istream);
- const QList& streamSettingsKeys = *it;
-
- if (streamSettingsKeys.contains("centerFrequency") || force) {
- streams->back()->setCenterFrequency(settings.m_streams[istream].m_centerFrequency);
- }
- if (streamSettingsKeys.contains("frequencyShift") || force) {
- streams->back()->setFrequencyShift(settings.m_streams[istream].m_frequencyShift);
- }
- if (streamSettingsKeys.contains("sampleRate") || force) {
- streams->back()->setSampleRate(settings.m_streams[istream].m_sampleRate);
- }
- if (streamSettingsKeys.contains("log2Decim") || force) {
- streams->back()->setLog2Decim(settings.m_streams[istream].m_log2Decim);
- }
- if (streamSettingsKeys.contains("fcPos") || force) {
- streams->back()->setFcPos((int) settings.m_streams[istream].m_fcPos);
- }
- if (streamSettingsKeys.contains("sampleSizeIndex") || force) {
- streams->back()->setSampleSizeIndex(settings.m_streams[istream].m_sampleSizeIndex);
- }
- if (streamSettingsKeys.contains("amplitudeBits") || force) {
- streams->back()->setAmplitudeBits(settings.m_streams[istream].m_amplitudeBits);
- }
- if (streamSettingsKeys.contains("autoCorrOptions") || force) {
- streams->back()->setAutoCorrOptions((int) settings.m_streams[istream].m_sampleSizeIndex);
- }
- if (streamSettingsKeys.contains("modulation") || force) {
- streams->back()->setModulation((int) settings.m_streams[istream].m_modulation);
- }
- if (streamSettingsKeys.contains("modulationTone")) {
- streams->back()->setModulationTone(settings.m_streams[istream].m_modulationTone);
- }
- if (streamSettingsKeys.contains("amModulation") || force) {
- streams->back()->setAmModulation(settings.m_streams[istream].m_amModulation);
- };
- if (streamSettingsKeys.contains("fmDeviation") || force) {
- streams->back()->setFmDeviation(settings.m_streams[istream].m_fmDeviation);
- };
- if (streamSettingsKeys.contains("dcFactor") || force) {
- streams->back()->setDcFactor(settings.m_streams[istream].m_dcFactor);
- };
- if (streamSettingsKeys.contains("iFactor") || force) {
- streams->back()->setIFactor(settings.m_streams[istream].m_iFactor);
- };
- if (streamSettingsKeys.contains("qFactor") || force) {
- streams->back()->setQFactor(settings.m_streams[istream].m_qFactor);
- };
- if (streamSettingsKeys.contains("phaseImbalance") || force) {
- streams->back()->setPhaseImbalance(settings.m_streams[istream].m_phaseImbalance);
- };
- }
- }
-
- if (deviceSettingsKeys.m_commonSettingsKeys.contains("fileRecordName") || force) {
- swgTestMISettings->setFileRecordName(new QString(settings.m_fileRecordName));
- }
-
- QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings")
- .arg(settings.m_reverseAPIAddress)
- .arg(settings.m_reverseAPIPort)
- .arg(settings.m_reverseAPIDeviceIndex);
- m_networkRequest.setUrl(QUrl(channelSettingsURL));
- m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
-
- QBuffer *buffer = new QBuffer();
- buffer->open((QBuffer::ReadWrite));
- buffer->write(swgDeviceSettings->asJson().toUtf8());
- buffer->seek(0);
-
- // Always use PATCH to avoid passing reverse API settings
- QNetworkReply *reply = m_networkManager->sendCustomRequest(m_networkRequest, "PATCH", buffer);
- buffer->setParent(reply);
-
- delete swgDeviceSettings;
-}
-
-void TestMI::webapiReverseSendStartStop(bool start)
-{
- SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
- swgDeviceSettings->setDirection(0); // single Rx
- swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
- swgDeviceSettings->setDeviceHwType(new QString("TestSource"));
-
- QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/run")
- .arg(m_settings.m_reverseAPIAddress)
- .arg(m_settings.m_reverseAPIPort)
- .arg(m_settings.m_reverseAPIDeviceIndex);
- m_networkRequest.setUrl(QUrl(channelSettingsURL));
- m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
-
- QBuffer *buffer = new QBuffer();
- buffer->open((QBuffer::ReadWrite));
- buffer->write(swgDeviceSettings->asJson().toUtf8());
- buffer->seek(0);
- QNetworkReply *reply;
-
- if (start) {
- reply = m_networkManager->sendCustomRequest(m_networkRequest, "POST", buffer);
- } else {
- reply = m_networkManager->sendCustomRequest(m_networkRequest, "DELETE", buffer);
- }
-
- buffer->setParent(reply);
- delete swgDeviceSettings;
-}
-
-void TestMI::networkManagerFinished(QNetworkReply *reply)
-{
- QNetworkReply::NetworkError replyError = reply->error();
-
- if (replyError)
- {
- qWarning() << "TestMI::networkManagerFinished:"
- << " error(" << (int) replyError
- << "): " << replyError
- << ": " << reply->errorString();
- }
- else
- {
- QString answer = reply->readAll();
- answer.chop(1); // remove last \n
- qDebug("TestMI::networkManagerFinished: reply:\n%s", answer.toStdString().c_str());
- }
-
- reply->deleteLater();
-}
-
-bool TestMI::isRecording(unsigned int istream) const
-{
- if (istream < m_fileSinks.size()) {
- return m_fileSinks[istream]->isRecording();
- } else {
- return false;
- }
-}
\ No newline at end of file
diff --git a/plugins/samplemimo/testmi/testmi.h b/plugins/samplemimo/testmi/testmi.h
deleted file mode 100644
index ca1888b19..000000000
--- a/plugins/samplemimo/testmi/testmi.h
+++ /dev/null
@@ -1,191 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef _TESTMI_TESTMI_H_
-#define _TESTMI_TESTMI_H_
-
-#include
-#include
-#include
-#include
-
-#include "dsp/devicesamplemimo.h"
-#include "testmisettings.h"
-
-class DeviceAPI;
-class TestMIThread;
-class FileRecord;
-class QNetworkAccessManager;
-class QNetworkReply;
-
-class TestMI : public DeviceSampleMIMO {
- Q_OBJECT
-public:
- class MsgConfigureTestSource : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- const TestMISettings& getSettings() const { return m_settings; }
- bool getForce() const { return m_force; }
-
- static MsgConfigureTestSource* create(const TestMISettings& settings, bool force)
- {
- return new MsgConfigureTestSource(settings, force);
- }
-
- private:
- TestMISettings m_settings;
- bool m_force;
-
- MsgConfigureTestSource(const TestMISettings& settings, bool force) :
- Message(),
- m_settings(settings),
- m_force(force)
- { }
- };
-
- class MsgFileRecord : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- bool getStartStop() const { return m_startStop; }
- int getStreamIndex() const { return m_streamIndex; }
-
- static MsgFileRecord* create(bool startStop, int streamIndex) {
- return new MsgFileRecord(startStop, streamIndex);
- }
-
- protected:
- bool m_startStop;
- int m_streamIndex;
-
- MsgFileRecord(bool startStop, int streamIndex) :
- Message(),
- m_startStop(startStop),
- m_streamIndex(streamIndex)
- { }
- };
-
- class MsgStartStop : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- bool getStartStop() const { return m_startStop; }
-
- static MsgStartStop* create(bool startStop) {
- return new MsgStartStop(startStop);
- }
-
- protected:
- bool m_startStop;
-
- MsgStartStop(bool startStop) :
- Message(),
- m_startStop(startStop)
- { }
- };
-
- TestMI(DeviceAPI *deviceAPI);
- virtual ~TestMI();
- virtual void destroy();
-
- virtual void init();
- virtual bool startRx();
- virtual void stopRx();
- virtual bool startTx();
- virtual void stopTx();
-
- virtual QByteArray serialize() const;
- virtual bool deserialize(const QByteArray& data);
-
- virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
- virtual const QString& getDeviceDescription() const;
-
- virtual int getSourceSampleRate(int index) const;
- virtual void setSourceSampleRate(int sampleRate, int index) { (void) sampleRate; (void) index; }
- virtual quint64 getSourceCenterFrequency(int index) const;
- virtual void setSourceCenterFrequency(qint64 centerFrequency, int index);
-
- virtual int getSinkSampleRate(int index) const { return 0; (void) index; }
- virtual void setSinkSampleRate(int sampleRate, int index) { (void) sampleRate; (void) index; }
- virtual quint64 getSinkCenterFrequency(int index) const { return 0; (void) index; }
- virtual void setSinkCenterFrequency(qint64 centerFrequency, int index) { (void) centerFrequency; (void) index; }
-
- virtual quint64 getMIMOCenterFrequency() const { return getSourceCenterFrequency(0); }
- virtual unsigned int getMIMOSampleRate() const { return getSourceSampleRate(0); }
-
- virtual bool handleMessage(const Message& message);
-
- virtual int webapiSettingsGet(
- SWGSDRangel::SWGDeviceSettings& response,
- QString& errorMessage);
-
- virtual int webapiSettingsPutPatch(
- bool force,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response, // query + response
- QString& errorMessage);
-
- virtual int webapiRunGet(
- int subsystemIndex,
- SWGSDRangel::SWGDeviceState& response,
- QString& errorMessage);
-
- virtual int webapiRun(
- bool run,
- int subsystemIndex,
- SWGSDRangel::SWGDeviceState& response,
- QString& errorMessage);
-
- static void webapiFormatDeviceSettings(
- SWGSDRangel::SWGDeviceSettings& response,
- const TestMISettings& settings);
-
- static void webapiUpdateDeviceSettings(
- TestMISettings& settings,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response);
-
- bool isRecording(unsigned int istream) const;
-
-private:
- struct DeviceSettingsKeys
- {
- QList m_commonSettingsKeys;
- QList> m_streamsSettingsKeys;
- };
-
- DeviceAPI *m_deviceAPI;
- std::vector m_fileSinks; //!< File sinks to record device I/Q output
- QMutex m_mutex;
- TestMISettings m_settings;
- std::vector m_testSourceThreads;
- QString m_deviceDescription;
- bool m_running;
- const QTimer& m_masterTimer;
- QNetworkAccessManager *m_networkManager;
- QNetworkRequest m_networkRequest;
-
- bool applySettings(const TestMISettings& settings, bool force);
- void webapiReverseSendSettings(const DeviceSettingsKeys& deviceSettingsKeys, const TestMISettings& settings, bool force);
- void webapiReverseSendStartStop(bool start);
-
-private slots:
- void networkManagerFinished(QNetworkReply *reply);
-};
-
-#endif // _TESTMI_TESTMI_H_
diff --git a/plugins/samplemimo/testmi/testmigui.cpp b/plugins/samplemimo/testmi/testmigui.cpp
deleted file mode 100644
index f802483b6..000000000
--- a/plugins/samplemimo/testmi/testmigui.cpp
+++ /dev/null
@@ -1,605 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-
-#include
-#include
-#include
-#include
-
-#include "plugin/pluginapi.h"
-#include "device/deviceapi.h"
-#include "device/deviceuiset.h"
-#include "gui/colormapper.h"
-#include "gui/glspectrum.h"
-#include "gui/crightclickenabler.h"
-#include "gui/basicdevicesettingsdialog.h"
-#include "dsp/dspengine.h"
-#include "dsp/dspdevicemimoengine.h"
-#include "dsp/dspcommands.h"
-#include "util/db.h"
-
-#include "mainwindow.h"
-
-#include "ui_testmigui.h"
-#include "testmigui.h"
-
-TestMIGui::TestMIGui(DeviceUISet *deviceUISet, QWidget* parent) :
- QWidget(parent),
- ui(new Ui::TestMIGui),
- m_deviceUISet(deviceUISet),
- m_settings(),
- m_doApplySettings(true),
- m_forceSettings(true),
- m_sampleMIMO(nullptr),
- m_tickCount(0),
- m_lastEngineState(DeviceAPI::StNotStarted)
-{
- qDebug("TestMIGui::TestMIGui");
- m_sampleMIMO = m_deviceUISet->m_deviceAPI->getSampleMIMO();
- m_streamIndex = 0;
- m_deviceCenterFrequencies.push_back(m_settings.m_streams[0].m_centerFrequency);
- m_deviceCenterFrequencies.push_back(m_settings.m_streams[1].m_centerFrequency);
- m_deviceSampleRates.push_back(m_settings.m_streams[0].m_sampleRate / (1<setupUi(this);
- ui->spectrumSource->addItem("0");
- ui->spectrumSource->addItem("1");
- ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
- ui->centerFrequency->setValueRange(7, 0, 9999999);
- ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
- ui->sampleRate->setValueRange(7, 48000, 9999999);
- ui->frequencyShift->setColorMapper(ColorMapper(ColorMapper::GrayGold));
- ui->frequencyShift->setValueRange(false, 7, -9999999, 9999999);
- ui->frequencyShiftLabel->setText(QString("%1").arg(QChar(0x94, 0x03)));
-
- displaySettings();
-
- connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
- connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
- m_statusTimer.start(500);
-
- connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
- m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue);
-
- CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop);
- connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &)));
-}
-
-TestMIGui::~TestMIGui()
-{
- delete ui;
-}
-
-void TestMIGui::destroy()
-{
- delete this;
-}
-
-void TestMIGui::setName(const QString& name)
-{
- setObjectName(name);
-}
-
-QString TestMIGui::getName() const
-{
- return objectName();
-}
-
-void TestMIGui::resetToDefaults()
-{
- m_settings.resetToDefaults();
- displaySettings();
- sendSettings();
-}
-
-qint64 TestMIGui::getCenterFrequency() const
-{
- return m_settings.m_streams[m_streamIndex].m_centerFrequency;
-}
-
-void TestMIGui::setCenterFrequency(qint64 centerFrequency)
-{
- m_settings.m_streams[m_streamIndex].m_centerFrequency = centerFrequency;
- displaySettings();
- sendSettings();
-}
-
-QByteArray TestMIGui::serialize() const
-{
- return m_settings.serialize();
-}
-
-bool TestMIGui::deserialize(const QByteArray& data)
-{
- if(m_settings.deserialize(data)) {
- displaySettings();
- m_forceSettings = true;
- sendSettings();
- return true;
- } else {
- resetToDefaults();
- return false;
- }
-}
-
-void TestMIGui::on_startStop_toggled(bool checked)
-{
- if (m_doApplySettings)
- {
- TestMI::MsgStartStop *message = TestMI::MsgStartStop::create(checked);
- m_sampleMIMO->getInputMessageQueue()->push(message);
- }
-}
-
-void TestMIGui::on_streamIndex_currentIndexChanged(int index)
-{
- if (ui->streamLock->isChecked())
- {
- m_spectrumStreamIndex = index;
- m_deviceUISet->m_spectrum->setDisplayedStream(true, index);
- m_deviceUISet->m_deviceAPI->setSpectrumSinkInput(true, m_spectrumStreamIndex);
- ui->spectrumSource->blockSignals(true);
- ui->spectrumSource->setCurrentIndex(index);
- ui->spectrumSource->blockSignals(false);
- }
-
- m_streamIndex = index;
- updateFileRecordStatus();
- updateSampleRateAndFrequency();
- displaySettings();
-}
-
-void TestMIGui::on_spectrumSource_currentIndexChanged(int index)
-{
- m_spectrumStreamIndex = index;
- m_deviceUISet->m_spectrum->setDisplayedStream(true, index);
- m_deviceUISet->m_deviceAPI->setSpectrumSinkInput(true, m_spectrumStreamIndex);
- updateSampleRateAndFrequency();
-
- if (ui->streamLock->isChecked())
- {
- ui->streamIndex->blockSignals(true);
- ui->streamIndex->setCurrentIndex(index);
- ui->streamIndex->blockSignals(false);
- m_streamIndex = index;
- updateFileRecordStatus();
- displaySettings();
- }
-}
-
-void TestMIGui::on_streamLock_toggled(bool checked)
-{
- if (checked && (ui->streamIndex->currentIndex() != ui->spectrumSource->currentIndex())) {
- ui->spectrumSource->setCurrentIndex(ui->streamIndex->currentIndex());
- }
-}
-
-void TestMIGui::on_centerFrequency_changed(quint64 value)
-{
- m_settings.m_streams[m_streamIndex].m_centerFrequency = value * 1000;
- sendSettings();
-}
-
-void TestMIGui::on_autoCorr_currentIndexChanged(int index)
-{
- if ((index < 0) || (index > TestMIStreamSettings::AutoCorrLast)) {
- return;
- }
-
- m_settings.m_streams[m_streamIndex].m_autoCorrOptions = (TestMIStreamSettings::AutoCorrOptions) index;
- sendSettings();
-}
-
-void TestMIGui::on_frequencyShift_changed(qint64 value)
-{
- m_settings.m_streams[m_streamIndex].m_frequencyShift = value;
- sendSettings();
-}
-
-void TestMIGui::on_decimation_currentIndexChanged(int index)
-{
- if ((index < 0) || (index > 6)) {
- return;
- }
-
- m_settings.m_streams[m_streamIndex].m_log2Decim = index;
- sendSettings();
-}
-
-void TestMIGui::on_fcPos_currentIndexChanged(int index)
-{
- if ((index < 0) || (index > 2)) {
- return;
- }
-
- m_settings.m_streams[m_streamIndex].m_fcPos = (TestMIStreamSettings::fcPos_t) index;
- sendSettings();
-}
-
-void TestMIGui::on_sampleRate_changed(quint64 value)
-{
- updateFrequencyShiftLimit();
- m_settings.m_streams[m_streamIndex].m_frequencyShift = ui->frequencyShift->getValueNew();
- m_settings.m_streams[m_streamIndex].m_sampleRate = value;
- sendSettings();
-}
-
-void TestMIGui::on_sampleSize_currentIndexChanged(int index)
-{
- if ((index < 0) || (index > 2)) {
- return;
- }
-
- updateAmpCoarseLimit();
- updateAmpFineLimit();
- displayAmplitude();
- m_settings.m_streams[m_streamIndex].m_amplitudeBits = ui->amplitudeCoarse->value() * 100 + ui->amplitudeFine->value();
- m_settings.m_streams[m_streamIndex].m_sampleSizeIndex = index;
- sendSettings();
-}
-
-void TestMIGui::on_amplitudeCoarse_valueChanged(int value)
-{
- (void) value;
- updateAmpFineLimit();
- displayAmplitude();
- m_settings.m_streams[m_streamIndex].m_amplitudeBits = ui->amplitudeCoarse->value() * 100 + ui->amplitudeFine->value();
- sendSettings();
-}
-
-void TestMIGui::on_amplitudeFine_valueChanged(int value)
-{
- (void) value;
- displayAmplitude();
- m_settings.m_streams[m_streamIndex].m_amplitudeBits = ui->amplitudeCoarse->value() * 100 + ui->amplitudeFine->value();
- sendSettings();
-}
-
-void TestMIGui::on_modulation_currentIndexChanged(int index)
-{
- if ((index < 0) || (index > TestMIStreamSettings::ModulationLast)) {
- return;
- }
-
- m_settings.m_streams[m_streamIndex].m_modulation = (TestMIStreamSettings::Modulation) index;
- sendSettings();
-}
-
-void TestMIGui::on_modulationFrequency_valueChanged(int value)
-{
- m_settings.m_streams[m_streamIndex].m_modulationTone = value;
- ui->modulationFrequencyText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_modulationTone / 100.0, 0, 'f', 2));
- sendSettings();
-}
-
-void TestMIGui::on_amModulation_valueChanged(int value)
-{
- m_settings.m_streams[m_streamIndex].m_amModulation = value;
- ui->amModulationText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_amModulation));
- sendSettings();
-}
-
-void TestMIGui::on_fmDeviation_valueChanged(int value)
-{
- m_settings.m_streams[m_streamIndex].m_fmDeviation = value;
- ui->fmDeviationText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_fmDeviation / 10.0, 0, 'f', 1));
- sendSettings();
-}
-
-void TestMIGui::on_dcBias_valueChanged(int value)
-{
- ui->dcBiasText->setText(QString(tr("%1 %").arg(value)));
- m_settings.m_streams[m_streamIndex].m_dcFactor = value / 100.0f;
- sendSettings();
-}
-
-void TestMIGui::on_iBias_valueChanged(int value)
-{
- ui->iBiasText->setText(QString(tr("%1 %").arg(value)));
- m_settings.m_streams[m_streamIndex].m_iFactor = value / 100.0f;
- sendSettings();
-}
-
-void TestMIGui::on_qBias_valueChanged(int value)
-{
- ui->qBiasText->setText(QString(tr("%1 %").arg(value)));
- m_settings.m_streams[m_streamIndex].m_qFactor = value / 100.0f;
- sendSettings();
-}
-
-void TestMIGui::on_phaseImbalance_valueChanged(int value)
-{
- ui->phaseImbalanceText->setText(QString(tr("%1 %").arg(value)));
- m_settings.m_streams[m_streamIndex].m_phaseImbalance = value / 100.0f;
- sendSettings();
-}
-
-void TestMIGui::on_record_toggled(bool checked)
-{
- if (checked) {
- ui->record->setStyleSheet("QToolButton { background-color : red; }");
- } else {
- ui->record->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
- }
-
- TestMI::MsgFileRecord* message = TestMI::MsgFileRecord::create(checked, m_streamIndex);
- m_sampleMIMO->getInputMessageQueue()->push(message);
-}
-
-void TestMIGui::displayAmplitude()
-{
- int amplitudeInt = ui->amplitudeCoarse->value() * 100 + ui->amplitudeFine->value();
- double power;
-
- switch (ui->sampleSize->currentIndex())
- {
- case 0: // 8 bits: 128
- power = (double) amplitudeInt*amplitudeInt / (double) (1<<14);
- break;
- case 1: // 12 bits 2048
- power = (double) amplitudeInt*amplitudeInt / (double) (1<<22);
- break;
- case 2: // 16 bits 32768
- default:
- power = (double) amplitudeInt*amplitudeInt / (double) (1<<30);
- break;
- }
-
- ui->amplitudeBits->setText(QString(tr("%1 b").arg(amplitudeInt)));
- double powerDb = CalcDb::dbPower(power);
- ui->power->setText(QString(tr("%1 dB").arg(QString::number(powerDb, 'f', 1))));
-}
-
-void TestMIGui::updateAmpCoarseLimit()
-{
- switch (ui->sampleSize->currentIndex())
- {
- case 0: // 8 bits: 128
- ui->amplitudeCoarse->setMaximum(1);
- break;
- case 1: // 12 bits 2048
- ui->amplitudeCoarse->setMaximum(20);
- break;
- case 2: // 16 bits 32768
- default:
- ui->amplitudeCoarse->setMaximum(327);
- break;
- }
-}
-
-void TestMIGui::updateAmpFineLimit()
-{
- switch (ui->sampleSize->currentIndex())
- {
- case 0: // 8 bits: 128
- if (ui->amplitudeCoarse->value() == 1) {
- ui->amplitudeFine->setMaximum(27);
- } else {
- ui->amplitudeFine->setMaximum(99);
- }
- break;
- case 1: // 12 bits 2048
- if (ui->amplitudeCoarse->value() == 20) {
- ui->amplitudeFine->setMaximum(47);
- } else {
- ui->amplitudeFine->setMaximum(99);
- }
- break;
- case 2: // 16 bits 32768
- default:
- if (ui->amplitudeCoarse->value() == 327) {
- ui->amplitudeFine->setMaximum(67);
- } else {
- ui->amplitudeFine->setMaximum(99);
- }
- break;
- }
-}
-
-void TestMIGui::updateFrequencyShiftLimit()
-{
- qint64 sampleRate = ui->sampleRate->getValueNew();
- ui->frequencyShift->setValueRange(false, 7, -sampleRate, sampleRate);
- ui->frequencyShift->setValue(m_settings.m_streams[m_streamIndex].m_frequencyShift);
-}
-
-void TestMIGui::updateFileRecordStatus()
-{
- if (((TestMI*) m_sampleMIMO)->isRecording(m_streamIndex)) {
- ui->record->setStyleSheet("QToolButton { background-color : red; }");
- } else {
- ui->record->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
- }
-}
-
-void TestMIGui::displaySettings()
-{
- blockApplySettings(true);
- ui->sampleSize->blockSignals(true);
-
- ui->streamIndex->setCurrentIndex(m_streamIndex);
- ui->centerFrequency->setValue(m_settings.m_streams[m_streamIndex].m_centerFrequency / 1000);
- ui->decimation->setCurrentIndex(m_settings.m_streams[m_streamIndex].m_log2Decim);
- ui->fcPos->setCurrentIndex((int) m_settings.m_streams[m_streamIndex].m_fcPos);
- ui->sampleRate->setValue(m_settings.m_streams[m_streamIndex].m_sampleRate);
- updateFrequencyShiftLimit();
- ui->frequencyShift->setValue(m_settings.m_streams[m_streamIndex].m_frequencyShift);
- ui->sampleSize->setCurrentIndex(m_settings.m_streams[m_streamIndex].m_sampleSizeIndex);
- updateAmpCoarseLimit();
- int amplitudeBits = m_settings.m_streams[m_streamIndex].m_amplitudeBits;
- ui->amplitudeCoarse->setValue(amplitudeBits/100);
- updateAmpFineLimit();
- ui->amplitudeFine->setValue(amplitudeBits%100);
- displayAmplitude();
- int dcBiasPercent = roundf(m_settings.m_streams[m_streamIndex].m_dcFactor * 100.0f);
- ui->dcBias->setValue((int) dcBiasPercent);
- ui->dcBiasText->setText(QString(tr("%1 %").arg(dcBiasPercent)));
- int iBiasPercent = roundf(m_settings.m_streams[m_streamIndex].m_iFactor * 100.0f);
- ui->iBias->setValue((int) iBiasPercent);
- ui->iBiasText->setText(QString(tr("%1 %").arg(iBiasPercent)));
- int qBiasPercent = roundf(m_settings.m_streams[m_streamIndex].m_qFactor * 100.0f);
- ui->qBias->setValue((int) qBiasPercent);
- ui->qBiasText->setText(QString(tr("%1 %").arg(qBiasPercent)));
- int phaseImbalancePercent = roundf(m_settings.m_streams[m_streamIndex].m_phaseImbalance * 100.0f);
- ui->phaseImbalance->setValue((int) phaseImbalancePercent);
- ui->phaseImbalanceText->setText(QString(tr("%1 %").arg(phaseImbalancePercent)));
- ui->autoCorr->setCurrentIndex(m_settings.m_streams[m_streamIndex].m_autoCorrOptions);
- ui->sampleSize->blockSignals(false);
- ui->modulation->setCurrentIndex((int) m_settings.m_streams[m_streamIndex].m_modulation);
- ui->modulationFrequency->setValue(m_settings.m_streams[m_streamIndex].m_modulationTone);
- ui->modulationFrequencyText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_modulationTone / 100.0, 0, 'f', 2));
- ui->amModulation->setValue(m_settings.m_streams[m_streamIndex].m_amModulation);
- ui->amModulationText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_amModulation));
- ui->fmDeviation->setValue(m_settings.m_streams[m_streamIndex].m_fmDeviation);
- ui->fmDeviationText->setText(QString("%1").arg(m_settings.m_streams[m_streamIndex].m_fmDeviation / 10.0, 0, 'f', 1));
- blockApplySettings(false);
-}
-
-void TestMIGui::sendSettings()
-{
- if(!m_updateTimer.isActive()) {
- m_updateTimer.start(100);
- }
-}
-
-void TestMIGui::updateHardware()
-{
- if (m_doApplySettings)
- {
- TestMI::MsgConfigureTestSource* message = TestMI::MsgConfigureTestSource::create(m_settings, m_forceSettings);
- m_sampleMIMO->getInputMessageQueue()->push(message);
- m_forceSettings = false;
- m_updateTimer.stop();
- }
-}
-
-void TestMIGui::updateStatus()
-{
- int state = m_deviceUISet->m_deviceAPI->state();
-
- if(m_lastEngineState != state)
- {
- switch(state)
- {
- case DeviceAPI::StNotStarted:
- ui->startStop->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
- break;
- case DeviceAPI::StIdle:
- ui->startStop->setStyleSheet("QToolButton { background-color : blue; }");
- break;
- case DeviceAPI::StRunning:
- ui->startStop->setStyleSheet("QToolButton { background-color : green; }");
- break;
- case DeviceAPI::StError:
- ui->startStop->setStyleSheet("QToolButton { background-color : red; }");
- QMessageBox::information(this, tr("Message"), m_deviceUISet->m_deviceAPI->errorMessage());
- break;
- default:
- break;
- }
-
- m_lastEngineState = state;
- }
-}
-
-bool TestMIGui::handleMessage(const Message& message)
-{
- if (TestMI::MsgConfigureTestSource::match(message))
- {
- qDebug("TestMIGui::handleMessage: MsgConfigureTestSource");
- const TestMI::MsgConfigureTestSource& cfg = (TestMI::MsgConfigureTestSource&) message;
- m_settings = cfg.getSettings();
- displaySettings();
- return true;
- }
- else if (TestMI::MsgStartStop::match(message))
- {
- qDebug("TestMIGui::handleMessage: MsgStartStop");
- TestMI::MsgStartStop& notif = (TestMI::MsgStartStop&) message;
- blockApplySettings(true);
- ui->startStop->setChecked(notif.getStartStop());
- blockApplySettings(false);
-
- return true;
- }
- else
- {
- return false;
- }
-}
-
-void TestMIGui::handleInputMessages()
-{
- Message* message;
-
- while ((message = m_inputMessageQueue.pop()) != 0)
- {
- if (DSPMIMOSignalNotification::match(*message))
- {
- DSPMIMOSignalNotification* notif = (DSPMIMOSignalNotification*) message;
- int istream = notif->getIndex();
- bool sourceOrSink = notif->getSourceOrSink();
- m_deviceSampleRates[istream] = notif->getSampleRate();
- m_deviceCenterFrequencies[istream] = notif->getCenterFrequency();
- // Do not consider multiple sources at this time
- qDebug("TestMIGui::handleInputMessages: DSPMIMOSignalNotification: %s stream: %d SampleRate:%d, CenterFrequency:%llu",
- sourceOrSink ? "source" : "sink",
- istream,
- notif->getSampleRate(),
- notif->getCenterFrequency());
- updateSampleRateAndFrequency();
-
- delete message;
- }
- else
- {
- if (handleMessage(*message))
- {
- delete message;
- }
- }
- }
-}
-
-void TestMIGui::updateSampleRateAndFrequency()
-{
- m_deviceUISet->getSpectrum()->setSampleRate(m_deviceSampleRates[m_spectrumStreamIndex]);
- m_deviceUISet->getSpectrum()->setCenterFrequency(m_deviceCenterFrequencies[m_spectrumStreamIndex]);
- ui->deviceRateText->setText(tr("%1k").arg((float) m_deviceSampleRates[m_streamIndex] / 1000));
-}
-
-void TestMIGui::openDeviceSettingsDialog(const QPoint& p)
-{
- BasicDeviceSettingsDialog dialog(this);
- dialog.setUseReverseAPI(m_settings.m_useReverseAPI);
- dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress);
- dialog.setReverseAPIPort(m_settings.m_reverseAPIPort);
- dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex);
-
- dialog.move(p);
- dialog.exec();
-
- m_settings.m_useReverseAPI = dialog.useReverseAPI();
- m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress();
- m_settings.m_reverseAPIPort = dialog.getReverseAPIPort();
- m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex();
-
- sendSettings();
-}
\ No newline at end of file
diff --git a/plugins/samplemimo/testmi/testmigui.h b/plugins/samplemimo/testmi/testmigui.h
deleted file mode 100644
index eaff0fb03..000000000
--- a/plugins/samplemimo/testmi/testmigui.h
+++ /dev/null
@@ -1,112 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef _TESTMI_TESTMIGUI_H_
-#define _TESTMI_TESTMIGUI_H_
-
-#include
-#include
-#include
-
-#include "util/messagequeue.h"
-
-#include "testmisettings.h"
-#include "testmi.h"
-
-class DeviceUISet;
-
-namespace Ui {
- class TestMIGui;
-}
-
-class TestMIGui : public QWidget, public PluginInstanceGUI {
- Q_OBJECT
-
-public:
- explicit TestMIGui(DeviceUISet *deviceUISet, QWidget* parent = 0);
- virtual ~TestMIGui();
- virtual void destroy();
-
- void setName(const QString& name);
- QString getName() const;
-
- void resetToDefaults();
- virtual qint64 getCenterFrequency() const;
- virtual void setCenterFrequency(qint64 centerFrequency);
- QByteArray serialize() const;
- bool deserialize(const QByteArray& data);
- virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
- virtual bool handleMessage(const Message& message);
-
-private:
- Ui::TestMIGui* ui;
-
- DeviceUISet* m_deviceUISet;
- TestMISettings m_settings;
- int m_streamIndex; //!< Current stream index being dealt with
- int m_spectrumStreamIndex; //!< Index of the stream displayed on main spectrum
- QTimer m_updateTimer;
- QTimer m_statusTimer;
- bool m_doApplySettings;
- bool m_forceSettings;
- DeviceSampleMIMO* m_sampleMIMO;
- std::size_t m_tickCount;
- std::vector m_deviceSampleRates;
- std::vector m_deviceCenterFrequencies; //!< Center frequency in device
- int m_lastEngineState;
- MessageQueue m_inputMessageQueue;
-
- void blockApplySettings(bool block) { m_doApplySettings = !block; }
- void displaySettings();
- void sendSettings();
- void updateSampleRateAndFrequency();
- void displayAmplitude();
- void updateAmpCoarseLimit();
- void updateAmpFineLimit();
- void updateFrequencyShiftLimit();
- void updateFileRecordStatus();
-
-private slots:
- void handleInputMessages();
- void on_startStop_toggled(bool checked);
- void on_streamIndex_currentIndexChanged(int index);
- void on_spectrumSource_currentIndexChanged(int index);
- void on_streamLock_toggled(bool checked);
- void on_centerFrequency_changed(quint64 value);
- void on_autoCorr_currentIndexChanged(int index);
- void on_frequencyShift_changed(qint64 value);
- void on_decimation_currentIndexChanged(int index);
- void on_fcPos_currentIndexChanged(int index);
- void on_sampleRate_changed(quint64 value);
- void on_sampleSize_currentIndexChanged(int index);
- void on_amplitudeCoarse_valueChanged(int value);
- void on_amplitudeFine_valueChanged(int value);
- void on_modulation_currentIndexChanged(int index);
- void on_modulationFrequency_valueChanged(int value);
- void on_amModulation_valueChanged(int value);
- void on_fmDeviation_valueChanged(int value);
- void on_dcBias_valueChanged(int value);
- void on_iBias_valueChanged(int value);
- void on_qBias_valueChanged(int value);
- void on_phaseImbalance_valueChanged(int value);
- void on_record_toggled(bool checked);
- void openDeviceSettingsDialog(const QPoint& p);
- void updateStatus();
- void updateHardware();
-};
-
-#endif // _TESTMI_TESTMIGUI_H_
diff --git a/plugins/samplemimo/testmi/testmigui.ui b/plugins/samplemimo/testmi/testmigui.ui
deleted file mode 100644
index e21fe1946..000000000
--- a/plugins/samplemimo/testmi/testmigui.ui
+++ /dev/null
@@ -1,1097 +0,0 @@
-
-
- TestMIGui
-
-
-
- 0
- 0
- 360
- 300
-
-
-
-
- 0
- 0
-
-
-
-
- 360
- 300
-
-
-
-
- Liberation Sans
- 9
- 50
- false
- false
-
-
-
- Test Multiple Input
-
-
-
- 3
-
-
- 2
-
-
- 2
-
-
- 2
-
-
- 2
-
- -
-
-
-
-
-
- Stream
-
-
-
- -
-
-
-
- 40
- 16777215
-
-
-
- Stream index
-
-
-
-
- 0
-
-
- -
-
- 1
-
-
-
-
- -
-
-
- Spectrum
-
-
-
- -
-
-
-
- 60
- 16777215
-
-
-
- Select stream for main spectrum source
-
-
-
- -
-
-
- Lock spectrum display to stream selection
-
-
-
-
-
-
- :/unlocked.png
- :/locked.png:/unlocked.png
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- 4
-
-
-
-
-
-
-
-
-
-
-
- start/stop acquisition
-
-
-
-
-
-
- :/play.png
- :/stop.png:/play.png
-
-
-
- -
-
-
- Toggle record I/Q samples from device
-
-
-
-
-
-
- :/record_off.png:/record_off.png
-
-
-
-
-
- -
-
-
-
-
-
-
- 58
- 0
-
-
-
- I/Q sample rate kS/s
-
-
- 0000.00k
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 32
- 16
-
-
-
-
- Liberation Mono
- 20
-
-
-
- PointingHandCursor
-
-
- Qt::StrongFocus
-
-
- Tuner center frequency in kHz
-
-
-
- -
-
-
- kHz
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 0
- 0
-
-
-
-
-
-
- -
-
-
-
-
-
- Corr
-
-
-
- -
-
-
- DC offset and IQ correction options
-
-
-
-
- None
-
-
- -
-
- DC
-
-
- -
-
- DC+IQ
-
-
-
-
- -
-
-
- Dec
-
-
-
- -
-
-
-
- 45
- 16777215
-
-
-
- Decimation factor
-
-
-
-
- 1
-
-
- -
-
- 2
-
-
- -
-
- 4
-
-
- -
-
- 8
-
-
- -
-
- 16
-
-
- -
-
- 32
-
-
- -
-
- 64
-
-
-
-
- -
-
-
- Fp
-
-
-
- -
-
-
-
- 50
- 16777215
-
-
-
- Relative position of generator center frequency
-
-
- 2
-
-
-
-
- Inf
-
-
- -
-
- Sup
-
-
- -
-
- Cen
-
-
-
-
- -
-
-
- Sz
-
-
-
- -
-
-
-
- 45
- 16777215
-
-
-
- Sample size
-
-
- 0
-
-
-
-
- 8
-
-
- -
-
- 12
-
-
- -
-
- 16
-
-
-
-
- -
-
-
- bits
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- 2
-
-
- 2
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 16
- 0
-
-
-
- SR
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 32
- 16
-
-
-
-
- Liberation Mono
- 12
-
-
-
- PointingHandCursor
-
-
- Generator sample rate (S/s)
-
-
-
- -
-
-
- S/s
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Mod
-
-
-
- -
-
-
-
- 50
- 16777215
-
-
-
- Modulation
-
-
-
-
- No
-
-
- -
-
- AM
-
-
- -
-
- FM
-
-
- -
-
- P0
-
-
- -
-
- P1
-
-
- -
-
- P2
-
-
-
-
- -
-
-
-
- 22
- 22
-
-
-
- Modulation tone (kHz)
-
-
- 1
-
-
- 999
-
-
- 1
-
-
-
- -
-
-
-
- 35
- 0
-
-
-
- Modulation tone value (kHz)
-
-
- 0.00
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 16
- 0
-
-
-
- D
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 32
- 16
-
-
-
-
- Liberation Mono
- 12
-
-
-
- PointingHandCursor
-
-
- Shift from center frequency
-
-
-
- -
-
-
- Hz
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- AM
-
-
-
- -
-
-
-
- 22
- 22
-
-
-
- AM modulation (%)
-
-
- 1
-
-
-
- -
-
-
- AM modulation value (%)
-
-
- 00
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- -
-
-
- FM
-
-
-
- -
-
-
-
- 22
- 22
-
-
-
- FM deviation (kHz)
-
-
- 1
-
-
- 999
-
-
- 1
-
-
-
- -
-
-
-
- 35
- 0
-
-
-
- FM deviation value (kHz)
-
-
- 00.0
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
- Amp fine
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Amp coarse
-
-
-
- -
-
-
- true
-
-
- Amplitude coarse (x100)
-
-
- 327
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Amplitude in bits
-
-
- 32768 b
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
- 52
- 0
-
-
-
- Power
-
-
- -100 dB
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- Amplitude fine (x1)
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
-
-
- -
-
-
-
-
-
- -99
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- -100 %
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- Q bias
-
-
-
- -
-
-
- +
-
-
-
- -
-
-
- -
-
-
-
- -
-
-
- I bias
-
-
-
- -
-
-
- -
-
-
-
- -
-
-
- -99
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- -100 %
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- +
-
-
-
- -
-
-
- DC bias
-
-
-
- -
-
-
- -
-
-
-
- -
-
-
- -99
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- +
-
-
-
- -
-
-
- -100 %
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- Phase
-
-
-
- -
-
-
- -
-
-
-
- -
-
-
- +
-
-
-
- -
-
-
-
- 45
- 0
-
-
-
- -100 %
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- -99
-
-
- 1
-
-
- Qt::Horizontal
-
-
-
-
-
- -
-
-
-
-
-
-
- ValueDial
- QWidget
-
- 1
-
-
- ButtonSwitch
- QToolButton
-
-
-
- ValueDialZ
- QWidget
-
- 1
-
-
-
-
-
-
-
diff --git a/plugins/samplemimo/testmi/testmiplugin.cpp b/plugins/samplemimo/testmi/testmiplugin.cpp
deleted file mode 100644
index 882107000..000000000
--- a/plugins/samplemimo/testmi/testmiplugin.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-
-#include "plugin/pluginapi.h"
-#include "util/simpleserializer.h"
-
-#ifdef SERVER_MODE
-#include "testmi.h"
-#else
-#include "testmigui.h"
-#endif
-#include "testmiplugin.h"
-#include "testmiwebapiadapter.h"
-
-const PluginDescriptor TestMIPlugin::m_pluginDescriptor = {
- QString("TestMI"),
- QString("Test Multiple Input"),
- QString("4.12.3"),
- QString("(c) Edouard Griffiths, F4EXB"),
- QString("https://github.com/f4exb/sdrangel"),
- true,
- QString("https://github.com/f4exb/sdrangel")
-};
-
-const QString TestMIPlugin::m_hardwareID = "TestMI";
-const QString TestMIPlugin::m_deviceTypeID = TESTMI_DEVICE_TYPE_ID;
-
-TestMIPlugin::TestMIPlugin(QObject* parent) :
- QObject(parent)
-{
-}
-
-const PluginDescriptor& TestMIPlugin::getPluginDescriptor() const
-{
- return m_pluginDescriptor;
-}
-
-void TestMIPlugin::initPlugin(PluginAPI* pluginAPI)
-{
- pluginAPI->registerSampleMIMO(m_deviceTypeID, this);
-}
-
-void TestMIPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices)
-{
- if (listedHwIds.contains(m_hardwareID)) { // check if it was done
- return;
- }
-
- originDevices.append(OriginDevice(
- "TestMI", // Displayable name
- m_hardwareID, // Hardware ID
- QString(), // Serial
- 0, // Sequence
- 2, // Number of Rx streams
- 0 // Number of Tx streams
- ));
-
- listedHwIds.append(m_hardwareID);
-}
-
-PluginInterface::SamplingDevices TestMIPlugin::enumSampleMIMO(const OriginDevices& originDevices)
-{
- SamplingDevices result;
-
- for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it)
- {
- if (it->hardwareId == m_hardwareID)
- {
- result.append(SamplingDevice(
- "TestMI",
- m_hardwareID,
- m_deviceTypeID,
- it->serial,
- it->sequence,
- PluginInterface::SamplingDevice::BuiltInDevice,
- PluginInterface::SamplingDevice::StreamMIMO,
- 1, // MIMO is always considered as a single device
- 0));
- }
- }
-
- return result;
-}
-
-#ifdef SERVER_MODE
-PluginInstanceGUI* TestMIPlugin::createSampleMIMOPluginInstanceGUI(
- const QString& sourceId,
- QWidget **widget,
- DeviceUISet *deviceUISet)
-{
- (void) sourceId;
- (void) widget;
- (void) deviceUISet;
- return 0;
-}
-#else
-PluginInstanceGUI* TestMIPlugin::createSampleMIMOPluginInstanceGUI(
- const QString& sourceId,
- QWidget **widget,
- DeviceUISet *deviceUISet)
-{
- if (sourceId == m_deviceTypeID) {
- TestMIGui* gui = new TestMIGui(deviceUISet);
- *widget = gui;
- return gui;
- } else {
- return nullptr;
- }
-}
-#endif
-
-DeviceSampleMIMO *TestMIPlugin::createSampleMIMOPluginInstance(const QString& mimoId, DeviceAPI *deviceAPI)
-{
- if (mimoId == m_deviceTypeID)
- {
- TestMI* input = new TestMI(deviceAPI);
- return input;
- }
- else
- {
- return nullptr;
- }
-}
-
-DeviceWebAPIAdapter *TestMIPlugin::createDeviceWebAPIAdapter() const
-{
- return new TestMIWebAPIAdapter();
-}
diff --git a/plugins/samplemimo/testmi/testmiplugin.h b/plugins/samplemimo/testmi/testmiplugin.h
deleted file mode 100644
index c1a2d8622..000000000
--- a/plugins/samplemimo/testmi/testmiplugin.h
+++ /dev/null
@@ -1,55 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef _TESTMI_TESTMIPLUGIN_H
-#define _TESTMI_TESTMIPLUGIN_H
-
-#include
-#include "plugin/plugininterface.h"
-
-class PluginAPI;
-
-#define TESTMI_DEVICE_TYPE_ID "sdrangel.samplemimo.testmi"
-
-class TestMIPlugin : public QObject, public PluginInterface {
- Q_OBJECT
- Q_INTERFACES(PluginInterface)
- Q_PLUGIN_METADATA(IID TESTMI_DEVICE_TYPE_ID)
-
-public:
- explicit TestMIPlugin(QObject* parent = NULL);
-
- const PluginDescriptor& getPluginDescriptor() const;
- void initPlugin(PluginAPI* pluginAPI);
-
- virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices);
- virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices);
- virtual PluginInstanceGUI* createSampleMIMOPluginInstanceGUI(
- const QString& sourceId,
- QWidget **widget,
- DeviceUISet *deviceUISet);
- virtual DeviceSampleMIMO* createSampleMIMOPluginInstance(const QString& sourceId, DeviceAPI *deviceAPI);
- virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const;
-
- static const QString m_hardwareID;
- static const QString m_deviceTypeID;
-
-private:
- static const PluginDescriptor m_pluginDescriptor;
-};
-
-#endif // _TESTMI_TESTMIPLUGIN_H
diff --git a/plugins/samplemimo/testmi/testmisettings.cpp b/plugins/samplemimo/testmi/testmisettings.cpp
deleted file mode 100644
index 2b580af24..000000000
--- a/plugins/samplemimo/testmi/testmisettings.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include
-#include "util/simpleserializer.h"
-#include "testmisettings.h"
-
-TestMIStreamSettings::TestMIStreamSettings()
-{
- resetToDefaults();
-}
-
-void TestMIStreamSettings::resetToDefaults()
-{
- m_centerFrequency = 435000*1000;
- m_frequencyShift = 0;
- m_sampleRate = 768*1000;
- m_log2Decim = 4;
- m_fcPos = FC_POS_CENTER;
- m_sampleSizeIndex = 0;
- m_amplitudeBits = 127;
- m_autoCorrOptions = AutoCorrNone;
- m_modulation = ModulationNone;
- m_modulationTone = 44; // 440 Hz
- m_amModulation = 50; // 50%
- m_fmDeviation = 50; // 5 kHz
- m_dcFactor = 0.0f;
- m_iFactor = 0.0f;
- m_qFactor = 0.0f;
- m_phaseImbalance = 0.0f;
-}
-
-TestMISettings::TestMISettings()
-{
- m_fileRecordName = "";
- m_useReverseAPI = false;
- m_reverseAPIAddress = "127.0.0.1";
- m_reverseAPIPort = 8888;
- m_reverseAPIDeviceIndex = 0;
- m_streams.push_back(TestMIStreamSettings());
- m_streams.push_back(TestMIStreamSettings());
-}
-
-TestMISettings::TestMISettings(const TestMISettings& other) :
- m_streams(other.m_streams)
-{
- m_fileRecordName = other.m_fileRecordName;
- m_useReverseAPI = other.m_useReverseAPI;
- m_reverseAPIAddress = other.m_reverseAPIAddress;
- m_reverseAPIPort = other.m_reverseAPIPort;
- m_reverseAPIDeviceIndex = other.m_reverseAPIDeviceIndex;
-}
-
-void TestMISettings::resetToDefaults()
-{
- for (unsigned int i = 0; i < m_streams.size(); i++) {
- m_streams[i].resetToDefaults();
- }
-}
-
-QByteArray TestMISettings::serialize() const
-{
- SimpleSerializer s(1);
-
- s.writeBool(1, m_useReverseAPI);
- s.writeString(2, m_reverseAPIAddress);
- s.writeU32(3, m_reverseAPIPort);
- s.writeU32(4, m_reverseAPIDeviceIndex);
-
- for (unsigned int i = 0; i < m_streams.size(); i++)
- {
- s.writeS32(10 + 30*i, m_streams[i].m_frequencyShift);
- s.writeU32(11 + 30*i, m_streams[i].m_sampleRate);
- s.writeU32(12 + 30*i, m_streams[i].m_log2Decim);
- s.writeS32(13 + 30*i, (int) m_streams[i].m_fcPos);
- s.writeU32(14 + 30*i, m_streams[i].m_sampleSizeIndex);
- s.writeS32(15 + 30*i, m_streams[i].m_amplitudeBits);
- s.writeS32(16 + 30*i, (int) m_streams[i].m_autoCorrOptions);
- s.writeFloat(17 + 30*i, m_streams[i].m_dcFactor);
- s.writeFloat(18 + 30*i, m_streams[i].m_iFactor);
- s.writeFloat(19 + 30*i, m_streams[i].m_qFactor);
- s.writeFloat(20 + 30*i, m_streams[i].m_phaseImbalance);
- s.writeS32(21 + 30*i, (int) m_streams[i].m_modulation);
- s.writeS32(22 + 30*i, m_streams[i].m_modulationTone);
- s.writeS32(23 + 30*i, m_streams[i].m_amModulation);
- s.writeS32(24 + 30*i, m_streams[i].m_fmDeviation);
- }
-
- return s.final();
-}
-
-bool TestMISettings::deserialize(const QByteArray& data)
-{
- SimpleDeserializer d(data);
-
- if (!d.isValid())
- {
- resetToDefaults();
- return false;
- }
-
- if (d.getVersion() == 1)
- {
- int intval;
- uint32_t utmp;
-
- d.readBool(1, &m_useReverseAPI, false);
- d.readString(2, &m_reverseAPIAddress, "127.0.0.1");
- d.readU32(3, &utmp, 0);
-
- if ((utmp > 1023) && (utmp < 65535)) {
- m_reverseAPIPort = utmp;
- } else {
- m_reverseAPIPort = 8888;
- }
-
- d.readU32(4, &utmp, 0);
- m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp;
-
- for (unsigned int i = 0; i < m_streams.size(); i++)
- {
- d.readS32(10 + 30*i, &m_streams[i].m_frequencyShift, 0);
- d.readU32(11 + 30*i, &m_streams[i].m_sampleRate, 768*1000);
- d.readU32(12 + 30*i, &m_streams[i].m_log2Decim, 4);
- d.readS32(13 + 30*i, &intval, 0);
- m_streams[i].m_fcPos = (TestMIStreamSettings::fcPos_t) intval;
- d.readU32(14 + 30*i, &m_streams[i].m_sampleSizeIndex, 0);
- d.readS32(15 + 30*i, &m_streams[i].m_amplitudeBits, 128);
- d.readS32(16 + 30*i, &intval, 0);
-
- if (intval < 0 || intval > (int) TestMIStreamSettings::AutoCorrLast) {
- m_streams[i].m_autoCorrOptions = TestMIStreamSettings::AutoCorrNone;
- } else {
- m_streams[i].m_autoCorrOptions = (TestMIStreamSettings::AutoCorrOptions) intval;
- }
-
- d.readFloat(17 + 30*i, &m_streams[i].m_dcFactor, 0.0f);
- d.readFloat(18 + 30*i, &m_streams[i].m_iFactor, 0.0f);
- d.readFloat(19 + 30*i, &m_streams[i].m_qFactor, 0.0f);
- d.readFloat(20 + 30*i, &m_streams[i].m_phaseImbalance, 0.0f);
- d.readS32(21 + 30*i, &intval, 0);
-
- if (intval < 0 || intval > (int) TestMIStreamSettings::ModulationLast) {
- m_streams[i].m_modulation = TestMIStreamSettings::ModulationNone;
- } else {
- m_streams[i].m_modulation = (TestMIStreamSettings::Modulation) intval;
- }
-
- d.readS32(22 + 30*i, &m_streams[i].m_modulationTone, 44);
- d.readS32(23 + 30*i, &m_streams[i].m_amModulation, 50);
- d.readS32(24 + 30*i, &m_streams[i].m_fmDeviation, 50);
- }
-
- return true;
- }
- else
- {
- resetToDefaults();
- return false;
- }
-}
-
-
-
-
-
-
diff --git a/plugins/samplemimo/testmi/testmisettings.h b/plugins/samplemimo/testmi/testmisettings.h
deleted file mode 100644
index bf7da4265..000000000
--- a/plugins/samplemimo/testmi/testmisettings.h
+++ /dev/null
@@ -1,84 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef _TESTMI_TESTMISETTINGS_H_
-#define _TESTMI_TESTMISETTINGS_H_
-
-#include
-
-struct TestMIStreamSettings {
- typedef enum {
- FC_POS_INFRA = 0,
- FC_POS_SUPRA,
- FC_POS_CENTER
- } fcPos_t;
-
- typedef enum {
- AutoCorrNone,
- AutoCorrDC,
- AutoCorrDCAndIQ,
- AutoCorrLast,
- } AutoCorrOptions;
-
- typedef enum {
- ModulationNone,
- ModulationAM,
- ModulationFM,
- ModulationPattern0,
- ModulationPattern1,
- ModulationPattern2,
- ModulationLast
- } Modulation;
-
- quint64 m_centerFrequency;
- qint32 m_frequencyShift;
- quint32 m_sampleRate;
- quint32 m_log2Decim;
- fcPos_t m_fcPos;
- quint32 m_sampleSizeIndex;
- qint32 m_amplitudeBits;
- AutoCorrOptions m_autoCorrOptions;
- Modulation m_modulation;
- int m_modulationTone; //!< 10'Hz
- int m_amModulation; //!< percent
- int m_fmDeviation; //!< 100'Hz
- float m_dcFactor; //!< -1.0 < x < 1.0
- float m_iFactor; //!< -1.0 < x < 1.0
- float m_qFactor; //!< -1.0 < x < 1.0
- float m_phaseImbalance; //!< -1.0 < x < 1.0
-
- TestMIStreamSettings();
- void resetToDefaults();
-};
-
-struct TestMISettings {
- QString m_fileRecordName;
- bool m_useReverseAPI;
- QString m_reverseAPIAddress;
- uint16_t m_reverseAPIPort;
- uint16_t m_reverseAPIDeviceIndex;
- std::vector m_streams;
-
- TestMISettings();
- TestMISettings(const TestMISettings& other);
- void resetToDefaults();
- QByteArray serialize() const;
- bool deserialize(const QByteArray& data);
-};
-
-
-#endif /* _TESTMI_TESTMISETTINGS_H_ */
diff --git a/plugins/samplemimo/testmi/testmithread.cpp b/plugins/samplemimo/testmi/testmithread.cpp
deleted file mode 100644
index c56bca121..000000000
--- a/plugins/samplemimo/testmi/testmithread.cpp
+++ /dev/null
@@ -1,451 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#define _USE_MATH_DEFINES
-#include
-#include
-#include
-
-#include "dsp/samplemififo.h"
-
-#include "testmithread.h"
-
-#define TESTMI_BLOCKSIZE 16384
-
-MESSAGE_CLASS_DEFINITION(TestMIThread::MsgStartStop, Message)
-
-TestMIThread::TestMIThread(SampleMIFifo* sampleFifo, int streamIndex, QObject* parent) :
- QThread(parent),
- m_running(false),
- m_buf(0),
- m_bufsize(0),
- m_chunksize(0),
- m_convertBuffer(TESTMI_BLOCKSIZE),
- m_sampleFifo(sampleFifo),
- m_streamIndex(streamIndex),
- m_frequencyShift(0),
- m_toneFrequency(440),
- m_modulation(TestMIStreamSettings::ModulationNone),
- m_amModulation(0.5f),
- m_fmDeviationUnit(0.0f),
- m_fmPhasor(0.0f),
- m_pulseWidth(150),
- m_pulseSampleCount(0),
- m_pulsePatternCount(0),
- m_pulsePatternCycle(8),
- m_pulsePatternPlaces(3),
- m_samplerate(48000),
- m_log2Decim(4),
- m_fcPos(0),
- m_bitSizeIndex(0),
- m_bitShift(8),
- m_amplitudeBits(127),
- m_dcBias(0.0f),
- m_iBias(0.0f),
- m_qBias(0.0f),
- m_phaseImbalance(0.0f),
- m_amplitudeBitsDC(0),
- m_amplitudeBitsI(127),
- m_amplitudeBitsQ(127),
- m_frequency(435*1000),
- m_fcPosShift(0),
- m_throttlems(TESTMI_THROTTLE_MS),
- m_throttleToggle(false),
- m_mutex(QMutex::Recursive)
-{
- connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
-}
-
-TestMIThread::~TestMIThread()
-{
-}
-
-void TestMIThread::startWork()
-{
- m_timer.setTimerType(Qt::PreciseTimer);
- connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
- m_timer.start(50);
- m_startWaitMutex.lock();
- m_elapsedTimer.start();
- start();
- while(!m_running)
- m_startWaiter.wait(&m_startWaitMutex, 100);
- m_startWaitMutex.unlock();
-}
-
-void TestMIThread::stopWork()
-{
- m_running = false;
- wait();
- m_timer.stop();
- disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
-}
-
-void TestMIThread::setSamplerate(int samplerate)
-{
- QMutexLocker mutexLocker(&m_mutex);
-
- m_samplerate = samplerate;
- m_chunksize = 4 * ((m_samplerate * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000);
- m_throttleToggle = !m_throttleToggle;
- m_nco.setFreq(m_frequencyShift, m_samplerate);
- m_toneNco.setFreq(m_toneFrequency, m_samplerate);
-}
-
-void TestMIThread::setLog2Decimation(unsigned int log2_decim)
-{
- m_log2Decim = log2_decim;
-}
-
-void TestMIThread::setFcPos(int fcPos)
-{
- m_fcPos = fcPos;
-}
-
-void TestMIThread::setBitSize(quint32 bitSizeIndex)
-{
- switch (bitSizeIndex)
- {
- case 0:
- m_bitShift = 7;
- m_bitSizeIndex = 0;
- break;
- case 1:
- m_bitShift = 11;
- m_bitSizeIndex = 1;
- break;
- case 2:
- default:
- m_bitShift = 15;
- m_bitSizeIndex = 2;
- break;
- }
-}
-
-void TestMIThread::setAmplitudeBits(int32_t amplitudeBits)
-{
- m_amplitudeBits = amplitudeBits;
- m_amplitudeBitsDC = m_dcBias * amplitudeBits;
- m_amplitudeBitsI = (1.0f + m_iBias) * amplitudeBits;
- m_amplitudeBitsQ = (1.0f + m_qBias) * amplitudeBits;
-}
-
-void TestMIThread::setDCFactor(float dcFactor)
-{
- m_dcBias = dcFactor;
- m_amplitudeBitsDC = m_dcBias * m_amplitudeBits;
-}
-
-void TestMIThread::setIFactor(float iFactor)
-{
- m_iBias = iFactor;
- m_amplitudeBitsI = (1.0f + m_iBias) * m_amplitudeBits;
-}
-
-void TestMIThread::setQFactor(float iFactor)
-{
- m_qBias = iFactor;
- m_amplitudeBitsQ = (1.0f + m_qBias) * m_amplitudeBits;
-}
-
-void TestMIThread::setPhaseImbalance(float phaseImbalance)
-{
- m_phaseImbalance = phaseImbalance;
-}
-
-void TestMIThread::setFrequencyShift(int shift)
-{
- m_nco.setFreq(shift, m_samplerate);
-}
-
-void TestMIThread::setToneFrequency(int toneFrequency)
-{
- m_toneNco.setFreq(toneFrequency, m_samplerate);
-}
-
-void TestMIThread::setModulation(TestMIStreamSettings::Modulation modulation)
-{
- m_modulation = modulation;
-}
-
-void TestMIThread::setAMModulation(float amModulation)
-{
- m_amModulation = amModulation < 0.0f ? 0.0f : amModulation > 1.0f ? 1.0f : amModulation;
-}
-
-void TestMIThread::setFMDeviation(float deviation)
-{
- float fmDeviationUnit = deviation / (float) m_samplerate;
- m_fmDeviationUnit = fmDeviationUnit < 0.0f ? 0.0f : fmDeviationUnit > 0.5f ? 0.5f : fmDeviationUnit;
- qDebug("TestMIThread::setFMDeviation: m_fmDeviationUnit: %f", m_fmDeviationUnit);
-}
-
-void TestMIThread::startStop(bool start)
-{
- MsgStartStop *msg = MsgStartStop::create(start);
- m_inputMessageQueue.push(msg);
-}
-
-void TestMIThread::run()
-{
- m_running = true;
- m_startWaiter.wakeAll();
-
- while (m_running) // actual work is in the tick() function
- {
- sleep(1);
- }
-
- m_running = false;
-}
-
-void TestMIThread::setBuffers(quint32 chunksize)
-{
- if (chunksize > m_bufsize)
- {
- m_bufsize = chunksize;
-
- if (m_buf == 0)
- {
- qDebug() << "TestMIThread::setBuffer: Allocate buffer: "
- << " size: " << m_bufsize << " bytes"
- << " #samples: " << (m_bufsize/4);
- m_buf = (qint16*) malloc(m_bufsize);
- }
- else
- {
- qDebug() << "TestMIThread::setBuffer: Re-allocate buffer: "
- << " size: " << m_bufsize << " bytes"
- << " #samples: " << (m_bufsize/4);
- free(m_buf);
- m_buf = (qint16*) malloc(m_bufsize);
- }
-
- m_convertBuffer.resize(chunksize/4);
- }
-}
-
-void TestMIThread::generate(quint32 chunksize)
-{
- int n = chunksize / 2;
- setBuffers(chunksize);
-
- for (int i = 0; i < n-1;)
- {
- switch (m_modulation)
- {
- case TestMIStreamSettings::ModulationAM:
- {
- Complex c = m_nco.nextIQ();
- Real t, re, im;
- pullAF(t);
- t = (t*m_amModulation + 1.0f)*0.5f;
- re = c.real()*t;
- im = c.imag()*t + m_phaseImbalance*re;
- m_buf[i++] = (int16_t) (re * (float) m_amplitudeBitsI) + m_amplitudeBitsDC;
- m_buf[i++] = (int16_t) (im * (float) m_amplitudeBitsQ);
- }
- break;
- case TestMIStreamSettings::ModulationFM:
- {
- Complex c = m_nco.nextIQ();
- Real t, re, im;
- pullAF(t);
- m_fmPhasor += m_fmDeviationUnit * t;
- m_fmPhasor = m_fmPhasor < -1.0f ? -m_fmPhasor - 1.0f : m_fmPhasor > 1.0f ? m_fmPhasor - 1.0f : m_fmPhasor;
- re = c.real()*cos(m_fmPhasor*M_PI) - c.imag()*sin(m_fmPhasor*M_PI);
- im = (c.real()*sin(m_fmPhasor*M_PI) + c.imag()*cos(m_fmPhasor*M_PI)) + m_phaseImbalance*re;
- m_buf[i++] = (int16_t) (re * (float) m_amplitudeBitsI) + m_amplitudeBitsDC;
- m_buf[i++] = (int16_t) (im * (float) m_amplitudeBitsQ);
- }
- break;
- case TestMIStreamSettings::ModulationPattern0: // binary pattern
- {
- if (m_pulseSampleCount < m_pulseWidth) // sync pattern: 0
- {
- m_buf[i++] = m_amplitudeBitsDC;
- m_buf[i++] = 0;
- }
- else if (m_pulseSampleCount < 2*m_pulseWidth) // sync pattern: 1
- {
- m_buf[i++] = (int16_t) (m_amplitudeBitsI + m_amplitudeBitsDC);
- m_buf[i++] = (int16_t) (m_phaseImbalance * (float) m_amplitudeBitsQ);
- }
- else if (m_pulseSampleCount < 3*m_pulseWidth) // sync pattern: 0
- {
- m_buf[i++] = m_amplitudeBitsDC;
- m_buf[i++] = 0;
- }
- else if (m_pulseSampleCount < (3+m_pulsePatternPlaces)*m_pulseWidth) // binary pattern
- {
- uint32_t patPulseSampleCount = m_pulseSampleCount - 3*m_pulseWidth;
- uint32_t patPulseIndex = patPulseSampleCount / m_pulseWidth;
- float patFigure = (m_pulsePatternCount & (1<writeAsync(m_convertBuffer.begin(), it - m_convertBuffer.begin(), m_streamIndex);
-}
-
-void TestMIThread::tick()
-{
- if (m_running)
- {
- qint64 throttlems = m_elapsedTimer.restart();
-
- if ((throttlems > 45) && (throttlems < 55) && (throttlems != m_throttlems))
- {
- QMutexLocker mutexLocker(&m_mutex);
- m_throttlems = throttlems;
- m_chunksize = 4 * ((m_samplerate * (m_throttlems+(m_throttleToggle ? 1 : 0))) / 1000);
- m_throttleToggle = !m_throttleToggle;
- }
-
- generate(m_chunksize);
- }
-}
-
-void TestMIThread::handleInputMessages()
-{
- Message* message;
-
- while ((message = m_inputMessageQueue.pop()) != 0)
- {
- if (MsgStartStop::match(*message))
- {
- MsgStartStop* notif = (MsgStartStop*) message;
- qDebug("TestMIThread::handleInputMessages: MsgStartStop: %s", notif->getStartStop() ? "start" : "stop");
-
- if (notif->getStartStop()) {
- startWork();
- } else {
- stopWork();
- }
-
- delete message;
- }
- }
-}
-
-void TestMIThread::setPattern0()
-{
- m_pulseWidth = 150;
- m_pulseSampleCount = 0;
- m_pulsePatternCount = 0;
- m_pulsePatternCycle = 8;
- m_pulsePatternPlaces = 3;
-}
-
-void TestMIThread::setPattern1()
-{
- m_pulseWidth = 1000;
- m_pulseSampleCount = 0;
-}
-
-void TestMIThread::setPattern2()
-{
- m_pulseWidth = 1000;
- m_pulseSampleCount = 0;
-}
diff --git a/plugins/samplemimo/testmi/testmithread.h b/plugins/samplemimo/testmi/testmithread.h
deleted file mode 100644
index 74ed311a8..000000000
--- a/plugins/samplemimo/testmi/testmithread.h
+++ /dev/null
@@ -1,387 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#ifndef _TESTMI_TESTMITHREAD_H_
-#define _TESTMI_TESTMITHREAD_H_
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "dsp/decimators.h"
-#include "dsp/ncof.h"
-#include "util/message.h"
-#include "util/messagequeue.h"
-
-#include "testmisettings.h"
-
-#define TESTMI_THROTTLE_MS 50
-
-class SampleMIFifo;
-
-class TestMIThread : public QThread {
- Q_OBJECT
-
-public:
- class MsgStartStop : public Message {
- MESSAGE_CLASS_DECLARATION
-
- public:
- bool getStartStop() const { return m_startStop; }
-
- static MsgStartStop* create(bool startStop) {
- return new MsgStartStop(startStop);
- }
-
- protected:
- bool m_startStop;
-
- MsgStartStop(bool startStop) :
- Message(),
- m_startStop(startStop)
- { }
- };
-
- TestMIThread(SampleMIFifo* sampleFifo, int streamIndex, QObject* parent = nullptr);
- ~TestMIThread();
-
- void startStop(bool start);
- void setSamplerate(int samplerate);
- void setLog2Decimation(unsigned int log2_decim);
- void setFcPos(int fcPos);
- void setBitSize(uint32_t bitSizeIndex);
- void setAmplitudeBits(int32_t amplitudeBits);
- void setDCFactor(float iFactor);
- void setIFactor(float iFactor);
- void setQFactor(float qFactor);
- void setPhaseImbalance(float phaseImbalance);
- void setFrequencyShift(int shift);
- void setToneFrequency(int toneFrequency);
- void setModulation(TestMIStreamSettings::Modulation modulation);
- void setAMModulation(float amModulation);
- void setFMDeviation(float deviation);
- void setPattern0();
- void setPattern1();
- void setPattern2();
-
-private:
- QMutex m_startWaitMutex;
- QWaitCondition m_startWaiter;
- volatile bool m_running;
-
- qint16 *m_buf;
- quint32 m_bufsize;
- quint32 m_chunksize;
- SampleVector m_convertBuffer;
- SampleMIFifo* m_sampleFifo;
- int m_streamIndex;
- NCOF m_nco;
- NCOF m_toneNco;
- int m_frequencyShift;
- int m_toneFrequency;
- TestMIStreamSettings::Modulation m_modulation;
- float m_amModulation;
- float m_fmDeviationUnit;
- float m_fmPhasor;
- uint32_t m_pulseWidth; //!< pulse width in number of samples
- uint32_t m_pulseSampleCount;
- uint32_t m_pulsePatternCount;
- uint32_t m_pulsePatternCycle;
- uint32_t m_pulsePatternPlaces;
-
- int m_samplerate;
- unsigned int m_log2Decim;
- int m_fcPos;
- uint32_t m_bitSizeIndex;
- uint32_t m_bitShift;
- int32_t m_amplitudeBits;
- float m_dcBias;
- float m_iBias;
- float m_qBias;
- float m_phaseImbalance;
- int32_t m_amplitudeBitsDC;
- int32_t m_amplitudeBitsI;
- int32_t m_amplitudeBitsQ;
-
- uint64_t m_frequency;
- int m_fcPosShift;
-
- int m_throttlems;
- QTimer m_timer;
- QElapsedTimer m_elapsedTimer;
- bool m_throttleToggle;
- QMutex m_mutex;
-
- MessageQueue m_inputMessageQueue;
-
- Decimators m_decimators_8;
- Decimators m_decimators_12;
- Decimators m_decimators_16;
-
- void startWork();
- void stopWork();
- void run();
- void callback(const qint16* buf, qint32 len);
- void setBuffers(quint32 chunksize);
- void generate(quint32 chunksize);
- void pullAF(Real& afSample);
-
- // Decimate according to specified log2 (ex: log2=4 => decim=16)
- inline void convert_8(SampleVector::iterator* it, const qint16* buf, qint32 len)
- {
- if (m_log2Decim == 0) {
- m_decimators_8.decimate1(it, buf, len);
- } else {
- if (m_fcPos == 0) { // Infradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_8.decimate2_inf(it, buf, len);
- break;
- case 2:
- m_decimators_8.decimate4_inf(it, buf, len);
- break;
- case 3:
- m_decimators_8.decimate8_inf(it, buf, len);
- break;
- case 4:
- m_decimators_8.decimate16_inf(it, buf, len);
- break;
- case 5:
- m_decimators_8.decimate32_inf(it, buf, len);
- break;
- case 6:
- m_decimators_8.decimate64_inf(it, buf, len);
- break;
- default:
- break;
- }
- } else if (m_fcPos == 1) {// Supradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_8.decimate2_sup(it, buf, len);
- break;
- case 2:
- m_decimators_8.decimate4_sup(it, buf, len);
- break;
- case 3:
- m_decimators_8.decimate8_sup(it, buf, len);
- break;
- case 4:
- m_decimators_8.decimate16_sup(it, buf, len);
- break;
- case 5:
- m_decimators_8.decimate32_sup(it, buf, len);
- break;
- case 6:
- m_decimators_8.decimate64_sup(it, buf, len);
- break;
- default:
- break;
- }
- } else { // Centered
- switch (m_log2Decim) {
- case 1:
- m_decimators_8.decimate2_cen(it, buf, len);
- break;
- case 2:
- m_decimators_8.decimate4_cen(it, buf, len);
- break;
- case 3:
- m_decimators_8.decimate8_cen(it, buf, len);
- break;
- case 4:
- m_decimators_8.decimate16_cen(it, buf, len);
- break;
- case 5:
- m_decimators_8.decimate32_cen(it, buf, len);
- break;
- case 6:
- m_decimators_8.decimate64_cen(it, buf, len);
- break;
- default:
- break;
- }
- }
- }
- }
-
- void convert_12(SampleVector::iterator* it, const qint16* buf, qint32 len)
- {
- if (m_log2Decim == 0) {
- m_decimators_12.decimate1(it, buf, len);
- } else {
- if (m_fcPos == 0) { // Infradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_12.decimate2_inf(it, buf, len);
- break;
- case 2:
- m_decimators_12.decimate4_inf(it, buf, len);
- break;
- case 3:
- m_decimators_12.decimate8_inf(it, buf, len);
- break;
- case 4:
- m_decimators_12.decimate16_inf(it, buf, len);
- break;
- case 5:
- m_decimators_12.decimate32_inf(it, buf, len);
- break;
- case 6:
- m_decimators_12.decimate64_inf(it, buf, len);
- break;
- default:
- break;
- }
- } else if (m_fcPos == 1) {// Supradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_12.decimate2_sup(it, buf, len);
- break;
- case 2:
- m_decimators_12.decimate4_sup(it, buf, len);
- break;
- case 3:
- m_decimators_12.decimate8_sup(it, buf, len);
- break;
- case 4:
- m_decimators_12.decimate16_sup(it, buf, len);
- break;
- case 5:
- m_decimators_12.decimate32_sup(it, buf, len);
- break;
- case 6:
- m_decimators_12.decimate64_sup(it, buf, len);
- break;
- default:
- break;
- }
- } else { // Centered
- switch (m_log2Decim) {
- case 1:
- m_decimators_12.decimate2_cen(it, buf, len);
- break;
- case 2:
- m_decimators_12.decimate4_cen(it, buf, len);
- break;
- case 3:
- m_decimators_12.decimate8_cen(it, buf, len);
- break;
- case 4:
- m_decimators_12.decimate16_cen(it, buf, len);
- break;
- case 5:
- m_decimators_12.decimate32_cen(it, buf, len);
- break;
- case 6:
- m_decimators_12.decimate64_cen(it, buf, len);
- break;
- default:
- break;
- }
- }
- }
- }
-
- void convert_16(SampleVector::iterator* it, const qint16* buf, qint32 len)
- {
- if (m_log2Decim == 0) {
- m_decimators_16.decimate1(it, buf, len);
- } else {
- if (m_fcPos == 0) { // Infradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_16.decimate2_inf(it, buf, len);
- break;
- case 2:
- m_decimators_16.decimate4_inf(it, buf, len);
- break;
- case 3:
- m_decimators_16.decimate8_inf(it, buf, len);
- break;
- case 4:
- m_decimators_16.decimate16_inf(it, buf, len);
- break;
- case 5:
- m_decimators_16.decimate32_inf(it, buf, len);
- break;
- case 6:
- m_decimators_16.decimate64_inf(it, buf, len);
- break;
- default:
- break;
- }
- } else if (m_fcPos == 1) {// Supradyne
- switch (m_log2Decim) {
- case 1:
- m_decimators_16.decimate2_sup(it, buf, len);
- break;
- case 2:
- m_decimators_16.decimate4_sup(it, buf, len);
- break;
- case 3:
- m_decimators_16.decimate8_sup(it, buf, len);
- break;
- case 4:
- m_decimators_16.decimate16_sup(it, buf, len);
- break;
- case 5:
- m_decimators_16.decimate32_sup(it, buf, len);
- break;
- case 6:
- m_decimators_16.decimate64_sup(it, buf, len);
- break;
- default:
- break;
- }
- } else { // Centered
- switch (m_log2Decim) {
- case 1:
- m_decimators_16.decimate2_cen(it, buf, len);
- break;
- case 2:
- m_decimators_16.decimate4_cen(it, buf, len);
- break;
- case 3:
- m_decimators_16.decimate8_cen(it, buf, len);
- break;
- case 4:
- m_decimators_16.decimate16_cen(it, buf, len);
- break;
- case 5:
- m_decimators_16.decimate32_cen(it, buf, len);
- break;
- case 6:
- m_decimators_16.decimate64_cen(it, buf, len);
- break;
- default:
- break;
- }
- }
- }
- }
-
-
-private slots:
- void tick();
- void handleInputMessages();
-};
-
-#endif // _TESTSOURCE_TESTSOURCETHREAD_H_
diff --git a/plugins/samplemimo/testmi/testmiwebapiadapter.cpp b/plugins/samplemimo/testmi/testmiwebapiadapter.cpp
deleted file mode 100644
index 06811ff75..000000000
--- a/plugins/samplemimo/testmi/testmiwebapiadapter.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// Implementation of static web API adapters used for preset serialization and //
-// deserialization //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include "SWGDeviceSettings.h"
-#include "testmi.h"
-#include "testmiwebapiadapter.h"
-
-TestMIWebAPIAdapter::TestMIWebAPIAdapter()
-{}
-
-TestMIWebAPIAdapter::~TestMIWebAPIAdapter()
-{}
-
-int TestMIWebAPIAdapter::webapiSettingsGet(
- SWGSDRangel::SWGDeviceSettings& response,
- QString& errorMessage)
-{
- (void) errorMessage;
- response.setTestMiSettings(new SWGSDRangel::SWGTestMISettings());
- response.getTestMiSettings()->init();
- TestMI::webapiFormatDeviceSettings(response, m_settings);
- return 200;
-}
-
-int TestMIWebAPIAdapter::webapiSettingsPutPatch(
- bool force,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response, // query + response
- QString& errorMessage)
-{
- (void) errorMessage;
- TestMI::webapiUpdateDeviceSettings(m_settings, deviceSettingsKeys, response);
- return 200;
-}
diff --git a/plugins/samplemimo/testmi/testmiwebapiadapter.h b/plugins/samplemimo/testmi/testmiwebapiadapter.h
deleted file mode 100644
index d31a7b63b..000000000
--- a/plugins/samplemimo/testmi/testmiwebapiadapter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2019 Edouard Griffiths, F4EXB //
-// //
-// Implementation of static web API adapters used for preset serialization and //
-// deserialization //
-// //
-// This program is free software; you can redistribute it and/or modify //
-// it under the terms of the GNU General Public License as published by //
-// the Free Software Foundation as version 3 of the License, or //
-// (at your option) any later version. //
-// //
-// This program is distributed in the hope that it will be useful, //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
-// GNU General Public License V3 for more details. //
-// //
-// You should have received a copy of the GNU General Public License //
-// along with this program. If not, see . //
-///////////////////////////////////////////////////////////////////////////////////
-
-#include "device/devicewebapiadapter.h"
-#include "testmisettings.h"
-
-class TestMIWebAPIAdapter : public DeviceWebAPIAdapter
-{
-public:
- TestMIWebAPIAdapter();
- virtual ~TestMIWebAPIAdapter();
- virtual QByteArray serialize() { return m_settings.serialize(); }
- virtual bool deserialize(const QByteArray& data) { return m_settings.deserialize(data); }
-
- virtual int webapiSettingsGet(
- SWGSDRangel::SWGDeviceSettings& response,
- QString& errorMessage);
-
- virtual int webapiSettingsPutPatch(
- bool force,
- const QStringList& deviceSettingsKeys,
- SWGSDRangel::SWGDeviceSettings& response, // query + response
- QString& errorMessage);
-
-private:
- TestMISettings m_settings;
-};
\ No newline at end of file
diff --git a/plugins/samplemimo/testmi/testsourcemi.pro b/plugins/samplemimo/testmi/testsourcemi.pro
deleted file mode 100644
index 92f455cfc..000000000
--- a/plugins/samplemimo/testmi/testsourcemi.pro
+++ /dev/null
@@ -1,48 +0,0 @@
-#--------------------------------------------------------
-#
-# Pro file for Android and Windows builds with Qt Creator
-#
-#--------------------------------------------------------
-
-TEMPLATE = lib
-CONFIG += plugin
-
-QT += core gui widgets multimedia opengl
-
-TARGET = mimotestsourcemi
-
-DEFINES += USE_SSE2=1
-QMAKE_CXXFLAGS += -msse2
-DEFINES += USE_SSE4_1=1
-QMAKE_CXXFLAGS += -msse4.1
-QMAKE_CXXFLAGS += -std=c++11
-macx:QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/
-
-INCLUDEPATH += $$PWD
-INCLUDEPATH += ../../../exports
-INCLUDEPATH += ../../../sdrbase
-INCLUDEPATH += ../../../sdrgui
-INCLUDEPATH += ../../../swagger/sdrangel/code/qt5/client
-
-CONFIG(Release):build_subdir = release
-CONFIG(Debug):build_subdir = debug
-
-SOURCES += testsourcegui.cpp\
- testsourcemiinput.cpp\
- testsourcemiplugin.cpp\
- testsourcemisettings.cpp\
- testsourcemithread.cpp
-
-HEADERS += testsourcemigui.h\
- testsourcemiinput.h\
- testsourcemiplugin.h\
- testsourcemisettings.h\
- testsourcemithread.h
-
-FORMS += testsourcemigui.ui
-
-LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase
-LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui
-LIBS += -L../../../swagger/$${build_subdir} -lswagger
-
-RESOURCES = ../../../sdrgui/resources/res.qrc
diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp
index 57510035e..6a5a578ba 100644
--- a/sdrbase/device/deviceenumerator.cpp
+++ b/sdrbase/device/deviceenumerator.cpp
@@ -388,18 +388,6 @@ int DeviceEnumerator::getFileSinkDeviceIndex() const
return -1;
}
-int DeviceEnumerator::getTestMIMODeviceIndex() const
-{
- for (DevicesEnumeration::const_iterator it = m_mimoEnumeration.begin(); it != m_mimoEnumeration.end(); ++it)
- {
- if (it->m_samplingDevice.id == PluginManager::getTestMIMODeviceId()) {
- return it->m_index;
- }
- }
-
- return -1;
-}
-
int DeviceEnumerator::getRxSamplingDeviceIndex(const QString& deviceId, int sequence)
{
for (DevicesEnumeration::iterator it = m_rxEnumeration.begin(); it != m_rxEnumeration.end(); ++it)
diff --git a/sdrbase/device/deviceenumerator.h b/sdrbase/device/deviceenumerator.h
index 1791c0db4..9ac35b4e1 100644
--- a/sdrbase/device/deviceenumerator.h
+++ b/sdrbase/device/deviceenumerator.h
@@ -58,7 +58,6 @@ public:
PluginInterface *getMIMOPluginInterface(int deviceIndex) { return m_mimoEnumeration[deviceIndex].m_pluginInterface; }
int getFileInputDeviceIndex() const; //!< Get Rx default device
int getFileSinkDeviceIndex() const; //!< Get Tx default device
- int getTestMIMODeviceIndex() const; //!< Get MIMO default device
int getRxSamplingDeviceIndex(const QString& deviceId, int sequence);
int getTxSamplingDeviceIndex(const QString& deviceId, int sequence);
int getMIMOSamplingDeviceIndex(const QString& deviceId, int sequence);
diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp
index 72651fd55..9d5c44dc7 100644
--- a/sdrbase/plugin/pluginmanager.cpp
+++ b/sdrbase/plugin/pluginmanager.cpp
@@ -44,9 +44,6 @@ const QString PluginManager::m_remoteOutputDeviceTypeID = "sdrangel.samplesink.r
const QString PluginManager::m_fileSinkHardwareID = "FileSink";
const QString PluginManager::m_fileSinkDeviceTypeID = "sdrangel.samplesink.filesink";
-const QString PluginManager::m_testMIMOHardwareID = "TestMI";
-const QString PluginManager::m_testMIMODeviceTypeID = "sdrangel.samplemimo.testmi";
-
PluginManager::PluginManager(QObject* parent) :
QObject(parent),
m_pluginAPI(this)
diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h
index 296a19f91..df8df23f2 100644
--- a/sdrbase/plugin/pluginmanager.h
+++ b/sdrbase/plugin/pluginmanager.h
@@ -92,7 +92,6 @@ public:
static const QString& getFileInputDeviceId() { return m_fileInputDeviceTypeID; }
static const QString& getFileSinkDeviceId() { return m_fileSinkDeviceTypeID; }
- static const QString& getTestMIMODeviceId() { return m_testMIMODeviceTypeID; }
private:
struct SamplingDevice { //!< This is the device registration
@@ -147,10 +146,6 @@ private:
static const QString m_fileSinkHardwareID; //!< FileSink sink hardware ID
static const QString m_fileSinkDeviceTypeID; //!< FileSink sink plugin ID
- // "Local" sample MIMO device IDs
- static const QString m_testMIMOHardwareID; //!< Test MIMO hardware ID
- static const QString m_testMIMODeviceTypeID; //!< Test MIMO plugin ID
-
void loadPluginsDir(const QDir& dir);
};
diff --git a/sdrbase/resources/webapi.qrc b/sdrbase/resources/webapi.qrc
index 5bb60237a..a2f436913 100644
--- a/sdrbase/resources/webapi.qrc
+++ b/sdrbase/resources/webapi.qrc
@@ -51,7 +51,6 @@
webapi/doc/swagger/include/SSBMod.yaml
webapi/doc/swagger/include/Structs.yaml
webapi/doc/swagger/include/TestSource.yaml
- webapi/doc/swagger/include/TestMI.yaml
webapi/doc/swagger/include/UDPSource.yaml
webapi/doc/swagger/include/UDPSink.yaml
webapi/doc/swagger/include/WFMDemod.yaml
diff --git a/sdrbase/resources/webapi/doc/swagger/include/DeviceSettings.yaml b/sdrbase/resources/webapi/doc/swagger/include/DeviceSettings.yaml
index 61bc48dab..7393b6bc7 100644
--- a/sdrbase/resources/webapi/doc/swagger/include/DeviceSettings.yaml
+++ b/sdrbase/resources/webapi/doc/swagger/include/DeviceSettings.yaml
@@ -68,8 +68,6 @@ DeviceSettings:
$ref: "/doc/swagger/include/SoapySDR.yaml#/SoapySDROutputSettings"
testSourceSettings:
$ref: "/doc/swagger/include/TestSource.yaml#/TestSourceSettings"
- testMISettings:
- $ref: "/doc/swagger/include/TestMI.yaml#/TestMISettings"
xtrxInputSettings:
$ref: "/doc/swagger/include/Xtrx.yaml#/XtrxInputSettings"
xtrxOutputSettings:
diff --git a/sdrbase/webapi/webapirequestmapper.cpp b/sdrbase/webapi/webapirequestmapper.cpp
index f7952bf45..157942a9a 100644
--- a/sdrbase/webapi/webapirequestmapper.cpp
+++ b/sdrbase/webapi/webapirequestmapper.cpp
@@ -117,7 +117,6 @@ const QMap WebAPIRequestMapper::m_deviceIdToSettingsKey = {
{"sdrangel.samplesource.soapysdrinput", "soapySDRInputSettings"},
{"sdrangel.samplesink.soapysdroutput", "soapySDROutputSettings"},
{"sdrangel.samplesource.testsource", "testSourceSettings"},
- {"sdrangel.samplemimo.testmi", "testMISettings"},
{"sdrangel.samplesource.xtrx", "XtrxInputSettings"},
{"sdrangel.samplesink.xtrx", "XtrxOutputSettings"}
};
@@ -183,10 +182,6 @@ const QMap WebAPIRequestMapper::m_sinkDeviceHwIdToSettingsKey
{"XTRX", "XtrxOutputSettings"}
};
-const QMap WebAPIRequestMapper::m_mimoDeviceHwIdToSettingsKey= {
- {"TestMI", "testMISettings"}
-};
-
WebAPIRequestMapper::WebAPIRequestMapper(QObject* parent) :
HttpRequestHandler(parent),
m_adapter(0)
@@ -2156,14 +2151,6 @@ bool WebAPIRequestMapper::validateDeviceSettings(
return false;
}
}
- else if (deviceSettings.getDirection() == 2) // MIMO
- {
- if (m_mimoDeviceHwIdToSettingsKey.contains(*deviceHwType)) {
- deviceSettingsKey = m_mimoDeviceHwIdToSettingsKey[*deviceHwType];
- } else {
- return false;
- }
- }
else
{
return false;
diff --git a/sdrbase/webapi/webapirequestmapper.h b/sdrbase/webapi/webapirequestmapper.h
index a72dadb71..06bbc1b8e 100644
--- a/sdrbase/webapi/webapirequestmapper.h
+++ b/sdrbase/webapi/webapirequestmapper.h
@@ -164,7 +164,6 @@ private:
static const QMap m_channelTypeToSettingsKey;
static const QMap m_sourceDeviceHwIdToSettingsKey;
static const QMap m_sinkDeviceHwIdToSettingsKey;
- static const QMap m_mimoDeviceHwIdToSettingsKey;
};
#endif /* SDRBASE_WEBAPI_WEBAPIREQUESTMAPPER_H_ */
diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp
index 0548e1461..bd189acb7 100644
--- a/sdrgui/mainwindow.cpp
+++ b/sdrgui/mainwindow.cpp
@@ -431,92 +431,6 @@ void MainWindow::addSinkDevice()
setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceDisplayName(), 1);
}
-void MainWindow::addMIMODevice()
-{
- DSPDeviceMIMOEngine *dspDeviceMIMOEngine = m_dspEngine->addDeviceMIMOEngine();
- dspDeviceMIMOEngine->start();
-
- uint dspDeviceMIMOEngineUID = dspDeviceMIMOEngine->getUID();
- char uidCStr[16];
- sprintf(uidCStr, "UID:%d", dspDeviceMIMOEngineUID);
-
- int deviceTabIndex = m_deviceUIs.size();
- m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, 2, m_masterTimer));
- m_deviceUIs.back()->m_deviceSourceEngine = nullptr;
- m_deviceUIs.back()->m_deviceSinkEngine = nullptr;
- m_deviceUIs.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine;
-
- char tabNameCStr[16];
- sprintf(tabNameCStr, "M%d", deviceTabIndex);
-
- DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine);
-
- m_deviceUIs.back()->m_deviceAPI = deviceAPI;
- m_deviceUIs.back()->m_samplingDeviceControl->setPluginManager(m_pluginManager);
- QComboBox *channelSelector = m_deviceUIs.back()->m_samplingDeviceControl->getChannelSelector();
- // Add Rx channels
- QList rxChannelNames;
- m_pluginManager->listRxChannels(rxChannelNames);
- QStringList rxChannelNamesList(rxChannelNames);
- channelSelector->addItems(rxChannelNamesList);
- m_deviceUIs.back()->setNumberOfAvailableRxChannels(rxChannelNamesList.size());
- // Add Tx channels
- QList txChannelNames;
- m_pluginManager->listTxChannels(txChannelNames);
- QStringList txChannelNamesList(txChannelNames);
- channelSelector->addItems(txChannelNamesList);
- m_deviceUIs.back()->setNumberOfAvailableTxChannels(txChannelNamesList.size());
-
- connect(m_deviceUIs.back()->m_samplingDeviceControl->getAddChannelButton(), SIGNAL(clicked(bool)), this, SLOT(channelAddClicked(bool)));
-
- dspDeviceMIMOEngine->addSpectrumSink(m_deviceUIs.back()->m_spectrumVis);
- ui->tabSpectra->addTab(m_deviceUIs.back()->m_spectrum, tabNameCStr);
- ui->tabSpectraGUI->addTab(m_deviceUIs.back()->m_spectrumGUI, tabNameCStr);
- ui->tabChannels->addTab(m_deviceUIs.back()->m_channelWindow, tabNameCStr);
-
- connect(m_deviceUIs.back()->m_samplingDeviceControl, SIGNAL(changed()), this, SLOT(sampleMIMOChanged()));
-
- ui->tabInputsSelect->addTab(m_deviceUIs.back()->m_samplingDeviceControl, tabNameCStr);
- ui->tabInputsSelect->setTabToolTip(deviceTabIndex, QString(uidCStr));
-
- // create a test MIMO by default
- int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex();
- const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex);
- m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence);
- m_deviceUIs.back()->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems);
- m_deviceUIs.back()->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex);
- m_deviceUIs.back()->m_deviceAPI->setHardwareId(samplingDevice->hardwareId);
- m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->id);
- m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial);
- m_deviceUIs.back()->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName);
- m_deviceUIs.back()->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex));
-
- QString userArgs = m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence);
-
- if (userArgs.size() > 0) {
- m_deviceUIs.back()->m_deviceAPI->setHardwareUserArguments(userArgs);
- }
-
- m_deviceUIs.back()->m_samplingDeviceControl->setSelectedDeviceIndex(testMIMODeviceIndex);
-
- // delete previous plugin GUI if it exists
- m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
- m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
-
- DeviceSampleMIMO *mimo = m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance(
- m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceId(), m_deviceUIs.back()->m_deviceAPI);
- m_deviceUIs.back()->m_deviceAPI->setSampleMIMO(mimo);
- QWidget *gui;
- PluginInstanceGUI *pluginUI = m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstanceGUI(
- m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceId(),
- &gui,
- m_deviceUIs.back());
- m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(pluginUI->getInputMessageQueue());
- m_deviceUIs.back()->m_deviceAPI->setSamplingDevicePluginInstanceGUI(pluginUI);
- m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->init();
- setDeviceGUI(deviceTabIndex, gui, m_deviceUIs.back()->m_deviceAPI->getSamplingDeviceDisplayName(), 2);
-}
-
void MainWindow::removeLastDevice()
{
if (m_deviceUIs.back()->m_deviceSourceEngine) // source tab
@@ -1012,8 +926,6 @@ bool MainWindow::handleMessage(const Message& cmd)
addSinkDevice();
} else if (direction == 0) { // Single stream Rx
addSourceDevice(-1); // create with file source device by default
- } else if (direction == 2) { // MIMO
- addMIMODevice();
}
return true;
@@ -1987,11 +1899,7 @@ void MainWindow::on_action_addSinkDevice_triggered()
void MainWindow::on_action_addMIMODevice_triggered()
{
- if (m_dspEngine->getMIMOSupport()) {
- addMIMODevice();
- } else {
- QMessageBox::information(this, tr("Message"), tr("MIMO not supported in this version"));
- }
+ QMessageBox::information(this, tr("Message"), tr("MIMO not supported in this version"));
}
void MainWindow::on_action_removeLastDevice_triggered()
diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h
index 71134acbc..0acaa3a81 100644
--- a/sdrgui/mainwindow.h
+++ b/sdrgui/mainwindow.h
@@ -361,7 +361,6 @@ private:
void addSourceDevice(int deviceIndex);
void addSinkDevice();
- void addMIMODevice();
void removeLastDevice();
void deleteChannel(int deviceSetIndex, int channelIndex);
diff --git a/sdrsrv/maincore.cpp b/sdrsrv/maincore.cpp
index 644d9ab2f..2305162c6 100644
--- a/sdrsrv/maincore.cpp
+++ b/sdrsrv/maincore.cpp
@@ -145,8 +145,6 @@ bool MainCore::handleMessage(const Message& cmd)
addSinkDevice();
} else if (direction == 0) { // Single stream Rx
addSourceDevice();
- } else if (direction == 2) { // MIMO
- addMIMODevice();
}
return true;
@@ -362,49 +360,6 @@ void MainCore::addSourceDevice()
m_deviceSets.back()->m_deviceAPI->setSampleSource(source);
}
-void MainCore::addMIMODevice()
-{
- DSPDeviceMIMOEngine *dspDeviceMIMOEngine = m_dspEngine->addDeviceMIMOEngine();
- dspDeviceMIMOEngine->start();
-
- uint dspDeviceMIMOEngineUID = dspDeviceMIMOEngine->getUID();
- char uidCStr[16];
- sprintf(uidCStr, "UID:%d", dspDeviceMIMOEngineUID);
-
- int deviceTabIndex = m_deviceSets.size();
- m_deviceSets.push_back(new DeviceSet(deviceTabIndex));
- m_deviceSets.back()->m_deviceSourceEngine = nullptr;
- m_deviceSets.back()->m_deviceSinkEngine = nullptr;
- m_deviceSets.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine;
-
- char tabNameCStr[16];
- sprintf(tabNameCStr, "M%d", deviceTabIndex);
-
- DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine);
-
- // create a test MIMO by default
- int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex();
- const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex);
- m_deviceSets.back()->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence);
- m_deviceSets.back()->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems);
- m_deviceSets.back()->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex);
- m_deviceSets.back()->m_deviceAPI->setHardwareId(samplingDevice->hardwareId);
- m_deviceSets.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->id);
- m_deviceSets.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial);
- m_deviceSets.back()->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName);
- m_deviceSets.back()->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex));
-
- QString userArgs = m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence);
-
- if (userArgs.size() > 0) {
- m_deviceSets.back()->m_deviceAPI->setHardwareUserArguments(userArgs);
- }
-
- DeviceSampleMIMO *mimo = m_deviceSets.back()->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance(
- m_deviceSets.back()->m_deviceAPI->getSamplingDeviceId(), m_deviceSets.back()->m_deviceAPI);
- m_deviceSets.back()->m_deviceAPI->setSampleMIMO(mimo);
-}
-
void MainCore::removeLastDevice()
{
if (m_deviceSets.back()->m_deviceSourceEngine) // source set
diff --git a/sdrsrv/maincore.h b/sdrsrv/maincore.h
index 26f51eeba..875e66054 100644
--- a/sdrsrv/maincore.h
+++ b/sdrsrv/maincore.h
@@ -61,7 +61,6 @@ public:
void addSourceDevice();
void addSinkDevice();
- void addMIMODevice();
void removeLastDevice();
void changeSampleSource(int deviceSetIndex, int selectedDeviceIndex);
void changeSampleSink(int deviceSetIndex, int selectedDeviceIndex);
diff --git a/swagger/sdrangel/api/swagger/include/DeviceSettings.yaml b/swagger/sdrangel/api/swagger/include/DeviceSettings.yaml
index 550400585..e18fb29f3 100644
--- a/swagger/sdrangel/api/swagger/include/DeviceSettings.yaml
+++ b/swagger/sdrangel/api/swagger/include/DeviceSettings.yaml
@@ -68,8 +68,6 @@ DeviceSettings:
$ref: "http://localhost:8081/api/swagger/include/SoapySDR.yaml#/SoapySDROutputSettings"
testSourceSettings:
$ref: "http://localhost:8081/api/swagger/include/TestSource.yaml#/TestSourceSettings"
- testMISettings:
- $ref: "http://localhost:8081/api/swagger/include/TestMI.yaml#/TestMISettings"
xtrxInputSettings:
$ref: "http://localhost:8081/api/swagger/include/Xtrx.yaml#/XtrxInputSettings"
xtrxOutputSettings:
diff --git a/swagger/sdrangel/api/swagger/include/TestMI.yaml b/swagger/sdrangel/api/swagger/include/TestMI.yaml
deleted file mode 100644
index 0c8c3a481..000000000
--- a/swagger/sdrangel/api/swagger/include/TestMI.yaml
+++ /dev/null
@@ -1,64 +0,0 @@
-TestMISettings:
- description: TestMISettings
- properties:
- fileRecordName:
- type: string
- useReverseAPI:
- description: Synchronize with reverse API (1 for yes, 0 for no)
- type: integer
- reverseAPIAddress:
- type: string
- reverseAPIPort:
- type: integer
- reverseAPIDeviceIndex:
- type: integer
- streams:
- description: Settings for each of the streams
- type: array
- items:
- $ref: "#/definitions/TestMiStreamSettings"
-
-definitions:
- TestMiStreamSettings:
- description: TestMiStreamSettings
- properties:
- streamIndex:
- description: Index of the stream to which the settings apply
- type: integer
- centerFrequency:
- type: integer
- format: uint64
- frequencyShift:
- type: integer
- sampleRate:
- type: integer
- log2Decim:
- type: integer
- fcPos:
- type: integer
- sampleSizeIndex:
- type: integer
- amplitudeBits:
- type: integer
- autoCorrOptions:
- type: integer
- modulation:
- type: integer
- modulationTone:
- type: integer
- amModulation:
- type: integer
- fmDeviation:
- type: integer
- dcFactor:
- type: number
- format: float
- iFactor:
- type: number
- format: float
- qFactor:
- type: number
- format: float
- phaseImbalance:
- type: number
- format: float
diff --git a/swagger/sdrangel/api/swagger/swagger.yaml b/swagger/sdrangel/api/swagger/swagger.yaml
index a78157619..91bc7fafc 100644
--- a/swagger/sdrangel/api/swagger/swagger.yaml
+++ b/swagger/sdrangel/api/swagger/swagger.yaml
@@ -15,7 +15,7 @@ info:
---
- version: "4.11.6"
+ version: "4.12.5"
title: SDRangel
contact:
url: "https://github.com/f4exb/sdrangel"