From b9587273d84a70b33ac991a7949b6199caf9e15f Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 17 Apr 2018 00:25:19 +0200 Subject: [PATCH] LimeSDR input: implemented transverter shift --- .../limesdrinput/limesdrinput.cpp | 28 ++++++++++--- .../limesdrinput/limesdrinputgui.cpp | 35 ++++++++++++---- .../limesdrinput/limesdrinputgui.h | 3 +- .../limesdrinput/limesdrinputgui.ui | 34 ++++++++------- .../limesdrinput/limesdrinputsettings.cpp | 6 +++ .../limesdrinput/limesdrinputsettings.h | 2 + sdrbase/resources/webapi/doc/html2/index.html | 9 +++- .../webapi/doc/swagger/include/LimeSdr.yaml | 5 +++ .../sdrangel/api/swagger/include/LimeSdr.yaml | 5 +++ swagger/sdrangel/code/html2/index.html | 9 +++- .../qt5/client/SWGLimeSdrInputSettings.cpp | 42 +++++++++++++++++++ .../code/qt5/client/SWGLimeSdrInputSettings.h | 12 ++++++ 12 files changed, 159 insertions(+), 31 deletions(-) diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index 18e44da12..5f4810cbf 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -735,6 +735,10 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc double clockGenFreq = 0.0; // QMutexLocker mutexLocker(&m_mutex); + qint64 deviceCenterFrequency = settings.m_centerFrequency; + deviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0; + deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency; + if (LMS_GetClockFreq(m_deviceShared.m_deviceParams->getDevice(), LMS_CLOCK_CGEN, &clockGenFreq) != 0) { qCritical("LimeSDRInput::applySettings: could not get clock gen frequency"); @@ -1016,21 +1020,24 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc } } - if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || setAntennaAuto || force) + if ((m_settings.m_centerFrequency != settings.m_centerFrequency) + || (m_settings.m_transverterMode != settings.m_transverterMode) + || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) + || setAntennaAuto || force) { forwardChangeRxDSP = true; if (m_deviceShared.m_deviceParams->getDevice() != 0 && m_channelAcquired) { - if (LMS_SetClockFreq(m_deviceShared.m_deviceParams->getDevice(), LMS_CLOCK_SXR, settings.m_centerFrequency) < 0) + if (LMS_SetClockFreq(m_deviceShared.m_deviceParams->getDevice(), LMS_CLOCK_SXR, deviceCenterFrequency) < 0) { - qCritical("LimeSDRInput::applySettings: could not set frequency to %lu", settings.m_centerFrequency); + qCritical("LimeSDRInput::applySettings: could not set frequency to %lld", deviceCenterFrequency); } else { doCalibration = true; - m_deviceShared.m_centerFrequency = settings.m_centerFrequency; // for buddies - qDebug("LimeSDRInput::applySettings: frequency set to %lu", settings.m_centerFrequency); + m_deviceShared.m_centerFrequency = deviceCenterFrequency; // for buddies + qDebug("LimeSDRInput::applySettings: frequency set to %lld", deviceCenterFrequency); } } } @@ -1217,6 +1224,9 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc QLocale loc; qDebug().noquote() << "LimeSDRInput::applySettings: center freq: " << m_settings.m_centerFrequency << " Hz" + << " m_transverterMode: " << m_settings.m_transverterMode + << " m_transverterDeltaFrequency: " << m_settings.m_transverterDeltaFrequency + << " deviceCenterFrequency: " << deviceCenterFrequency << " device stream sample rate: " << loc.toString(m_settings.m_devSampleRate) << "S/s" << " sample rate with soft decimation: " << loc.toString( m_settings.m_devSampleRate/(1<getTiaGain(); } + if (deviceSettingsKeys.contains("transverterDeltaFrequency")) { + settings.m_transverterDeltaFrequency = response.getLimeSdrInputSettings()->getTransverterDeltaFrequency(); + } + if (deviceSettingsKeys.contains("transverterMode")) { + settings.m_transverterMode = response.getLimeSdrInputSettings()->getTransverterMode() != 0; + } MsgConfigureLimeSDR *msg = MsgConfigureLimeSDR::create(settings, force); m_inputMessageQueue.push(msg); @@ -1349,6 +1365,8 @@ void LimeSDRInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re response.getLimeSdrInputSettings()->setNcoFrequency(settings.m_ncoFrequency); response.getLimeSdrInputSettings()->setPgaGain(settings.m_pgaGain); response.getLimeSdrInputSettings()->setTiaGain(settings.m_tiaGain); + response.getLimeSdrInputSettings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency); + response.getLimeSdrInputSettings()->setTransverterMode(settings.m_transverterMode ? 1 : 0); } int LimeSDRInput::webapiRunGet( diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp index 911de2900..10a930672 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -242,6 +242,23 @@ bool LimeSDRInputGUI::handleMessage(const Message& message) } } +void LimeSDRInputGUI::updateFrequencyLimits() +{ + // values in kHz + float minF, maxF; + qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0; + m_limeSDRInput->getLORange(minF, maxF); + qint64 minLimit = minF/1000 + deltaFrequency; + qint64 maxLimit = maxF/1000 + deltaFrequency; + + minLimit = minLimit < 0 ? 0 : minLimit > 9999999 ? 9999999 : minLimit; + maxLimit = maxLimit < 0 ? 0 : maxLimit > 9999999 ? 9999999 : maxLimit; + + qDebug("LimeSDRInputGUI::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit); + + ui->centerFrequency->setValueRange(7, minLimit, maxLimit); +} + void LimeSDRInputGUI::handleInputMessages() { Message* message; @@ -504,13 +521,6 @@ void LimeSDRInputGUI::on_ncoEnable_toggled(bool checked) sendSettings(); } -void LimeSDRInputGUI::on_ncoReset_clicked(bool checked __attribute__((unused))) -{ - m_settings.m_ncoFrequency = 0; - ui->ncoFrequency->setValue(0); - sendSettings(); -} - void LimeSDRInputGUI::on_dcOffset_toggled(bool checked) { m_settings.m_dcBlock = checked; @@ -632,3 +642,14 @@ void LimeSDRInputGUI::on_extClock_clicked() sendSettings(); } +void LimeSDRInputGUI::on_transverter_clicked() +{ + m_settings.m_transverterMode = ui->transverter->getDeltaFrequencyAcive(); + m_settings.m_transverterDeltaFrequency = ui->transverter->getDeltaFrequency(); + qDebug("LimeSDRInputGUI::on_transverter_clicked: %lld Hz %s", m_settings.m_transverterDeltaFrequency, m_settings.m_transverterMode ? "on" : "off"); + updateFrequencyLimits(); + setCenterFrequencySetting(ui->centerFrequency->getValueNew()); + sendSettings(); +} + + diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h index b8966d5ba..9c44963da 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.h +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -75,6 +75,7 @@ private: void updateSampleRateAndFrequency(); void updateADCRate(); void blockApplySettings(bool block); + void updateFrequencyLimits(); private slots: void handleInputMessages(); @@ -83,7 +84,6 @@ private slots: void on_centerFrequency_changed(quint64 value); void on_ncoFrequency_changed(qint64 value); void on_ncoEnable_toggled(bool checked); - void on_ncoReset_clicked(bool checked); void on_dcOffset_toggled(bool checked); void on_iqImbalance_toggled(bool checked); void on_sampleRate_changed(quint64 value); @@ -99,6 +99,7 @@ private slots: void on_pgaGain_valueChanged(int value); void on_antenna_currentIndexChanged(int index); void on_extClock_clicked(); + void on_transverter_clicked(); void updateHardware(); void updateStatus(); diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.ui b/plugins/samplesource/limesdrinput/limesdrinputgui.ui index 3c493322c..928c56fb7 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.ui +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.ui @@ -230,22 +230,6 @@ - - - - - 22 - 22 - - - - Reset the NCO to zero frequency - - - R - - - @@ -316,6 +300,19 @@ + + + + + 24 + 24 + + + + X + + + @@ -1176,6 +1173,11 @@ QToolTip{background-color: white; color: black;}
gui/valuedialz.h
1 + + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp b/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp index 025ce48f5..34f053d3b 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputsettings.cpp @@ -43,6 +43,8 @@ void LimeSDRInputSettings::resetToDefaults() m_pgaGain = 16; m_extClock = false; m_extClockFreq = 10000000; // 10 MHz + m_transverterMode = false; + m_transverterDeltaFrequency = 0; } QByteArray LimeSDRInputSettings::serialize() const @@ -67,6 +69,8 @@ QByteArray LimeSDRInputSettings::serialize() const s.writeU32(17, m_pgaGain); s.writeBool(18, m_extClock); s.writeU32(19, m_extClockFreq); + s.writeBool(20, m_transverterMode); + s.writeS64(21, m_transverterDeltaFrequency); return s.final(); } @@ -105,6 +109,8 @@ bool LimeSDRInputSettings::deserialize(const QByteArray& data) d.readU32(17, &m_pgaGain, 16); d.readBool(18, &m_extClock, false); d.readU32(19, &m_extClockFreq, 10000000); + d.readBool(20, &m_transverterMode, false); + d.readS64(21, &m_transverterDeltaFrequency, 0); return true; } diff --git a/plugins/samplesource/limesdrinput/limesdrinputsettings.h b/plugins/samplesource/limesdrinput/limesdrinputsettings.h index e129af9c9..a82638954 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputsettings.h +++ b/plugins/samplesource/limesdrinput/limesdrinputsettings.h @@ -62,6 +62,8 @@ struct LimeSDRInputSettings uint32_t m_pgaGain; //!< Manual PGA gain bool m_extClock; //!< True if external clock source uint32_t m_extClockFreq; //!< Frequency (Hz) of external clock source + bool m_transverterMode; + qint64 m_transverterDeltaFrequency; LimeSDRInputSettings(); void resetToDefaults(); diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index c66efd72b..b8d1ee6b1 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -1681,6 +1681,13 @@ margin-bottom: 20px; }, "extClockFreq" : { "type" : "integer" + }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" } }, "description" : "LimeSDR" @@ -20629,7 +20636,7 @@ except ApiException as e:
- Generated 2018-04-15T11:16:57.480+02:00 + Generated 2018-04-17T00:16:15.209+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml b/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml index 532b36fd5..0d30f5ed4 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml @@ -40,6 +40,11 @@ LimeSdrInputSettings: type: integer extClockFreq: type: integer + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 LimeSdrOutputSettings: description: LimeSDR diff --git a/swagger/sdrangel/api/swagger/include/LimeSdr.yaml b/swagger/sdrangel/api/swagger/include/LimeSdr.yaml index 532b36fd5..0d30f5ed4 100644 --- a/swagger/sdrangel/api/swagger/include/LimeSdr.yaml +++ b/swagger/sdrangel/api/swagger/include/LimeSdr.yaml @@ -40,6 +40,11 @@ LimeSdrInputSettings: type: integer extClockFreq: type: integer + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 LimeSdrOutputSettings: description: LimeSDR diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index c66efd72b..b8d1ee6b1 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -1681,6 +1681,13 @@ margin-bottom: 20px; }, "extClockFreq" : { "type" : "integer" + }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" } }, "description" : "LimeSDR" @@ -20629,7 +20636,7 @@ except ApiException as e:
- Generated 2018-04-15T11:16:57.480+02:00 + Generated 2018-04-17T00:16:15.209+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.cpp index b010a7ef1..bffdd5215 100644 --- a/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.cpp @@ -66,6 +66,10 @@ SWGLimeSdrInputSettings::SWGLimeSdrInputSettings() { m_ext_clock_isSet = false; ext_clock_freq = 0; m_ext_clock_freq_isSet = false; + transverter_mode = 0; + m_transverter_mode_isSet = false; + transverter_delta_frequency = 0L; + m_transverter_delta_frequency_isSet = false; } SWGLimeSdrInputSettings::~SWGLimeSdrInputSettings() { @@ -112,6 +116,10 @@ SWGLimeSdrInputSettings::init() { m_ext_clock_isSet = false; ext_clock_freq = 0; m_ext_clock_freq_isSet = false; + transverter_mode = 0; + m_transverter_mode_isSet = false; + transverter_delta_frequency = 0L; + m_transverter_delta_frequency_isSet = false; } void @@ -134,6 +142,8 @@ SWGLimeSdrInputSettings::cleanup() { + + } @@ -186,6 +196,10 @@ SWGLimeSdrInputSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&ext_clock_freq, pJson["extClockFreq"], "qint32", ""); + ::SWGSDRangel::setValue(&transverter_mode, pJson["transverterMode"], "qint32", ""); + + ::SWGSDRangel::setValue(&transverter_delta_frequency, pJson["transverterDeltaFrequency"], "qint64", ""); + } QString @@ -259,6 +273,12 @@ SWGLimeSdrInputSettings::asJsonObject() { if(m_ext_clock_freq_isSet){ obj->insert("extClockFreq", QJsonValue(ext_clock_freq)); } + if(m_transverter_mode_isSet){ + obj->insert("transverterMode", QJsonValue(transverter_mode)); + } + if(m_transverter_delta_frequency_isSet){ + obj->insert("transverterDeltaFrequency", QJsonValue(transverter_delta_frequency)); + } return obj; } @@ -453,6 +473,26 @@ SWGLimeSdrInputSettings::setExtClockFreq(qint32 ext_clock_freq) { this->m_ext_clock_freq_isSet = true; } +qint32 +SWGLimeSdrInputSettings::getTransverterMode() { + return transverter_mode; +} +void +SWGLimeSdrInputSettings::setTransverterMode(qint32 transverter_mode) { + this->transverter_mode = transverter_mode; + this->m_transverter_mode_isSet = true; +} + +qint64 +SWGLimeSdrInputSettings::getTransverterDeltaFrequency() { + return transverter_delta_frequency; +} +void +SWGLimeSdrInputSettings::setTransverterDeltaFrequency(qint64 transverter_delta_frequency) { + this->transverter_delta_frequency = transverter_delta_frequency; + this->m_transverter_delta_frequency_isSet = true; +} + bool SWGLimeSdrInputSettings::isSet(){ @@ -477,6 +517,8 @@ SWGLimeSdrInputSettings::isSet(){ if(m_pga_gain_isSet){ isObjectUpdated = true; break;} if(m_ext_clock_isSet){ isObjectUpdated = true; break;} if(m_ext_clock_freq_isSet){ isObjectUpdated = true; break;} + if(m_transverter_mode_isSet){ isObjectUpdated = true; break;} + if(m_transverter_delta_frequency_isSet){ isObjectUpdated = true; break;} }while(false); return isObjectUpdated; } diff --git a/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.h b/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.h index fbaa8e360..5fd83cdd7 100644 --- a/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGLimeSdrInputSettings.h @@ -98,6 +98,12 @@ public: qint32 getExtClockFreq(); void setExtClockFreq(qint32 ext_clock_freq); + qint32 getTransverterMode(); + void setTransverterMode(qint32 transverter_mode); + + qint64 getTransverterDeltaFrequency(); + void setTransverterDeltaFrequency(qint64 transverter_delta_frequency); + virtual bool isSet() override; @@ -159,6 +165,12 @@ private: qint32 ext_clock_freq; bool m_ext_clock_freq_isSet; + qint32 transverter_mode; + bool m_transverter_mode_isSet; + + qint64 transverter_delta_frequency; + bool m_transverter_delta_frequency_isSet; + }; }