diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp index 95df8dab7..8c056d7e0 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.cpp @@ -43,6 +43,7 @@ void BeamSteeringCWModSettings::resetToDefaults() m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; m_reverseAPIChannelIndex = 0; + m_workspaceIndex = 0; } QByteArray BeamSteeringCWModSettings::serialize() const @@ -64,6 +65,9 @@ QByteArray BeamSteeringCWModSettings::serialize() const s.writeBlob(15, m_rollupState->serialize()); } + s.writeS32(16, m_workspaceIndex); + s.writeBlob(17, m_geometryBytes); + return s.final(); } @@ -114,6 +118,9 @@ bool BeamSteeringCWModSettings::deserialize(const QByteArray& data) m_rollupState->deserialize(bytetmp); } + d.readS32(16, &m_workspaceIndex); + d.readBlob(17, &m_geometryBytes); + return true; } else diff --git a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h index cdac05bea..1dfbba1cd 100644 --- a/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h +++ b/plugins/channelmimo/beamsteeringcwmod/beamsteeringcwmodsettings.h @@ -36,6 +36,8 @@ struct BeamSteeringCWModSettings uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; uint16_t m_reverseAPIChannelIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; Serializable *m_channelMarker; Serializable *m_rollupState; diff --git a/plugins/channelmimo/interferometer/interferometersettings.cpp b/plugins/channelmimo/interferometer/interferometersettings.cpp index 128ba8528..e0c5846cf 100644 --- a/plugins/channelmimo/interferometer/interferometersettings.cpp +++ b/plugins/channelmimo/interferometer/interferometersettings.cpp @@ -44,6 +44,7 @@ void InterferometerSettings::resetToDefaults() m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; m_reverseAPIChannelIndex = 0; + m_workspaceIndex = 0; } QByteArray InterferometerSettings::serialize() const @@ -61,6 +62,8 @@ QByteArray InterferometerSettings::serialize() const s.writeU32(10, m_reverseAPIDeviceIndex); s.writeU32(11, m_reverseAPIChannelIndex); s.writeS32(12, m_phase); + s.writeS32(13,m_workspaceIndex); + s.writeBlob(14, m_geometryBytes); if (m_spectrumGUI) { s.writeBlob(20, m_spectrumGUI->serialize()); @@ -117,6 +120,8 @@ bool InterferometerSettings::deserialize(const QByteArray& data) m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp; d.readS32(12, &tmp, 0); m_phase = tmp < -180 ? -180 : tmp > 180 ? 180 : tmp; + d.readS32(13, &m_workspaceIndex); + d.readBlob(14, &m_geometryBytes); if (m_spectrumGUI) { diff --git a/plugins/channelmimo/interferometer/interferometersettings.h b/plugins/channelmimo/interferometer/interferometersettings.h index 387902402..ead9dc259 100644 --- a/plugins/channelmimo/interferometer/interferometersettings.h +++ b/plugins/channelmimo/interferometer/interferometersettings.h @@ -48,6 +48,8 @@ struct InterferometerSettings uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; uint16_t m_reverseAPIChannelIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; Serializable *m_channelMarker; Serializable *m_spectrumGUI; diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp index ecbc3ab34..608e7b388 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp @@ -66,7 +66,10 @@ BladeRF2MIMOGui::BladeRF2MIMOGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRateMode(true) { qDebug("BladeRF2MIMOGui::BladeRF2MIMOGui"); - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#BladeRF2MIMOGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/bladerf2mimo/readme.md"; m_sampleMIMO = (BladeRF2MIMO*) m_deviceUISet->m_deviceAPI->getSampleMIMO(); m_sampleMIMO->getRxFrequencyRange(m_fMinRx, m_fMaxRx, m_fStepRx, m_fScaleRx); @@ -100,6 +103,7 @@ BladeRF2MIMOGui::BladeRF2MIMOGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); + makeUIConnections(); } BladeRF2MIMOGui::~BladeRF2MIMOGui() @@ -821,3 +825,27 @@ int BladeRF2MIMOGui::getGainValue(float gainDB, int gainMin, int gainMax, int ga gainDB, gainMin, gainMax, gainStep, gainScale, gain); return gain; } + +void BladeRF2MIMOGui::makeUIConnections() +{ + QObject::connect(ui->streamSide, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_streamSide_currentIndexChanged); + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSide, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_spectrumSide_currentIndexChanged); + QObject::connect(ui->spectrumIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_spectrumIndex_currentIndexChanged); + QObject::connect(ui->startStopRx, &ButtonSwitch::toggled, this, &BladeRF2MIMOGui::on_startStopRx_toggled); + QObject::connect(ui->startStopTx, &ButtonSwitch::toggled, this, &BladeRF2MIMOGui::on_startStopTx_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &BladeRF2MIMOGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &BladeRF2MIMOGui::on_LOppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &BladeRF2MIMOGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &BladeRF2MIMOGui::on_iqImbalance_toggled); + QObject::connect(ui->bandwidth, &ValueDial::changed, this, &BladeRF2MIMOGui::on_bandwidth_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &BladeRF2MIMOGui::on_sampleRate_changed); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_decim_currentIndexChanged); + QObject::connect(ui->gainLock, &QToolButton::toggled, this, &BladeRF2MIMOGui::on_gainLock_toggled); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2MIMOGui::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &BladeRF2MIMOGui::on_gain_valueChanged); + QObject::connect(ui->biasTee, &ButtonSwitch::toggled, this, &BladeRF2MIMOGui::on_biasTee_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &BladeRF2MIMOGui::on_transverter_clicked); + +} diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h index 23101e88d..471d36a79 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::BladeRF2MIMOGui* ui; @@ -97,6 +101,7 @@ private: int getGainValue(float gainDB, int gainMin, int gainMax, int gainStep, float gainScale); float setGainFromValue(int value); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.cpp index 650dd62f1..0a2058d59 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.cpp @@ -58,6 +58,8 @@ void BladeRF2MIMOSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + + m_workspaceIndex = 0; } QByteArray BladeRF2MIMOSettings::serialize() const @@ -97,6 +99,9 @@ QByteArray BladeRF2MIMOSettings::serialize() const s.writeU32(53, m_reverseAPIPort); s.writeU32(54, m_reverseAPIDeviceIndex); + s.writeS32(55, m_workspaceIndex); + s.writeBlob(56, m_geometryBytes); + return s.final(); } @@ -158,6 +163,9 @@ bool BladeRF2MIMOSettings::deserialize(const QByteArray& data) d.readU32(54, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(55,&m_workspaceIndex, 0); + d.readBlob(56, &m_geometryBytes); + return true; } else diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.h b/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.h index 2f2104630..98e69d66d 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.h +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimosettings.h @@ -60,6 +60,8 @@ struct BladeRF2MIMOSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; BladeRF2MIMOSettings(); void resetToDefaults(); diff --git a/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp b/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp index 6a0b4c649..2022ce44e 100644 --- a/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp +++ b/plugins/samplemimo/limesdrmimo/limesdrmimogui.cpp @@ -68,7 +68,10 @@ LimeSDRMIMOGUI::LimeSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRateMode(true) { qDebug("LimeSDRMIMOGUI::LimeSDRMIMOGUI"); - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#LimeSDRMIMOGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/limesdrmimo/readme.md"; m_limeSDRMIMO = (LimeSDRMIMO*) m_deviceUISet->m_deviceAPI->getSampleMIMO(); m_limeSDRMIMO->getRxFrequencyRange(m_fMinRx, m_fMaxRx, m_fStepRx); @@ -100,6 +103,7 @@ LimeSDRMIMOGUI::LimeSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); + makeUIConnections(); } LimeSDRMIMOGUI::~LimeSDRMIMOGUI() @@ -1137,3 +1141,33 @@ void LimeSDRMIMOGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void LimeSDRMIMOGUI::makeUIConnections() +{ + QObject::connect(ui->streamSide, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_streamSide_currentIndexChanged); + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSide, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_spectrumSide_currentIndexChanged); + QObject::connect(ui->spectrumIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_spectrumIndex_currentIndexChanged); + QObject::connect(ui->startStopRx, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_startStopRx_toggled); + QObject::connect(ui->startStopTx, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_startStopTx_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &LimeSDRMIMOGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_ncoEnable_toggled); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &LimeSDRMIMOGUI::on_ncoFrequency_changed); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_iqImbalance_toggled); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &LimeSDRMIMOGUI::on_extClock_clicked); + QObject::connect(ui->hwDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_hwDecim_currentIndexChanged); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &LimeSDRMIMOGUI::on_sampleRateMode_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &LimeSDRMIMOGUI::on_sampleRate_changed); + QObject::connect(ui->lpf, &ValueDial::changed, this, &LimeSDRMIMOGUI::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &LimeSDRMIMOGUI::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &LimeSDRMIMOGUI::on_lpFIR_changed); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &LimeSDRMIMOGUI::on_transverter_clicked); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &LimeSDRMIMOGUI::on_gain_valueChanged); + QObject::connect(ui->lnaGain, &QDial::valueChanged, this, &LimeSDRMIMOGUI::on_lnaGain_valueChanged); + QObject::connect(ui->tiaGain, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_tiaGain_currentIndexChanged); + QObject::connect(ui->pgaGain, &QDial::valueChanged, this, &LimeSDRMIMOGUI::on_pgaGain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRMIMOGUI::on_antenna_currentIndexChanged); +} diff --git a/plugins/samplemimo/limesdrmimo/limesdrmimogui.h b/plugins/samplemimo/limesdrmimo/limesdrmimogui.h index e42720cdd..666f8d3a6 100644 --- a/plugins/samplemimo/limesdrmimo/limesdrmimogui.h +++ b/plugins/samplemimo/limesdrmimo/limesdrmimogui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::LimeSDRMIMOGUI* ui; @@ -96,6 +100,7 @@ private: void updateSampleRateAndFrequency(); void sendSettings(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/limesdrmimo/limesdrmimosettings.cpp b/plugins/samplemimo/limesdrmimo/limesdrmimosettings.cpp index 7deaecb71..c25f25965 100644 --- a/plugins/samplemimo/limesdrmimo/limesdrmimosettings.cpp +++ b/plugins/samplemimo/limesdrmimo/limesdrmimosettings.cpp @@ -86,6 +86,8 @@ void LimeSDRMIMOSettings::resetToDefaults() m_lpfFIRBWTx1 = 2.5e6f; m_gainTx1 = 4; m_antennaPathTx1 = PATH_RFE_TX_NONE; + + m_workspaceIndex = 0; } QByteArray LimeSDRMIMOSettings::serialize() const @@ -153,6 +155,9 @@ QByteArray LimeSDRMIMOSettings::serialize() const s.writeU32(93, m_gainTx1); s.writeS32(94, (int) m_antennaPathTx1); + s.writeS32(95, m_workspaceIndex); + s.writeBlob(96, m_geometryBytes); + return s.final(); } @@ -248,6 +253,9 @@ bool LimeSDRMIMOSettings::deserialize(const QByteArray& data) d.readS32(94, &intval, 0); m_antennaPathTx1 = (PathTxRFE) intval; + d.readS32(95, &m_workspaceIndex, 0); + d.readBlob(96, &m_geometryBytes); + return true; } else @@ -255,4 +263,4 @@ bool LimeSDRMIMOSettings::deserialize(const QByteArray& data) resetToDefaults(); return false; } -} \ No newline at end of file +} diff --git a/plugins/samplemimo/limesdrmimo/limesdrmimosettings.h b/plugins/samplemimo/limesdrmimo/limesdrmimosettings.h index 6bb8617a5..ae189e162 100644 --- a/plugins/samplemimo/limesdrmimo/limesdrmimosettings.h +++ b/plugins/samplemimo/limesdrmimo/limesdrmimosettings.h @@ -119,10 +119,13 @@ struct LimeSDRMIMOSettings uint32_t m_gainTx1; //!< Tx[1] Optimally distributed gain (dB) PathTxRFE m_antennaPathTx1; //!< Tx[1] Antenna connection + int m_workspaceIndex; + QByteArray m_geometryBytes; + LimeSDRMIMOSettings(); void resetToDefaults(); QByteArray serialize() const; bool deserialize(const QByteArray& data); }; -#endif // PLUGINS_SAMPLEMIMO_LIMESDRMIMO_LIMESDRMIMOSETTINGS_H_ \ No newline at end of file +#endif // PLUGINS_SAMPLEMIMO_LIMESDRMIMO_LIMESDRMIMOSETTINGS_H_ diff --git a/plugins/samplemimo/metismiso/metismisogui.cpp b/plugins/samplemimo/metismiso/metismisogui.cpp index 3e720162c..98e91cd69 100644 --- a/plugins/samplemimo/metismiso/metismisogui.cpp +++ b/plugins/samplemimo/metismiso/metismisogui.cpp @@ -52,11 +52,14 @@ MetisMISOGui::MetisMISOGui(DeviceUISet *deviceUISet, QWidget* parent) : m_lastEngineState(DeviceAPI::StNotStarted) { qDebug("MetisMISOGui::MetisMISOGui"); + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleMIMO = m_deviceUISet->m_deviceAPI->getSampleMIMO(); m_rxSampleRate = 48000; m_txSampleRate = 48000; - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#MetisMISOGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/metismiso/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0, m_absMaxFreq); @@ -71,6 +74,8 @@ MetisMISOGui::MetisMISOGui(DeviceUISet *deviceUISet, QWidget* parent) : CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + + makeUIConnections(); } MetisMISOGui::~MetisMISOGui() @@ -574,3 +579,26 @@ void MetisMISOGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void MetisMISOGui::makeUIConnections() +{ + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSource, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_spectrumSource_currentIndexChanged); + QObject::connect(ui->streamLock, &QToolButton::toggled, this, &MetisMISOGui::on_streamLock_toggled); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &MetisMISOGui::on_LOppm_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &MetisMISOGui::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &MetisMISOGui::on_centerFrequency_changed); + QObject::connect(ui->samplerateIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_samplerateIndex_currentIndexChanged); + QObject::connect(ui->log2Decim, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_log2Decim_currentIndexChanged); + QObject::connect(ui->subsamplingIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_subsamplingIndex_currentIndexChanged); + QObject::connect(ui->dcBlock, &ButtonSwitch::toggled, this, &MetisMISOGui::on_dcBlock_toggled); + QObject::connect(ui->iqCorrection, &ButtonSwitch::toggled, this, &MetisMISOGui::on_iqCorrection_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &MetisMISOGui::on_transverter_clicked); + QObject::connect(ui->preamp, &ButtonSwitch::toggled, this, &MetisMISOGui::on_preamp_toggled); + QObject::connect(ui->random, &ButtonSwitch::toggled, this, &MetisMISOGui::on_random_toggled); + QObject::connect(ui->dither, &ButtonSwitch::toggled, this, &MetisMISOGui::on_dither_toggled); + QObject::connect(ui->duplex, &ButtonSwitch::toggled, this, &MetisMISOGui::on_duplex_toggled); + QObject::connect(ui->nbRxIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &MetisMISOGui::on_nbRxIndex_currentIndexChanged); + QObject::connect(ui->txEnable, &ButtonSwitch::toggled, this, &MetisMISOGui::on_txEnable_toggled); + QObject::connect(ui->txDrive, &QDial::valueChanged, this, &MetisMISOGui::on_txDrive_valueChanged); +} diff --git a/plugins/samplemimo/metismiso/metismisogui.h b/plugins/samplemimo/metismiso/metismisogui.h index 48cad3f44..b54780ef7 100644 --- a/plugins/samplemimo/metismiso/metismisogui.h +++ b/plugins/samplemimo/metismiso/metismisogui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::MetisMISOGui* ui; @@ -74,6 +78,7 @@ private: void sendSettings(); void setCenterFrequency(qint64 centerFrequency); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/metismiso/metismisosettings.cpp b/plugins/samplemimo/metismiso/metismisosettings.cpp index 2e3a0e45a..e636bbfd6 100644 --- a/plugins/samplemimo/metismiso/metismisosettings.cpp +++ b/plugins/samplemimo/metismiso/metismisosettings.cpp @@ -82,6 +82,7 @@ void MetisMISOSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray MetisMISOSettings::serialize() const @@ -112,6 +113,8 @@ QByteArray MetisMISOSettings::serialize() const s.writeU32(22, m_reverseAPIDeviceIndex); s.writeS32(23, m_streamIndex); s.writeS32(24, m_spectrumStreamIndex); + s.writeS32(25, m_workspaceIndex); + s.writeBlob(26, m_geometryBytes); for (int i = 0; i < m_maxReceivers; i++) { @@ -175,6 +178,8 @@ bool MetisMISOSettings::deserialize(const QByteArray& data) d.readS32(23, &m_streamIndex, 0); d.readS32(24, &m_spectrumStreamIndex, 0); + d.readS32(25, &m_workspaceIndex, 0); + d.readBlob(26, &m_geometryBytes); return true; } diff --git a/plugins/samplemimo/metismiso/metismisosettings.h b/plugins/samplemimo/metismiso/metismisosettings.h index 3fd3ee396..26257d225 100644 --- a/plugins/samplemimo/metismiso/metismisosettings.h +++ b/plugins/samplemimo/metismiso/metismisosettings.h @@ -48,6 +48,8 @@ struct MetisMISOSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; MetisMISOSettings(); MetisMISOSettings(const MetisMISOSettings& other); diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp index 95f750f94..6b741d057 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.cpp @@ -68,7 +68,10 @@ PlutoSDRMIMOGUI::PlutoSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRateMode(true) { qDebug("PlutoSDRMIMOGui::PlutoSDRMIMOGui"); - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#PlutoSDRMIMOGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/plutosdrmimo/readme.md"; m_sampleMIMO = (PlutoSDRMIMO*) m_deviceUISet->m_deviceAPI->getSampleMIMO(); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -102,6 +105,8 @@ PlutoSDRMIMOGUI::PlutoSDRMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue); + + makeUIConnections(); } PlutoSDRMIMOGUI::~PlutoSDRMIMOGUI() @@ -891,3 +896,35 @@ void PlutoSDRMIMOGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void PlutoSDRMIMOGUI::makeUIConnections() +{ + QObject::connect(ui->streamSide, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_streamSide_currentIndexChanged); + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSide, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_spectrumSide_currentIndexChanged); + QObject::connect(ui->spectrumIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_spectrumIndex_currentIndexChanged); + QObject::connect(ui->startStopRx, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_startStopRx_toggled); + QObject::connect(ui->startStopTx, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_startStopTx_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &PlutoSDRMIMOGUI::on_centerFrequency_changed); + QObject::connect(ui->loPPM, &QSlider::valueChanged, this, &PlutoSDRMIMOGUI::on_loPPM_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &PlutoSDRMIMOGUI::on_sampleRate_changed); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &PlutoSDRMIMOGUI::on_sampleRateMode_toggled); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged),this, &PlutoSDRMIMOGUI::on_fcPos_currentIndexChanged); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->gainLock, &QToolButton::toggled, this, &PlutoSDRMIMOGUI::on_gainLock_toggled); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &PlutoSDRMIMOGUI::on_gain_valueChanged); + QObject::connect(ui->att, &QDial::valueChanged, this, &PlutoSDRMIMOGUI::on_att_valueChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &PlutoSDRMIMOGUI::on_transverter_clicked); + QObject::connect(ui->rfDCOffset, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_rfDCOffset_toggled); + QObject::connect(ui->bbDCOffset, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_bbDCOffset_toggled); + QObject::connect(ui->hwIQImbalance, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_hwIQImbalance_toggled); + QObject::connect(ui->lpf, &ValueDial::changed, this, &PlutoSDRMIMOGUI::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &PlutoSDRMIMOGUI::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &PlutoSDRMIMOGUI::on_lpFIR_changed); + QObject::connect(ui->lpFIRDecimation, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_lpFIRDecimation_currentIndexChanged); + QObject::connect(ui->lpFIRGain, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_lpFIRGain_currentIndexChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRMIMOGUI::on_antenna_currentIndexChanged); +} diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.h b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.h index 0f58ffd8d..cbd816025 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.h +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimogui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::PlutoSDRMIMOGUI* ui; @@ -81,6 +85,7 @@ private: void setSampleRateLimits(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.cpp b/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.cpp index ceb4441d3..887c6d6d7 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.cpp +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.cpp @@ -77,6 +77,7 @@ void PlutoSDRMIMOSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray PlutoSDRMIMOSettings::serialize() const @@ -141,6 +142,9 @@ QByteArray PlutoSDRMIMOSettings::serialize() const s.writeU32(102, m_reverseAPIPort); s.writeU32(103, m_reverseAPIDeviceIndex); + s.writeS32(104, m_workspaceIndex); + s.writeBlob(105, m_geometryBytes); + return s.final(); } @@ -275,6 +279,9 @@ bool PlutoSDRMIMOSettings::deserialize(const QByteArray& data) d.readU32(103, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(104, &m_workspaceIndex, 0); + d.readBlob(105, &m_geometryBytes); + return true; } else diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.h b/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.h index d99efd8f2..3fda801be 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.h +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimosettings.h @@ -121,6 +121,8 @@ struct PlutoSDRMIMOSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; static const int m_plutoSDRBlockSizeSamples = 64*256; //complex samples per buffer (must be multiple of 64) diff --git a/plugins/samplemimo/testmi/testmigui.cpp b/plugins/samplemimo/testmi/testmigui.cpp index e39e93c76..49751eabf 100644 --- a/plugins/samplemimo/testmi/testmigui.cpp +++ b/plugins/samplemimo/testmi/testmigui.cpp @@ -52,6 +52,7 @@ TestMIGui::TestMIGui(DeviceUISet *deviceUISet, QWidget* parent) : m_lastEngineState(DeviceAPI::StNotStarted) { qDebug("TestMIGui::TestMIGui"); + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleMIMO = m_deviceUISet->m_deviceAPI->getSampleMIMO(); m_streamIndex = 0; m_deviceCenterFrequencies.push_back(m_settings.m_streams[0].m_centerFrequency); @@ -59,7 +60,9 @@ TestMIGui::TestMIGui(DeviceUISet *deviceUISet, QWidget* parent) : m_deviceSampleRates.push_back(m_settings.m_streams[0].m_sampleRate / (1<setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#TestMIGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/testmi/readme.md"; ui->spectrumSource->addItem("0"); ui->spectrumSource->addItem("1"); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -81,6 +84,8 @@ TestMIGui::TestMIGui(DeviceUISet *deviceUISet, QWidget* parent) : CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); + + makeUIConnections(); } TestMIGui::~TestMIGui() @@ -559,3 +564,28 @@ void TestMIGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void TestMIGui::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &TestMIGui::on_startStop_toggled); + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSource, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_spectrumSource_currentIndexChanged); + QObject::connect(ui->streamLock, &QToolButton::toggled, this, &TestMIGui::on_streamLock_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestMIGui::on_centerFrequency_changed); + QObject::connect(ui->autoCorr, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_autoCorr_currentIndexChanged); + QObject::connect(ui->frequencyShift, &ValueDialZ::changed, this, &TestMIGui::on_frequencyShift_changed); + QObject::connect(ui->decimation, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_decimation_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &TestMIGui::on_sampleRate_changed); + QObject::connect(ui->sampleSize, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_sampleSize_currentIndexChanged); + QObject::connect(ui->amplitudeCoarse, &QSlider::valueChanged, this, &TestMIGui::on_amplitudeCoarse_valueChanged); + QObject::connect(ui->amplitudeFine, &QSlider::valueChanged, this, &TestMIGui::on_amplitudeFine_valueChanged); + QObject::connect(ui->modulation, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMIGui::on_modulation_currentIndexChanged); + QObject::connect(ui->modulationFrequency, &QDial::valueChanged, this, &TestMIGui::on_modulationFrequency_valueChanged); + QObject::connect(ui->amModulation, &QDial::valueChanged, this, &TestMIGui::on_amModulation_valueChanged); + QObject::connect(ui->fmDeviation, &QDial::valueChanged, this, &TestMIGui::on_fmDeviation_valueChanged); + QObject::connect(ui->dcBias, &QSlider::valueChanged, this, &TestMIGui::on_dcBias_valueChanged); + QObject::connect(ui->iBias, &QSlider::valueChanged, this, &TestMIGui::on_iBias_valueChanged); + QObject::connect(ui->qBias, &QSlider::valueChanged, this, &TestMIGui::on_qBias_valueChanged); + QObject::connect(ui->phaseImbalance, &QSlider::valueChanged, this, &TestMIGui::on_phaseImbalance_valueChanged); +} diff --git a/plugins/samplemimo/testmi/testmigui.h b/plugins/samplemimo/testmi/testmigui.h index a3b9ecd6f..ec27cbaae 100644 --- a/plugins/samplemimo/testmi/testmigui.h +++ b/plugins/samplemimo/testmi/testmigui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::TestMIGui* ui; @@ -73,6 +77,7 @@ private: void updateAmpFineLimit(); void updateFrequencyShiftLimit(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/testmi/testmigui.ui b/plugins/samplemimo/testmi/testmigui.ui index 45b8e95a5..078537460 100644 --- a/plugins/samplemimo/testmi/testmigui.ui +++ b/plugins/samplemimo/testmi/testmigui.ui @@ -7,7 +7,7 @@ 0 0 360 - 300 + 368 @@ -19,7 +19,7 @@ 360 - 300 + 0 @@ -224,6 +224,9 @@ Liberation Mono 20 + 50 + false + false @@ -488,6 +491,9 @@ Liberation Mono 12 + 50 + false + false @@ -644,6 +650,9 @@ Liberation Mono 12 + 50 + false + false @@ -764,13 +773,6 @@ - - - - Qt::Horizontal - - - @@ -1052,9 +1054,6 @@ - - - diff --git a/plugins/samplemimo/testmi/testmisettings.cpp b/plugins/samplemimo/testmi/testmisettings.cpp index 7461e52b4..66d43f192 100644 --- a/plugins/samplemimo/testmi/testmisettings.cpp +++ b/plugins/samplemimo/testmi/testmisettings.cpp @@ -50,6 +50,7 @@ TestMISettings::TestMISettings() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; m_streams.push_back(TestMIStreamSettings()); m_streams.push_back(TestMIStreamSettings()); } @@ -61,6 +62,7 @@ TestMISettings::TestMISettings(const TestMISettings& other) : m_reverseAPIAddress = other.m_reverseAPIAddress; m_reverseAPIPort = other.m_reverseAPIPort; m_reverseAPIDeviceIndex = other.m_reverseAPIDeviceIndex; + m_workspaceIndex = other.m_workspaceIndex; } void TestMISettings::resetToDefaults() @@ -78,6 +80,8 @@ QByteArray TestMISettings::serialize() const s.writeString(2, m_reverseAPIAddress); s.writeU32(3, m_reverseAPIPort); s.writeU32(4, m_reverseAPIDeviceIndex); + s.writeS32(5, m_workspaceIndex); + s.writeBlob(6, m_geometryBytes); for (unsigned int i = 0; i < m_streams.size(); i++) { @@ -128,6 +132,8 @@ bool TestMISettings::deserialize(const QByteArray& data) d.readU32(4, &utmp, 0); m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; + d.readS32(5, &m_workspaceIndex, 0); + d.readBlob(6, &m_geometryBytes); for (unsigned int i = 0; i < m_streams.size(); i++) { diff --git a/plugins/samplemimo/testmi/testmisettings.h b/plugins/samplemimo/testmi/testmisettings.h index 62c328b97..95898b1ac 100644 --- a/plugins/samplemimo/testmi/testmisettings.h +++ b/plugins/samplemimo/testmi/testmisettings.h @@ -70,6 +70,8 @@ struct TestMISettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; std::vector m_streams; TestMISettings(); diff --git a/plugins/samplemimo/testmosync/testmosyncgui.cpp b/plugins/samplemimo/testmosync/testmosyncgui.cpp index cbcd64670..b9c3b8404 100644 --- a/plugins/samplemimo/testmosync/testmosyncgui.cpp +++ b/plugins/samplemimo/testmosync/testmosyncgui.cpp @@ -49,7 +49,10 @@ TestMOSyncGui::TestMOSyncGui(DeviceUISet *deviceUISet, QWidget* parent) : m_tickCount(0), m_lastEngineState(DeviceAPI::StNotStarted) { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#TestMOSyncGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/testmosync/readme.md"; m_sampleMIMO = (TestMOSync*) m_deviceUISet->m_deviceAPI->getSampleMIMO(); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -70,6 +73,7 @@ TestMOSyncGui::TestMOSyncGui(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); m_sampleMIMO->setMessageQueueToGUI(&m_inputMessageQueue); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); @@ -77,6 +81,7 @@ TestMOSyncGui::TestMOSyncGui(DeviceUISet *deviceUISet, QWidget* parent) : m_deviceUISet->m_spectrum->setDisplayedStream(false, 0); m_deviceUISet->m_deviceAPI->setSpectrumSinkInput(false, 0); m_deviceUISet->setSpectrumScalingFactor(SDR_TX_SCALEF); + } TestMOSyncGui::~TestMOSyncGui() @@ -282,3 +287,12 @@ void TestMOSyncGui::on_spectrumIndex_currentIndexChanged(int index) void TestMOSyncGui::tick() { } + +void TestMOSyncGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestMOSyncGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &TestMOSyncGui::on_sampleRate_changed); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &TestMOSyncGui::on_startStop_toggled); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMOSyncGui::on_interp_currentIndexChanged); + QObject::connect(ui->spectrumIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &TestMOSyncGui::on_spectrumIndex_currentIndexChanged); +} diff --git a/plugins/samplemimo/testmosync/testmosyncgui.h b/plugins/samplemimo/testmosync/testmosyncgui.h index e6b066d0b..13a509d67 100644 --- a/plugins/samplemimo/testmosync/testmosyncgui.h +++ b/plugins/samplemimo/testmosync/testmosyncgui.h @@ -47,6 +47,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::TestMOSyncGui* ui; @@ -72,6 +76,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/testmosync/testmosyncsettings.cpp b/plugins/samplemimo/testmosync/testmosyncsettings.cpp index 596f90432..ca026deec 100644 --- a/plugins/samplemimo/testmosync/testmosyncsettings.cpp +++ b/plugins/samplemimo/testmosync/testmosyncsettings.cpp @@ -31,6 +31,7 @@ void TestMOSyncSettings::resetToDefaults() m_sampleRate = 48000; m_log2Interp = 0; m_fcPosTx = FC_POS_CENTER; + m_workspaceIndex = 0; } QByteArray TestMOSyncSettings::serialize() const @@ -40,6 +41,8 @@ QByteArray TestMOSyncSettings::serialize() const s.writeU64(1, m_sampleRate); s.writeU32(2, m_log2Interp); s.writeS32(3, (int) m_fcPosTx); + s.writeS32(4, m_workspaceIndex); + s.writeBlob(5, m_geometryBytes); return s.final(); } @@ -60,8 +63,10 @@ bool TestMOSyncSettings::deserialize(const QByteArray& data) d.readU64(1, &m_sampleRate, 48000); d.readU32(2, &m_log2Interp, 0); - d.readS32(38, &intval, 2); + d.readS32(3, &intval, 2); m_fcPosTx = (fcPos_t) intval; + d.readS32(4, &m_workspaceIndex, 0); + d.readBlob(5, &m_geometryBytes); return true; } diff --git a/plugins/samplemimo/testmosync/testmosyncsettings.h b/plugins/samplemimo/testmosync/testmosyncsettings.h index dc40e9c5a..23976fb85 100644 --- a/plugins/samplemimo/testmosync/testmosyncsettings.h +++ b/plugins/samplemimo/testmosync/testmosyncsettings.h @@ -31,6 +31,8 @@ struct TestMOSyncSettings { quint64 m_sampleRate; quint32 m_log2Interp; fcPos_t m_fcPosTx; + int m_workspaceIndex; + QByteArray m_geometryBytes; static const unsigned int m_msThrottle; diff --git a/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp b/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp index cace01d2f..98fc27e4f 100644 --- a/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp +++ b/plugins/samplemimo/xtrxmimo/xtrxmimogui.cpp @@ -65,7 +65,10 @@ XTRXMIMOGUI::XTRXMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRateMode(true) { qDebug("XTRXMIMOGUI::XTRXMIMOGUI"); - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#XTRXMIMOGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplemimo/xtrxmimo/readme.md"; m_xtrxMIMO = (XTRXMIMO*) m_deviceUISet->m_deviceAPI->getSampleMIMO(); float minF, maxF, stepF; @@ -97,6 +100,7 @@ XTRXMIMOGUI::XTRXMIMOGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); + makeUIConnections(); } XTRXMIMOGUI::~XTRXMIMOGUI() @@ -1013,3 +1017,31 @@ void XTRXMIMOGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void XTRXMIMOGUI::makeUIConnections() +{ + QObject::connect(ui->streamSide, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_streamSide_currentIndexChanged); + QObject::connect(ui->streamIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_streamIndex_currentIndexChanged); + QObject::connect(ui->spectrumSide, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_spectrumSide_currentIndexChanged); + QObject::connect(ui->spectrumIndex, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_spectrumIndex_currentIndexChanged); + QObject::connect(ui->startStopRx, &ButtonSwitch::toggled, this, &XTRXMIMOGUI::on_startStopRx_toggled); + QObject::connect(ui->startStopTx, &ButtonSwitch::toggled, this, &XTRXMIMOGUI::on_startStopTx_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &XTRXMIMOGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &XTRXMIMOGUI::on_ncoEnable_toggled); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &XTRXMIMOGUI::on_ncoFrequency_changed); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &XTRXMIMOGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &XTRXMIMOGUI::on_iqImbalance_toggled); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &XTRXMIMOGUI::on_extClock_clicked); + QObject::connect(ui->hwDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_hwDecim_currentIndexChanged); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &XTRXMIMOGUI::on_sampleRateMode_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &XTRXMIMOGUI::on_sampleRate_changed); + QObject::connect(ui->lpf, &ValueDial::changed, this, &XTRXMIMOGUI::on_lpf_changed); + QObject::connect(ui->pwrmode, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_pwrmode_currentIndexChanged); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &XTRXMIMOGUI::on_gain_valueChanged); + QObject::connect(ui->lnaGain, &QDial::valueChanged, this, &XTRXMIMOGUI::on_lnaGain_valueChanged); + QObject::connect(ui->tiaGain, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_tiaGain_currentIndexChanged); + QObject::connect(ui->pgaGain, &QDial::valueChanged, this, &XTRXMIMOGUI::on_pgaGain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXMIMOGUI::on_antenna_currentIndexChanged); +} diff --git a/plugins/samplemimo/xtrxmimo/xtrxmimogui.h b/plugins/samplemimo/xtrxmimo/xtrxmimogui.h index 4699300fb..2f40493d7 100644 --- a/plugins/samplemimo/xtrxmimo/xtrxmimogui.h +++ b/plugins/samplemimo/xtrxmimo/xtrxmimogui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::XTRXMIMOGUI* ui; @@ -85,6 +89,7 @@ private: void updateADCRate(); void updateDACRate(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplemimo/xtrxmimo/xtrxmimosettings.cpp b/plugins/samplemimo/xtrxmimo/xtrxmimosettings.cpp index fcde1096d..2d6cb75f1 100644 --- a/plugins/samplemimo/xtrxmimo/xtrxmimosettings.cpp +++ b/plugins/samplemimo/xtrxmimo/xtrxmimosettings.cpp @@ -75,6 +75,8 @@ void XTRXMIMOSettings::resetToDefaults() m_lpfBWTx1 = 4.5e6f; m_gainTx1 = 20; m_pwrmodeTx1 = 4; + // GUI + m_workspaceIndex = 0; } QByteArray XTRXMIMOSettings::serialize() const @@ -129,6 +131,9 @@ QByteArray XTRXMIMOSettings::serialize() const s.writeFloat(90, m_lpfBWTx1); s.writeU32(91, m_gainTx1); s.writeU32(92, m_pwrmodeTx1); + // GUI + s.writeS32(93, m_workspaceIndex); + s.writeBlob(94, m_geometryBytes); return s.final(); } diff --git a/plugins/samplemimo/xtrxmimo/xtrxmimosettings.h b/plugins/samplemimo/xtrxmimo/xtrxmimosettings.h index 8dc3a7a19..f86fdb5ce 100644 --- a/plugins/samplemimo/xtrxmimo/xtrxmimosettings.h +++ b/plugins/samplemimo/xtrxmimo/xtrxmimosettings.h @@ -93,6 +93,9 @@ struct XTRXMIMOSettings float m_lpfBWTx1; //!< LMS analog lowpass filter bandwidth (Hz) uint32_t m_gainTx1; //!< Optimally distributed gain (dB) uint32_t m_pwrmodeTx1; + // GUI + int m_workspaceIndex; + QByteArray m_geometryBytes; XTRXMIMOSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/audiooutput/audiooutputgui.cpp b/plugins/samplesink/audiooutput/audiooutputgui.cpp index be4df2bb1..8aeddf0c8 100644 --- a/plugins/samplesink/audiooutput/audiooutputgui.cpp +++ b/plugins/samplesink/audiooutput/audiooutputgui.cpp @@ -40,9 +40,12 @@ AudioOutputGui::AudioOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_settings(), m_centerFrequency(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_audioOutput = (AudioOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#AudioOutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/audiooutput/readme.md"; connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); @@ -57,6 +60,8 @@ AudioOutputGui::AudioOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_audioOutput->setMessageQueueToGUI(&m_inputMessageQueue); + + makeUIConnections(); } AudioOutputGui::~AudioOutputGui() @@ -237,3 +242,11 @@ void AudioOutputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void AudioOutputGui::makeUIConnections() +{ + QObject::connect(ui->deviceSelect, &QPushButton::clicked, this, &AudioOutputGui::on_deviceSelect_clicked); + QObject::connect(ui->volume, &QDial::valueChanged, this, &AudioOutputGui::on_volume_valueChanged); + QObject::connect(ui->channels, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioOutputGui::on_channels_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AudioOutputGui::on_startStop_toggled); +} diff --git a/plugins/samplesink/audiooutput/audiooutputgui.h b/plugins/samplesink/audiooutput/audiooutputgui.h index 84e3e92a9..d53748dfc 100644 --- a/plugins/samplesink/audiooutput/audiooutputgui.h +++ b/plugins/samplesink/audiooutput/audiooutputgui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::AudioOutputGui* ui; @@ -65,6 +69,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/audiooutput/audiooutputsettings.cpp b/plugins/samplesink/audiooutput/audiooutputsettings.cpp index e6d39f949..b11772506 100644 --- a/plugins/samplesink/audiooutput/audiooutputsettings.cpp +++ b/plugins/samplesink/audiooutput/audiooutputsettings.cpp @@ -34,6 +34,7 @@ void AudioOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray AudioOutputSettings::serialize() const @@ -43,6 +44,8 @@ QByteArray AudioOutputSettings::serialize() const s.writeString(1, m_deviceName); s.writeFloat(3, m_volume); s.writeS32(5, (int)m_iqMapping); + s.writeS32(6, m_workspaceIndex); + s.writeBlob(7, m_geometryBytes); s.writeBool(24, m_useReverseAPI); s.writeString(25, m_reverseAPIAddress); @@ -69,6 +72,8 @@ bool AudioOutputSettings::deserialize(const QByteArray& data) d.readString(1, &m_deviceName, ""); d.readFloat(3, &m_volume, 1.0f); d.readS32(5, (int *)&m_iqMapping, IQMapping::LR); + d.readS32(6, &m_workspaceIndex, 0); + d.readBlob(7, &m_geometryBytes); d.readBool(24, &m_useReverseAPI, false); d.readString(25, &m_reverseAPIAddress, "127.0.0.1"); diff --git a/plugins/samplesink/audiooutput/audiooutputsettings.h b/plugins/samplesink/audiooutput/audiooutputsettings.h index d2f9e7634..66335e21d 100644 --- a/plugins/samplesink/audiooutput/audiooutputsettings.h +++ b/plugins/samplesink/audiooutput/audiooutputsettings.h @@ -34,6 +34,8 @@ struct AudioOutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; AudioOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp b/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp index 56c2168a8..4e96bb307 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp +++ b/plugins/samplesink/bladerf1output/bladerf1outputgui.cpp @@ -43,10 +43,12 @@ Bladerf1OutputGui::Bladerf1OutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_sampleRate(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_deviceSampleSink = (Bladerf1Output*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); - ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#Bladerf1OutputGui { border: 1px solid #C06900 }"); + m_helpURL = "/plugins/samplesink/bladerf1output/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, BLADERF_FREQUENCY_MIN_XB200/1000, BLADERF_FREQUENCY_MAX/1000); ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); @@ -67,6 +69,7 @@ Bladerf1OutputGui::Bladerf1OutputGui(DeviceUISet *deviceUISet, QWidget* parent) connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -460,3 +463,13 @@ void Bladerf1OutputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void Bladerf1OutputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &Bladerf1OutputGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &Bladerf1OutputGui::on_sampleRate_changed); + QObject::connect(ui->bandwidth, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1OutputGui::on_bandwidth_currentIndexChanged); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1OutputGui::on_interp_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &Bladerf1OutputGui::on_startStop_toggled); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &Bladerf1OutputGui::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/bladerf1output/bladerf1outputgui.h b/plugins/samplesink/bladerf1output/bladerf1outputgui.h index 36d8312aa..af5cc768e 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputgui.h +++ b/plugins/samplesink/bladerf1output/bladerf1outputgui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::Bladerf1OutputGui* ui; @@ -69,6 +73,7 @@ private: unsigned int getXb200Index(bool xb_200, bladerf_xb200_path xb200Path, bladerf_xb200_filter xb200Filter); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/bladerf1output/bladerf1outputsettings.cpp b/plugins/samplesink/bladerf1output/bladerf1outputsettings.cpp index 42e33f262..4e29762e4 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputsettings.cpp +++ b/plugins/samplesink/bladerf1output/bladerf1outputsettings.cpp @@ -41,6 +41,7 @@ void BladeRF1OutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray BladeRF1OutputSettings::serialize() const @@ -59,6 +60,8 @@ QByteArray BladeRF1OutputSettings::serialize() const s.writeString(10, m_reverseAPIAddress); s.writeU32(11, m_reverseAPIPort); s.writeU32(12, m_reverseAPIDeviceIndex); + s.writeS32(13, m_workspaceIndex); + s.writeBlob(14, m_geometryBytes); return s.final(); } @@ -100,6 +103,8 @@ bool BladeRF1OutputSettings::deserialize(const QByteArray& data) d.readU32(12, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(13, &m_workspaceIndex, 0); + d.readBlob(14, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/bladerf1output/bladerf1outputsettings.h b/plugins/samplesink/bladerf1output/bladerf1outputsettings.h index 71d15376c..44c0b5d0b 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputsettings.h +++ b/plugins/samplesink/bladerf1output/bladerf1outputsettings.h @@ -37,6 +37,8 @@ struct BladeRF1OutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; BladeRF1OutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp index eac2bb5c7..7fa2bd767 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp @@ -43,12 +43,15 @@ BladeRF2OutputGui::BladeRF2OutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_sampleRate(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSink = (BladeRF2Output*) m_deviceUISet->m_deviceAPI->getSampleSink(); int max, min, step; float scale; uint64_t f_min, f_max; - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#BladeRF2OutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/bladerf2output/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); m_sampleSink->getFrequencyRange(f_min, f_max, step, scale); qDebug("BladeRF2OutputGui::BladeRF2OutputGui: getFrequencyRange: [%lu,%lu] step: %d", f_min, f_max, step); @@ -80,6 +83,7 @@ BladeRF2OutputGui::BladeRF2OutputGui(DeviceUISet *deviceUISet, QWidget* parent) connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSink->setMessageQueueToGUI(&m_inputMessageQueue); @@ -453,3 +457,17 @@ int BladeRF2OutputGui::getGainValue(float gainDB) // gainDB, m_gainMin, m_gainMax, m_gainStep, gain); return gain; } + +void BladeRF2OutputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &BladeRF2OutputGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &BladeRF2OutputGui::on_LOppm_valueChanged); + QObject::connect(ui->biasTee, &ButtonSwitch::toggled, this, &BladeRF2OutputGui::on_biasTee_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &BladeRF2OutputGui::on_sampleRate_changed); + QObject::connect(ui->bandwidth, &ValueDial::changed, this, &BladeRF2OutputGui::on_bandwidth_changed); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2OutputGui::on_interp_currentIndexChanged); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &BladeRF2OutputGui::on_gain_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &BladeRF2OutputGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &BladeRF2OutputGui::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &BladeRF2OutputGui::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/bladerf2output/bladerf2outputgui.h b/plugins/samplesink/bladerf2output/bladerf2outputgui.h index 19e382f34..c4930bbce 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputgui.h +++ b/plugins/samplesink/bladerf2output/bladerf2outputgui.h @@ -46,6 +46,10 @@ public: virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } virtual bool handleMessage(const Message& message); + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::BladeRF2OutputGui* ui; @@ -76,6 +80,7 @@ private: void setCenterFrequencySetting(uint64_t kHzValue); float getGainDB(int gainValue); int getGainValue(float gainDB); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/bladerf2output/bladerf2outputsettings.cpp b/plugins/samplesink/bladerf2output/bladerf2outputsettings.cpp index a50ee005f..1aa48b762 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputsettings.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputsettings.cpp @@ -41,6 +41,7 @@ void BladeRF2OutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray BladeRF2OutputSettings::serialize() const @@ -59,6 +60,8 @@ QByteArray BladeRF2OutputSettings::serialize() const s.writeString(10, m_reverseAPIAddress); s.writeU32(11, m_reverseAPIPort); s.writeU32(12, m_reverseAPIDeviceIndex); + s.writeS32(13, m_workspaceIndex); + s.writeBlob(14, m_geometryBytes); return s.final(); } @@ -97,6 +100,8 @@ bool BladeRF2OutputSettings::deserialize(const QByteArray& data) d.readU32(12, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(13, &m_workspaceIndex, 0); + d.readBlob(14, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/bladerf2output/bladerf2outputsettings.h b/plugins/samplesink/bladerf2output/bladerf2outputsettings.h index 69a4dd3b3..21e5e762a 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputsettings.h +++ b/plugins/samplesink/bladerf2output/bladerf2outputsettings.h @@ -35,6 +35,8 @@ struct BladeRF2OutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; BladeRF2OutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/fileoutput/fileoutputgui.cpp b/plugins/samplesink/fileoutput/fileoutputgui.cpp index 3a06d16e0..60c61e310 100644 --- a/plugins/samplesink/fileoutput/fileoutputgui.cpp +++ b/plugins/samplesink/fileoutput/fileoutputgui.cpp @@ -51,7 +51,11 @@ FileOutputGui::FileOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_tickCount(0), m_lastEngineState(DeviceAPI::StNotStarted) { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#FileOutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/fileoutput/readme.md"; + ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0, pow(10,7)); @@ -67,6 +71,7 @@ FileOutputGui::FileOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); m_deviceSampleSink = (FileOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); @@ -316,3 +321,12 @@ void FileOutputGui::tick() m_deviceSampleSink->getInputMessageQueue()->push(message); } } + +void FileOutputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &FileOutputGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &FileOutputGui::on_sampleRate_changed); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FileOutputGui::on_startStop_toggled); + QObject::connect(ui->showFileDialog, &QPushButton::clicked, this, &FileOutputGui::on_showFileDialog_clicked); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &FileOutputGui::on_interp_currentIndexChanged); +} diff --git a/plugins/samplesink/fileoutput/fileoutputgui.h b/plugins/samplesink/fileoutput/fileoutputgui.h index 0b8061bbb..ef3445595 100644 --- a/plugins/samplesink/fileoutput/fileoutputgui.h +++ b/plugins/samplesink/fileoutput/fileoutputgui.h @@ -47,6 +47,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::FileOutputGui* ui; @@ -76,6 +80,7 @@ private: void updateWithStreamTime(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/fileoutput/fileoutputgui.ui b/plugins/samplesink/fileoutput/fileoutputgui.ui index 6deafee04..82c4c8094 100644 --- a/plugins/samplesink/fileoutput/fileoutputgui.ui +++ b/plugins/samplesink/fileoutput/fileoutputgui.ui @@ -6,8 +6,8 @@ 0 0 - 350 - 190 + 360 + 144 @@ -18,8 +18,8 @@ - 350 - 190 + 360 + 0 @@ -364,23 +364,6 @@ - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - diff --git a/plugins/samplesink/fileoutput/fileoutputsettings.cpp b/plugins/samplesink/fileoutput/fileoutputsettings.cpp index a4affa826..e07abde6a 100644 --- a/plugins/samplesink/fileoutput/fileoutputsettings.cpp +++ b/plugins/samplesink/fileoutput/fileoutputsettings.cpp @@ -33,6 +33,7 @@ void FileOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray FileOutputSettings::serialize() const @@ -46,6 +47,8 @@ QByteArray FileOutputSettings::serialize() const s.writeString(5, m_reverseAPIAddress); s.writeU32(6, m_reverseAPIPort); s.writeU32(7, m_reverseAPIDeviceIndex); + s.writeS32(8, m_workspaceIndex); + s.writeBlob(9, m_geometryBytes); return s.final(); } @@ -79,6 +82,8 @@ bool FileOutputSettings::deserialize(const QByteArray& data) d.readU32(7, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(8, &m_workspaceIndex, 0); + d.readBlob(9, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/fileoutput/fileoutputsettings.h b/plugins/samplesink/fileoutput/fileoutputsettings.h index 3b6b666c4..a75d9af88 100644 --- a/plugins/samplesink/fileoutput/fileoutputsettings.h +++ b/plugins/samplesink/fileoutput/fileoutputsettings.h @@ -29,6 +29,8 @@ struct FileOutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; FileOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp index a7453bea3..1bfa6105e 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.cpp @@ -45,9 +45,12 @@ HackRFOutputGui::HackRFOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_lastEngineState(DeviceAPI::StNotStarted), m_doApplySettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_deviceSampleSink = (HackRFOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#HackRFOutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/hackrfoutput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0U, 7250000U); @@ -64,6 +67,7 @@ HackRFOutputGui::HackRFOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : displaySettings(); displayBandwidths(); sendSettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -454,3 +458,19 @@ void HackRFOutputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void HackRFOutputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &HackRFOutputGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &HackRFOutputGui::on_sampleRate_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &HackRFOutputGui::on_LOppm_valueChanged); + QObject::connect(ui->biasT, &QCheckBox::stateChanged, this, &HackRFOutputGui::on_biasT_stateChanged); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFOutputGui::on_interp_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFOutputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->lnaExt, &QCheckBox::stateChanged, this, &HackRFOutputGui::on_lnaExt_stateChanged); + QObject::connect(ui->bbFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFOutputGui::on_bbFilter_currentIndexChanged); + QObject::connect(ui->txvga, &QSlider::valueChanged, this, &HackRFOutputGui::on_txvga_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &HackRFOutputGui::on_startStop_toggled); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &HackRFOutputGui::on_sampleRateMode_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &HackRFOutputGui::on_transverter_clicked); +} diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputgui.h b/plugins/samplesink/hackrfoutput/hackrfoutputgui.h index 0774a134a..44ac8ab02 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputgui.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutputgui.h @@ -55,6 +55,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::HackRFOutputGui* ui; @@ -81,6 +85,7 @@ private: void updateFrequencyLimits(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputsettings.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputsettings.cpp index e876d4c66..498b18951 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputsettings.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputsettings.cpp @@ -43,6 +43,7 @@ void HackRFOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray HackRFOutputSettings::serialize() const @@ -63,6 +64,8 @@ QByteArray HackRFOutputSettings::serialize() const s.writeU32(12, m_reverseAPIDeviceIndex); s.writeBool(13, m_transverterMode); s.writeS64(14, m_transverterDeltaFrequency); + s.writeS32(15, m_workspaceIndex); + s.writeBlob(16, m_geometryBytes); return s.final(); } @@ -105,6 +108,8 @@ bool HackRFOutputSettings::deserialize(const QByteArray& data) m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(13, &m_transverterMode, false); d.readS64(14, &m_transverterDeltaFrequency, 0); + d.readS32(15, &m_workspaceIndex, 0); + d.readBlob(16, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputsettings.h b/plugins/samplesink/hackrfoutput/hackrfoutputsettings.h index 25ffe4c54..e8b4ee158 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputsettings.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutputsettings.h @@ -43,6 +43,8 @@ struct HackRFOutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; HackRFOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index 7bca77a1b..7e4ebe7dc 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -42,9 +42,12 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_limeSDROutput = (LimeSDROutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#LimeSDROutputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/limesdroutput/readme.md"; float minF, maxF; @@ -94,6 +97,7 @@ LimeSDROutputGUI::LimeSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); + makeUIConnections(); } LimeSDROutputGUI::~LimeSDROutputGUI() @@ -630,3 +634,22 @@ void LimeSDROutputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void LimeSDROutputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &LimeSDROutputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &LimeSDROutputGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &LimeSDROutputGUI::on_ncoFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &LimeSDROutputGUI::on_ncoEnable_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &LimeSDROutputGUI::on_sampleRate_changed); + QObject::connect(ui->hwInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDROutputGUI::on_hwInterp_currentIndexChanged); + QObject::connect(ui->swInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDROutputGUI::on_swInterp_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &LimeSDROutputGUI::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &LimeSDROutputGUI::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &LimeSDROutputGUI::on_lpFIR_changed); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &LimeSDROutputGUI::on_gain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDROutputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &LimeSDROutputGUI::on_extClock_clicked); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &LimeSDROutputGUI::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &LimeSDROutputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.h b/plugins/samplesink/limesdroutput/limesdroutputgui.h index 5093b7e80..8ba79e4e3 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.h +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::LimeSDROutputGUI* ui; @@ -75,6 +79,7 @@ private: void updateFrequencyLimits(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp b/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp index bd54bb58b..6164e616b 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp @@ -47,6 +47,7 @@ void LimeSDROutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray LimeSDROutputSettings::serialize() const @@ -73,6 +74,8 @@ QByteArray LimeSDROutputSettings::serialize() const s.writeString(21, m_reverseAPIAddress); s.writeU32(22, m_reverseAPIPort); s.writeU32(23, m_reverseAPIDeviceIndex); + s.writeS32(24, m_workspaceIndex); + s.writeBlob(25, m_geometryBytes); return s.final(); } @@ -123,6 +126,8 @@ bool LimeSDROutputSettings::deserialize(const QByteArray& data) d.readU32(23, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(24, &m_workspaceIndex, 0); + d.readBlob(25, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/limesdroutput/limesdroutputsettings.h b/plugins/samplesink/limesdroutput/limesdroutputsettings.h index 6bed846c4..148493670 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputsettings.h +++ b/plugins/samplesink/limesdroutput/limesdroutputsettings.h @@ -65,6 +65,8 @@ struct LimeSDROutputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; LimeSDROutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/localoutput/localoutputgui.cpp b/plugins/samplesink/localoutput/localoutputgui.cpp index 70619e7c4..7fc23d47b 100644 --- a/plugins/samplesink/localoutput/localoutputgui.cpp +++ b/plugins/samplesink/localoutput/localoutputgui.cpp @@ -58,10 +58,13 @@ LocalOutputGui::LocalOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_forceSettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_paletteGreenText.setColor(QPalette::WindowText, Qt::green); m_paletteWhiteText.setColor(QPalette::WindowText, Qt::white); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#LocalOutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/localoutput/readme.md"; CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); @@ -79,6 +82,7 @@ LocalOutputGui::LocalOutputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_forceSettings = true; sendSettings(); + makeUIConnections(); } LocalOutputGui::~LocalOutputGui() @@ -293,3 +297,8 @@ void LocalOutputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void LocalOutputGui::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &LocalOutputGui::on_startStop_toggled); +} diff --git a/plugins/samplesink/localoutput/localoutputgui.h b/plugins/samplesink/localoutput/localoutputgui.h index f9d27e8f4..50a9ecead 100644 --- a/plugins/samplesink/localoutput/localoutputgui.h +++ b/plugins/samplesink/localoutput/localoutputgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::LocalOutputGui* ui; @@ -75,6 +79,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/localoutput/localoutputsettings.cpp b/plugins/samplesink/localoutput/localoutputsettings.cpp index 226bfd807..8165dd454 100644 --- a/plugins/samplesink/localoutput/localoutputsettings.cpp +++ b/plugins/samplesink/localoutput/localoutputsettings.cpp @@ -29,6 +29,7 @@ void LocalOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray LocalOutputSettings::serialize() const @@ -38,6 +39,8 @@ QByteArray LocalOutputSettings::serialize() const s.writeString(4, m_reverseAPIAddress); s.writeU32(5, m_reverseAPIPort); s.writeU32(6, m_reverseAPIDeviceIndex); + s.writeS32(7, m_workspaceIndex); + s.writeBlob(8, m_geometryBytes); return s.final(); } @@ -67,6 +70,9 @@ bool LocalOutputSettings::deserialize(const QByteArray& data) d.readU32(6, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(7, &m_workspaceIndex, 0); + d.readBlob(8, &m_geometryBytes); + return true; } else diff --git a/plugins/samplesink/localoutput/localoutputsettings.h b/plugins/samplesink/localoutput/localoutputsettings.h index 6c7569f7f..5b42fe082 100644 --- a/plugins/samplesink/localoutput/localoutputsettings.h +++ b/plugins/samplesink/localoutput/localoutputsettings.h @@ -26,6 +26,8 @@ struct LocalOutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; LocalOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp index be0b3e59d..006c31900 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.cpp @@ -45,9 +45,12 @@ PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) m_doApplySettings(true), m_statusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSink = (PlutoSDROutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#PlutoSDROutputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/plutosdroutput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -71,6 +74,7 @@ PlutoSDROutputGUI::PlutoSDROutputGUI(DeviceUISet *deviceUISet, QWidget* parent) blockApplySettings(true); displaySettings(); + makeUIConnections(); blockApplySettings(false); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); @@ -493,3 +497,21 @@ void PlutoSDROutputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void PlutoSDROutputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &PlutoSDROutputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &PlutoSDROutputGUI::on_centerFrequency_changed); + QObject::connect(ui->loPPM, &QSlider::valueChanged, this, &PlutoSDROutputGUI::on_loPPM_valueChanged); + QObject::connect(ui->swInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDROutputGUI::on_swInterp_currentIndexChanged); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &PlutoSDROutputGUI::on_sampleRate_changed); + QObject::connect(ui->lpf, &ValueDial::changed, this, &PlutoSDROutputGUI::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &PlutoSDROutputGUI::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &PlutoSDROutputGUI::on_lpFIR_changed); + QObject::connect(ui->lpFIRInterpolation, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDROutputGUI::on_lpFIRInterpolation_currentIndexChanged); + QObject::connect(ui->lpFIRGain, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDROutputGUI::on_lpFIRGain_currentIndexChanged); + QObject::connect(ui->att, &QDial::valueChanged, this, &PlutoSDROutputGUI::on_att_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDROutputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &PlutoSDROutputGUI::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &PlutoSDROutputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h index 61db78122..9851da659 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputgui.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputgui.h @@ -47,6 +47,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::PlutoSDROutputGUI* ui; @@ -73,6 +77,7 @@ private: void setSampleRateLimits(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void on_startStop_toggled(bool checked); diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp index d42615dac..6885defcc 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.cpp @@ -44,6 +44,7 @@ void PlutoSDROutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray PlutoSDROutputSettings::serialize() const @@ -66,6 +67,8 @@ QByteArray PlutoSDROutputSettings::serialize() const s.writeString(18, m_reverseAPIAddress); s.writeU32(19, m_reverseAPIPort); s.writeU32(20, m_reverseAPIDeviceIndex); + s.writeS32(21, m_workspaceIndex); + s.writeBlob(22, m_geometryBytes); return s.final(); } @@ -119,6 +122,8 @@ bool PlutoSDROutputSettings::deserialize(const QByteArray& data) d.readU32(20, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(21, &m_workspaceIndex, 0); + d.readBlob(22, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h index 02f917885..db4f4d5ad 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputsettings.h @@ -51,6 +51,8 @@ struct PlutoSDROutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; PlutoSDROutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/remoteoutput/remoteoutputgui.cpp b/plugins/samplesink/remoteoutput/remoteoutputgui.cpp index 393dead1e..447d0d232 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputgui.cpp +++ b/plugins/samplesink/remoteoutput/remoteoutputgui.cpp @@ -56,6 +56,7 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare m_forceSettings(true), m_remoteAPIConnected(false) { + setAttribute(Qt::WA_DeleteOnClose, true); m_countUnrecoverable = 0; m_countRecovered = 0; m_lastCountUnrecoverable = 0; @@ -66,7 +67,9 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare m_paletteRedText.setColor(QPalette::WindowText, Qt::red); m_paletteWhiteText.setColor(QPalette::WindowText, Qt::white); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#RemoteOutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/remoteoutput/readme.md"; connect(&(m_deviceUISet->m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); @@ -88,6 +91,7 @@ RemoteOutputSinkGui::RemoteOutputSinkGui(DeviceUISet *deviceUISet, QWidget* pare displaySettings(); sendSettings(); + makeUIConnections(); } RemoteOutputSinkGui::~RemoteOutputSinkGui() @@ -540,3 +544,19 @@ void RemoteOutputSinkGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void RemoteOutputSinkGui::makeUIConnections() +{ + QObject::connect(ui->nbFECBlocks, &QDial::valueChanged, this, &RemoteOutputSinkGui::on_nbFECBlocks_valueChanged); + QObject::connect(ui->deviceIndex, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_deviceIndex_returnPressed); + QObject::connect(ui->channelIndex, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_channelIndex_returnPressed); + QObject::connect(ui->nbTxBytes, QOverload::of(&QComboBox::currentIndexChanged), this, &RemoteOutputSinkGui::on_nbTxBytes_currentIndexChanged); + QObject::connect(ui->apiAddress, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_apiAddress_returnPressed); + QObject::connect(ui->apiPort, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_apiPort_returnPressed); + QObject::connect(ui->dataAddress, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_dataAddress_returnPressed); + QObject::connect(ui->dataPort, &QLineEdit::returnPressed, this, &RemoteOutputSinkGui::on_dataPort_returnPressed); + QObject::connect(ui->apiApplyButton, &QPushButton::clicked, this, &RemoteOutputSinkGui::on_apiApplyButton_clicked); + QObject::connect(ui->dataApplyButton, &QPushButton::clicked, this, &RemoteOutputSinkGui::on_dataApplyButton_clicked); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &RemoteOutputSinkGui::on_startStop_toggled); + QObject::connect(ui->eventCountsReset, &QPushButton::clicked, this, &RemoteOutputSinkGui::on_eventCountsReset_clicked); +} diff --git a/plugins/samplesink/remoteoutput/remoteoutputgui.h b/plugins/samplesink/remoteoutput/remoteoutputgui.h index 7b1964440..f2f440d74 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputgui.h +++ b/plugins/samplesink/remoteoutput/remoteoutputgui.h @@ -77,6 +77,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::RemoteOutputGui* ui; @@ -123,6 +127,7 @@ private: void displayEventStatus(int recoverableCount, int unrecoverableCount); void displayEventTimer(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/remoteoutput/remoteoutputsettings.cpp b/plugins/samplesink/remoteoutput/remoteoutputsettings.cpp index cbff6e6f0..65a222484 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputsettings.cpp +++ b/plugins/samplesink/remoteoutput/remoteoutputsettings.cpp @@ -37,6 +37,7 @@ void RemoteOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray RemoteOutputSettings::serialize() const @@ -55,6 +56,8 @@ QByteArray RemoteOutputSettings::serialize() const s.writeString(13, m_reverseAPIAddress); s.writeU32(14, m_reverseAPIPort); s.writeU32(15, m_reverseAPIDeviceIndex); + s.writeS32(16, m_workspaceIndex); + s.writeBlob(17, m_geometryBytes); return s.final(); } @@ -95,6 +98,8 @@ bool RemoteOutputSettings::deserialize(const QByteArray& data) d.readU32(15, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(16, &m_workspaceIndex, 0); + d.readBlob(17, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/remoteoutput/remoteoutputsettings.h b/plugins/samplesink/remoteoutput/remoteoutputsettings.h index 830e056dd..814577e3a 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputsettings.h +++ b/plugins/samplesink/remoteoutput/remoteoutputsettings.h @@ -34,6 +34,8 @@ struct RemoteOutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; RemoteOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp index 677de3e3f..133925b01 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp @@ -57,8 +57,11 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_autoDCCorrection(0), m_autoIQCorrection(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSink = (SoapySDROutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#SoapySDROutputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/soapysdroutput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); uint64_t f_min, f_max; @@ -99,6 +102,7 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_sampleSink->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } SoapySDROutputGui::~SoapySDROutputGui() @@ -883,3 +887,12 @@ void SoapySDROutputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void SoapySDROutputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &SoapySDROutputGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &SoapySDROutputGui::on_LOppm_valueChanged); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &SoapySDROutputGui::on_interp_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &SoapySDROutputGui::on_transverter_clicked); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &SoapySDROutputGui::on_startStop_toggled); +} diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h index a16e2b779..8f3b53e7f 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h @@ -53,6 +53,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: void createRangesControl( @@ -107,6 +111,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); void setCenterFrequencySetting(uint64_t kHzValue); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp index 7d7a431d0..2cc77d0fe 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp @@ -47,6 +47,7 @@ void SoapySDROutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray SoapySDROutputSettings::serialize() const @@ -76,6 +77,8 @@ QByteArray SoapySDROutputSettings::serialize() const s.writeString(24, m_reverseAPIAddress); s.writeU32(25, m_reverseAPIPort); s.writeU32(26, m_reverseAPIDeviceIndex); + s.writeS32(27, m_workspaceIndex); + s.writeBlob(28, m_geometryBytes); return s.final(); } @@ -133,6 +136,8 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data) d.readU32(26, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(27, &m_workspaceIndex, 0); + d.readBlob(28, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h index 9589a65f1..7216385aa 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h @@ -45,6 +45,8 @@ struct SoapySDROutputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; SoapySDROutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/testsink/testsinkgui.cpp b/plugins/samplesink/testsink/testsinkgui.cpp index 5afe0f4ab..9b22a7bec 100644 --- a/plugins/samplesink/testsink/testsinkgui.cpp +++ b/plugins/samplesink/testsink/testsinkgui.cpp @@ -48,7 +48,10 @@ TestSinkGui::TestSinkGui(DeviceUISet *deviceUISet, QWidget* parent) : m_tickCount(0), m_lastEngineState(DeviceAPI::StNotStarted) { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#TestSinkGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/testsink/readme.md"; m_sampleSink = (TestSinkOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -69,6 +72,7 @@ TestSinkGui::TestSinkGui(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -257,3 +261,11 @@ void TestSinkGui::on_startStop_toggled(bool checked) void TestSinkGui::tick() { } + +void TestSinkGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestSinkGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &TestSinkGui::on_sampleRate_changed); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &TestSinkGui::on_startStop_toggled); + QObject::connect(ui->interp, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSinkGui::on_interp_currentIndexChanged); +} diff --git a/plugins/samplesink/testsink/testsinkgui.h b/plugins/samplesink/testsink/testsinkgui.h index 257c57cbd..255d7b1de 100644 --- a/plugins/samplesink/testsink/testsinkgui.h +++ b/plugins/samplesink/testsink/testsinkgui.h @@ -48,6 +48,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::TestSinkGui* ui; @@ -73,6 +77,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/testsink/testsinksettings.cpp b/plugins/samplesink/testsink/testsinksettings.cpp index 89ad8b87c..ea14da772 100644 --- a/plugins/samplesink/testsink/testsinksettings.cpp +++ b/plugins/samplesink/testsink/testsinksettings.cpp @@ -30,6 +30,7 @@ void TestSinkSettings::resetToDefaults() m_sampleRate = 48000; m_log2Interp = 0; m_spectrumGUI = nullptr; + m_workspaceIndex = 0; } QByteArray TestSinkSettings::serialize() const @@ -44,6 +45,9 @@ QByteArray TestSinkSettings::serialize() const s.writeBlob(4, m_spectrumGUI->serialize()); } + s.writeS32(5, m_workspaceIndex); + s.writeBlob(6, m_geometryBytes); + return s.final(); } @@ -71,6 +75,9 @@ bool TestSinkSettings::deserialize(const QByteArray& data) m_spectrumGUI->deserialize(bytetmp); } + d.readS32(5, &m_workspaceIndex, 0); + d.readBlob(6, &m_geometryBytes); + return true; } else diff --git a/plugins/samplesink/testsink/testsinksettings.h b/plugins/samplesink/testsink/testsinksettings.h index 355537569..79e082488 100644 --- a/plugins/samplesink/testsink/testsinksettings.h +++ b/plugins/samplesink/testsink/testsinksettings.h @@ -27,6 +27,8 @@ struct TestSinkSettings { quint64 m_sampleRate; quint32 m_log2Interp; Serializable *m_spectrumGUI; + int m_workspaceIndex; + QByteArray m_geometryBytes; TestSinkSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp index 7e8c52e24..c9848c106 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp @@ -43,9 +43,12 @@ USRPOutputGUI::USRPOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_usrpOutput = (USRPOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#USRPOutputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/usrpoutput/readme.md"; float minF, maxF; @@ -87,6 +90,7 @@ USRPOutputGUI::USRPOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); sendSettings(); + makeUIConnections(); } USRPOutputGUI::~USRPOutputGUI() @@ -574,3 +578,18 @@ void USRPOutputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void USRPOutputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &USRPOutputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &USRPOutputGUI::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &USRPOutputGUI::on_sampleRate_changed); + QObject::connect(ui->swInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPOutputGUI::on_swInterp_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &USRPOutputGUI::on_lpf_changed); + QObject::connect(ui->loOffset, &ValueDialZ::changed, this, &USRPOutputGUI::on_loOffset_changed); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &USRPOutputGUI::on_gain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPOutputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->clockSource, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPOutputGUI::on_clockSource_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &USRPOutputGUI::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &USRPOutputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/usrpoutput/usrpoutputgui.h b/plugins/samplesink/usrpoutput/usrpoutputgui.h index 1f337e40f..4d602bc92 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputgui.h +++ b/plugins/samplesink/usrpoutput/usrpoutputgui.h @@ -52,6 +52,10 @@ public: bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } virtual bool handleMessage(const Message& message); + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::USRPOutputGUI* ui; @@ -80,6 +84,7 @@ private: void updateSampleRate(); void updateFrequencyLimits(); void blockApplySettings(bool block); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp b/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp index ef7c067c2..3483bd7fd 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp @@ -42,6 +42,7 @@ void USRPOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray USRPOutputSettings::serialize() const @@ -61,6 +62,8 @@ QByteArray USRPOutputSettings::serialize() const s.writeU32(11, m_reverseAPIPort); s.writeU32(12, m_reverseAPIDeviceIndex); s.writeS32(13, m_loOffset); + s.writeS32(14, m_workspaceIndex); + s.writeBlob(15, m_geometryBytes); return s.final(); } @@ -100,6 +103,8 @@ bool USRPOutputSettings::deserialize(const QByteArray& data) d.readU32(12, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readS32(13, &m_loOffset, 0); + d.readS32(14, &m_workspaceIndex, 0); + d.readBlob(15, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/usrpoutput/usrpoutputsettings.h b/plugins/samplesink/usrpoutput/usrpoutputsettings.h index 80e20d281..968e9de84 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputsettings.h +++ b/plugins/samplesink/usrpoutput/usrpoutputsettings.h @@ -47,6 +47,8 @@ struct USRPOutputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; USRPOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp b/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp index e1e9454d4..9bdc65f45 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp +++ b/plugins/samplesink/xtrxoutput/xtrxoutputgui.cpp @@ -44,9 +44,12 @@ XTRXOutputGUI::XTRXOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_XTRXOutput = (XTRXOutput*) m_deviceUISet->m_deviceAPI->getSampleSink(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#XTRXOutputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesink/xtrxoutput/readme.md"; float minF, maxF, stepF; @@ -74,6 +77,7 @@ XTRXOutputGUI::XTRXOutputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -565,3 +569,20 @@ void XTRXOutputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void XTRXOutputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &XTRXOutputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &XTRXOutputGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &XTRXOutputGUI::on_ncoFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &XTRXOutputGUI::on_ncoEnable_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &XTRXOutputGUI::on_sampleRate_changed); + QObject::connect(ui->hwInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXOutputGUI::on_hwInterp_currentIndexChanged); + QObject::connect(ui->swInterp, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXOutputGUI::on_swInterp_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &XTRXOutputGUI::on_lpf_changed); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &XTRXOutputGUI::on_gain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXOutputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &XTRXOutputGUI::on_extClock_clicked); + QObject::connect(ui->pwrmode, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXOutputGUI::on_pwrmode_currentIndexChanged); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &XTRXOutputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputgui.h b/plugins/samplesink/xtrxoutput/xtrxoutputgui.h index b53d1c0f4..c355e7524 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputgui.h +++ b/plugins/samplesink/xtrxoutput/xtrxoutputgui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::XTRXOutputGUI* ui; @@ -73,6 +77,7 @@ private: void updateDACRate(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputsettings.cpp b/plugins/samplesink/xtrxoutput/xtrxoutputsettings.cpp index f5dfe188c..42ed29e20 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputsettings.cpp +++ b/plugins/samplesink/xtrxoutput/xtrxoutputsettings.cpp @@ -42,6 +42,7 @@ void XTRXOutputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray XTRXOutputSettings::serialize() const @@ -63,6 +64,8 @@ QByteArray XTRXOutputSettings::serialize() const s.writeString(13, m_reverseAPIAddress); s.writeU32(14, m_reverseAPIPort); s.writeU32(15, m_reverseAPIDeviceIndex); + s.writeS32(16, m_workspaceIndex); + s.writeBlob(17, m_geometryBytes); return s.final(); } @@ -106,6 +109,8 @@ bool XTRXOutputSettings::deserialize(const QByteArray& data) d.readU32(15, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(16, &m_workspaceIndex, 0); + d.readBlob(17, &m_geometryBytes); return true; } diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputsettings.h b/plugins/samplesink/xtrxoutput/xtrxoutputsettings.h index 71954f555..a7a9909e8 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputsettings.h +++ b/plugins/samplesink/xtrxoutput/xtrxoutputsettings.h @@ -49,6 +49,8 @@ struct XTRXOutputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; XTRXOutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/airspy/airspygui.cpp b/plugins/samplesource/airspy/airspygui.cpp index 06ab05bd1..9cc584157 100644 --- a/plugins/samplesource/airspy/airspygui.cpp +++ b/plugins/samplesource/airspy/airspygui.cpp @@ -44,9 +44,11 @@ AirspyGui::AirspyGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (AirspyInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#AirspyGui { border: 1px solid #C06900 }"); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -65,6 +67,7 @@ AirspyGui::AirspyGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } AirspyGui::~AirspyGui() @@ -447,3 +450,22 @@ void AirspyGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void AirspyGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &AirspyGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &AirspyGui::on_LOppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &AirspyGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &AirspyGui::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyGui::on_sampleRate_currentIndexChanged); + QObject::connect(ui->biasT, &QCheckBox::stateChanged, this, &AirspyGui::on_biasT_stateChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->lna, &QSlider::valueChanged, this, &AirspyGui::on_lna_valueChanged); + QObject::connect(ui->mix, &QSlider::valueChanged, this, &AirspyGui::on_mix_valueChanged); + QObject::connect(ui->vga, &QSlider::valueChanged, this, &AirspyGui::on_vga_valueChanged); + QObject::connect(ui->lnaAGC, &QCheckBox::stateChanged, this, &AirspyGui::on_lnaAGC_stateChanged); + QObject::connect(ui->mixAGC, &QCheckBox::stateChanged, this, &AirspyGui::on_mixAGC_stateChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AirspyGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &AirspyGui::on_transverter_clicked); +} diff --git a/plugins/samplesource/airspy/airspygui.h b/plugins/samplesource/airspy/airspygui.h index 3f52caef6..2f0a9c03c 100644 --- a/plugins/samplesource/airspy/airspygui.h +++ b/plugins/samplesource/airspy/airspygui.h @@ -44,6 +44,11 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } + uint32_t getDevSampleRate(unsigned int index); int getDevSampleRateIndex(uint32_t sampleRate); @@ -70,6 +75,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void on_centerFrequency_changed(quint64 value); diff --git a/plugins/samplesource/airspy/airspysettings.cpp b/plugins/samplesource/airspy/airspysettings.cpp index 5be260a5a..1026a1213 100644 --- a/plugins/samplesource/airspy/airspysettings.cpp +++ b/plugins/samplesource/airspy/airspysettings.cpp @@ -46,6 +46,7 @@ void AirspySettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray AirspySettings::serialize() const @@ -71,6 +72,8 @@ QByteArray AirspySettings::serialize() const s.writeU32(17, m_reverseAPIPort); s.writeU32(18, m_reverseAPIDeviceIndex); s.writeBool(19, m_iqOrder); + s.writeS32(20, m_workspaceIndex); + s.writeBlob(21, m_geometryBytes); return s.final(); } @@ -118,6 +121,8 @@ bool AirspySettings::deserialize(const QByteArray& data) d.readU32(18, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(19, &m_iqOrder, true); + d.readS32(20, &m_workspaceIndex, 0); + d.readBlob(21, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/airspy/airspysettings.h b/plugins/samplesource/airspy/airspysettings.h index 5b2850fcd..9b6275aa4 100644 --- a/plugins/samplesource/airspy/airspysettings.h +++ b/plugins/samplesource/airspy/airspysettings.h @@ -47,6 +47,8 @@ struct AirspySettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; AirspySettings(); void resetToDefaults(); diff --git a/plugins/samplesource/airspyhf/airspyhfgui.cpp b/plugins/samplesource/airspyhf/airspyhfgui.cpp index 93da0660d..a2e3e2c54 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.cpp +++ b/plugins/samplesource/airspyhf/airspyhfgui.cpp @@ -43,9 +43,12 @@ AirspyHFGui::AirspyHFGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (AirspyHFInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#AirspyHFGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/airspyhf/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -64,6 +67,7 @@ AirspyHFGui::AirspyHFGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } AirspyHFGui::~AirspyHFGui() @@ -466,3 +470,21 @@ void AirspyHFGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void AirspyHFGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &AirspyHFGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &AirspyHFGui::on_LOppm_valueChanged); + QObject::connect(ui->resetLOppm, &QPushButton::clicked, this, &AirspyHFGui::on_resetLOppm_clicked); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &AirspyHFGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &AirspyHFGui::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyHFGui::on_sampleRate_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyHFGui::on_decim_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AirspyHFGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &AirspyHFGui::on_transverter_clicked); + QObject::connect(ui->band, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyHFGui::on_band_currentIndexChanged); + QObject::connect(ui->dsp, &ButtonSwitch::toggled, this, &AirspyHFGui::on_dsp_toggled); + QObject::connect(ui->lna, &ButtonSwitch::toggled, this, &AirspyHFGui::on_lna_toggled); + QObject::connect(ui->agc, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyHFGui::on_agc_currentIndexChanged); + QObject::connect(ui->att, QOverload::of(&QComboBox::currentIndexChanged), this, &AirspyHFGui::on_att_currentIndexChanged); +} diff --git a/plugins/samplesource/airspyhf/airspyhfgui.h b/plugins/samplesource/airspyhf/airspyhfgui.h index 6c92f3bc2..58e2ce8fa 100644 --- a/plugins/samplesource/airspyhf/airspyhfgui.h +++ b/plugins/samplesource/airspyhf/airspyhfgui.h @@ -45,6 +45,11 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } + uint32_t getDevSampleRate(unsigned int index); int getDevSampleRateIndex(uint32_t sampleRate); @@ -72,6 +77,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void on_centerFrequency_changed(quint64 value); diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.cpp b/plugins/samplesource/airspyhf/airspyhfsettings.cpp index 4f7ae4b57..ead7a0f1b 100644 --- a/plugins/samplesource/airspyhf/airspyhfsettings.cpp +++ b/plugins/samplesource/airspyhf/airspyhfsettings.cpp @@ -46,6 +46,7 @@ void AirspyHFSettings::resetToDefaults() m_attenuatorSteps = 0; m_dcBlock = false; m_iqCorrection = false; + m_workspaceIndex = 0; } QByteArray AirspyHFSettings::serialize() const @@ -70,6 +71,8 @@ QByteArray AirspyHFSettings::serialize() const s.writeBool(19, m_dcBlock); s.writeBool(20, m_iqCorrection); s.writeBool(21, m_iqOrder); + s.writeS32(22, m_workspaceIndex); + s.writeBlob(23, m_geometryBytes); return s.final(); } @@ -117,6 +120,8 @@ bool AirspyHFSettings::deserialize(const QByteArray& data) d.readBool(19, &m_dcBlock, false); d.readBool(20, &m_iqCorrection, false); d.readBool(21, &m_iqOrder, true); + d.readS32(22, &m_workspaceIndex, 0); + d.readBlob(23, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.h b/plugins/samplesource/airspyhf/airspyhfsettings.h index 805a0a708..d093f747f 100644 --- a/plugins/samplesource/airspyhf/airspyhfsettings.h +++ b/plugins/samplesource/airspyhf/airspyhfsettings.h @@ -41,6 +41,8 @@ struct AirspyHFSettings quint32 m_attenuatorSteps; bool m_dcBlock; bool m_iqCorrection; + int m_workspaceIndex; + QByteArray m_geometryBytes; AirspyHFSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/audioinput/audioinputgui.cpp b/plugins/samplesource/audioinput/audioinputgui.cpp index 10983f562..29b4fd49f 100644 --- a/plugins/samplesource/audioinput/audioinputgui.cpp +++ b/plugins/samplesource/audioinput/audioinputgui.cpp @@ -40,9 +40,12 @@ AudioInputGui::AudioInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(nullptr), m_centerFrequency(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (AudioInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#AudioInputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/audioinput/readme.md"; connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); @@ -50,6 +53,7 @@ AudioInputGui::AudioInputGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); @@ -306,3 +310,13 @@ void AudioInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void AudioInputGui::makeUIConnections() +{ + QObject::connect(ui->device, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_device_currentIndexChanged); + QObject::connect(ui->sampleRate, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_sampleRate_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_decim_currentIndexChanged); + QObject::connect(ui->volume, &QDial::valueChanged, this, &AudioInputGui::on_volume_valueChanged); + QObject::connect(ui->channels, QOverload::of(&QComboBox::currentIndexChanged), this, &AudioInputGui::on_channels_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &AudioInputGui::on_startStop_toggled); +} diff --git a/plugins/samplesource/audioinput/audioinputgui.h b/plugins/samplesource/audioinput/audioinputgui.h index 1976091d4..46775ba21 100644 --- a/plugins/samplesource/audioinput/audioinputgui.h +++ b/plugins/samplesource/audioinput/audioinputgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::AudioInputGui* ui; @@ -68,6 +72,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/audioinput/audioinputsettings.cpp b/plugins/samplesource/audioinput/audioinputsettings.cpp index 84fb1ae07..777ccfd02 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.cpp +++ b/plugins/samplesource/audioinput/audioinputsettings.cpp @@ -36,6 +36,7 @@ void AudioInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray AudioInputSettings::serialize() const @@ -47,6 +48,8 @@ QByteArray AudioInputSettings::serialize() const s.writeFloat(3, m_volume); s.writeU32(4, m_log2Decim); s.writeS32(5, (int)m_iqMapping); + s.writeS32(6, m_workspaceIndex); + s.writeBlob(7, m_geometryBytes); s.writeBool(24, m_useReverseAPI); s.writeString(25, m_reverseAPIAddress); @@ -75,6 +78,8 @@ bool AudioInputSettings::deserialize(const QByteArray& data) d.readFloat(3, &m_volume, 1.0f); d.readU32(4, &m_log2Decim, 0); d.readS32(5, (int *)&m_iqMapping, IQMapping::L); + d.readS32(6, &m_workspaceIndex, 0); + d.readBlob(7, &m_geometryBytes); d.readBool(24, &m_useReverseAPI, false); d.readString(25, &m_reverseAPIAddress, "127.0.0.1"); diff --git a/plugins/samplesource/audioinput/audioinputsettings.h b/plugins/samplesource/audioinput/audioinputsettings.h index 16f8eb4f1..f707fbead 100644 --- a/plugins/samplesource/audioinput/audioinputsettings.h +++ b/plugins/samplesource/audioinput/audioinputsettings.h @@ -39,6 +39,8 @@ struct AudioInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; AudioInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp b/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp index 8745d2622..06bf09a2c 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1inputgui.cpp @@ -45,9 +45,12 @@ Bladerf1InputGui::Bladerf1InputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRate(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (Bladerf1Input*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#Bladerf1InputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/bladerf1input/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, BLADERF_FREQUENCY_MIN_XB200/1000, BLADERF_FREQUENCY_MAX/1000); @@ -74,6 +77,7 @@ Bladerf1InputGui::Bladerf1InputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } Bladerf1InputGui::~Bladerf1InputGui() @@ -525,3 +529,17 @@ void Bladerf1InputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void Bladerf1InputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &Bladerf1InputGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &Bladerf1InputGui::on_sampleRate_changed); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &Bladerf1InputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &Bladerf1InputGui::on_iqImbalance_toggled); + QObject::connect(ui->bandwidth, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1InputGui::on_bandwidth_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1InputGui::on_decim_currentIndexChanged); + QObject::connect(ui->lna, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1InputGui::on_lna_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &Bladerf1InputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &Bladerf1InputGui::on_startStop_toggled); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &Bladerf1InputGui::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/bladerf1input/bladerf1inputgui.h b/plugins/samplesource/bladerf1input/bladerf1inputgui.h index 27ea2d695..a774bc4c1 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputgui.h +++ b/plugins/samplesource/bladerf1input/bladerf1inputgui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::Bladerf1InputGui* ui; @@ -70,6 +74,7 @@ private: void updateSampleRateAndFrequency(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/bladerf1input/bladerf1inputsettings.cpp b/plugins/samplesource/bladerf1input/bladerf1inputsettings.cpp index 6745b693e..4975d5c85 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputsettings.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1inputsettings.cpp @@ -47,6 +47,7 @@ void BladeRF1InputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray BladeRF1InputSettings::serialize() const @@ -70,6 +71,8 @@ QByteArray BladeRF1InputSettings::serialize() const s.writeU32(15, m_reverseAPIPort); s.writeU32(16, m_reverseAPIDeviceIndex); s.writeBool(17, m_iqOrder); + s.writeS32(18, m_workspaceIndex); + s.writeBlob(19, m_geometryBytes); return s.final(); } @@ -117,6 +120,8 @@ bool BladeRF1InputSettings::deserialize(const QByteArray& data) d.readU32(16, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(17, &m_iqOrder); + d.readS32(18, &m_workspaceIndex, 0); + d.readBlob(19, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/bladerf1input/bladerf1inputsettings.h b/plugins/samplesource/bladerf1input/bladerf1inputsettings.h index 32ab4ba33..333218ffd 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputsettings.h +++ b/plugins/samplesource/bladerf1input/bladerf1inputsettings.h @@ -48,6 +48,8 @@ struct BladeRF1InputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; BladeRF1InputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp index 1705b0a8f..824c0e927 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp @@ -45,12 +45,15 @@ BladeRF2InputGui::BladeRF2InputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleRate(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (BladeRF2Input*) m_deviceUISet->m_deviceAPI->getSampleSource(); int max, min, step; float scale; uint64_t f_min, f_max; - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#Bladerf2InputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/bladerf2input/readme.md"; m_sampleSource->getFrequencyRange(f_min, f_max, step, scale); ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); @@ -96,6 +99,7 @@ BladeRF2InputGui::BladeRF2InputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } BladeRF2InputGui::~BladeRF2InputGui() @@ -542,3 +546,21 @@ int BladeRF2InputGui::getGainValue(float gainDB) // gainDB, m_gainMin, m_gainMax, m_gainStep, m_gainScale, gain); return gain; } + +void BladeRF2InputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &BladeRF2InputGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &BladeRF2InputGui::on_LOppm_valueChanged); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &BladeRF2InputGui::on_sampleRate_changed); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &BladeRF2InputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &BladeRF2InputGui::on_iqImbalance_toggled); + QObject::connect(ui->biasTee, &ButtonSwitch::toggled, this, &BladeRF2InputGui::on_biasTee_toggled); + QObject::connect(ui->bandwidth, &ValueDial::changed, this, &BladeRF2InputGui::on_bandwidth_changed); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2InputGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2InputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &BladeRF2InputGui::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &BladeRF2InputGui::on_gain_valueChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &BladeRF2InputGui::on_transverter_clicked); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &BladeRF2InputGui::on_startStop_toggled); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &BladeRF2InputGui::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.h b/plugins/samplesource/bladerf2input/bladerf2inputgui.h index 98b24b8ed..08cb773a2 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.h +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.h @@ -44,6 +44,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::Bladerf2InputGui* ui; @@ -77,6 +81,7 @@ private: int getGainValue(float gainDB); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp b/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp index 17c975f62..f0de33bae 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp @@ -44,6 +44,7 @@ void BladeRF2InputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray BladeRF2InputSettings::serialize() const @@ -67,6 +68,8 @@ QByteArray BladeRF2InputSettings::serialize() const s.writeU32(15, m_reverseAPIPort); s.writeU32(16, m_reverseAPIDeviceIndex); s.writeBool(17, m_iqOrder); + s.writeS32(18, m_workspaceIndex); + s.writeBlob(19, m_geometryBytes); return s.final(); } @@ -112,6 +115,8 @@ bool BladeRF2InputSettings::deserialize(const QByteArray& data) d.readU32(16, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(17, &m_iqOrder, true); + d.readS32(18, &m_workspaceIndex, 0); + d.readBlob(19, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/bladerf2input/bladerf2inputsettings.h b/plugins/samplesource/bladerf2input/bladerf2inputsettings.h index 6fb1a2952..7059be36a 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputsettings.h +++ b/plugins/samplesource/bladerf2input/bladerf2inputsettings.h @@ -46,6 +46,8 @@ struct BladeRF2InputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; BladeRF2InputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/fcdpro/fcdprogui.cpp b/plugins/samplesource/fcdpro/fcdprogui.cpp index 64c1e18a9..c3fbe5877 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.cpp +++ b/plugins/samplesource/fcdpro/fcdprogui.cpp @@ -41,9 +41,12 @@ FCDProGui::FCDProGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(NULL), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (FCDProInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#FCDProGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/fcdpro/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -151,6 +154,7 @@ FCDProGui::FCDProGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); @@ -550,3 +554,26 @@ void FCDProGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void FCDProGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &FCDProGui::on_centerFrequency_changed); + QObject::connect(ui->ppm, &QSlider::valueChanged, this, &FCDProGui::on_ppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &FCDProGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &FCDProGui::on_iqImbalance_toggled); + QObject::connect(ui->lnaGain, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_lnaGain_currentIndexChanged); + QObject::connect(ui->rfFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_rfFilter_currentIndexChanged); + QObject::connect(ui->lnaEnhance, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_lnaEnhance_currentIndexChanged); + QObject::connect(ui->band, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_band_currentIndexChanged); + QObject::connect(ui->mixGain, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_mixGain_currentIndexChanged); + QObject::connect(ui->mixFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_mixFilter_currentIndexChanged); + QObject::connect(ui->bias, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_bias_currentIndexChanged); + QObject::connect(ui->mode, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_mode_currentIndexChanged); + QObject::connect(ui->rcFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_rcFilter_currentIndexChanged); + QObject::connect(ui->ifFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_ifFilter_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->setDefaults, &QPushButton::clicked, this, &FCDProGui::on_setDefaults_clicked); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FCDProGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &FCDProGui::on_transverter_clicked); +} diff --git a/plugins/samplesource/fcdpro/fcdprogui.h b/plugins/samplesource/fcdpro/fcdprogui.h index 304dc6273..50c7594fb 100644 --- a/plugins/samplesource/fcdpro/fcdprogui.h +++ b/plugins/samplesource/fcdpro/fcdprogui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::FCDProGui* ui; @@ -68,6 +72,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/fcdpro/fcdprosettings.cpp b/plugins/samplesource/fcdpro/fcdprosettings.cpp index 075419d6b..3765dc3fb 100644 --- a/plugins/samplesource/fcdpro/fcdprosettings.cpp +++ b/plugins/samplesource/fcdpro/fcdprosettings.cpp @@ -55,6 +55,7 @@ void FCDProSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray FCDProSettings::serialize() const @@ -89,6 +90,8 @@ QByteArray FCDProSettings::serialize() const s.writeU32(26, m_reverseAPIPort); s.writeU32(27, m_reverseAPIDeviceIndex); s.writeBool(28, m_iqOrder); + s.writeS32(29, m_workspaceIndex); + s.writeBlob(30, m_geometryBytes); return s.final(); } @@ -145,6 +148,8 @@ bool FCDProSettings::deserialize(const QByteArray& data) d.readU32(27, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(28, &m_iqOrder, true); + d.readS32(29, &m_workspaceIndex, 0); + d.readBlob(30, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/fcdpro/fcdprosettings.h b/plugins/samplesource/fcdpro/fcdprosettings.h index 03d126c7e..e00a1292a 100644 --- a/plugins/samplesource/fcdpro/fcdprosettings.h +++ b/plugins/samplesource/fcdpro/fcdprosettings.h @@ -56,6 +56,8 @@ struct FCDProSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; FCDProSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp index deac61bfd..075eb4a05 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.cpp @@ -42,9 +42,12 @@ FCDProPlusGui::FCDProPlusGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(NULL), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (FCDProPlusInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#FCDProPlusGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/fcdproplus/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -69,6 +72,7 @@ FCDProPlusGui::FCDProPlusGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); @@ -372,3 +376,21 @@ void FCDProPlusGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void FCDProPlusGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &FCDProPlusGui::on_centerFrequency_changed); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProPlusGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProPlusGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &FCDProPlusGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &FCDProPlusGui::on_iqImbalance_toggled); + QObject::connect(ui->checkBoxG, &QCheckBox::stateChanged, this, &FCDProPlusGui::on_checkBoxG_stateChanged); + QObject::connect(ui->checkBoxB, &QCheckBox::stateChanged, this, &FCDProPlusGui::on_checkBoxB_stateChanged); + QObject::connect(ui->mixGain, &QCheckBox::stateChanged, this, &FCDProPlusGui::on_mixGain_stateChanged); + QObject::connect(ui->ifGain, &QSlider::valueChanged, this, &FCDProPlusGui::on_ifGain_valueChanged); + QObject::connect(ui->filterRF, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProPlusGui::on_filterRF_currentIndexChanged); + QObject::connect(ui->filterIF, QOverload::of(&QComboBox::currentIndexChanged), this, &FCDProPlusGui::on_filterIF_currentIndexChanged); + QObject::connect(ui->ppm, &QSlider::valueChanged, this, &FCDProPlusGui::on_ppm_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FCDProPlusGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &FCDProPlusGui::on_transverter_clicked); +} diff --git a/plugins/samplesource/fcdproplus/fcdproplusgui.h b/plugins/samplesource/fcdproplus/fcdproplusgui.h index 5a628f218..11955c69c 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusgui.h +++ b/plugins/samplesource/fcdproplus/fcdproplusgui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::FCDProPlusGui* ui; @@ -67,6 +71,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/fcdproplus/fcdproplussettings.cpp b/plugins/samplesource/fcdproplus/fcdproplussettings.cpp index aaa302934..53fd2be89 100644 --- a/plugins/samplesource/fcdproplus/fcdproplussettings.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplussettings.cpp @@ -46,6 +46,7 @@ void FCDProPlusSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray FCDProPlusSettings::serialize() const @@ -70,6 +71,8 @@ QByteArray FCDProPlusSettings::serialize() const s.writeU32(16, m_reverseAPIPort); s.writeU32(17, m_reverseAPIDeviceIndex); s.writeBool(18, m_iqOrder); + s.writeS32(19, m_workspaceIndex); + s.writeBlob(20, m_geometryBytes); return s.final(); } @@ -116,6 +119,8 @@ bool FCDProPlusSettings::deserialize(const QByteArray& data) d.readU32(17, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(18, &m_iqOrder, true); + d.readS32(19, &m_workspaceIndex, 0); + d.readBlob(20, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/fcdproplus/fcdproplussettings.h b/plugins/samplesource/fcdproplus/fcdproplussettings.h index ed5bf7401..5b9397805 100644 --- a/plugins/samplesource/fcdproplus/fcdproplussettings.h +++ b/plugins/samplesource/fcdproplus/fcdproplussettings.h @@ -47,6 +47,8 @@ struct FCDProPlusSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; FCDProPlusSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/fileinput/fileinputgui.cpp b/plugins/samplesource/fileinput/fileinputgui.cpp index 15ee71c2b..d4f7aee5a 100644 --- a/plugins/samplesource/fileinput/fileinputgui.cpp +++ b/plugins/samplesource/fileinput/fileinputgui.cpp @@ -55,7 +55,10 @@ FileInputGUI::FileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_enableNavTime(false), m_lastEngineState(DeviceAPI::StNotStarted) { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#FileInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/fileinput/readme.md"; ui->crcLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }"); connect(&(m_deviceUISet->m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); @@ -75,11 +78,15 @@ FileInputGUI::FileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); + + makeUIConnections(); } FileInputGUI::~FileInputGUI() { + qDebug("FileInputGUI::~FileInputGUI"); delete ui; + qDebug("FileInputGUI::~FileInputGUI: end"); } void FileInputGUI::destroy() @@ -444,3 +451,13 @@ void FileInputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void FileInputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &FileInputGUI::on_startStop_toggled); + QObject::connect(ui->playLoop, &ButtonSwitch::toggled, this, &FileInputGUI::on_playLoop_toggled); + QObject::connect(ui->play, &ButtonSwitch::toggled, this, &FileInputGUI::on_play_toggled); + QObject::connect(ui->navTimeSlider, &QSlider::valueChanged, this, &FileInputGUI::on_navTimeSlider_valueChanged); + QObject::connect(ui->showFileDialog, &QPushButton::clicked, this, &FileInputGUI::on_showFileDialog_clicked); + QObject::connect(ui->acceleration, QOverload::of(&QComboBox::currentIndexChanged), this, &FileInputGUI::on_acceleration_currentIndexChanged); +} diff --git a/plugins/samplesource/fileinput/fileinputgui.h b/plugins/samplesource/fileinput/fileinputgui.h index 2b5dae4b9..6f6e7b01e 100644 --- a/plugins/samplesource/fileinput/fileinputgui.h +++ b/plugins/samplesource/fileinput/fileinputgui.h @@ -37,7 +37,7 @@ class FileInputGUI : public DeviceGUI { Q_OBJECT public: - explicit FileInputGUI(DeviceUISet *deviceUISet, QWidget* parent = 0); + explicit FileInputGUI(DeviceUISet *deviceUISet, QWidget* parent = nullptr); virtual ~FileInputGUI(); virtual void destroy(); @@ -46,6 +46,10 @@ public: bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } virtual bool handleMessage(const Message& message); + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::FileInputGUI* ui; @@ -81,6 +85,7 @@ private: void updateWithStreamTime(); void setAccelerationCombo(); void setNumberStr(int n, QString& s); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/fileinput/fileinputgui.ui b/plugins/samplesource/fileinput/fileinputgui.ui index 6d9c9bbde..512b97571 100644 --- a/plugins/samplesource/fileinput/fileinputgui.ui +++ b/plugins/samplesource/fileinput/fileinputgui.ui @@ -6,8 +6,8 @@ 0 0 - 377 - 190 + 360 + 202 @@ -18,8 +18,8 @@ - 246 - 190 + 360 + 0 @@ -592,23 +592,6 @@ - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - diff --git a/plugins/samplesource/fileinput/fileinputsettings.cpp b/plugins/samplesource/fileinput/fileinputsettings.cpp index c63128502..0bbf959cc 100644 --- a/plugins/samplesource/fileinput/fileinputsettings.cpp +++ b/plugins/samplesource/fileinput/fileinputsettings.cpp @@ -36,6 +36,7 @@ void FileInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray FileInputSettings::serialize() const @@ -48,6 +49,8 @@ QByteArray FileInputSettings::serialize() const s.writeString(5, m_reverseAPIAddress); s.writeU32(6, m_reverseAPIPort); s.writeU32(7, m_reverseAPIDeviceIndex); + s.writeS32(8, m_workspaceIndex); + s.writeBlob(9, m_geometryBytes); return s.final(); } @@ -80,6 +83,8 @@ bool FileInputSettings::deserialize(const QByteArray& data) d.readU32(7, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(8, &m_workspaceIndex, 0); + d.readBlob(9, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/fileinput/fileinputsettings.h b/plugins/samplesource/fileinput/fileinputsettings.h index d007000e5..1d9bdaf33 100644 --- a/plugins/samplesource/fileinput/fileinputsettings.h +++ b/plugins/samplesource/fileinput/fileinputsettings.h @@ -29,6 +29,8 @@ struct FileInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; static const unsigned int m_accelerationMaxScale; //!< Max power of 10 multiplier to 2,5,10 base ex: 2 -> 2,5,10,20,50,100,200,500,1000 diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp index dda1e7139..9bab88194 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp @@ -46,9 +46,12 @@ HackRFInputGui::HackRFInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(NULL), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (HackRFInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#HackRFInputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/hackrfinput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0U, 7250000U); @@ -69,6 +72,7 @@ HackRFInputGui::HackRFInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } HackRFInputGui::~HackRFInputGui() @@ -506,3 +510,23 @@ void HackRFInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void HackRFInputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &HackRFInputGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &HackRFInputGui::on_sampleRate_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &HackRFInputGui::on_LOppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &HackRFInputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &HackRFInputGui::on_iqImbalance_toggled); + QObject::connect(ui->autoBBF, &ButtonSwitch::toggled, this, &HackRFInputGui::on_autoBBF_toggled); + QObject::connect(ui->biasT, &QCheckBox::stateChanged, this, &HackRFInputGui::on_biasT_stateChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFInputGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFInputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->lnaExt, &QCheckBox::stateChanged, this, &HackRFInputGui::on_lnaExt_stateChanged); + QObject::connect(ui->lna, &QSlider::valueChanged, this, &HackRFInputGui::on_lna_valueChanged); + QObject::connect(ui->bbFilter, QOverload::of(&QComboBox::currentIndexChanged), this, &HackRFInputGui::on_bbFilter_currentIndexChanged); + QObject::connect(ui->vga, &QSlider::valueChanged, this, &HackRFInputGui::on_vga_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &HackRFInputGui::on_startStop_toggled); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &HackRFInputGui::on_sampleRateMode_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &HackRFInputGui::on_transverter_clicked); +} diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.h b/plugins/samplesource/hackrfinput/hackrfinputgui.h index 758837920..51cac6209 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.h +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.h @@ -54,6 +54,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::HackRFInputGui* ui; @@ -80,6 +84,7 @@ private: void updateFrequencyLimits(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp index e7b14f65c..7c20b4454 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp @@ -48,6 +48,7 @@ void HackRFInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray HackRFInputSettings::serialize() const @@ -73,6 +74,8 @@ QByteArray HackRFInputSettings::serialize() const s.writeS64(19, m_transverterDeltaFrequency); s.writeBool(20, m_iqOrder); s.writeBool(21, m_autoBBF); + s.writeS32(22, m_workspaceIndex); + s.writeBlob(23, m_geometryBytes); return s.final(); } @@ -120,6 +123,8 @@ bool HackRFInputSettings::deserialize(const QByteArray& data) d.readS64(19, &m_transverterDeltaFrequency, 0); d.readBool(20, &m_iqOrder, true); d.readBool(21, &m_autoBBF, true); + d.readS32(22, &m_workspaceIndex, 0); + d.readBlob(23, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.h b/plugins/samplesource/hackrfinput/hackrfinputsettings.h index de756e03e..36bad5903 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.h +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.h @@ -48,6 +48,8 @@ struct HackRFInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; HackRFInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/kiwisdr/kiwisdrgui.cpp b/plugins/samplesource/kiwisdr/kiwisdrgui.cpp index 886d08851..dc339541a 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrgui.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrgui.cpp @@ -52,6 +52,7 @@ KiwiSDRGui::KiwiSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : m_lastEngineState(DeviceAPI::StNotStarted) { qDebug("KiwiSDRGui::KiwiSDRGui"); + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = m_deviceUISet->m_deviceAPI->getSampleSource(); m_statusTooltips.push_back("Idle"); // 0 @@ -66,11 +67,14 @@ KiwiSDRGui::KiwiSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : m_statusColors.push_back("rgb(232, 85, 85)"); // Error (red) m_statusColors.push_back("rgb(232, 85, 232)"); // Disconnected (magenta) - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#KiwiSDRGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/kiwisdr/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0, 9999999); displaySettings(); + makeUIConnections(); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); @@ -313,3 +317,14 @@ void KiwiSDRGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void KiwiSDRGui::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &KiwiSDRGui::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &KiwiSDRGui::on_centerFrequency_changed); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &KiwiSDRGui::on_gain_valueChanged); + QObject::connect(ui->agc, &QToolButton::toggled, this, &KiwiSDRGui::on_agc_toggled); + QObject::connect(ui->serverAddress, &QLineEdit::returnPressed, this, &KiwiSDRGui::on_serverAddress_returnPressed); + QObject::connect(ui->serverAddressApplyButton, &QPushButton::clicked, this, &KiwiSDRGui::on_serverAddressApplyButton_clicked); + QObject::connect(ui->dcBlock, &ButtonSwitch::toggled, this, &KiwiSDRGui::on_dcBlock_toggled); +} diff --git a/plugins/samplesource/kiwisdr/kiwisdrgui.h b/plugins/samplesource/kiwisdr/kiwisdrgui.h index f0b08d9b2..125fd6111 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrgui.h +++ b/plugins/samplesource/kiwisdr/kiwisdrgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::KiwiSDRGui* ui; @@ -70,6 +74,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/kiwisdr/kiwisdrsettings.cpp b/plugins/samplesource/kiwisdr/kiwisdrsettings.cpp index f894288c7..8dfbecd14 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrsettings.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrsettings.cpp @@ -38,6 +38,8 @@ void KiwiSDRSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + + m_workspaceIndex = 0; } QByteArray KiwiSDRSettings::serialize() const @@ -47,6 +49,8 @@ QByteArray KiwiSDRSettings::serialize() const s.writeString(2, m_serverAddress); s.writeU32(3, m_gain); s.writeBool(4, m_useAGC); + s.writeS32(5, m_workspaceIndex); + s.writeBlob(6, m_geometryBytes); s.writeBool(100, m_useReverseAPI); s.writeString(101, m_reverseAPIAddress); @@ -73,6 +77,8 @@ bool KiwiSDRSettings::deserialize(const QByteArray& data) d.readString(2, &m_serverAddress, "127.0.0.1:8073"); d.readU32(3, &m_gain, 20); d.readBool(4, &m_useAGC, true); + d.readS32(5, &m_workspaceIndex, 0); + d.readBlob(6, &m_geometryBytes); d.readBool(100, &m_useReverseAPI, false); d.readString(101, &m_reverseAPIAddress, "127.0.0.1"); diff --git a/plugins/samplesource/kiwisdr/kiwisdrsettings.h b/plugins/samplesource/kiwisdr/kiwisdrsettings.h index 23b09f312..d084df434 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrsettings.h +++ b/plugins/samplesource/kiwisdr/kiwisdrsettings.h @@ -35,6 +35,9 @@ struct KiwiSDRSettings { uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; + KiwiSDRSettings(); void resetToDefaults(); QByteArray serialize() const; diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp index fafdac5b8..1cdfcfe58 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -46,9 +46,12 @@ LimeSDRInputGUI::LimeSDRInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_limeSDRInput = (LimeSDRInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#LimeSDRInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/limesdrinput/readme.md"; float minF, maxF; @@ -93,6 +96,7 @@ LimeSDRInputGUI::LimeSDRInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_limeSDRInput->setMessageQueueToGUI(&m_inputMessageQueue); @@ -718,3 +722,28 @@ void LimeSDRInputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void LimeSDRInputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &LimeSDRInputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &LimeSDRInputGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &LimeSDRInputGUI::on_ncoFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &LimeSDRInputGUI::on_ncoEnable_toggled); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &LimeSDRInputGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &LimeSDRInputGUI::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &LimeSDRInputGUI::on_sampleRate_changed); + QObject::connect(ui->hwDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRInputGUI::on_hwDecim_currentIndexChanged); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRInputGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &LimeSDRInputGUI::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &LimeSDRInputGUI::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &LimeSDRInputGUI::on_lpFIR_changed); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRInputGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &LimeSDRInputGUI::on_gain_valueChanged); + QObject::connect(ui->lnaGain, &QDial::valueChanged, this, &LimeSDRInputGUI::on_lnaGain_valueChanged); + QObject::connect(ui->tiaGain, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRInputGUI::on_tiaGain_currentIndexChanged); + QObject::connect(ui->pgaGain, &QDial::valueChanged, this, &LimeSDRInputGUI::on_pgaGain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &LimeSDRInputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &LimeSDRInputGUI::on_extClock_clicked); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &LimeSDRInputGUI::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &LimeSDRInputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h index 894230e4b..e58cd27dc 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.h +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -44,6 +44,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::LimeSDRInputGUI* ui; @@ -74,6 +78,7 @@ private: void updateFrequencyLimits(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp b/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp index da822b06c..ba08ac6c5 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp @@ -53,6 +53,7 @@ void LimeSDRInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray LimeSDRInputSettings::serialize() const @@ -86,6 +87,9 @@ QByteArray LimeSDRInputSettings::serialize() const s.writeU32(26, m_reverseAPIPort); s.writeU32(27, m_reverseAPIDeviceIndex); s.writeBool(28, m_iqOrder); + s.writeS32(29, m_workspaceIndex); + s.writeBlob(30, m_geometryBytes); + return s.final(); } @@ -143,6 +147,8 @@ bool LimeSDRInputSettings::deserialize(const QByteArray& data) d.readU32(27, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(28, &m_iqOrder, true); + d.readS32(29, &m_workspaceIndex, 0); + d.readBlob(20, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/limesdrinput/limesdrinputsettings.h b/plugins/samplesource/limesdrinput/limesdrinputsettings.h index ef43bbadf..96f5fdae5 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputsettings.h +++ b/plugins/samplesource/limesdrinput/limesdrinputsettings.h @@ -73,6 +73,8 @@ struct LimeSDRInputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; LimeSDRInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/localinput/localinputgui.cpp b/plugins/samplesource/localinput/localinputgui.cpp index 3221a3de9..dbfb078fb 100644 --- a/plugins/samplesource/localinput/localinputgui.cpp +++ b/plugins/samplesource/localinput/localinputgui.cpp @@ -70,16 +70,20 @@ LocalInputGui::LocalInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_forceSettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_paletteGreenText.setColor(QPalette::WindowText, Qt::green); m_paletteWhiteText.setColor(QPalette::WindowText, Qt::white); m_startingTimeStampms = 0; - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#LocalInputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/localinput/readme.md"; CRightClickEnabler *startStopRightClickEnabler = new CRightClickEnabler(ui->startStop); connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); @@ -321,3 +325,10 @@ void LocalInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void LocalInputGui::makeUIConnections() +{ + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &LocalInputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &LocalInputGui::on_iqImbalance_toggled); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &LocalInputGui::on_startStop_toggled); +} diff --git a/plugins/samplesource/localinput/localinputgui.h b/plugins/samplesource/localinput/localinputgui.h index 0f5472d3e..191b7bea8 100644 --- a/plugins/samplesource/localinput/localinputgui.h +++ b/plugins/samplesource/localinput/localinputgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::LocalInputGui* ui; @@ -100,6 +104,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/localinput/localinputsettings.cpp b/plugins/samplesource/localinput/localinputsettings.cpp index 62782c894..7c48abbe3 100644 --- a/plugins/samplesource/localinput/localinputsettings.cpp +++ b/plugins/samplesource/localinput/localinputsettings.cpp @@ -31,6 +31,7 @@ void LocalInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray LocalInputSettings::serialize() const @@ -43,6 +44,8 @@ QByteArray LocalInputSettings::serialize() const s.writeString(4, m_reverseAPIAddress); s.writeU32(5, m_reverseAPIPort); s.writeU32(6, m_reverseAPIDeviceIndex); + s.writeS32(7, m_workspaceIndex); + s.writeBlob(8, m_geometryBytes); return s.final(); } @@ -75,6 +78,9 @@ bool LocalInputSettings::deserialize(const QByteArray& data) d.readU32(6, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(7, &m_workspaceIndex, 0); + d.readBlob(8, &m_geometryBytes); + return true; } else diff --git a/plugins/samplesource/localinput/localinputsettings.h b/plugins/samplesource/localinput/localinputsettings.h index 42689d497..3f6beb9f0 100644 --- a/plugins/samplesource/localinput/localinputsettings.h +++ b/plugins/samplesource/localinput/localinputsettings.h @@ -28,6 +28,8 @@ struct LocalInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; LocalInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/perseus/perseusgui.cpp b/plugins/samplesource/perseus/perseusgui.cpp index 21cfb8759..5e1332f9a 100644 --- a/plugins/samplesource/perseus/perseusgui.cpp +++ b/plugins/samplesource/perseus/perseusgui.cpp @@ -41,9 +41,12 @@ PerseusGui::PerseusGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (PerseusInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#PerseusGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/perseus/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -62,6 +65,7 @@ PerseusGui::PerseusGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } PerseusGui::~PerseusGui() @@ -390,3 +394,18 @@ void PerseusGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void PerseusGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &PerseusGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &PerseusGui::on_LOppm_valueChanged); + QObject::connect(ui->resetLOppm, &QPushButton::clicked, this, &PerseusGui::on_resetLOppm_clicked); + QObject::connect(ui->sampleRate, QOverload::of(&QComboBox::currentIndexChanged), this, &PerseusGui::on_sampleRate_currentIndexChanged); + QObject::connect(ui->wideband, &ButtonSwitch::toggled, this, &PerseusGui::on_wideband_toggled); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &PerseusGui::on_decim_currentIndexChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &PerseusGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &PerseusGui::on_transverter_clicked); + QObject::connect(ui->attenuator, QOverload::of(&QComboBox::currentIndexChanged), this, &PerseusGui::on_attenuator_currentIndexChanged); + QObject::connect(ui->adcDither, &ButtonSwitch::toggled, this, &PerseusGui::on_adcDither_toggled); + QObject::connect(ui->adcPreamp, &ButtonSwitch::toggled, this, &PerseusGui::on_adcPreamp_toggled); +} diff --git a/plugins/samplesource/perseus/perseusgui.h b/plugins/samplesource/perseus/perseusgui.h index 0e217ded6..38a8d1a5c 100644 --- a/plugins/samplesource/perseus/perseusgui.h +++ b/plugins/samplesource/perseus/perseusgui.h @@ -44,6 +44,11 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } + uint32_t getDevSampleRate(unsigned int index); int getDevSampleRateIndex(uint32_t sampleRate); @@ -70,6 +75,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void on_centerFrequency_changed(quint64 value); diff --git a/plugins/samplesource/perseus/perseussettings.cpp b/plugins/samplesource/perseus/perseussettings.cpp index c75e08e00..37e8e34c2 100644 --- a/plugins/samplesource/perseus/perseussettings.cpp +++ b/plugins/samplesource/perseus/perseussettings.cpp @@ -41,6 +41,7 @@ void PerseusSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray PerseusSettings::serialize() const @@ -61,6 +62,8 @@ QByteArray PerseusSettings::serialize() const s.writeU32(12, m_reverseAPIPort); s.writeU32(13, m_reverseAPIDeviceIndex); s.writeBool(14, m_iqOrder); + s.writeS32(15, m_workspaceIndex); + s.writeBlob(16, m_geometryBytes); return s.final(); } @@ -109,6 +112,8 @@ bool PerseusSettings::deserialize(const QByteArray& data) d.readU32(13, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(14, &m_iqOrder, true); + d.readS32(15, &m_workspaceIndex, 0); + d.readBlob(16, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/perseus/perseussettings.h b/plugins/samplesource/perseus/perseussettings.h index 6c28b142a..284c86395 100644 --- a/plugins/samplesource/perseus/perseussettings.h +++ b/plugins/samplesource/perseus/perseussettings.h @@ -47,6 +47,8 @@ struct PerseusSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; PerseusSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp index b57538799..70a037c63 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp @@ -46,9 +46,12 @@ PlutoSDRInputGui::PlutoSDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_statusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (PlutoSDRInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#PlutoSDRInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/plutosdrinput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -72,6 +75,7 @@ PlutoSDRInputGui::PlutoSDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : blockApplySettings(true); displaySettings(); + makeUIConnections(); blockApplySettings(false); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); @@ -565,3 +569,28 @@ void PlutoSDRInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void PlutoSDRInputGui::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &PlutoSDRInputGui::on_centerFrequency_changed); + QObject::connect(ui->loPPM, &QSlider::valueChanged, this, &PlutoSDRInputGui::on_loPPM_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_dcOffset_toggled); + QObject::connect(ui->rfDCOffset, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_rfDCOffset_toggled); + QObject::connect(ui->bbDCOffset, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_bbDCOffset_toggled); + QObject::connect(ui->hwIQImbalance, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_hwIQImbalance_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_iqImbalance_toggled); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_swDecim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &PlutoSDRInputGui::on_sampleRate_changed); + QObject::connect(ui->lpf, &ValueDial::changed, this, &PlutoSDRInputGui::on_lpf_changed); + QObject::connect(ui->lpFIREnable, &ButtonSwitch::toggled, this, &PlutoSDRInputGui::on_lpFIREnable_toggled); + QObject::connect(ui->lpFIR, &ValueDial::changed, this, &PlutoSDRInputGui::on_lpFIR_changed); + QObject::connect(ui->lpFIRDecimation, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_lpFIRDecimation_currentIndexChanged); + QObject::connect(ui->lpFIRGain, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_lpFIRGain_currentIndexChanged); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &PlutoSDRInputGui::on_gain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &PlutoSDRInputGui::on_antenna_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &PlutoSDRInputGui::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &PlutoSDRInputGui::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h index abd0f7e84..003c6d298 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h @@ -47,6 +47,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::PlutoSDRInputGUI* ui; @@ -74,6 +78,7 @@ private: void setSampleRateLimits(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void on_startStop_toggled(bool checked); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp index 72cb5fae1..4d7c3ab9d 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp @@ -53,6 +53,7 @@ void PlutoSDRInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray PlutoSDRInputSettings::serialize() const @@ -83,6 +84,8 @@ QByteArray PlutoSDRInputSettings::serialize() const s.writeBool(23, m_hwRFDCBlock); s.writeBool(24, m_hwIQCorrection); s.writeBool(25, m_iqOrder); + s.writeS32(26, m_workspaceIndex); + s.writeBlob(27, m_geometryBytes); return s.final(); } @@ -155,6 +158,8 @@ bool PlutoSDRInputSettings::deserialize(const QByteArray& data) d.readBool(23, &m_hwRFDCBlock, true); d.readBool(24, &m_hwIQCorrection, true); d.readBool(25, &m_iqOrder, true); + d.readS32(26, &m_workspaceIndex, 0); + d.readBlob(27, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h index 7dabb7310..0a3397534 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h @@ -83,6 +83,8 @@ struct PlutoSDRInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; PlutoSDRInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/remoteinput/remoteinputgui.cpp b/plugins/samplesource/remoteinput/remoteinputgui.cpp index 41c173d5b..6de87f3e4 100644 --- a/plugins/samplesource/remoteinput/remoteinputgui.cpp +++ b/plugins/samplesource/remoteinput/remoteinputgui.cpp @@ -67,11 +67,14 @@ RemoteInputGui::RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_forceSettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_paletteGreenText.setColor(QPalette::WindowText, Qt::green); m_paletteWhiteText.setColor(QPalette::WindowText, Qt::white); m_startingTimeStampms = 0; - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#RemoteInputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/remoteinput/readme.md"; ui->remoteDeviceFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->remoteDeviceFrequency->setValueRange(8, 0, 99999999); @@ -97,6 +100,7 @@ RemoteInputGui::RemoteInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_forceSettings = true; sendSettings(); + makeUIConnections(); } RemoteInputGui::~RemoteInputGui() @@ -684,3 +688,22 @@ void RemoteInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void RemoteInputGui::makeUIConnections() +{ + QObject::connect(ui->remoteDeviceFrequency, &ValueDial::changed, this, &RemoteInputGui::on_remoteDeviceFrequency_changed); + QObject::connect(ui->decimationFactor, QOverload::of(&QComboBox::currentIndexChanged), this, &RemoteInputGui::on_decimationFactor_currentIndexChanged); + QObject::connect(ui->position, &QSlider::valueChanged, this, &RemoteInputGui::on_position_valueChanged); + QObject::connect(ui->apiApplyButton, &QPushButton::clicked, this, &RemoteInputGui::on_apiApplyButton_clicked); + QObject::connect(ui->dataApplyButton, &QPushButton::clicked, this, &RemoteInputGui::on_dataApplyButton_clicked); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &RemoteInputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &RemoteInputGui::on_iqImbalance_toggled); + QObject::connect(ui->apiAddress, &QLineEdit::editingFinished, this, &RemoteInputGui::on_apiAddress_editingFinished); + QObject::connect(ui->apiPort, &QLineEdit::editingFinished, this, &RemoteInputGui::on_apiPort_editingFinished); + QObject::connect(ui->dataAddress, &QLineEdit::editingFinished, this, &RemoteInputGui::on_dataAddress_editingFinished); + QObject::connect(ui->dataPort, &QLineEdit::editingFinished, this, &RemoteInputGui::on_dataPort_editingFinished); + QObject::connect(ui->multicastAddress, &QLineEdit::editingFinished, this, &RemoteInputGui::on_multicastAddress_editingFinished); + QObject::connect(ui->multicastJoin, &ButtonSwitch::toggled, this, &RemoteInputGui::on_multicastJoin_toggled); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &RemoteInputGui::on_startStop_toggled); + QObject::connect(ui->eventCountsReset, &QPushButton::clicked, this, &RemoteInputGui::on_eventCountsReset_clicked); +} diff --git a/plugins/samplesource/remoteinput/remoteinputgui.h b/plugins/samplesource/remoteinput/remoteinputgui.h index 1aaa91f14..6de55ffc2 100644 --- a/plugins/samplesource/remoteinput/remoteinputgui.h +++ b/plugins/samplesource/remoteinput/remoteinputgui.h @@ -48,6 +48,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::RemoteInputGui* ui; @@ -116,6 +120,7 @@ private: void applyPosition(); void applyRemoteSettings(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/remoteinput/remoteinputsettings.cpp b/plugins/samplesource/remoteinput/remoteinputsettings.cpp index a731506f6..97ede685d 100644 --- a/plugins/samplesource/remoteinput/remoteinputsettings.cpp +++ b/plugins/samplesource/remoteinput/remoteinputsettings.cpp @@ -37,6 +37,7 @@ void RemoteInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray RemoteInputSettings::serialize() const @@ -55,6 +56,8 @@ QByteArray RemoteInputSettings::serialize() const s.writeString(12, m_reverseAPIAddress); s.writeU32(13, m_reverseAPIPort); s.writeU32(14, m_reverseAPIDeviceIndex); + s.writeS32(15, m_workspaceIndex); + s.writeBlob(16, m_geometryBytes); return s.final(); } @@ -95,6 +98,9 @@ bool RemoteInputSettings::deserialize(const QByteArray& data) d.readU32(14, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(15, &m_workspaceIndex, 0); + d.readBlob(16, &m_geometryBytes); + return true; } else diff --git a/plugins/samplesource/remoteinput/remoteinputsettings.h b/plugins/samplesource/remoteinput/remoteinputsettings.h index 60cec764d..bb544070e 100644 --- a/plugins/samplesource/remoteinput/remoteinputsettings.h +++ b/plugins/samplesource/remoteinput/remoteinputsettings.h @@ -34,6 +34,8 @@ struct RemoteInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; RemoteInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp index 228bbf3b7..36c7edee0 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp @@ -43,9 +43,12 @@ RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource(0), m_lastEngineState(DeviceAPI::StNotStarted) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (RTLSDRInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#RTLSDRGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/rtlsdr/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -59,6 +62,7 @@ RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); m_gains = m_sampleSource->getGains(); displayGains(); @@ -533,3 +537,24 @@ void RTLSDRGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void RTLSDRGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &RTLSDRGui::on_centerFrequency_changed); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &RTLSDRGui::on_sampleRate_changed); + QObject::connect(ui->offsetTuning, &QCheckBox::toggled, this, &RTLSDRGui::on_offsetTuning_toggled); + QObject::connect(ui->rfBW, &ValueDial::changed, this, &RTLSDRGui::on_rfBW_changed); + QObject::connect(ui->lowSampleRate, &ButtonSwitch::toggled, this, &RTLSDRGui::on_lowSampleRate_toggled); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &RTLSDRGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &RTLSDRGui::on_iqImbalance_toggled); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &RTLSDRGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &RTLSDRGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->ppm, &QSlider::valueChanged, this, &RTLSDRGui::on_ppm_valueChanged); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &RTLSDRGui::on_gain_valueChanged); + QObject::connect(ui->checkBox, &QCheckBox::stateChanged, this, &RTLSDRGui::on_checkBox_stateChanged); + QObject::connect(ui->agc, &QCheckBox::stateChanged, this, &RTLSDRGui::on_agc_stateChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &RTLSDRGui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &RTLSDRGui::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &RTLSDRGui::on_sampleRateMode_toggled); + QObject::connect(ui->biasT, &QCheckBox::stateChanged, this, &RTLSDRGui::on_biasT_stateChanged); +} diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.h b/plugins/samplesource/rtlsdr/rtlsdrgui.h index 9c09d10e3..a6c3f0e98 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.h +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::RTLSDRGui* ui; @@ -73,6 +77,7 @@ private: void updateFrequencyLimits(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.ui b/plugins/samplesource/rtlsdr/rtlsdrgui.ui index bdbe8b255..d4a6d75af 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrgui.ui +++ b/plugins/samplesource/rtlsdr/rtlsdrgui.ui @@ -6,8 +6,8 @@ 0 0 - 320 - 220 + 360 + 229 @@ -18,8 +18,8 @@ - 320 - 220 + 360 + 0 @@ -251,6 +251,12 @@ + + + 55 + 0 + + 50 @@ -636,44 +642,20 @@ - - - - Qt::Horizontal - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
ValueDial QWidget
gui/valuedial.h
1
+ + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
TransverterButton QPushButton diff --git a/plugins/samplesource/rtlsdr/rtlsdrsettings.cpp b/plugins/samplesource/rtlsdr/rtlsdrsettings.cpp index ace5e0f89..c8326fdf9 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrsettings.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrsettings.cpp @@ -47,6 +47,7 @@ void RTLSDRSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray RTLSDRSettings::serialize() const @@ -73,6 +74,8 @@ QByteArray RTLSDRSettings::serialize() const s.writeU32(19, m_reverseAPIDeviceIndex); s.writeBool(20, m_iqOrder); s.writeBool(21, m_biasTee); + s.writeS32(22, m_workspaceIndex); + s.writeBlob(23, m_geometryBytes); return s.final(); } @@ -121,6 +124,8 @@ bool RTLSDRSettings::deserialize(const QByteArray& data) m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; d.readBool(20, &m_iqOrder, true); d.readBool(21, &m_biasTee, false); + d.readS32(22, &m_workspaceIndex, 0); + d.readBlob(23, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/rtlsdr/rtlsdrsettings.h b/plugins/samplesource/rtlsdr/rtlsdrsettings.h index a80649339..2d9913816 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrsettings.h +++ b/plugins/samplesource/rtlsdr/rtlsdrsettings.h @@ -48,6 +48,8 @@ struct RTLSDRSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; RTLSDRSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/sdrplay/sdrplaygui.cpp b/plugins/samplesource/sdrplay/sdrplaygui.cpp index a214a0b54..bba28d7e0 100644 --- a/plugins/samplesource/sdrplay/sdrplaygui.cpp +++ b/plugins/samplesource/sdrplay/sdrplaygui.cpp @@ -40,9 +40,12 @@ SDRPlayGui::SDRPlayGui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_forceSettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (SDRPlayInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#SDRPlayGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/sdrplay/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 10U, 12000U); @@ -78,6 +81,7 @@ SDRPlayGui::SDRPlayGui(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); @@ -456,3 +460,24 @@ void SDRPlayGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void SDRPlayGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &SDRPlayGui::on_centerFrequency_changed); + QObject::connect(ui->ppm, &QSlider::valueChanged, this, &SDRPlayGui::on_ppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &SDRPlayGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &SDRPlayGui::on_iqImbalance_toggled); + QObject::connect(ui->fBand, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_fBand_currentIndexChanged); + QObject::connect(ui->bandwidth, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_bandwidth_currentIndexChanged); + QObject::connect(ui->samplerate, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_samplerate_currentIndexChanged); + QObject::connect(ui->ifFrequency, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_ifFrequency_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->gainTunerOn, &QRadioButton::toggled, this, &SDRPlayGui::on_gainTunerOn_toggled); + QObject::connect(ui->gainTuner, &QDial::valueChanged, this, &SDRPlayGui::on_gainTuner_valueChanged); + QObject::connect(ui->gainManualOn, &QRadioButton::toggled, this, &SDRPlayGui::on_gainManualOn_toggled); + QObject::connect(ui->gainLNA, &ButtonSwitch::toggled, this, &SDRPlayGui::on_gainLNA_toggled); + QObject::connect(ui->gainMixer, &ButtonSwitch::toggled, this, &SDRPlayGui::on_gainMixer_toggled); + QObject::connect(ui->gainBaseband, &QDial::valueChanged, this, &SDRPlayGui::on_gainBaseband_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &SDRPlayGui::on_startStop_toggled); +} diff --git a/plugins/samplesource/sdrplay/sdrplaygui.h b/plugins/samplesource/sdrplay/sdrplaygui.h index 0e0595f04..31e783831 100644 --- a/plugins/samplesource/sdrplay/sdrplaygui.h +++ b/plugins/samplesource/sdrplay/sdrplaygui.h @@ -46,6 +46,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::SDRPlayGui* ui; @@ -67,6 +71,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void updateHardware(); diff --git a/plugins/samplesource/sdrplay/sdrplaysettings.cpp b/plugins/samplesource/sdrplay/sdrplaysettings.cpp index 4828bb086..626ab4ec0 100644 --- a/plugins/samplesource/sdrplay/sdrplaysettings.cpp +++ b/plugins/samplesource/sdrplay/sdrplaysettings.cpp @@ -47,6 +47,7 @@ void SDRPlaySettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray SDRPlaySettings::serialize() const @@ -72,6 +73,8 @@ QByteArray SDRPlaySettings::serialize() const s.writeU32(17, m_reverseAPIPort); s.writeU32(18, m_reverseAPIDeviceIndex); s.writeBool(19, m_iqOrder); + s.writeS32(20, m_workspaceIndex); + s.writeBlob(21, m_geometryBytes); return s.final(); } @@ -119,6 +122,8 @@ bool SDRPlaySettings::deserialize(const QByteArray& data) d.readU32(18, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(19, &m_iqOrder, true); + d.readS32(20, &m_workspaceIndex, 0); + d.readBlob(21, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/sdrplay/sdrplaysettings.h b/plugins/samplesource/sdrplay/sdrplaysettings.h index 7dbe2765c..1242b532a 100644 --- a/plugins/samplesource/sdrplay/sdrplaysettings.h +++ b/plugins/samplesource/sdrplay/sdrplaysettings.h @@ -50,6 +50,8 @@ struct SDRPlaySettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; SDRPlaySettings(); void resetToDefaults(); diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp index 7b78455b4..56344262e 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3gui.cpp @@ -40,9 +40,12 @@ SDRPlayV3Gui::SDRPlayV3Gui(DeviceUISet *deviceUISet, QWidget* parent) : m_doApplySettings(true), m_forceSettings(true) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sdrPlayV3Input = (SDRPlayV3Input*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#SDRPlayV3Gui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/sdrplayv3/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); updateFrequencyLimits(); @@ -114,6 +117,7 @@ SDRPlayV3Gui::SDRPlayV3Gui(DeviceUISet *deviceUISet, QWidget* parent) : ui->antenna->blockSignals(false); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_sdrPlayV3Input->setMessageQueueToGUI(&m_inputMessageQueue); @@ -520,3 +524,28 @@ void SDRPlayV3Gui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void SDRPlayV3Gui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &SDRPlayV3Gui::on_centerFrequency_changed); + QObject::connect(ui->ppm, &QSlider::valueChanged, this, &SDRPlayV3Gui::on_ppm_valueChanged); + QObject::connect(ui->tuner, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_tuner_currentIndexChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_antenna_currentIndexChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_iqImbalance_toggled); + QObject::connect(ui->extRef, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_extRef_toggled); + QObject::connect(ui->biasTee, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_biasTee_toggled); + QObject::connect(ui->amNotch, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_amNotch_toggled); + QObject::connect(ui->fmNotch, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_fmNotch_toggled); + QObject::connect(ui->dabNotch, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_dabNotch_toggled); + QObject::connect(ui->bandwidth, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_bandwidth_currentIndexChanged); + QObject::connect(ui->samplerate, &ValueDial::changed, this, &SDRPlayV3Gui::on_samplerate_changed); + QObject::connect(ui->ifFrequency, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_ifFrequency_currentIndexChanged); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_fcPos_currentIndexChanged); + QObject::connect(ui->gainLNA, QOverload::of(&QComboBox::currentIndexChanged), this, &SDRPlayV3Gui::on_gainLNA_currentIndexChanged); + QObject::connect(ui->gainIFAGC, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_gainIFAGC_toggled); + QObject::connect(ui->gainIF, &QDial::valueChanged, this, &SDRPlayV3Gui::on_gainIF_valueChanged); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &SDRPlayV3Gui::on_startStop_toggled); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &SDRPlayV3Gui::on_transverter_clicked); +} diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3gui.h b/plugins/samplesource/sdrplayv3/sdrplayv3gui.h index 0c790c961..b3fb7df14 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3gui.h +++ b/plugins/samplesource/sdrplayv3/sdrplayv3gui.h @@ -46,6 +46,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::SDRPlayV3Gui* ui; @@ -69,6 +73,7 @@ private: void updateSampleRateAndFrequency(); void updateFrequencyLimits(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void updateHardware(); diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3settings.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3settings.cpp index 3787f473b..2cc56029d 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3settings.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3settings.cpp @@ -54,6 +54,7 @@ void SDRPlayV3Settings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray SDRPlayV3Settings::serialize() const @@ -85,6 +86,8 @@ QByteArray SDRPlayV3Settings::serialize() const s.writeBool(26, m_transverterMode); s.writeS64(27, m_transverterDeltaFrequency); s.writeBool(28, m_iqOrder); + s.writeS32(29, m_workspaceIndex); + s.writeBlob(30, m_geometryBytes); return s.final(); } @@ -138,6 +141,8 @@ bool SDRPlayV3Settings::deserialize(const QByteArray& data) d.readBool(26, &m_transverterMode, false); d.readS64(27, &m_transverterDeltaFrequency, 0); d.readBool(28, &m_iqOrder, true); + d.readS32(29, &m_workspaceIndex, 0); + d.readBlob(30, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3settings.h b/plugins/samplesource/sdrplayv3/sdrplayv3settings.h index 6a2ed2a90..f5c0c6466 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3settings.h +++ b/plugins/samplesource/sdrplayv3/sdrplayv3settings.h @@ -57,6 +57,8 @@ struct SDRPlayV3Settings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; SDRPlayV3Settings(); void resetToDefaults(); diff --git a/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp b/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp index 2e60cef5d..1e07aab74 100644 --- a/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp +++ b/plugins/samplesource/sigmffileinput/sigmffileinputgui.cpp @@ -61,7 +61,10 @@ SigMFFileInputGUI::SigMFFileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) m_enableFullNavTime(false), m_lastEngineState(DeviceAPI::StNotStarted) { - ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose, true); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#SigMFFileInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/sigmffileinput/readme.md"; ui->fileNameText->setText(m_metaFileName); ui->crcLabel->setStyleSheet("QLabel { background:rgb(79,79,79); }"); @@ -76,6 +79,7 @@ SigMFFileInputGUI::SigMFFileInputGUI(DeviceUISet *deviceUISet, QWidget* parent) setAccelerationCombo(); displaySettings(); + makeUIConnections(); updateStartStop(); ui->trackNavTimeSlider->setEnabled(false); @@ -679,3 +683,18 @@ void SigMFFileInputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void SigMFFileInputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &SigMFFileInputGUI::on_startStop_toggled); + QObject::connect(ui->infoDetails, &QPushButton::clicked, this, &SigMFFileInputGUI::on_infoDetails_clicked); + QObject::connect(ui->captureTable, &QTableWidget::itemSelectionChanged, this, &SigMFFileInputGUI::on_captureTable_itemSelectionChanged); + QObject::connect(ui->trackNavTimeSlider, &QSlider::valueChanged, this, &SigMFFileInputGUI::on_trackNavTimeSlider_valueChanged); + QObject::connect(ui->playTrack, &ButtonSwitch::toggled, this, &SigMFFileInputGUI::on_playTrack_toggled); + QObject::connect(ui->playTrackLoop, &ButtonSwitch::toggled, this, &SigMFFileInputGUI::on_playTrackLoop_toggled); + QObject::connect(ui->fullNavTimeSlider, &QSlider::valueChanged, this, &SigMFFileInputGUI::on_fullNavTimeSlider_valueChanged); + QObject::connect(ui->playFull, &ButtonSwitch::toggled, this, &SigMFFileInputGUI::on_playFull_toggled); + QObject::connect(ui->playFullLoop, &ButtonSwitch::toggled, this, &SigMFFileInputGUI::on_playFullLoop_toggled); + QObject::connect(ui->showFileDialog, &QPushButton::clicked, this, &SigMFFileInputGUI::on_showFileDialog_clicked); + QObject::connect(ui->acceleration, QOverload::of(&QComboBox::currentIndexChanged), this, &SigMFFileInputGUI::on_acceleration_currentIndexChanged); +} diff --git a/plugins/samplesource/sigmffileinput/sigmffileinputgui.h b/plugins/samplesource/sigmffileinput/sigmffileinputgui.h index fea452537..f468bcc03 100644 --- a/plugins/samplesource/sigmffileinput/sigmffileinputgui.h +++ b/plugins/samplesource/sigmffileinput/sigmffileinputgui.h @@ -46,6 +46,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::SigMFFileInputGUI* ui; @@ -94,6 +98,7 @@ private: void setAccelerationCombo(); void setNumberStr(int n, QString& s); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/sigmffileinput/sigmffileinputsettings.cpp b/plugins/samplesource/sigmffileinput/sigmffileinputsettings.cpp index 5abdce315..2104b9c16 100644 --- a/plugins/samplesource/sigmffileinput/sigmffileinputsettings.cpp +++ b/plugins/samplesource/sigmffileinput/sigmffileinputsettings.cpp @@ -36,6 +36,7 @@ void SigMFFileInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray SigMFFileInputSettings::serialize() const @@ -49,6 +50,8 @@ QByteArray SigMFFileInputSettings::serialize() const s.writeString(6, m_reverseAPIAddress); s.writeU32(7, m_reverseAPIPort); s.writeU32(8, m_reverseAPIDeviceIndex); + s.writeS32(9, m_workspaceIndex); + s.writeBlob(10, m_geometryBytes); return s.final(); } @@ -82,6 +85,8 @@ bool SigMFFileInputSettings::deserialize(const QByteArray& data) d.readU32(8, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readS32(9, &m_workspaceIndex, 0); + d.readBlob(10, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/sigmffileinput/sigmffileinputsettings.h b/plugins/samplesource/sigmffileinput/sigmffileinputsettings.h index 9e365494f..30ce9149e 100644 --- a/plugins/samplesource/sigmffileinput/sigmffileinputsettings.h +++ b/plugins/samplesource/sigmffileinput/sigmffileinputsettings.h @@ -30,6 +30,8 @@ struct SigMFFileInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; static const unsigned int m_accelerationMaxScale; //!< Max power of 10 multiplier to 2,5,10 base ex: 2 -> 2,5,10,20,50,100,200,500,1000 diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp index b4b60e20d..b13efebe3 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp @@ -59,8 +59,11 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_autoDCCorrection(0), m_autoIQCorrection(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = (SoapySDRInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#SoapySDRInputGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/soapysdrinput/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); uint64_t f_min, f_max; @@ -101,6 +104,7 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); sendSettings(); + makeUIConnections(); } SoapySDRInputGui::~SoapySDRInputGui() @@ -924,3 +928,15 @@ void SoapySDRInputGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void SoapySDRInputGui::makeUIConnections() +{ + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &SoapySDRInputGui::on_centerFrequency_changed); + QObject::connect(ui->LOppm, &QSlider::valueChanged, this, &SoapySDRInputGui::on_LOppm_valueChanged); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &SoapySDRInputGui::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &SoapySDRInputGui::on_iqImbalance_toggled); + QObject::connect(ui->decim, QOverload::of(&QComboBox::currentIndexChanged), this, &SoapySDRInputGui::on_decim_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &SoapySDRInputGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &SoapySDRInputGui::on_transverter_clicked); + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &SoapySDRInputGui::on_startStop_toggled); +} diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h index 56bd33042..b1bc40230 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h @@ -51,6 +51,10 @@ public: virtual QByteArray serialize() const; virtual bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: void createRangesControl( @@ -64,6 +68,7 @@ private: void createIndividualGainsControl(const std::vector& individualGainsList); void createCorrectionsControl(); void createArgumentsControl(const SoapySDR::ArgInfoList& argInfoList, bool deviceArguments); + void makeUIConnections(); Ui::SoapySDRInputGui* ui; diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp index 6583dde0a..0709f7f3f 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp @@ -50,6 +50,7 @@ void SoapySDRInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray SoapySDRInputSettings::serialize() const @@ -83,6 +84,8 @@ QByteArray SoapySDRInputSettings::serialize() const s.writeU32(25, m_reverseAPIPort); s.writeU32(26, m_reverseAPIDeviceIndex); s.writeBool(27, m_iqOrder); + s.writeS32(28, m_workspaceIndex); + s.writeBlob(29, m_geometryBytes); return s.final(); } @@ -146,6 +149,8 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data) d.readU32(26, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(27, &m_iqOrder, true); + d.readS32(28, &m_workspaceIndex, 0); + d.readBlob(29, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h index baab1b235..d68416238 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h @@ -56,6 +56,8 @@ struct SoapySDRInputSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; SoapySDRInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/testsource/testsourcegui.cpp b/plugins/samplesource/testsource/testsourcegui.cpp index b13a30f4d..211d411cd 100644 --- a/plugins/samplesource/testsource/testsourcegui.cpp +++ b/plugins/samplesource/testsource/testsourcegui.cpp @@ -51,9 +51,12 @@ TestSourceGui::TestSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : m_lastEngineState(DeviceAPI::StNotStarted) { qDebug("TestSourceGui::TestSourceGui"); + setAttribute(Qt::WA_DeleteOnClose, true); m_sampleSource = m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#TestSourceGui { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/testsource/readme.md"; ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); ui->centerFrequency->setValueRange(7, 0, 9999999); ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); @@ -63,6 +66,7 @@ TestSourceGui::TestSourceGui(DeviceUISet *deviceUISet, QWidget* parent) : ui->frequencyShiftLabel->setText(QString("%1").arg(QChar(0x94, 0x03))); displaySettings(); + makeUIConnections(); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); @@ -503,3 +507,25 @@ void TestSourceGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void TestSourceGui::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &TestSourceGui::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &TestSourceGui::on_centerFrequency_changed); + QObject::connect(ui->autoCorr, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSourceGui::on_autoCorr_currentIndexChanged); + QObject::connect(ui->frequencyShift, &ValueDialZ::changed, this, &TestSourceGui::on_frequencyShift_changed); + QObject::connect(ui->decimation, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSourceGui::on_decimation_currentIndexChanged); + QObject::connect(ui->fcPos, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSourceGui::on_fcPos_currentIndexChanged); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &TestSourceGui::on_sampleRate_changed); + QObject::connect(ui->sampleSize, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSourceGui::on_sampleSize_currentIndexChanged); + QObject::connect(ui->amplitudeCoarse, &QSlider::valueChanged, this, &TestSourceGui::on_amplitudeCoarse_valueChanged); + QObject::connect(ui->amplitudeFine, &QSlider::valueChanged, this, &TestSourceGui::on_amplitudeFine_valueChanged); + QObject::connect(ui->modulation, QOverload::of(&QComboBox::currentIndexChanged), this, &TestSourceGui::on_modulation_currentIndexChanged); + QObject::connect(ui->modulationFrequency, &QDial::valueChanged, this, &TestSourceGui::on_modulationFrequency_valueChanged); + QObject::connect(ui->amModulation, &QDial::valueChanged, this, &TestSourceGui::on_amModulation_valueChanged); + QObject::connect(ui->fmDeviation, &QDial::valueChanged, this, &TestSourceGui::on_fmDeviation_valueChanged); + QObject::connect(ui->dcBias, &QSlider::valueChanged, this, &TestSourceGui::on_dcBias_valueChanged); + QObject::connect(ui->iBias, &QSlider::valueChanged, this, &TestSourceGui::on_iBias_valueChanged); + QObject::connect(ui->qBias, &QSlider::valueChanged, this, &TestSourceGui::on_qBias_valueChanged); + QObject::connect(ui->phaseImbalance, &QSlider::valueChanged, this, &TestSourceGui::on_phaseImbalance_valueChanged); +} diff --git a/plugins/samplesource/testsource/testsourcegui.h b/plugins/samplesource/testsource/testsourcegui.h index f4fad8d1d..61b34eab1 100644 --- a/plugins/samplesource/testsource/testsourcegui.h +++ b/plugins/samplesource/testsource/testsourcegui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::TestSourceGui* ui; @@ -71,6 +75,7 @@ private: void updateAmpFineLimit(); void updateFrequencyShiftLimit(); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/testsource/testsourcesettings.cpp b/plugins/samplesource/testsource/testsourcesettings.cpp index 2c343f242..3db304e51 100644 --- a/plugins/samplesource/testsource/testsourcesettings.cpp +++ b/plugins/samplesource/testsource/testsourcesettings.cpp @@ -46,6 +46,7 @@ void TestSourceSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray TestSourceSettings::serialize() const @@ -71,6 +72,9 @@ QByteArray TestSourceSettings::serialize() const s.writeString(19, m_reverseAPIAddress); s.writeU32(20, m_reverseAPIPort); s.writeU32(21, m_reverseAPIDeviceIndex); + s.writeS32(22, m_workspaceIndex); + s.writeBlob(23, m_geometryBytes); + return s.final(); } @@ -132,6 +136,8 @@ bool TestSourceSettings::deserialize(const QByteArray& data) d.readU32(21, &utmp, 0); m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; + d.readS32(22, &m_workspaceIndex, 0); + d.readBlob(23, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/testsource/testsourcesettings.h b/plugins/samplesource/testsource/testsourcesettings.h index e7529d51a..c22ffbb25 100644 --- a/plugins/samplesource/testsource/testsourcesettings.h +++ b/plugins/samplesource/testsource/testsourcesettings.h @@ -64,6 +64,8 @@ struct TestSourceSettings { QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; TestSourceSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/usrpinput/usrpinputgui.cpp b/plugins/samplesource/usrpinput/usrpinputgui.cpp index db606d134..3325f91d9 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.cpp +++ b/plugins/samplesource/usrpinput/usrpinputgui.cpp @@ -47,9 +47,12 @@ USRPInputGUI::USRPInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_usrpInput = (USRPInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#USRPInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/usrpinput/readme.md"; float minF, maxF; @@ -81,6 +84,7 @@ USRPInputGUI::USRPInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusTimer.start(500); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); m_usrpInput->setMessageQueueToGUI(&m_inputMessageQueue); @@ -620,3 +624,21 @@ void USRPInputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void USRPInputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &USRPInputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &USRPInputGUI::on_centerFrequency_changed); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &USRPInputGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &USRPInputGUI::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &USRPInputGUI::on_sampleRate_changed); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPInputGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &USRPInputGUI::on_lpf_changed); + QObject::connect(ui->loOffset, &ValueDialZ::changed, this, &USRPInputGUI::on_loOffset_changed); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPInputGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QSlider::valueChanged, this, &USRPInputGUI::on_gain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPInputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->clockSource, QOverload::of(&QComboBox::currentIndexChanged), this, &USRPInputGUI::on_clockSource_currentIndexChanged); + QObject::connect(ui->transverter, &TransverterButton::clicked, this, &USRPInputGUI::on_transverter_clicked); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &USRPInputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/usrpinput/usrpinputgui.h b/plugins/samplesource/usrpinput/usrpinputgui.h index 9790d7fb2..4facc1e5a 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.h +++ b/plugins/samplesource/usrpinput/usrpinputgui.h @@ -50,7 +50,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } - virtual bool handleMessage(const Message& message); + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::USRPInputGUI* ui; @@ -79,6 +82,8 @@ private: void updateSampleRate(); void updateFrequencyLimits(); void blockApplySettings(bool block); + bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/usrpinput/usrpinputsettings.cpp b/plugins/samplesource/usrpinput/usrpinputsettings.cpp index 1a7c0b2be..76cfc3061 100644 --- a/plugins/samplesource/usrpinput/usrpinputsettings.cpp +++ b/plugins/samplesource/usrpinput/usrpinputsettings.cpp @@ -44,6 +44,7 @@ void USRPInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray USRPInputSettings::serialize() const @@ -66,6 +67,9 @@ QByteArray USRPInputSettings::serialize() const s.writeU32(14, m_reverseAPIPort); s.writeU32(15, m_reverseAPIDeviceIndex); s.writeS32(16, m_loOffset); + s.writeS32(17, m_workspaceIndex); + s.writeBlob(18, m_geometryBytes); + return s.final(); } @@ -109,6 +113,8 @@ bool USRPInputSettings::deserialize(const QByteArray& data) d.readU32(15, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readS32(16, &m_loOffset, 0); + d.readS32(17, &m_workspaceIndex, 0); + d.readBlob(18, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/usrpinput/usrpinputsettings.h b/plugins/samplesource/usrpinput/usrpinputsettings.h index 9f6aa5372..e843f0092 100644 --- a/plugins/samplesource/usrpinput/usrpinputsettings.h +++ b/plugins/samplesource/usrpinput/usrpinputsettings.h @@ -54,6 +54,8 @@ struct USRPInputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; USRPInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/xtrxinput/xtrxinputgui.cpp b/plugins/samplesource/xtrxinput/xtrxinputgui.cpp index 5065b0db9..17ff6f57c 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputgui.cpp +++ b/plugins/samplesource/xtrxinput/xtrxinputgui.cpp @@ -47,9 +47,12 @@ XTRXInputGUI::XTRXInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : m_statusCounter(0), m_deviceStatusCounter(0) { + setAttribute(Qt::WA_DeleteOnClose, true); m_XTRXInput = (XTRXInput*) m_deviceUISet->m_deviceAPI->getSampleSource(); - ui->setupUi(this); + ui->setupUi(getContents()); + getContents()->setStyleSheet("#XTRXInputGUI { border: 1px solid #C06900 }"); + m_helpURL = "plugins/samplesource/xtrxinput/readme.md"; float minF, maxF, stepF; @@ -77,6 +80,7 @@ XTRXInputGUI::XTRXInputGUI(DeviceUISet *deviceUISet, QWidget* parent) : connect(startStopRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(openDeviceSettingsDialog(const QPoint &))); displaySettings(); + makeUIConnections(); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); } @@ -647,3 +651,26 @@ void XTRXInputGUI::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +void XTRXInputGUI::makeUIConnections() +{ + QObject::connect(ui->startStop, &ButtonSwitch::toggled, this, &XTRXInputGUI::on_startStop_toggled); + QObject::connect(ui->centerFrequency, &ValueDial::changed, this, &XTRXInputGUI::on_centerFrequency_changed); + QObject::connect(ui->ncoFrequency, &ValueDialZ::changed, this, &XTRXInputGUI::on_ncoFrequency_changed); + QObject::connect(ui->ncoEnable, &ButtonSwitch::toggled, this, &XTRXInputGUI::on_ncoEnable_toggled); + QObject::connect(ui->dcOffset, &ButtonSwitch::toggled, this, &XTRXInputGUI::on_dcOffset_toggled); + QObject::connect(ui->iqImbalance, &ButtonSwitch::toggled, this, &XTRXInputGUI::on_iqImbalance_toggled); + QObject::connect(ui->sampleRate, &ValueDial::changed, this, &XTRXInputGUI::on_sampleRate_changed); + QObject::connect(ui->hwDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_hwDecim_currentIndexChanged); + QObject::connect(ui->swDecim, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_swDecim_currentIndexChanged); + QObject::connect(ui->lpf, &ValueDial::changed, this, &XTRXInputGUI::on_lpf_changed); + QObject::connect(ui->gainMode, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_gainMode_currentIndexChanged); + QObject::connect(ui->gain, &QDial::valueChanged, this, &XTRXInputGUI::on_gain_valueChanged); + QObject::connect(ui->lnaGain, &QDial::valueChanged, this, &XTRXInputGUI::on_lnaGain_valueChanged); + QObject::connect(ui->tiaGain, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_tiaGain_currentIndexChanged); + QObject::connect(ui->pgaGain, &QDial::valueChanged, this, &XTRXInputGUI::on_pgaGain_valueChanged); + QObject::connect(ui->antenna, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_antenna_currentIndexChanged); + QObject::connect(ui->extClock, &ExternalClockButton::clicked, this, &XTRXInputGUI::on_extClock_clicked); + QObject::connect(ui->pwrmode, QOverload::of(&QComboBox::currentIndexChanged), this, &XTRXInputGUI::on_pwrmode_currentIndexChanged); + QObject::connect(ui->sampleRateMode, &QToolButton::toggled, this, &XTRXInputGUI::on_sampleRateMode_toggled); +} diff --git a/plugins/samplesource/xtrxinput/xtrxinputgui.h b/plugins/samplesource/xtrxinput/xtrxinputgui.h index 36a793791..d727a5c4d 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputgui.h +++ b/plugins/samplesource/xtrxinput/xtrxinputgui.h @@ -45,6 +45,10 @@ public: QByteArray serialize() const; bool deserialize(const QByteArray& data); virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; } + virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; } + virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; } + virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; } private: Ui::XTRXInputGUI* ui; @@ -74,6 +78,7 @@ private: void updateADCRate(); void blockApplySettings(bool block); bool handleMessage(const Message& message); + void makeUIConnections(); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/xtrxinput/xtrxinputsettings.cpp b/plugins/samplesource/xtrxinput/xtrxinputsettings.cpp index 98584835d..47bbe02d3 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputsettings.cpp +++ b/plugins/samplesource/xtrxinput/xtrxinputsettings.cpp @@ -48,6 +48,7 @@ void XTRXInputSettings::resetToDefaults() m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; m_reverseAPIDeviceIndex = 0; + m_workspaceIndex = 0; } QByteArray XTRXInputSettings::serialize() const @@ -76,6 +77,8 @@ QByteArray XTRXInputSettings::serialize() const s.writeU32(24, m_reverseAPIPort); s.writeU32(25, m_reverseAPIDeviceIndex); s.writeBool(26, m_iqOrder); + s.writeS32(27, m_workspaceIndex); + s.writeBlob(28, m_geometryBytes); return s.final(); } @@ -127,6 +130,8 @@ bool XTRXInputSettings::deserialize(const QByteArray& data) d.readU32(25, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; d.readBool(26, &m_iqOrder, true); + d.readS32(27, &m_workspaceIndex, 0); + d.readBlob(28, &m_geometryBytes); return true; } diff --git a/plugins/samplesource/xtrxinput/xtrxinputsettings.h b/plugins/samplesource/xtrxinput/xtrxinputsettings.h index fb0e9a63e..40c771af8 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputsettings.h +++ b/plugins/samplesource/xtrxinput/xtrxinputsettings.h @@ -61,6 +61,8 @@ struct XTRXInputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + int m_workspaceIndex; + QByteArray m_geometryBytes; XTRXInputSettings(); void resetToDefaults(); diff --git a/sdrbase/pipes/messagepipeslegacy.cpp b/sdrbase/pipes/messagepipeslegacy.cpp new file mode 100644 index 000000000..6d9355bba --- /dev/null +++ b/sdrbase/pipes/messagepipeslegacy.cpp @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2020 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/messagequeue.h" + +#include "messagepipeslegacygcworker.h" +#include "messagepipeslegacy.h" +#include "pipeendpoint.h" + +MessagePipesLegacy::MessagePipesLegacy() +{ + m_gcWorker = new MessagePipesLegacyGCWorker(); + m_gcWorker->setC2FRegistrations( + m_registrations.getMutex(), + m_registrations.getElements(), + m_registrations.getConsumers() + ); + m_gcWorker->moveToThread(&m_gcThread); + startGC(); +} + +MessagePipesLegacy::~MessagePipesLegacy() +{ + if (m_gcWorker->isRunning()) { + stopGC(); + } +} + +MessageQueue *MessagePipesLegacy::registerChannelToFeature(const PipeEndPoint *source, PipeEndPoint *dest, const QString& type) +{ + qDebug("MessagePipesLegacy::registerChannelToFeature: %p %p %s", source, dest, qPrintable(type)); + return m_registrations.registerProducerToConsumer(source, dest, type); +} + +MessageQueue *MessagePipesLegacy::unregisterChannelToFeature(const PipeEndPoint *source, PipeEndPoint *dest, const QString& type) +{ + qDebug("MessagePipesLegacy::unregisterChannelToFeature: %p %p %s", source, dest, qPrintable(type)); + MessageQueue *messageQueue = m_registrations.unregisterProducerToConsumer(source, dest, type); + m_gcWorker->addMessageQueueToDelete(messageQueue); + return messageQueue; +} + +QList* MessagePipesLegacy::getMessageQueues(const PipeEndPoint *source, const QString& type) +{ + //qDebug("MessagePipesLegacy::getMessageQueues: %p %s", source, qPrintable(type)); + return m_registrations.getElements(source, type); +} + +void MessagePipesLegacy::startGC() +{ + qDebug("MessagePipesLegacy::startGC"); + m_gcWorker->startWork(); + m_gcThread.start(); +} + +void MessagePipesLegacy::stopGC() +{ + qDebug("MessagePipesLegacy::stopGC"); + m_gcWorker->stopWork(); + m_gcThread.quit(); + m_gcThread.wait(); +} diff --git a/sdrbase/pipes/messagepipeslegacy.h b/sdrbase/pipes/messagepipeslegacy.h new file mode 100644 index 000000000..562e582a8 --- /dev/null +++ b/sdrbase/pipes/messagepipeslegacy.h @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2020 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 SDRBASE_PIPES_MESSAGEPIPESLEGACY_H_ +#define SDRBASE_PIPES_MESSAGEPIPESLEGACY_H_ + +#include +#include +#include +#include +#include + +#include "export.h" + +#include "messagepipeslegacycommon.h" +#include "elementpipesregistrations.h" + +class PipeEndPoint; +class MessagePipesLegacyGCWorker; +class MessageQueue; + +class SDRBASE_API MessagePipesLegacy : public QObject +{ + Q_OBJECT +public: + MessagePipesLegacy(); + MessagePipesLegacy(const MessagePipesLegacy&) = delete; + MessagePipesLegacy& operator=(const MessagePipesLegacy&) = delete; + ~MessagePipesLegacy(); + + // FIXME: Names of these functions should probably change, as we now support channel or feature at either end + MessageQueue *registerChannelToFeature(const PipeEndPoint *source, PipeEndPoint *dest, const QString& type); + MessageQueue *unregisterChannelToFeature(const PipeEndPoint *source, PipeEndPoint *dest, const QString& type); + QList* getMessageQueues(const PipeEndPoint *source, const QString& type); + +private: + ElementPipesRegistrations m_registrations; + QThread m_gcThread; //!< Garbage collector thread + MessagePipesLegacyGCWorker *m_gcWorker; //!< Garbage collector + + void startGC(); //!< Start garbage collector + void stopGC(); //!< Stop garbage collector +}; + +#endif // SDRBASE_PIPES_MESSAGEPIPESLEGACY_H_ diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt index 4ed80997d..357850af4 100644 --- a/sdrgui/CMakeLists.txt +++ b/sdrgui/CMakeLists.txt @@ -83,6 +83,7 @@ set(sdrgui_SOURCES dsp/scopevisxy.cpp + device/devicegui.cpp device/deviceuiset.cpp channel/channelgui.cpp @@ -183,6 +184,7 @@ set(sdrgui_HEADERS dsp/scopevisxy.h + device/devicegui.h device/deviceuiset.h channel/channelgui.h @@ -190,8 +192,6 @@ set(sdrgui_HEADERS feature/featuregui.h feature/featureuiset.h - device/devicegui.h - soapygui/discreterangegui.h soapygui/intervalrangegui.h soapygui/itemsettinggui.h diff --git a/sdrgui/device/devicegui.cpp b/sdrgui/device/devicegui.cpp new file mode 100644 index 000000000..c1c1b1727 --- /dev/null +++ b/sdrgui/device/devicegui.cpp @@ -0,0 +1,313 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2022 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 +#include +#include +#include + +#include "mainwindow.h" +#include "gui/workspaceselectiondialog.h" +#include "gui/samplingdevicedialog.h" +#include "devicegui.h" + +DeviceGUI::DeviceGUI(QWidget *parent) : + QMdiSubWindow(parent), + m_deviceType(DeviceRx), + m_deviceSetIndex(0), + m_contextMenuType(ContextMenuNone), + m_drag(false), + m_currentDeviceIndex(-1) +{ + qDebug("DeviceGUI::DeviceGUI: %p", parent); + setWindowFlags(windowFlags() | Qt::FramelessWindowHint); + + m_indexLabel = new QLabel(); + m_indexLabel->setFixedSize(32, 16); + m_indexLabel->setStyleSheet("QLabel { background-color: rgb(128, 128, 128); qproperty-alignment: AlignCenter; }"); + m_indexLabel->setText(tr("X:%1").arg(m_deviceSetIndex)); + m_indexLabel->setToolTip("Device type and set index"); + + m_changeDeviceButton = new QPushButton(); + m_changeDeviceButton->setFixedSize(20, 20); + QIcon changeDeviceIcon(":/swap.png"); + m_changeDeviceButton->setIcon(changeDeviceIcon); + m_changeDeviceButton->setToolTip("Change device"); + + m_reloadDeviceButton = new QPushButton(); + m_reloadDeviceButton->setFixedSize(20, 20); + QIcon reloadDeviceIcon(":/recycle.png"); + m_reloadDeviceButton->setIcon(reloadDeviceIcon); + m_reloadDeviceButton->setToolTip("Reload device"); + + m_addChannelsButton = new QPushButton(); + m_addChannelsButton->setFixedSize(20, 20); + QIcon addChannelsIcon(":/create.png"); + m_addChannelsButton->setIcon(addChannelsIcon); + m_addChannelsButton->setToolTip("Add channels"); + + m_titleLabel = new QLabel(); + m_titleLabel->setText("Device"); + m_titleLabel->setToolTip("Device identification"); + m_titleLabel->setFixedHeight(20); + + m_helpButton = new QPushButton(); + m_helpButton->setFixedSize(20, 20); + QIcon helpIcon(":/help.png"); + m_helpButton->setIcon(helpIcon); + m_helpButton->setToolTip("Show device documentation in browser"); + + m_moveButton = new QPushButton(); + m_moveButton->setFixedSize(20, 20); + QIcon moveIcon(":/exit.png"); + m_moveButton->setIcon(moveIcon); + m_moveButton->setToolTip("Move to workspace"); + + m_shrinkButton = new QPushButton(); + m_shrinkButton->setFixedSize(20, 20); + QIcon shrinkIcon(":/shrink.png"); + m_shrinkButton->setIcon(shrinkIcon); + m_shrinkButton->setToolTip("Adjust window to minimum size"); + + m_closeButton = new QPushButton(); + m_closeButton->setFixedSize(20, 20); + QIcon closeIcon(":/cross.png"); + m_closeButton->setIcon(closeIcon); + m_closeButton->setToolTip("Close device"); + + m_statusLabel = new QLabel(); + // m_statusLabel->setText("OK"); // for future use + m_statusLabel->setFixedHeight(20); + m_statusLabel->setToolTip("Device status"); + + m_layouts = new QVBoxLayout(); + m_layouts->setContentsMargins(0, 4, 0, 4); + m_layouts->setSpacing(2); + + m_topLayout = new QHBoxLayout(); + m_topLayout->setContentsMargins(0, 0, 0, 0); + m_topLayout->addWidget(m_indexLabel); + m_topLayout->addWidget(m_changeDeviceButton); + m_topLayout->addWidget(m_reloadDeviceButton); + m_topLayout->addWidget(m_addChannelsButton); + m_topLayout->addWidget(m_titleLabel); + m_topLayout->addStretch(1); + m_topLayout->addWidget(m_helpButton); + m_topLayout->addWidget(m_moveButton); + m_topLayout->addWidget(m_shrinkButton); + m_topLayout->addWidget(m_closeButton); + m_sizeGripTopRight = new QSizeGrip(this); + m_sizeGripTopRight->setStyleSheet("QSizeGrip { background-color: rgb(128, 128, 128); width: 10px; height: 10px; }"); + m_topLayout->addWidget(m_sizeGripTopRight, 0, Qt::AlignTop | Qt::AlignRight); + + m_centerLayout = new QHBoxLayout(); + m_contents = new QWidget(); + m_centerLayout->addWidget(m_contents); + + m_bottomLayout = new QHBoxLayout(); + m_bottomLayout->setContentsMargins(0, 0, 0, 0); + m_bottomLayout->addWidget(m_statusLabel); + m_sizeGripBottomRight = new QSizeGrip(this); + m_sizeGripBottomRight->setStyleSheet("QSizeGrip { background-color: rgb(128, 128, 128); width: 10px; height: 10px; }"); + m_bottomLayout->addStretch(1); + m_bottomLayout->addWidget(m_sizeGripBottomRight, 0, Qt::AlignBottom | Qt::AlignRight); + + m_layouts->addLayout(m_topLayout); + m_layouts->addLayout(m_centerLayout); + m_layouts->addLayout(m_bottomLayout); + + QObjectCleanupHandler().add(layout()); + setLayout(m_layouts); + + connect(m_changeDeviceButton, SIGNAL(clicked()), this, SLOT(openChangeDeviceDialog())); + connect(m_reloadDeviceButton, SIGNAL(clicked()), this, SLOT(deviceReload())); + connect(m_helpButton, SIGNAL(clicked()), this, SLOT(showHelp())); + connect(m_moveButton, SIGNAL(clicked()), this, SLOT(openMoveToWorkspaceDialog())); + connect(m_shrinkButton, SIGNAL(clicked()), this, SLOT(shrinkWindow())); + connect(this, SIGNAL(forceShrink()), this, SLOT(shrinkWindow())); + connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close())); + connect(this, SIGNAL(forceClose()), this, SLOT(close())); +} + +DeviceGUI::~DeviceGUI() +{ + qDebug("DeviceGUI::~DeviceGUI"); + delete m_sizeGripBottomRight; + delete m_bottomLayout; + delete m_centerLayout; + delete m_sizeGripTopRight; + delete m_topLayout; + delete m_layouts; + delete m_statusLabel; + delete m_closeButton; + delete m_shrinkButton; + delete m_moveButton; + delete m_helpButton; + delete m_titleLabel; + delete m_addChannelsButton; + delete m_reloadDeviceButton; + delete m_changeDeviceButton; + delete m_indexLabel; + delete m_contents; + qDebug("DeviceGUI::~DeviceGUI: end"); +} + +void DeviceGUI::closeEvent(QCloseEvent *event) +{ + qDebug("DeviceGUI::closeEvent"); + emit closing(); + event->accept(); +} + +void DeviceGUI::mousePressEvent(QMouseEvent* event) +{ + if ((event->button() == Qt::LeftButton) && isOnMovingPad()) + { + m_drag = true; + m_DragPosition = event->globalPos() - pos(); + event->accept(); + } +} + +void DeviceGUI::mouseMoveEvent(QMouseEvent* event) +{ + if ((event->buttons() & Qt::LeftButton) && isOnMovingPad()) + { + move(event->globalPos() - m_DragPosition); + event->accept(); + } +} + +void DeviceGUI::openChangeDeviceDialog() +{ + SamplingDeviceDialog dialog((int) m_deviceType, this); + + if (dialog.exec() == QDialog::Accepted) + { + m_currentDeviceIndex = dialog.getSelectedDeviceIndex(); + emit deviceChange(m_currentDeviceIndex); + } +} + +void DeviceGUI::deviceReload() +{ + if (m_currentDeviceIndex >= 0) { + emit deviceChange(m_currentDeviceIndex); + } +} + +void DeviceGUI::showHelp() +{ + if (m_helpURL.isEmpty()) { + return; + } + + QString url; + + if (m_helpURL.startsWith("http")) { + url = m_helpURL; + } else { + url = QString("https://github.com/f4exb/sdrangel/blob/master/%1").arg(m_helpURL); // Something like "plugins/channelrx/chanalyzer/readme.md" + } + + QDesktopServices::openUrl(QUrl(url)); +} + +void DeviceGUI::openMoveToWorkspaceDialog() +{ + int numberOfWorkspaces = MainWindow::getInstance()->getNumberOfWorkspaces(); + WorkspaceSelectionDialog dialog(numberOfWorkspaces, this); + dialog.exec(); + + if (dialog.hasChanged()) { + emit moveToWorkspace(dialog.getSelectedIndex()); + } +} + +void DeviceGUI::shrinkWindow() +{ + qDebug("DeviceGUI::shrinkWindow"); + adjustSize(); +} + +void DeviceGUI::setTitle(const QString& title) +{ + m_titleLabel->setText(title); +} + +QString DeviceGUI::getTitle() const +{ + return m_titleLabel->text(); +} + +bool DeviceGUI::isOnMovingPad() +{ + return m_indexLabel->underMouse() || m_titleLabel->underMouse() || m_statusLabel->underMouse(); +} + +void DeviceGUI::setIndex(int index) +{ + m_deviceSetIndex = index; + m_indexLabel->setText(tr("%1:%2").arg(getDeviceTypeTag()).arg(m_deviceSetIndex)); +} + +void DeviceGUI::setDeviceType(DeviceType type) +{ + m_deviceType = type; + m_indexLabel->setStyleSheet(tr("QLabel { background-color: %1; qproperty-alignment: AlignCenter; }").arg(getDeviceTypeColor())); +} + +void DeviceGUI::setToolTip(const QString& tooltip) +{ + m_titleLabel->setToolTip(tooltip); +} + +QString DeviceGUI::getDeviceTypeColor() +{ + switch(m_deviceType) + { + case DeviceRx: + return "rgb(0, 128, 0)"; + case DeviceTx: + return "rgb(204, 0, 0)"; + case DeviceMIMO: + return "rgb(0, 0, 192)"; + default: + return "rgb(128, 128, 128)"; + } +} + +QString DeviceGUI::getDeviceTypeTag() +{ + switch(m_deviceType) + { + case DeviceRx: + return "R"; + case DeviceTx: + return "T"; + case DeviceMIMO: + return "M"; + default: + return "X"; + } +} diff --git a/sdrgui/device/devicegui.h b/sdrgui/device/devicegui.h index bc3f6f80d..e6a947c93 100644 --- a/sdrgui/device/devicegui.h +++ b/sdrgui/device/devicegui.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2020 Edouard Griffiths, F4EXB // +// Copyright (C) 2020-2022 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 // @@ -18,6 +18,8 @@ #ifndef INCLUDE_DEVICEGUI_H #define INCLUDE_DEVICEGUI_H +#include + #include #include #include @@ -25,20 +27,109 @@ #include "export.h" +class QCloseEvent; class Message; class MessageQueue; - -class SDRGUI_API DeviceGUI : public QWidget { +class QLabel; +class QPushButton; +class QVBoxLayout; +class QHBoxLayout; +class QSizeGrip; +class SDRGUI_API DeviceGUI : public QMdiSubWindow { + Q_OBJECT public: - DeviceGUI(QWidget *parent = nullptr) : QWidget(parent) { }; - virtual ~DeviceGUI() { }; + enum DeviceType + { + DeviceRx, + DeviceTx, + DeviceMIMO + }; + + enum ContextMenuType + { + ContextMenuNone, + ContextMenuChannelSettings, + ContextMenuStreamSettings + }; + + DeviceGUI(QWidget *parent = nullptr); + virtual ~DeviceGUI(); virtual void destroy() = 0; virtual void resetToDefaults() = 0; virtual QByteArray serialize() const = 0; virtual bool deserialize(const QByteArray& data) = 0; + // Data saved in the derived settings + virtual void setWorkspaceIndex(int index)= 0; + virtual int getWorkspaceIndex() const = 0; + virtual void setGeometryBytes(const QByteArray& blob) = 0; + virtual QByteArray getGeometryBytes() const = 0; virtual MessageQueue* getInputMessageQueue() = 0; + + QWidget *getContents() { return m_contents; } + void setDeviceType(DeviceType type); + DeviceType getDeviceType() const { return m_deviceType; } + void setTitle(const QString& title); + QString getTitle() const; + void setToolTip(const QString& tooltip); + void setIndex(int index); + int getIndex() const { return m_deviceSetIndex; } + void setCurrentDeviceIndex(int index) { m_currentDeviceIndex = index; } //!< index in plugins list + +protected: + void closeEvent(QCloseEvent *event); + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void resetContextMenuType() { m_contextMenuType = ContextMenuNone; } + + DeviceType m_deviceType; + int m_deviceSetIndex; + QString m_helpURL; + QWidget *m_contents; + ContextMenuType m_contextMenuType; + +protected slots: + void shrinkWindow(); + +private: + bool isOnMovingPad(); + QString getDeviceTypeColor(); + QString getDeviceTypeTag(); + + QLabel *m_indexLabel; + QPushButton *m_changeDeviceButton; + QPushButton *m_reloadDeviceButton; + QPushButton *m_addChannelsButton; + QLabel *m_titleLabel; + QPushButton *m_helpButton; + QPushButton *m_moveButton; + QPushButton *m_shrinkButton; + QPushButton *m_closeButton; + QLabel *m_statusLabel; + QVBoxLayout *m_layouts; + QHBoxLayout *m_topLayout; + QHBoxLayout *m_centerLayout; + QHBoxLayout *m_bottomLayout; + QSizeGrip *m_sizeGripTopRight; + QSizeGrip *m_sizeGripBottomRight; + bool m_drag; + QPoint m_DragPosition; + int m_currentDeviceIndex; //!< Index in device plugins registrations + +private slots: + void openChangeDeviceDialog(); + void deviceReload(); + void showHelp(); + void openMoveToWorkspaceDialog(); + +signals: + void forceClose(); + void closing(); + void moveToWorkspace(int workspaceIndex); + void forceShrink(); + void deviceAdd(int deviceType, int deviceIndex); + void deviceChange(int newDeviceIndex); }; #endif // INCLUDE_DEVICEGUI_H diff --git a/sdrgui/feature/featuregui.cpp b/sdrgui/feature/featuregui.cpp index 05e5f8d02..41638097e 100644 --- a/sdrgui/feature/featuregui.cpp +++ b/sdrgui/feature/featuregui.cpp @@ -130,6 +130,7 @@ FeatureGUI::FeatureGUI(QWidget *parent) : FeatureGUI::~FeatureGUI() { + qDebug("FeatureGUI::~FeatureGUI"); delete m_sizeGripBottomRight; delete m_bottomLayout; delete m_centerLayout; @@ -144,6 +145,7 @@ FeatureGUI::~FeatureGUI() delete m_titleLabel; delete m_settingsButton; delete m_indexLabel; + qDebug("FeatureGUI::~FeatureGUI: end"); } void FeatureGUI::closeEvent(QCloseEvent *event) diff --git a/sdrgui/gui/samplingdevicedialog.cpp b/sdrgui/gui/samplingdevicedialog.cpp index cf42381b2..fbbbbfec1 100644 --- a/sdrgui/gui/samplingdevicedialog.cpp +++ b/sdrgui/gui/samplingdevicedialog.cpp @@ -24,11 +24,10 @@ #include "device/deviceenumerator.h" -SamplingDeviceDialog::SamplingDeviceDialog(int deviceType, int deviceTabIndex, QWidget* parent) : +SamplingDeviceDialog::SamplingDeviceDialog(int deviceType, QWidget* parent) : QDialog(parent), ui(new Ui::SamplingDeviceDialog), m_deviceType(deviceType), - m_deviceTabIndex(deviceTabIndex), m_selectedDeviceIndex(-1), m_hasChanged(false) { @@ -81,15 +80,6 @@ void SamplingDeviceDialog::on_deviceSelect_currentIndexChanged(int index) void SamplingDeviceDialog::accept() { m_selectedDeviceIndex = m_deviceIndexes[ui->deviceSelect->currentIndex()]; - - if (m_deviceType == 0) { // Single Rx - DeviceEnumerator::instance()->changeRxSelection(m_deviceTabIndex, m_selectedDeviceIndex); - } else if (m_deviceType == 1) { // Single Tx - DeviceEnumerator::instance()->changeTxSelection(m_deviceTabIndex, m_selectedDeviceIndex); - } else if (m_deviceType == 2) { // MIMO - DeviceEnumerator::instance()->changeMIMOSelection(m_deviceTabIndex, m_selectedDeviceIndex); - } - QDialog::accept(); } diff --git a/sdrgui/gui/samplingdevicedialog.h b/sdrgui/gui/samplingdevicedialog.h index 9a5a3dc9c..7662e1cec 100644 --- a/sdrgui/gui/samplingdevicedialog.h +++ b/sdrgui/gui/samplingdevicedialog.h @@ -35,11 +35,10 @@ class SDRGUI_API SamplingDeviceDialog : public QDialog { Q_OBJECT public: - explicit SamplingDeviceDialog(int deviceType, int deviceTabIndex, QWidget* parent = nullptr); + explicit SamplingDeviceDialog(int deviceType, QWidget* parent = nullptr); ~SamplingDeviceDialog(); int getSelectedDeviceIndex() const { return m_selectedDeviceIndex; } void setSelectedDeviceIndex(int deviceIndex); - void setTabIndex(int deviceTabIndex) { m_deviceTabIndex = deviceTabIndex; } void getDeviceId(QString& id) const; int exec(); bool hasChanged() const { return m_hasChanged; } @@ -47,7 +46,6 @@ public: private: Ui::SamplingDeviceDialog* ui; int m_deviceType; - int m_deviceTabIndex; int m_selectedDeviceIndex; std::vector m_deviceIndexes; bool m_hasChanged; diff --git a/sdrgui/gui/samplingdevicesdock.cpp b/sdrgui/gui/samplingdevicesdock.cpp index 48e0cfa04..6cdea954b 100644 --- a/sdrgui/gui/samplingdevicesdock.cpp +++ b/sdrgui/gui/samplingdevicesdock.cpp @@ -111,7 +111,7 @@ void SamplingDevicesDock::addDevice(int deviceType, int deviceTabIndex) m_devicesInfo.push_back(DeviceInfo{ deviceType, deviceTabIndex, - new SamplingDeviceDialog(deviceType, deviceTabIndex, this) + new SamplingDeviceDialog(deviceType, this) }); setCurrentTabIndex(deviceTabIndex); diff --git a/sdrgui/gui/workspace.cpp b/sdrgui/gui/workspace.cpp index fc7eed526..724f10116 100644 --- a/sdrgui/gui/workspace.cpp +++ b/sdrgui/gui/workspace.cpp @@ -24,6 +24,7 @@ #include #include +#include "gui/samplingdevicedialog.h" #include "workspace.h" Workspace::Workspace(int index, QWidget *parent, Qt::WindowFlags flags) : @@ -130,21 +131,21 @@ Workspace::Workspace(int index, QWidget *parent, Qt::WindowFlags flags) : m_addRxDeviceButton, &QPushButton::clicked, this, - &Workspace::addRxDevice + &Workspace::addRxDeviceClicked ); QObject::connect( m_addTxDeviceButton, &QPushButton::clicked, this, - &Workspace::addTxDevice + &Workspace::addTxDeviceClicked ); QObject::connect( m_addMIMODeviceButton, &QPushButton::clicked, this, - &Workspace::addMIMODevice + &Workspace::addMIMODeviceClicked ); QObject::connect( @@ -194,6 +195,7 @@ Workspace::Workspace(int index, QWidget *parent, Qt::WindowFlags flags) : Workspace::~Workspace() { + qDebug("Workspace::~Workspace"); delete m_closeButton; delete m_normalButton; delete m_tileSubWindows; @@ -208,7 +210,9 @@ Workspace::~Workspace() delete m_titleLabel; delete m_titleBarLayout; delete m_titleBar; + qDebug("Workspace::~Workspace: about to delete MDI"); delete m_mdi; + qDebug("Workspace::~Workspace: end"); } void Workspace::toggleFloating() @@ -216,19 +220,31 @@ void Workspace::toggleFloating() setFloating(!isFloating()); } -void Workspace::addRxDevice() +void Workspace::addRxDeviceClicked() { + SamplingDeviceDialog dialog(0, this); + if (dialog.exec() == QDialog::Accepted) { + emit addRxDevice(this, dialog.getSelectedDeviceIndex()); + } } -void Workspace::addTxDevice() +void Workspace::addTxDeviceClicked() { + SamplingDeviceDialog dialog(1, this); + if (dialog.exec() == QDialog::Accepted) { + emit addTxDevice(this, dialog.getSelectedDeviceIndex()); + } } -void Workspace::addMIMODevice() +void Workspace::addMIMODeviceClicked() { + SamplingDeviceDialog dialog(2, this); + if (dialog.exec() == QDialog::Accepted) { + emit addMIMODevice(this, dialog.getSelectedDeviceIndex()); + } } void Workspace::addFeatureDialog() @@ -261,7 +277,6 @@ void Workspace::tileSubWindows() void Workspace::addToMdiArea(QMdiSubWindow *sub) { - sub->setParent(m_mdi); m_mdi->addSubWindow(sub); sub->show(); } diff --git a/sdrgui/gui/workspace.h b/sdrgui/gui/workspace.h index 3944ddfad..309332c15 100644 --- a/sdrgui/gui/workspace.h +++ b/sdrgui/gui/workspace.h @@ -68,9 +68,9 @@ private: QMdiArea *m_mdi; private slots: - void addRxDevice(); - void addTxDevice(); - void addMIMODevice(); + void addRxDeviceClicked(); + void addTxDeviceClicked(); + void addMIMODeviceClicked(); void addFeatureDialog(); void featurePresetsDialog(); void cascadeSubWindows(); @@ -79,6 +79,9 @@ private slots: void toggleFloating(); signals: + void addRxDevice(Workspace *inWorkspace, int deviceIndex); + void addTxDevice(Workspace *inWorkspace, int deviceIndex); + void addMIMODevice(Workspace *inWorkspace, int deviceIndex); void addFeature(Workspace*, int); void featurePresetsDialogRequested(QPoint, Workspace*); }; diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 65a464ee5..76d0881ee 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -234,40 +234,40 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse m_pluginManager->loadPlugins(QString("plugins")); m_pluginManager->loadPluginsNonDiscoverable(m_mainCore->m_settings.getDeviceUserArgs()); - splash->showStatusMessage("load initial feature set...", Qt::white); - QStringList featureNames; - m_pluginManager->listFeatures(featureNames); + splash->showStatusMessage("Add unique feature set...", Qt::white); + // QStringList featureNames; + // m_pluginManager->listFeatures(featureNames); // ui->featureDock->addAvailableFeatures(featureNames); addFeatureSet(); // ui->featureDock->setFeatureUISet(m_featureUIs[0]); // ui->featureDock->setPresets(m_mainCore->m_settings.getFeatureSetPresets()); // ui->featureDock->setPluginAPI(m_pluginManager->getPluginAPI()); - splash->showStatusMessage("load last device or file input...", Qt::white); - qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)..."; - qDebug() << "MainWindow::MainWindow: look for" - << m_mainCore->m_settings.getSourceDevice() - << "at index" << m_mainCore->m_settings.getSourceIndex() - << "and item index" << m_mainCore->m_settings.getSourceItemIndex(); + // splash->showStatusMessage("load last device or file input...", Qt::white); + // qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)..."; + // qDebug() << "MainWindow::MainWindow: look for" + // << m_mainCore->m_settings.getSourceDevice() + // << "at index" << m_mainCore->m_settings.getSourceIndex() + // << "and item index" << m_mainCore->m_settings.getSourceItemIndex(); - int deviceIndex = DeviceEnumerator::instance()->getRxSamplingDeviceIndex( - m_mainCore->m_settings.getSourceDevice(), - m_mainCore->m_settings.getSourceIndex(), - m_mainCore->m_settings.getSourceItemIndex()); - addSourceDevice(deviceIndex); // add the first device set with file input device as default if device in settings is not enumerated - m_deviceUIs.back()->m_deviceAPI->setBuddyLeader(true); // the first device is always the leader + // int deviceIndex = DeviceEnumerator::instance()->getRxSamplingDeviceIndex( + // m_mainCore->m_settings.getSourceDevice(), + // m_mainCore->m_settings.getSourceIndex(), + // m_mainCore->m_settings.getSourceItemIndex()); + // sampleSourceAdd(deviceIndex); // add the first device set with file input device as default if device in settings is not enumerated + // m_deviceUIs.back()->m_deviceAPI->setBuddyLeader(true); // the first device is always the leader tabChannelsIndexChanged(); // force channel selection list update - splash->showStatusMessage("load current preset settings...", Qt::white); - qDebug() << "MainWindow::MainWindow: load current preset settings..."; + splash->showStatusMessage("load current configuration...", Qt::white); + qDebug() << "MainWindow::MainWindow: load current configuration..."; // loadPresetSettings(m_mainCore->m_settings.getWorkingPreset(), 0); m_apiAdapter = new WebAPIAdapter(); // loadFeatureSetPresetSettings(m_mainCore->m_settings.getWorkingFeatureSetPreset(), 0); loadConfiguration(m_mainCore->m_settings.getWorkingConfiguration()); - splash->showStatusMessage("update preset controls...", Qt::white); - qDebug() << "MainWindow::MainWindow: update preset controls..."; + // splash->showStatusMessage("update preset controls...", Qt::white); + // qDebug() << "MainWindow::MainWindow: update preset controls..."; // updatePresetControls(); @@ -304,7 +304,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse m_dspEngine->setMIMOSupport(parser.getMIMOSupport()); // if (!parser.getMIMOSupport()) { - // ui->menu_Devices->removeAction(ui->action_addMIMODevice); + // ui->menu_Devices->removeAction(ui->action_sampleMIMOAdd); // } #ifdef __APPLE__ @@ -326,6 +326,8 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse MainWindow::~MainWindow() { + qDebug() << "MainWindow::~MainWindow"; + m_mainCore->m_settings.save(); m_apiServer->stop(); delete m_apiServer; @@ -343,15 +345,16 @@ MainWindow::~MainWindow() // delete ui; // delete m_spectrumToggleViewAction; - qDebug() << "MainWindow::~MainWindow: end"; delete m_commandKeyReceiver; for (const auto& workspace : m_workspaces) { delete workspace; } + + qDebug() << "MainWindow::~MainWindow: end"; } -void MainWindow::addSourceDevice(int deviceIndex) +void MainWindow::sampleSourceAdd(Workspace *workspace, int deviceIndex) { DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine(); dspDeviceSourceEngine->start(); @@ -360,11 +363,10 @@ void MainWindow::addSourceDevice(int deviceIndex) char uidCStr[16]; sprintf(uidCStr, "UID:%d", dspDeviceSourceEngineUID); - int deviceTabIndex = m_deviceUIs.size(); - // ui->inputViewDock->addDevice(0, deviceTabIndex); + int deviceSetIndex = m_deviceUIs.size(); m_mainCore->appendDeviceSet(0); - m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, m_mainCore->m_deviceSets.back())); + m_deviceUIs.push_back(new DeviceUISet(deviceSetIndex, m_mainCore->m_deviceSets.back())); m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine; m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = dspDeviceSourceEngine; m_deviceUIs.back()->m_deviceSinkEngine = nullptr; @@ -372,10 +374,7 @@ void MainWindow::addSourceDevice(int deviceIndex) m_deviceUIs.back()->m_deviceMIMOEngine = nullptr; m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = nullptr; - char tabNameCStr[16]; - sprintf(tabNameCStr, "R%d", deviceTabIndex); - - DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleRx, deviceTabIndex, dspDeviceSourceEngine, nullptr, nullptr); + DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleRx, deviceSetIndex, dspDeviceSourceEngine, nullptr, nullptr); m_deviceUIs.back()->m_deviceAPI = deviceAPI; m_mainCore->m_deviceSets.back()->m_deviceAPI = deviceAPI; @@ -384,15 +383,26 @@ void MainWindow::addSourceDevice(int deviceIndex) m_deviceUIs.back()->setNumberOfAvailableRxChannels(channelNames.size()); dspDeviceSourceEngine->addSink(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); // Create a file source instance by default if requested device was not enumerated (index = -1) if (deviceIndex < 0) { deviceIndex = DeviceEnumerator::instance()->getFileInputDeviceIndex(); } + sampleSourceImplement(deviceSetIndex, deviceIndex, deviceAPI, m_deviceUIs.back(), workspace); + emit m_mainCore->deviceSetAdded(deviceSetIndex, deviceAPI); +} + +void MainWindow::sampleSourceImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace +) +{ + int selectedDeviceIndex = deviceIndex; + DeviceEnumerator::instance()->changeRxSelection(deviceSetIndex, deviceIndex); const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(deviceIndex); deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); @@ -403,35 +413,111 @@ void MainWindow::addSourceDevice(int deviceIndex) deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(deviceIndex)); + qDebug() << "MainWindow::sampleSourceImplement:" + << "deviceIndex:" << deviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; + + if (deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default + { + qDebug("MainWindow::sampleSourceAdd: non existent device replaced by File Input"); + int fileInputDeviceIndex = DeviceEnumerator::instance()->getFileInputDeviceIndex(); + selectedDeviceIndex = fileInputDeviceIndex; + samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(fileInputDeviceIndex); + deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); + deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); + deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); + deviceAPI->setHardwareId(samplingDevice->hardwareId); + deviceAPI->setSamplingDeviceId(samplingDevice->id); + deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); + deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); + deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(fileInputDeviceIndex)); + } + QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); if (userArgs.size() > 0) { deviceAPI->setHardwareUserArguments(userArgs); } - // ui->inputViewDock->setSelectedDeviceIndex(deviceTabIndex, deviceIndex); + // add to buddies list + std::vector::iterator it = m_deviceUIs.begin(); + int nbOfBuddies = 0; - // delete previous plugin GUI if it exists - if (m_deviceUIs.back()->m_deviceGUI) { - m_deviceUIs.back()->m_deviceGUI->destroy(); + for (; it != m_deviceUIs.end(); ++it) + { + if (*it != deviceUISet) // do not add to itself + { + if ((*it)->m_deviceSourceEngine) // it is a source device + { + if ((deviceUISet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && + (deviceUISet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) + { + (*it)->m_deviceAPI->addSourceBuddy(deviceUISet->m_deviceAPI); + nbOfBuddies++; + } + } + + if ((*it)->m_deviceSinkEngine) // it is a sink device + { + if ((deviceUISet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && + (deviceUISet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) + { + (*it)->m_deviceAPI->addSourceBuddy(deviceUISet->m_deviceAPI); + nbOfBuddies++; + } + } + } } + if (nbOfBuddies == 0) { + deviceUISet->m_deviceAPI->setBuddyLeader(true); + } + + // delete previous GUI if it exists + if (deviceUISet->m_deviceGUI) { + emit deviceUISet->m_deviceGUI->forceClose(); + } + + // constructs new GUI and input object DeviceSampleSource *source = deviceAPI->getPluginInterface()->createSampleSourcePluginInstance( deviceAPI->getSamplingDeviceId(), deviceAPI); deviceAPI->setSampleSource(source); QWidget *gui; - DeviceGUI *pluginGUI = deviceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( + DeviceGUI *deviceGUI = deviceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( deviceAPI->getSamplingDeviceId(), &gui, - m_deviceUIs.back()); - deviceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceGUI = pluginGUI; - m_deviceUIs.back()->m_deviceAPI->getSampleSource()->init(); - setDeviceGUI(deviceTabIndex, gui, deviceAPI->getSamplingDeviceDisplayName()); - emit m_mainCore->deviceSetAdded(deviceTabIndex, deviceAPI); + deviceUISet + ); + QObject::connect( + deviceGUI, + &DeviceGUI::moveToWorkspace, + this, + [=](int wsIndexDest){ this->deviceMove(deviceGUI, wsIndexDest); } + ); + QObject::connect( + deviceGUI, + &DeviceGUI::deviceChange, + this, + [=](int newDeviceIndex){ this->sampleDeviceChangeHandler(deviceGUI, newDeviceIndex); } + ); + deviceAPI->getSampleSource()->setMessageQueueToGUI(deviceGUI->getInputMessageQueue()); + deviceUISet->m_deviceGUI = deviceGUI; + deviceUISet->m_deviceAPI->getSampleSource()->init(); + // Finalize GUI setup and add it to workspace MDI + deviceGUI->setDeviceType(DeviceGUI::DeviceRx); + deviceGUI->setIndex(deviceSetIndex); + deviceGUI->setWorkspaceIndex(workspace->getIndex()); + deviceGUI->setToolTip(samplingDevice->displayedName); + deviceGUI->setTitle(samplingDevice->displayedName.split(" ")[0]); + deviceGUI->setCurrentDeviceIndex(selectedDeviceIndex); + workspace->addToMdiArea((QMdiSubWindow*) deviceGUI); } -void MainWindow::addSinkDevice() +void MainWindow::sampleSinkAdd(Workspace *workspace, int deviceIndex) { DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine(); dspDeviceSinkEngine->start(); @@ -440,11 +526,10 @@ void MainWindow::addSinkDevice() char uidCStr[16]; sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID); - int deviceTabIndex = m_deviceUIs.size(); - // ui->inputViewDock->addDevice(1, deviceTabIndex); + int deviceSetIndex = m_deviceUIs.size(); m_mainCore->appendDeviceSet(1); - m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, m_mainCore->m_deviceSets.back())); + m_deviceUIs.push_back(new DeviceUISet(deviceSetIndex, m_mainCore->m_deviceSets.back())); m_deviceUIs.back()->m_deviceSourceEngine = nullptr; m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = nullptr; m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine; @@ -452,10 +537,7 @@ void MainWindow::addSinkDevice() m_deviceUIs.back()->m_deviceMIMOEngine = nullptr; m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = nullptr; - char tabNameCStr[16]; - sprintf(tabNameCStr, "T%d", deviceTabIndex); - - DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleTx, deviceTabIndex, nullptr, dspDeviceSinkEngine, nullptr); + DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleTx, deviceSetIndex, nullptr, dspDeviceSinkEngine, nullptr); m_deviceUIs.back()->m_deviceAPI = deviceAPI; m_mainCore->m_deviceSets.back()->m_deviceAPI = deviceAPI; @@ -465,13 +547,26 @@ void MainWindow::addSinkDevice() dspDeviceSinkEngine->addSpectrumSink(m_deviceUIs.back()->m_spectrumVis); m_deviceUIs.back()->m_spectrum->setDisplayedStream(false, 0); - // 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); - // create a file sink by default - int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileOutputDeviceIndex(); - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex); + if (deviceIndex < 0) { + deviceIndex = DeviceEnumerator::instance()->getFileOutputDeviceIndex(); // create a file output by default + } + + sampleSinkImplement(deviceSetIndex, deviceIndex, deviceAPI, m_deviceUIs.back(), workspace); + emit m_mainCore->deviceSetAdded(deviceSetIndex, deviceAPI); +} + +void MainWindow::sampleSinkImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace +) +{ + int selectedDeviceIndex = deviceIndex; + DeviceEnumerator::instance()->changeTxSelection(deviceSetIndex, deviceIndex); + const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(deviceIndex); deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); @@ -479,7 +574,31 @@ void MainWindow::addSinkDevice() deviceAPI->setSamplingDeviceId(samplingDevice->id); deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(fileSinkDeviceIndex)); + deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(deviceIndex)); + + qDebug() << "MainWindow::sampleSinkImplement:" + << "newDeviceIndex:" << deviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; + + if (deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default + { + qDebug("MainWindow::sampleSinkImplement: non existent device replaced by File Sink"); + int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileOutputDeviceIndex(); + selectedDeviceIndex = fileSinkDeviceIndex; + const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex); + deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); + deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); + deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); + deviceAPI->setHardwareId(samplingDevice->hardwareId); + deviceAPI->setSamplingDeviceId(samplingDevice->id); + deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); + deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); + deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(fileSinkDeviceIndex)); + } QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); @@ -487,29 +606,81 @@ void MainWindow::addSinkDevice() deviceAPI->setHardwareUserArguments(userArgs); } - // ui->inputViewDock->setSelectedDeviceIndex(deviceTabIndex, fileSinkDeviceIndex); + // add to buddies list + std::vector::iterator it = m_deviceUIs.begin(); + int nbOfBuddies = 0; - // delete previous plugin GUI if it exists - if (m_deviceUIs.back()->m_deviceGUI) { - m_deviceUIs.back()->m_deviceGUI->destroy(); + for (; it != m_deviceUIs.end(); ++it) + { + if (*it != deviceUISet) // do not add to itself + { + if ((*it)->m_deviceSourceEngine) // it is a source device + { + if ((deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && + (deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) + { + (*it)->m_deviceAPI->addSinkBuddy(deviceAPI); + nbOfBuddies++; + } + } + + if ((*it)->m_deviceSinkEngine) // it is a sink device + { + if ((deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && + (deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) + { + (*it)->m_deviceAPI->addSinkBuddy(deviceAPI); + nbOfBuddies++; + } + } + } } + if (nbOfBuddies == 0) { + deviceAPI->setBuddyLeader(true); + } + + // delete previous plugin GUI if it exists + if (deviceUISet->m_deviceGUI) { + emit deviceUISet->m_deviceGUI->forceClose(); + } + + // constructs new GUI and output object DeviceSampleSink *sink = deviceAPI->getPluginInterface()->createSampleSinkPluginInstance( deviceAPI->getSamplingDeviceId(), deviceAPI); deviceAPI->setSampleSink(sink); QWidget *gui; - DeviceGUI *pluginGUI = deviceAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( + DeviceGUI *deviceGUI = deviceAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( deviceAPI->getSamplingDeviceId(), &gui, - m_deviceUIs.back()); - deviceAPI->getSampleSink()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceGUI = pluginGUI; - m_deviceUIs.back()->m_deviceAPI->getSampleSink()->init(); - setDeviceGUI(deviceTabIndex, gui, deviceAPI->getSamplingDeviceDisplayName(), 1); - emit m_mainCore->deviceSetAdded(deviceTabIndex, deviceAPI); + deviceUISet + ); + QObject::connect( + deviceGUI, + &DeviceGUI::moveToWorkspace, + this, + [=](int wsIndexDest){ this->deviceMove(deviceGUI, wsIndexDest); } + ); + QObject::connect( + deviceGUI, + &DeviceGUI::deviceChange, + this, + [=](int newDeviceIndex){ this->sampleDeviceChangeHandler(deviceGUI, newDeviceIndex); } + ); + deviceAPI->getSampleSink()->setMessageQueueToGUI(deviceGUI->getInputMessageQueue()); + deviceUISet->m_deviceGUI = deviceGUI; + deviceUISet->m_deviceAPI->getSampleSink()->init(); + // Finalize GUI setup and add it to workspace MDI + deviceGUI->setDeviceType(DeviceGUI::DeviceTx); + deviceGUI->setIndex(deviceSetIndex); + deviceGUI->setWorkspaceIndex(workspace->getIndex()); + deviceGUI->setToolTip(samplingDevice->displayedName); + deviceGUI->setTitle(samplingDevice->displayedName.split(" ")[0]); + deviceGUI->setCurrentDeviceIndex(selectedDeviceIndex); + workspace->addToMdiArea((QMdiSubWindow*) deviceGUI); } -void MainWindow::addMIMODevice() +void MainWindow::sampleMIMOAdd(Workspace *workspace, int deviceIndex) { DSPDeviceMIMOEngine *dspDeviceMIMOEngine = m_dspEngine->addDeviceMIMOEngine(); dspDeviceMIMOEngine->start(); @@ -518,11 +689,10 @@ void MainWindow::addMIMODevice() char uidCStr[16]; sprintf(uidCStr, "UID:%d", dspDeviceMIMOEngineUID); - int deviceTabIndex = m_deviceUIs.size(); - // ui->inputViewDock->addDevice(2, deviceTabIndex); + int deviceSetIndex = m_deviceUIs.size(); m_mainCore->appendDeviceSet(2); - m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, m_mainCore->m_deviceSets.back())); + m_deviceUIs.push_back(new DeviceUISet(deviceSetIndex, m_mainCore->m_deviceSets.back())); m_deviceUIs.back()->m_deviceSourceEngine = nullptr; m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = nullptr; m_deviceUIs.back()->m_deviceSinkEngine = nullptr; @@ -530,10 +700,7 @@ void MainWindow::addMIMODevice() m_deviceUIs.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine; m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine; - char tabNameCStr[16]; - sprintf(tabNameCStr, "M%d", deviceTabIndex); - - DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine); + DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceSetIndex, nullptr, nullptr, dspDeviceMIMOEngine); m_deviceUIs.back()->m_deviceAPI = deviceAPI; m_mainCore->m_deviceSets.back()->m_deviceAPI = deviceAPI; @@ -551,13 +718,26 @@ void MainWindow::addMIMODevice() m_deviceUIs.back()->setNumberOfAvailableTxChannels(txChannelNames.size()); 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); - // create a test MIMO by default - int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex(); - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex); + if (deviceIndex < 0) { + deviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex(); // create a test MIMO by default + } + + sampleMIMOImplement(deviceSetIndex, deviceIndex, deviceAPI, m_deviceUIs.back(), workspace); + emit m_mainCore->deviceSetAdded(deviceSetIndex, deviceAPI); +} + +void MainWindow::sampleMIMOImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace +) +{ + int selectedDeviceIndex = deviceIndex; + DeviceEnumerator::instance()->changeMIMOSelection(deviceSetIndex, deviceIndex); + const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(deviceIndex); deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); @@ -565,7 +745,31 @@ void MainWindow::addMIMODevice() deviceAPI->setSamplingDeviceId(samplingDevice->id); deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex)); + deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(deviceIndex)); + + qDebug() << "MainWindow::sampleMIMOImplement:" + << "newDeviceIndex:" << deviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; + + if (deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default + { + qDebug("MainWindow::sampleMIMOImplement: non existent device replaced by Test MIMO"); + int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex(); + selectedDeviceIndex = testMIMODeviceIndex; + const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex); + deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); + deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); + deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); + deviceAPI->setHardwareId(samplingDevice->hardwareId); + deviceAPI->setSamplingDeviceId(samplingDevice->id); + deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); + deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); + deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex)); + } QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); @@ -573,26 +777,44 @@ void MainWindow::addMIMODevice() deviceAPI->setHardwareUserArguments(userArgs); } - // ui->inputViewDock->setSelectedDeviceIndex(deviceTabIndex, testMIMODeviceIndex); - // delete previous plugin GUI if it exists - if (m_deviceUIs.back()->m_deviceGUI) { - m_deviceUIs.back()->m_deviceGUI->destroy(); + if (deviceUISet->m_deviceGUI) { + emit deviceUISet->m_deviceGUI->forceClose(); } + // constructs new GUI and output object DeviceSampleMIMO *mimo = deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance( deviceAPI->getSamplingDeviceId(), deviceAPI); deviceAPI->setSampleMIMO(mimo); QWidget *gui; - DeviceGUI *pluginGUI = deviceAPI->getPluginInterface()->createSampleMIMOPluginInstanceGUI( + DeviceGUI *deviceGUI = deviceAPI->getPluginInterface()->createSampleMIMOPluginInstanceGUI( deviceAPI->getSamplingDeviceId(), &gui, - m_deviceUIs.back()); - deviceAPI->getSampleMIMO()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - m_deviceUIs.back()->m_deviceGUI = pluginGUI; - m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->init(); - setDeviceGUI(deviceTabIndex, gui, deviceAPI->getSamplingDeviceDisplayName(), 2); - emit m_mainCore->deviceSetAdded(deviceTabIndex, deviceAPI); + deviceUISet + ); + QObject::connect( + deviceGUI, + &DeviceGUI::moveToWorkspace, + this, + [=](int wsIndexDest){ this->deviceMove(deviceGUI, wsIndexDest); } + ); + QObject::connect( + deviceGUI, + &DeviceGUI::deviceChange, + this, + [=](int newDeviceIndex){ this->sampleDeviceChangeHandler(deviceGUI, newDeviceIndex); } + ); + deviceAPI->getSampleMIMO()->setMessageQueueToGUI(deviceGUI->getInputMessageQueue()); + deviceUISet->m_deviceGUI = deviceGUI; + deviceUISet->m_deviceAPI->getSampleMIMO()->init(); + // Finalize GUI setup and add it to workspace MDI + deviceGUI->setDeviceType(DeviceGUI::DeviceMIMO); + deviceGUI->setIndex(deviceSetIndex); + deviceGUI->setWorkspaceIndex(workspace->getIndex()); + deviceGUI->setToolTip(samplingDevice->displayedName); + deviceGUI->setTitle(samplingDevice->displayedName.split(" ")[0]); + deviceGUI->setCurrentDeviceIndex(selectedDeviceIndex); + workspace->addToMdiArea((QMdiSubWindow*) deviceGUI); } void MainWindow::removeLastDevice() @@ -621,7 +843,7 @@ void MainWindow::removeLastDevice() // ui->tabChannels->removeTab(ui->tabChannels->count() - 1); m_deviceWidgetTabs.removeLast(); - restoreDeviceTabs(); + // restoreDeviceTabs(); DeviceAPI *sourceAPI = m_deviceUIs.back()->m_deviceAPI; delete m_deviceUIs.back(); @@ -653,7 +875,7 @@ void MainWindow::removeLastDevice() // ui->tabChannels->removeTab(ui->tabChannels->count() - 1); m_deviceWidgetTabs.removeLast(); - restoreDeviceTabs(); + // restoreDeviceTabs(); DeviceAPI *sinkAPI = m_deviceUIs.back()->m_deviceAPI; delete m_deviceUIs.back(); @@ -685,7 +907,7 @@ void MainWindow::removeLastDevice() // ui->tabChannels->removeTab(ui->tabChannels->count() - 1); m_deviceWidgetTabs.removeLast(); - restoreDeviceTabs(); + // restoreDeviceTabs(); DeviceAPI *mimoAPI = m_deviceUIs.back()->m_deviceAPI; delete m_deviceUIs.back(); @@ -740,36 +962,6 @@ void MainWindow::deleteChannel(int deviceSetIndex, int channelIndex) } } -void MainWindow::addViewAction(QAction* action) -{ - // ui->menu_Window->addAction(action); -} - -void MainWindow::setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, int deviceType) -{ - QString tabName; - - if (deviceType == 0) { - tabName = tr("R%1").arg(deviceTabIndex); - } else if (deviceType == 1) { - tabName = tr("T%1").arg(deviceTabIndex); - } else if (deviceType == 2) { - tabName = tr("M%1").arg(deviceTabIndex); - } - - qDebug("MainWindow::setDeviceGUI: insert device type %d tab at %d", deviceType, deviceTabIndex); - - if (deviceTabIndex < m_deviceWidgetTabs.size()) { - m_deviceWidgetTabs[deviceTabIndex] = {gui, deviceDisplayName, tabName}; - } else { - m_deviceWidgetTabs.append({gui, deviceDisplayName, tabName}); - } - - restoreDeviceTabs(); - - // ui->tabInputsView->setCurrentIndex(deviceTabIndex); -} - void MainWindow::loadSettings() { qDebug() << "MainWindow::loadSettings"; @@ -1154,45 +1346,6 @@ QTreeWidgetItem* MainWindow::addPresetToTree(const Preset* preset) return nullptr; } -QTreeWidgetItem* MainWindow::addCommandToTree(const Command* command) -{ - // QTreeWidgetItem* group = 0; - - // for(int i = 0; i < ui->commandTree->topLevelItemCount(); i++) - // { - // if(ui->commandTree->topLevelItem(i)->text(0) == command->getGroup()) - // { - // group = ui->commandTree->topLevelItem(i); - // break; - // } - // } - - // if(group == 0) - // { - // QStringList sl; - // sl.append(command->getGroup()); - // group = new QTreeWidgetItem(ui->commandTree, sl, PGroup); - // group->setFirstColumnSpanned(true); - // group->setExpanded(true); - // ui->commandTree->sortByColumn(0, Qt::AscendingOrder); - // } - - // QStringList sl; - // sl.append(QString("%1").arg(command->getDescription())); // Descriptions column - // sl.append(QString("%1").arg(command->getAssociateKey() ? command->getRelease() ? "R" : "P" : "-")); // key press/release column - // sl.append(QString("%1").arg(command->getKeyLabel())); // key column - // CommandItem* item = new CommandItem(group, sl, command->getDescription(), PItem); - // item->setData(0, Qt::UserRole, QVariant::fromValue(command)); - // item->setTextAlignment(0, Qt::AlignLeft); - // ui->commandTree->resizeColumnToContents(0); // Resize description column to minimum - // ui->commandTree->resizeColumnToContents(1); // Resize key column to minimum - // ui->commandTree->resizeColumnToContents(2); // Resize key press/release column to minimum - - // //updatePresetControls(); - // return item; - return nullptr; -} - void MainWindow::applySettings() { // loadPresetSettings(m_mainCore->m_settings.getWorkingPreset(), 0); @@ -1216,9 +1369,9 @@ void MainWindow::applySettings() // m_mainCore->m_settings.sortCommands(); // ui->commandTree->clear(); - for (int i = 0; i < m_mainCore->m_settings.getCommandCount(); ++i) { - treeItem = addCommandToTree(m_mainCore->m_settings.getCommand(i)); - } + // for (int i = 0; i < m_mainCore->m_settings.getCommandCount(); ++i) { + // treeItem = addCommandToTree(m_mainCore->m_settings.getCommand(i)); + // } m_mainCore->setLoggingOptions(); } @@ -1302,12 +1455,15 @@ bool MainWindow::handleMessage(const Message& cmd) MainCore::MsgAddDeviceSet& notif = (MainCore::MsgAddDeviceSet&) cmd; int direction = notif.getDirection(); + // TODO: implement add workspace API. Will have to give the workspace index that will be ignored + // in Server flavor. Set nullptr for workspace if index is out of bonds + if (direction == 1) { // Single stream Tx - addSinkDevice(); + sampleSinkAdd(nullptr, -1); // create with file output device by default } else if (direction == 0) { // Single stream Rx - addSourceDevice(-1); // create with file source device by default + sampleSourceAdd(nullptr, -1); // create with file input device by default } else if (direction == 2) { // MIMO - addMIMODevice(); + sampleMIMOAdd(nullptr, -1); // create with testMI MIMO device y default } return true; @@ -1323,9 +1479,11 @@ bool MainWindow::handleMessage(const Message& cmd) else if (MainCore::MsgSetDevice::match(cmd)) { MainCore::MsgSetDevice& notif = (MainCore::MsgSetDevice&) cmd; - // ui->tabInputsView->setCurrentIndex(notif.getDeviceSetIndex()); - // ui->inputViewDock->setSelectedDeviceIndex(notif.getDeviceSetIndex(), notif.getDeviceIndex()); - samplingDeviceChanged(notif.getDeviceType(), notif.getDeviceSetIndex(), notif.getDeviceIndex()); + + // TODO: implement add workspace API. Will have to give the workspace index that will be ignored + // in Server flavor. Set nullptr for workspace if index is out of bonds + + sampleDeviceChange(notif.getDeviceType(), notif.getDeviceSetIndex(), notif.getDeviceIndex(), nullptr); return true; } @@ -1450,6 +1608,27 @@ void MainWindow::addWorkspace() m_workspaces.back()->addAvailableFeatures(featureNames); this->addDockWidget(Qt::LeftDockWidgetArea, m_workspaces.back()); + QObject::connect( + m_workspaces.back(), + &Workspace::addRxDevice, + this, + &MainWindow::sampleSourceAdd + ); + + QObject::connect( + m_workspaces.back(), + &Workspace::addTxDevice, + this, + &MainWindow::sampleSinkAdd + ); + + QObject::connect( + m_workspaces.back(), + &Workspace::addMIMODevice, + this, + &MainWindow::sampleMIMOAdd + ); + QObject::connect( m_workspaces.back(), &Workspace::addFeature, @@ -1975,15 +2154,6 @@ void MainWindow::fftWisdomProcessFinished(int exitCode, QProcess::ExitStatus exi m_fftWisdomProcess = nullptr; } -// void MainWindow::toggleSpectrumView(bool checked) -// { - // if (checked) { - // ui->centralWidget->show(); - // } else { - // ui->centralWidget->hide(); - // } -// } - void MainWindow::on_action_AMBE_triggered() { qDebug("MainWindow::on_action_AMBE_triggered"); @@ -2004,315 +2174,87 @@ void MainWindow::on_action_LimeRFE_triggered() #endif } -void MainWindow::samplingDeviceChanged(int deviceType, int tabIndex, int newDeviceIndex) +void MainWindow::sampleDeviceChangeHandler(DeviceGUI *deviceGUI, int newDeviceIndex) { - qDebug("MainWindow::samplingDeviceChanged: deviceType: %d tabIndex: %d newDeviceIndex: %d", - deviceType, tabIndex, newDeviceIndex); - - if (deviceType == 0) { - sampleSourceChanged(tabIndex, newDeviceIndex); - } else if (deviceType == 1) { - sampleSinkChanged(tabIndex, newDeviceIndex); - } else if (deviceType == 2) { - sampleMIMOChanged(tabIndex, newDeviceIndex); - } - - emit MainCore::instance()->deviceChanged(tabIndex); + int deviceType = (int) deviceGUI->getDeviceType(); + int deviceSetIndex = deviceGUI->getIndex(); + Workspace *workspace = m_workspaces[deviceGUI->getWorkspaceIndex()]; + sampleDeviceChange(deviceType, deviceSetIndex, newDeviceIndex, workspace); } -void MainWindow::sampleSourceChanged(int tabIndex, int newDeviceIndex) +void MainWindow::sampleDeviceChange(int deviceType, int deviceSetIndex, int newDeviceIndex, Workspace *workspace) { - if (tabIndex >= 0) + qDebug("MainWindow::sampleDeviceChange: deviceType: %d deviceSetIndex: %d newDeviceIndex: %d", + deviceType, deviceSetIndex, newDeviceIndex); + if (deviceType == 0) { + sampleSourceChange(deviceSetIndex, newDeviceIndex, workspace); + } else if (deviceType == 1) { + sampleSinkChange(deviceSetIndex, newDeviceIndex, workspace); + } else if (deviceType == 2) { + sampleMIMOChange(deviceSetIndex, newDeviceIndex, workspace); + } + + emit MainCore::instance()->deviceChanged(deviceSetIndex); +} + +void MainWindow::sampleSourceChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace) +{ + if (deviceSetIndex >= 0) { - qDebug("MainWindow::sampleSourceChanged: tab at %d", tabIndex); - DeviceUISet *deviceUI = m_deviceUIs[tabIndex]; - deviceUI->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings - deviceUI->m_deviceAPI->stopDeviceEngine(); + qDebug("MainWindow::sampleSourceChange: deviceSet %d workspace: %d", deviceSetIndex, workspace->getIndex()); + DeviceUISet *deviceUISet = m_deviceUIs[deviceSetIndex]; + DeviceGUI *gui = deviceUISet->m_deviceGUI; + workspace->removeFromMdiArea(gui); + // deviceUI->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings + deviceUISet->m_deviceAPI->stopDeviceEngine(); // deletes old UI and input object - deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(nullptr); // have source stop sending messages to the GUI - m_deviceUIs[tabIndex]->m_deviceGUI->destroy(); - deviceUI->m_deviceAPI->resetSamplingDeviceId(); - deviceUI->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(deviceUI->m_deviceAPI->getSampleSource()); - deviceUI->m_deviceAPI->clearBuddiesLists(); // clear old API buddies lists + deviceUISet->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(nullptr); // have source stop sending messages to the GUI + //deviceUISet->m_deviceGUI->destroy(); + deviceUISet->m_deviceAPI->resetSamplingDeviceId(); + deviceUISet->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(deviceUISet->m_deviceAPI->getSampleSource()); + deviceUISet->m_deviceAPI->clearBuddiesLists(); // clear old API buddies lists - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(newDeviceIndex); - qDebug("MainWindow::sampleSourceChanged: %s", qPrintable(samplingDevice->hardwareId)); - - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(newDeviceIndex)); - - qDebug() << "MainWindow::sampleSourceChanged:" - << "newDeviceIndex:" << newDeviceIndex - << "hardwareId:" << samplingDevice->hardwareId - << "sequence:" << samplingDevice->sequence - << "id:" << samplingDevice->id - << "serial:" << samplingDevice->serial - << "displayedName:" << samplingDevice->displayedName; - - if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default - { - qDebug("MainWindow::sampleSourceChanged: non existent device replaced by File Input"); - int fileInputDeviceIndex = DeviceEnumerator::instance()->getFileInputDeviceIndex(); - samplingDevice = DeviceEnumerator::instance()->getRxSamplingDevice(fileInputDeviceIndex); - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(fileInputDeviceIndex)); - } - - QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); - - if (userArgs.size() > 0) { - deviceUI->m_deviceAPI->setHardwareUserArguments(userArgs); - } - - // add to buddies list - std::vector::iterator it = m_deviceUIs.begin(); - int nbOfBuddies = 0; - - for (; it != m_deviceUIs.end(); ++it) - { - if (*it != deviceUI) // do not add to itself - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((deviceUI->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && - (deviceUI->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) - { - (*it)->m_deviceAPI->addSourceBuddy(deviceUI->m_deviceAPI); - nbOfBuddies++; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((deviceUI->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && - (deviceUI->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) - { - (*it)->m_deviceAPI->addSourceBuddy(deviceUI->m_deviceAPI); - nbOfBuddies++; - } - } - } - } - - if (nbOfBuddies == 0) { - deviceUI->m_deviceAPI->setBuddyLeader(true); - } - - // constructs new GUI and input object - DeviceSampleSource *source = deviceUI->m_deviceAPI->getPluginInterface()->createSampleSourcePluginInstance( - deviceUI->m_deviceAPI->getSamplingDeviceId(), deviceUI->m_deviceAPI); - deviceUI->m_deviceAPI->setSampleSource(source); - QWidget *gui; - DeviceGUI *pluginGUI = deviceUI->m_deviceAPI->getPluginInterface()->createSampleSourcePluginInstanceGUI( - deviceUI->m_deviceAPI->getSamplingDeviceId(), - &gui, - deviceUI); - deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - deviceUI->m_deviceGUI = pluginGUI; - setDeviceGUI(tabIndex, gui, deviceUI->m_deviceAPI->getSamplingDeviceDisplayName()); - deviceUI->m_deviceAPI->getSampleSource()->init(); - - deviceUI->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings - - if (tabIndex == 0) // save as default starting device - { - qDebug("MainWindow::sampleSourceChanged: save default starting device %s[%d:%d]", - qPrintable(samplingDevice->id), samplingDevice->sequence, samplingDevice->deviceItemIndex); - m_mainCore->m_settings.setSourceIndex(samplingDevice->sequence); - m_mainCore->m_settings.setSourceDevice(samplingDevice->id); - m_mainCore->m_settings.setSourceItemIndex(samplingDevice->deviceItemIndex); - } + sampleSourceImplement(deviceSetIndex, newDeviceIndex, deviceUISet->m_deviceAPI, deviceUISet, workspace); } } -void MainWindow::sampleSinkChanged(int tabIndex, int newDeviceIndex) +void MainWindow::sampleSinkChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace) { - if (tabIndex >= 0) + if (deviceSetIndex >= 0) { - qDebug("MainWindow::sampleSinkChanged: tab at %d", tabIndex); - DeviceUISet *deviceUI = m_deviceUIs[tabIndex]; - deviceUI->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings - deviceUI->m_deviceAPI->stopDeviceEngine(); + qDebug("MainWindow::sampleSinkChange: deviceSet %d workspace: %d", deviceSetIndex, workspace->getIndex()); + DeviceUISet *deviceUISet = m_deviceUIs[deviceSetIndex]; + deviceUISet->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings + deviceUISet->m_deviceAPI->stopDeviceEngine(); // deletes old UI and output object - deviceUI->m_deviceAPI->getSampleSink()->setMessageQueueToGUI(nullptr); // have sink stop sending messages to the GUI - m_deviceUIs[tabIndex]->m_deviceGUI->destroy(); - deviceUI->m_deviceAPI->resetSamplingDeviceId(); - deviceUI->m_deviceAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput(deviceUI->m_deviceAPI->getSampleSink()); - deviceUI->m_deviceAPI->clearBuddiesLists(); // clear old API buddies lists + deviceUISet->m_deviceAPI->getSampleSink()->setMessageQueueToGUI(nullptr); // have sink stop sending messages to the GUI + // m_deviceUIs[deviceSetIndex]->m_deviceGUI->destroy(); + deviceUISet->m_deviceAPI->resetSamplingDeviceId(); + deviceUISet->m_deviceAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput(deviceUISet->m_deviceAPI->getSampleSink()); + deviceUISet->m_deviceAPI->clearBuddiesLists(); // clear old API buddies lists - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(newDeviceIndex); - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(newDeviceIndex)); - - qDebug() << "MainWindow::sampleSinkChanged:" - << "newDeviceIndex:" << newDeviceIndex - << "hardwareId:" << samplingDevice->hardwareId - << "sequence:" << samplingDevice->sequence - << "id:" << samplingDevice->id - << "serial:" << samplingDevice->serial - << "displayedName:" << samplingDevice->displayedName; - - if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default - { - qDebug("MainWindow::sampleSinkChanged: non existent device replaced by File Sink"); - int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileOutputDeviceIndex(); - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex); - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(fileSinkDeviceIndex)); - } - - QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); - - if (userArgs.size() > 0) { - deviceUI->m_deviceAPI->setHardwareUserArguments(userArgs); - } - - // add to buddies list - std::vector::iterator it = m_deviceUIs.begin(); - int nbOfBuddies = 0; - - for (; it != m_deviceUIs.end(); ++it) - { - if (*it != deviceUI) // do not add to itself - { - if ((*it)->m_deviceSourceEngine) // it is a source device - { - if ((deviceUI->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && - (deviceUI->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) - { - (*it)->m_deviceAPI->addSinkBuddy(deviceUI->m_deviceAPI); - nbOfBuddies++; - } - } - - if ((*it)->m_deviceSinkEngine) // it is a sink device - { - if ((deviceUI->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) && - (deviceUI->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial())) - { - (*it)->m_deviceAPI->addSinkBuddy(deviceUI->m_deviceAPI); - nbOfBuddies++; - } - } - } - } - - if (nbOfBuddies == 0) { - deviceUI->m_deviceAPI->setBuddyLeader(true); - } - - // constructs new GUI and output object - DeviceSampleSink *sink = deviceUI->m_deviceAPI->getPluginInterface()->createSampleSinkPluginInstance( - deviceUI->m_deviceAPI->getSamplingDeviceId(), deviceUI->m_deviceAPI); - deviceUI->m_deviceAPI->setSampleSink(sink); - QWidget *gui; - DeviceGUI *pluginGUI = deviceUI->m_deviceAPI->getPluginInterface()->createSampleSinkPluginInstanceGUI( - deviceUI->m_deviceAPI->getSamplingDeviceId(), - &gui, - deviceUI); - deviceUI->m_deviceAPI->getSampleSink()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - deviceUI->m_deviceGUI = pluginGUI; - setDeviceGUI(tabIndex, gui, deviceUI->m_deviceAPI->getSamplingDeviceDisplayName(), 1); - deviceUI->m_deviceAPI->getSampleSink()->init(); - - deviceUI->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + sampleSinkImplement(deviceSetIndex, newDeviceIndex, deviceUISet->m_deviceAPI, deviceUISet, workspace); } } -void MainWindow::sampleMIMOChanged(int tabIndex, int newDeviceIndex) +void MainWindow::sampleMIMOChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace) { - if (tabIndex >= 0) + if (deviceSetIndex >= 0) { - qDebug("MainWindow::sampleMIMOChanged: tab at %d", tabIndex); - DeviceUISet *deviceUI = m_deviceUIs[tabIndex]; - deviceUI->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings - deviceUI->m_deviceAPI->stopDeviceEngine(); + qDebug("MainWindow::sampleSinkChange: deviceSet %d workspace: %d", deviceSetIndex, workspace->getIndex()); + DeviceUISet *deviceUISet = m_deviceUIs[deviceSetIndex]; + deviceUISet->m_deviceAPI->saveSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // save old API settings + deviceUISet->m_deviceAPI->stopDeviceEngine(); // deletes old UI and output object - deviceUI->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(nullptr); // have sink stop sending messages to the GUI - m_deviceUIs[tabIndex]->m_deviceGUI->destroy(); - deviceUI->m_deviceAPI->resetSamplingDeviceId(); - deviceUI->m_deviceAPI->getPluginInterface()->deleteSampleMIMOPluginInstanceMIMO(deviceUI->m_deviceAPI->getSampleMIMO()); + deviceUISet->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(nullptr); // have sink stop sending messages to the GUI + // m_deviceUIs[tabIndex]->m_deviceGUI->destroy(); + deviceUISet->m_deviceAPI->resetSamplingDeviceId(); + deviceUISet->m_deviceAPI->getPluginInterface()->deleteSampleMIMOPluginInstanceMIMO(deviceUISet->m_deviceAPI->getSampleMIMO()); - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(newDeviceIndex); - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(newDeviceIndex)); - qDebug() << "MainWindow::sampleMIMOChanged:" - << "newDeviceIndex:" << newDeviceIndex - << "hardwareId:" << samplingDevice->hardwareId - << "sequence:" << samplingDevice->sequence - << "id:" << samplingDevice->id - << "serial:" << samplingDevice->serial - << "displayedName:" << samplingDevice->displayedName; - - if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default - { - qDebug("MainWindow::sampleMIMOChanged: non existent device replaced by Test MIMO"); - int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex(); - const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex); - deviceUI->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); - deviceUI->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); - deviceUI->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); - deviceUI->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); - deviceUI->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); - deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); - deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); - deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex)); - } - - QString userArgs = m_mainCore->m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); - - if (userArgs.size() > 0) { - deviceUI->m_deviceAPI->setHardwareUserArguments(userArgs); - } - - // constructs new GUI and MIMO object - DeviceSampleMIMO *mimo = deviceUI->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance( - deviceUI->m_deviceAPI->getSamplingDeviceId(), deviceUI->m_deviceAPI); - deviceUI->m_deviceAPI->setSampleMIMO(mimo); - QWidget *gui; - DeviceGUI *pluginGUI = deviceUI->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstanceGUI( - deviceUI->m_deviceAPI->getSamplingDeviceId(), - &gui, - deviceUI); - deviceUI->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(pluginGUI->getInputMessageQueue()); - deviceUI->m_deviceGUI = pluginGUI; - setDeviceGUI(tabIndex, gui, deviceUI->m_deviceAPI->getSamplingDeviceDisplayName(), 2); - deviceUI->m_deviceAPI->getSampleMIMO()->init(); - - deviceUI->m_deviceAPI->loadSamplingDeviceSettings(m_mainCore->m_settings.getWorkingPreset()); // load new API settings + sampleMIMOImplement(deviceSetIndex, deviceSetIndex, deviceUISet->m_deviceAPI, deviceUISet, workspace); } } @@ -2428,6 +2370,19 @@ void MainWindow::featureMove(FeatureGUI *gui, int wsIndexDestnation) m_workspaces[wsIndexDestnation]->addToMdiArea(gui); } +void MainWindow::deviceMove(DeviceGUI *gui, int wsIndexDestnation) +{ + int wsIndexOrigin = gui->getWorkspaceIndex(); + + if (wsIndexOrigin == wsIndexDestnation) { + return; + } + + m_workspaces[wsIndexOrigin]->removeFromMdiArea(gui); + gui->setWorkspaceIndex(wsIndexDestnation); + m_workspaces[wsIndexDestnation]->addToMdiArea(gui); +} + void MainWindow::openFeaturePresetsDialog(QPoint p, Workspace *workspace) { FeaturePresetsDialog dialog; @@ -2470,25 +2425,6 @@ void MainWindow::on_action_About_triggered() dlg.exec(); } -void MainWindow::on_action_addSourceDevice_triggered() -{ - addSourceDevice(-1); // create with file source device by default -} - -void MainWindow::on_action_addSinkDevice_triggered() -{ - addSinkDevice(); -} - -void MainWindow::on_action_addMIMODevice_triggered() -{ - if (m_dspEngine->getMIMOSupport()) { - addMIMODevice(); - } else { - QMessageBox::information(this, tr("Message"), tr("MIMO not supported in this version")); - } -} - void MainWindow::on_action_removeLastDevice_triggered() { if (m_deviceUIs.size() > 1) @@ -2563,12 +2499,6 @@ void MainWindow::tabChannelsIndexChanged() // } } -void MainWindow::tabFeaturesIndexChanged() -{ - // int featuresTabIndex = ui->tabFeatures->currentIndex(); - // ui->featureDock->setFeatureUISet(m_featureUIs[featuresTabIndex]); -} - void MainWindow::updateStatus() { m_dateTimeWidget->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss t")); @@ -2593,15 +2523,3 @@ void MainWindow::commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifie } } } - -void MainWindow::restoreDeviceTabs() -{ - // ui->tabInputsView->clear(); - - // for (int i = 0; i < m_deviceWidgetTabs.size(); i++) - // { - // qDebug("MainWindow::restoreDeviceTabs: adding tab for %s", qPrintable(m_deviceWidgetTabs[i].displayName)); - // ui->tabInputsView->addTab(m_deviceWidgetTabs[i].gui, m_deviceWidgetTabs[i].tabName); - // ui->tabInputsView->setTabToolTip(i, m_deviceWidgetTabs[i].displayName); - // } -} diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h index 0481bc8e0..65d2673b8 100644 --- a/sdrgui/mainwindow.h +++ b/sdrgui/mainwindow.h @@ -72,7 +72,6 @@ public: ~MainWindow(); static MainWindow *getInstance() { return m_instance; } // Main Window is de facto a singleton so this just returns its reference MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; } - void addViewAction(QAction* action); const PluginManager *getPluginManager() const { return m_pluginManager; } std::vector& getDeviceUISets() { return m_deviceUIs; } void commandKeysConnect(QObject *object, const char *slot); @@ -135,25 +134,41 @@ private: void closeEvent(QCloseEvent*); void updatePresetControls(); QTreeWidgetItem* addPresetToTree(const Preset* preset); - QTreeWidgetItem* addCommandToTree(const Command* command); void applySettings(); - void setDeviceGUI(int deviceTabIndex, QWidget* gui, const QString& deviceDisplayName, int deviceType = 0); - void addSourceDevice(int deviceIndex); - void addSinkDevice(); - void addMIMODevice(); void removeLastDevice(); void addFeatureSet(); void removeFeatureSet(unsigned int tabIndex); void removeAllFeatureSets(); void deleteChannel(int deviceSetIndex, int channelIndex); - void sampleSourceChanged(int tabIndex, int newDeviceIndex); - void sampleSinkChanged(int tabIndex, int newDeviceIndex); - void sampleMIMOChanged(int tabIndex, int newDeviceIndex); + void sampleDeviceChange(int deviceType, int deviceSetIndex, int newDeviceIndex, Workspace *workspace); + void sampleSourceChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace); + void sampleSinkChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace); + void sampleMIMOChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace); + void sampleSourceImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace + ); + void sampleSinkImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace + ); + void sampleMIMOImplement( + int deviceSetIndex, + int deviceIndex, + DeviceAPI *deviceAPI, + DeviceUISet *deviceUISet, + Workspace *workspace + ); void deleteFeature(int featureSetIndex, int featureIndex); bool handleMessage(const Message& cmd); - void restoreDeviceTabs(); private slots: void handleMessages(); @@ -164,6 +179,10 @@ private slots: void removeEmptyWorkspaces(); void loadConfiguration(const Configuration *configuration); void saveConfiguration(Configuration *configuration); + void sampleSourceAdd(Workspace *workspace, int deviceIndex); + void sampleSinkAdd(Workspace *workspace, int deviceIndex); + void sampleMIMOAdd(Workspace *workspace, int deviceIndex); + void sampleDeviceChangeHandler(DeviceGUI *deviceGUI, int newDeviceIndex); void on_action_View_Fullscreen_toggled(bool checked); void on_presetSave_clicked(); @@ -185,27 +204,22 @@ private slots: void on_action_My_Position_triggered(); void on_action_DeviceUserArguments_triggered(); void on_action_commands_triggered(); - void samplingDeviceChanged(int deviceType, int tabIndex, int newDeviceIndex); void channelAddClicked(int channelIndex); void featureAddClicked(Workspace *workspace, int featureIndex); void featureMove(FeatureGUI *gui, int wsIndexDestnation); void openFeaturePresetsDialog(QPoint p, Workspace *workspace); + void deviceMove(DeviceGUI *gui, int wsIndexDestnation); void on_action_Quick_Start_triggered(); void on_action_Main_Window_triggered(); void on_action_Loaded_Plugins_triggered(); void on_action_About_triggered(); - void on_action_addSourceDevice_triggered(); - void on_action_addSinkDevice_triggered(); - void on_action_addMIMODevice_triggered(); void on_action_removeLastDevice_triggered(); void on_action_addFeatureSet_triggered(); void on_action_removeLastFeatureSet_triggered(); void tabInputViewIndexChanged(); void tabChannelsIndexChanged(); - void tabFeaturesIndexChanged(); void commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifiers, bool release); void fftWisdomProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); - // void toggleSpectrumView(bool checked); }; #endif // INCLUDE_MAINWINDOW_H