diff --git a/plugins/samplesink/limesdroutput/limesdroutput.cpp b/plugins/samplesink/limesdroutput/limesdroutput.cpp index 4b31712a1..4e2c7f5dc 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutput.cpp @@ -701,6 +701,10 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo 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("LimeSDROutput::applySettings: could not get clock gen frequency"); @@ -852,32 +856,35 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo settings.m_antennaPath)) { doCalibration = true; - qDebug("LimeSDRInput::applySettings: set antenna path to %d", + qDebug("LimeSDROutput::applySettings: set antenna path to %d", (int) settings.m_antennaPath); } else { - qCritical("LimeSDRInput::applySettings: could not set antenna path to %d", + qCritical("LimeSDROutput::applySettings: could not set antenna path to %d", (int) settings.m_antennaPath); } } } - if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || force) + if ((m_settings.m_centerFrequency != settings.m_centerFrequency) + || (m_settings.m_transverterMode != settings.m_transverterMode) + || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) + || force) { forwardChangeTxDSP = true; if (m_deviceShared.m_deviceParams->getDevice() != 0 && m_channelAcquired) { - if (LMS_SetClockFreq(m_deviceShared.m_deviceParams->getDevice(), LMS_CLOCK_SXT, settings.m_centerFrequency) < 0) + if (LMS_SetClockFreq(m_deviceShared.m_deviceParams->getDevice(), LMS_CLOCK_SXT, deviceCenterFrequency) < 0) { - qCritical("LimeSDROutput::applySettings: could not set frequency to %lu", settings.m_centerFrequency); + qCritical("LimeSDROutput::applySettings: could not set frequency to %lld", deviceCenterFrequency); } else { doCalibration = true; - m_deviceShared.m_centerFrequency = settings.m_centerFrequency; // for buddies - qDebug("LimeSDROutput::applySettings: frequency set to %lu", settings.m_centerFrequency); + m_deviceShared.m_centerFrequency = deviceCenterFrequency; // for buddies + qDebug("LimeSDROutput::applySettings: frequency set to %lld", deviceCenterFrequency); } } } @@ -1063,6 +1070,9 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo QLocale loc; qDebug().noquote() << "LimeSDROutput::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 interpolation: " << loc.toString( m_settings.m_devSampleRate/(1<getNcoFrequency(); } + if (deviceSettingsKeys.contains("transverterDeltaFrequency")) { + settings.m_transverterDeltaFrequency = response.getLimeSdrOutputSettings()->getTransverterDeltaFrequency(); + } + if (deviceSettingsKeys.contains("transverterMode")) { + settings.m_transverterMode = response.getLimeSdrOutputSettings()->getTransverterMode() != 0; + } MsgConfigureLimeSDR *msg = MsgConfigureLimeSDR::create(settings, force); m_inputMessageQueue.push(msg); @@ -1171,6 +1187,8 @@ void LimeSDROutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& r response.getLimeSdrOutputSettings()->setLpfFirbw(settings.m_lpfFIRBW); response.getLimeSdrOutputSettings()->setNcoEnable(settings.m_ncoEnable ? 1 : 0); response.getLimeSdrOutputSettings()->setNcoFrequency(settings.m_ncoFrequency); + response.getLimeSdrOutputSettings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency); + response.getLimeSdrOutputSettings()->setTransverterMode(settings.m_transverterMode ? 1 : 0); } int LimeSDROutput::webapiRunGet( diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index 953e4d01b..ed0a89575 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -140,6 +140,23 @@ bool LimeSDROutputGUI::deserialize(const QByteArray& data) } } +void LimeSDROutputGUI::updateFrequencyLimits() +{ + // values in kHz + float minF, maxF; + qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0; + m_limeSDROutput->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("LimeSDROutputGUI::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit); + + ui->centerFrequency->setValueRange(7, minLimit, maxLimit); +} + bool LimeSDROutputGUI::handleMessage(const Message& message) { if (LimeSDROutput::MsgConfigureLimeSDR::match(message)) @@ -469,13 +486,6 @@ void LimeSDROutputGUI::on_ncoEnable_toggled(bool checked) sendSettings(); } -void LimeSDROutputGUI::on_ncoReset_clicked(bool checked __attribute__((unused))) -{ - m_settings.m_ncoFrequency = 0; - ui->ncoFrequency->setValue(0); - sendSettings(); -} - void LimeSDROutputGUI::on_sampleRate_changed(quint64 value) { m_settings.m_devSampleRate = value; @@ -543,3 +553,14 @@ void LimeSDROutputGUI::on_extClock_clicked() sendSettings(); } +void LimeSDROutputGUI::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/samplesink/limesdroutput/limesdroutputgui.h b/plugins/samplesink/limesdroutput/limesdroutputgui.h index 59f050bc1..bfa1147b6 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.h +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.h @@ -75,6 +75,7 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); void updateDACRate(); + void updateFrequencyLimits(); void blockApplySettings(bool block); private slots: @@ -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_sampleRate_changed(quint64 value); void on_hwInterp_currentIndexChanged(int index); void on_swInterp_currentIndexChanged(int index); @@ -93,6 +93,7 @@ private slots: void on_gain_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/samplesink/limesdroutput/limesdroutputgui.ui b/plugins/samplesink/limesdroutput/limesdroutputgui.ui index 008191154..b7bb79f87 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.ui +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.ui @@ -29,7 +29,7 @@ - LimeSDR Input + LimeSDR output @@ -207,22 +207,6 @@ - - - - - 22 - 22 - - - - Reset the NCO to zero frequency - - - R - - - @@ -271,6 +255,22 @@ + + + + + 24 + 24 + + + + Transverter frequency translation dialog + + + X + + + @@ -935,6 +935,11 @@ QToolTip{background-color: white; color: black;}
gui/valuedialz.h
1 + + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp b/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp index b20991b78..96270d375 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputsettings.cpp @@ -38,6 +38,8 @@ void LimeSDROutputSettings::resetToDefaults() m_antennaPath = PATH_RFE_NONE; m_extClock = false; m_extClockFreq = 10000000; // 10 MHz + m_transverterMode = false; + m_transverterDeltaFrequency = 0; } QByteArray LimeSDROutputSettings::serialize() const @@ -56,6 +58,8 @@ QByteArray LimeSDROutputSettings::serialize() const s.writeS32(13, (int) m_antennaPath); s.writeBool(14, m_extClock); s.writeU32(15, m_extClockFreq); + s.writeBool(16, m_transverterMode); + s.writeS64(17, m_transverterDeltaFrequency); return s.final(); } @@ -87,6 +91,8 @@ bool LimeSDROutputSettings::deserialize(const QByteArray& data) m_antennaPath = (PathRFE) intval; d.readBool(14, &m_extClock, false); d.readU32(15, &m_extClockFreq, 10000000); + d.readBool(16, &m_transverterMode, false); + d.readS64(17, &m_transverterDeltaFrequency, 0); return true; } diff --git a/plugins/samplesink/limesdroutput/limesdroutputsettings.h b/plugins/samplesink/limesdroutput/limesdroutputsettings.h index 72e47d61f..2fe21b054 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputsettings.h +++ b/plugins/samplesink/limesdroutput/limesdroutputsettings.h @@ -54,6 +54,8 @@ struct LimeSDROutputSettings PathRFE m_antennaPath; bool m_extClock; //!< True if external clock source uint32_t m_extClockFreq; //!< Frequency (Hz) of external clock source + bool m_transverterMode; + qint64 m_transverterDeltaFrequency; LimeSDROutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index 5f4810cbf..05c5f15c5 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -1021,9 +1021,9 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc } if ((m_settings.m_centerFrequency != settings.m_centerFrequency) - || (m_settings.m_transverterMode != settings.m_transverterMode) - || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) - || setAntennaAuto || force) + || (m_settings.m_transverterMode != settings.m_transverterMode) + || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) + || setAntennaAuto || force) { forwardChangeRxDSP = true; diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h index 9c44963da..3ded84e9f 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.h +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -74,8 +74,8 @@ private: void sendSettings(); void updateSampleRateAndFrequency(); void updateADCRate(); - void blockApplySettings(bool block); void updateFrequencyLimits(); + void blockApplySettings(bool block); private slots: void handleInputMessages(); diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.ui b/plugins/samplesource/limesdrinput/limesdrinputgui.ui index 928c56fb7..5d79b1103 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.ui +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.ui @@ -308,6 +308,9 @@ 24
+ + Transverter frequency translation dialog + X diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index b8d1ee6b1..4a5243eb7 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -1733,6 +1733,13 @@ margin-bottom: 20px; }, "extClockFreq" : { "type" : "integer" + }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" } }, "description" : "LimeSDR" @@ -20636,7 +20643,7 @@ except ApiException as e:
- Generated 2018-04-17T00:16:15.209+02:00 + Generated 2018-04-17T00:43:20.797+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml b/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml index 0d30f5ed4..a043b00d8 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/LimeSdr.yaml @@ -76,4 +76,8 @@ LimeSdrOutputSettings: type: integer extClockFreq: type: integer - \ No newline at end of file + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 diff --git a/swagger/sdrangel/api/swagger/include/LimeSdr.yaml b/swagger/sdrangel/api/swagger/include/LimeSdr.yaml index 0d30f5ed4..a043b00d8 100644 --- a/swagger/sdrangel/api/swagger/include/LimeSdr.yaml +++ b/swagger/sdrangel/api/swagger/include/LimeSdr.yaml @@ -76,4 +76,8 @@ LimeSdrOutputSettings: type: integer extClockFreq: type: integer - \ No newline at end of file + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index b8d1ee6b1..4a5243eb7 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -1733,6 +1733,13 @@ margin-bottom: 20px; }, "extClockFreq" : { "type" : "integer" + }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" } }, "description" : "LimeSDR" @@ -20636,7 +20643,7 @@ except ApiException as e:
- Generated 2018-04-17T00:16:15.209+02:00 + Generated 2018-04-17T00:43:20.797+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.cpp index 2b9712044..39738800d 100644 --- a/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.cpp @@ -54,6 +54,10 @@ SWGLimeSdrOutputSettings::SWGLimeSdrOutputSettings() { 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; } SWGLimeSdrOutputSettings::~SWGLimeSdrOutputSettings() { @@ -88,6 +92,10 @@ SWGLimeSdrOutputSettings::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 @@ -105,6 +113,8 @@ SWGLimeSdrOutputSettings::cleanup() { + + } SWGLimeSdrOutputSettings* @@ -144,6 +154,10 @@ SWGLimeSdrOutputSettings::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 @@ -199,6 +213,12 @@ SWGLimeSdrOutputSettings::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; } @@ -333,6 +353,26 @@ SWGLimeSdrOutputSettings::setExtClockFreq(qint32 ext_clock_freq) { this->m_ext_clock_freq_isSet = true; } +qint32 +SWGLimeSdrOutputSettings::getTransverterMode() { + return transverter_mode; +} +void +SWGLimeSdrOutputSettings::setTransverterMode(qint32 transverter_mode) { + this->transverter_mode = transverter_mode; + this->m_transverter_mode_isSet = true; +} + +qint64 +SWGLimeSdrOutputSettings::getTransverterDeltaFrequency() { + return transverter_delta_frequency; +} +void +SWGLimeSdrOutputSettings::setTransverterDeltaFrequency(qint64 transverter_delta_frequency) { + this->transverter_delta_frequency = transverter_delta_frequency; + this->m_transverter_delta_frequency_isSet = true; +} + bool SWGLimeSdrOutputSettings::isSet(){ @@ -351,6 +391,8 @@ SWGLimeSdrOutputSettings::isSet(){ if(m_antenna_path_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/SWGLimeSdrOutputSettings.h b/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.h index b036243ca..9679abaa9 100644 --- a/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGLimeSdrOutputSettings.h @@ -80,6 +80,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; @@ -123,6 +129,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; + }; }