From 52593ab24048734edfe88bf515b47d978d33df33 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 27 Aug 2019 08:41:32 +0200 Subject: [PATCH] HackRF input: implemented transverter mode --- .../samplesource/hackrfinput/hackrfinput.cpp | 28 +++++++++-- .../hackrfinput/hackrfinputgui.cpp | 27 +++++++++++ .../samplesource/hackrfinput/hackrfinputgui.h | 2 + .../hackrfinput/hackrfinputgui.ui | 18 ++++++++ .../hackrfinput/hackrfinputsettings.cpp | 6 +++ .../hackrfinput/hackrfinputsettings.h | 2 + sdrbase/resources/webapi/doc/html2/index.html | 9 +++- .../webapi/doc/swagger/include/HackRF.yaml | 5 ++ .../sdrangel/api/swagger/include/HackRF.yaml | 5 ++ swagger/sdrangel/code/html2/index.html | 9 +++- .../qt5/client/SWGHackRFInputSettings.cpp | 46 +++++++++++++++++++ .../code/qt5/client/SWGHackRFInputSettings.h | 12 +++++ 12 files changed, 164 insertions(+), 5 deletions(-) diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index 6faba23c5..cc903dab3 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -431,21 +431,29 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) if ((m_settings.m_fcPos != settings.m_fcPos) || force) { reverseAPIKeys.append("fcPos"); } + if ((m_settings.m_transverterMode != settings.m_transverterMode) || force) { + reverseAPIKeys.append("transverterMode"); + } + if ((m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) { + reverseAPIKeys.append("transverterDeltaFrequency"); + } if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || (m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || (m_settings.m_log2Decim != settings.m_log2Decim) || - (m_settings.m_fcPos != settings.m_fcPos) || force) + (m_settings.m_fcPos != settings.m_fcPos) || + (m_settings.m_transverterMode != settings.m_transverterMode) || + (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) { qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency( settings.m_centerFrequency, - 0, + settings.m_transverterDeltaFrequency, settings.m_log2Decim, (DeviceSampleSource::fcPos_t) settings.m_fcPos, settings.m_devSampleRate, DeviceSampleSource::FrequencyShiftScheme::FSHIFT_TXSYNC, - false); + settings.m_transverterMode); setDeviceCenterFrequency(deviceCenterFrequency, settings.m_LOppmTenths); if (m_deviceAPI->getSinkBuddies().size() > 0) // forward to buddy if necessary @@ -664,6 +672,12 @@ void HackRFInput::webapiUpdateDeviceSettings( if (deviceSettingsKeys.contains("fileRecordName")) { settings.m_fileRecordName = *response.getHackRfInputSettings()->getFileRecordName(); } + if (deviceSettingsKeys.contains("transverterDeltaFrequency")) { + settings.m_transverterDeltaFrequency = response.getHackRfInputSettings()->getTransverterDeltaFrequency(); + } + if (deviceSettingsKeys.contains("transverterMode")) { + settings.m_transverterMode = response.getHackRfInputSettings()->getTransverterMode() != 0; + } if (deviceSettingsKeys.contains("useReverseAPI")) { settings.m_useReverseAPI = response.getHackRfInputSettings()->getUseReverseApi() != 0; } @@ -692,6 +706,8 @@ void HackRFInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& res response.getHackRfInputSettings()->setLnaExt(settings.m_lnaExt ? 1 : 0); response.getHackRfInputSettings()->setDcBlock(settings.m_dcBlock ? 1 : 0); response.getHackRfInputSettings()->setIqCorrection(settings.m_iqCorrection ? 1 : 0); + response.getHackRfInputSettings()->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency); + response.getHackRfInputSettings()->setTransverterMode(settings.m_transverterMode ? 1 : 0); if (response.getHackRfInputSettings()->getFileRecordName()) { *response.getHackRfInputSettings()->getFileRecordName() = settings.m_fileRecordName; @@ -789,6 +805,12 @@ void HackRFInput::webapiReverseSendSettings(QList& deviceSettingsKeys, if (deviceSettingsKeys.contains("fileRecordName") || force) { swgHackRFInputSettings->setFileRecordName(new QString(settings.m_fileRecordName)); } + if (deviceSettingsKeys.contains("transverterDeltaFrequency") || force) { + swgHackRFInputSettings->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency); + } + if (deviceSettingsKeys.contains("transverterMode") || force) { + swgHackRFInputSettings->setTransverterMode(settings.m_transverterMode ? 1 : 0); + } QString deviceSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/device/settings") .arg(settings.m_reverseAPIAddress) diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp index 9118b6987..f56e60c14 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.cpp @@ -196,6 +196,21 @@ void HackRFInputGui::updateSampleRateAndFrequency() displaySampleRate(); } +void HackRFInputGui::updateFrequencyLimits() +{ + // values in kHz + qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0; + qint64 minLimit = (0U) + deltaFrequency; + qint64 maxLimit = (7250000U) + deltaFrequency; + + minLimit = minLimit < 0 ? 0 : minLimit > 9999999 ? 9999999 : minLimit; + maxLimit = maxLimit < 0 ? 0 : maxLimit > 9999999 ? 9999999 : maxLimit; + + qDebug("HackRFInputGui::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit); + + ui->centerFrequency->setValueRange(7, minLimit, maxLimit); +} + void HackRFInputGui::displaySampleRate() { ui->sampleRate->blockSignals(true); @@ -242,6 +257,8 @@ void HackRFInputGui::displaySettings() blockApplySettings(true); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); + ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency); + ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode); ui->LOppm->setValue(m_settings.m_LOppmTenths); ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); @@ -438,6 +455,16 @@ void HackRFInputGui::updateHardware() } } +void HackRFInputGui::on_transverter_clicked() +{ + m_settings.m_transverterMode = ui->transverter->getDeltaFrequencyAcive(); + m_settings.m_transverterDeltaFrequency = ui->transverter->getDeltaFrequency(); + qDebug("HackRFInputGui::on_transverter_clicked: %lld Hz %s", m_settings.m_transverterDeltaFrequency, m_settings.m_transverterMode ? "on" : "off"); + updateFrequencyLimits(); + m_settings.m_centerFrequency = ui->centerFrequency->getValueNew()*1000; + sendSettings(); +} + void HackRFInputGui::blockApplySettings(bool block) { m_doApplySettings = !block; diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.h b/plugins/samplesource/hackrfinput/hackrfinputgui.h index 4bcdf34cc..d067c65ba 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.h +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.h @@ -83,6 +83,7 @@ private: void displayBandwidths(); void sendSettings(); void updateSampleRateAndFrequency(); + void updateFrequencyLimits(); void blockApplySettings(bool block); private slots: @@ -102,6 +103,7 @@ private slots: void on_startStop_toggled(bool checked); void on_record_toggled(bool checked); void on_sampleRateMode_toggled(bool checked); + void on_transverter_clicked(); void updateHardware(); void updateStatus(); void openDeviceSettingsDialog(const QPoint& p); diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.ui b/plugins/samplesource/hackrfinput/hackrfinputgui.ui index 747ac1cda..5e5800385 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.ui +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.ui @@ -292,6 +292,19 @@ + + + + + 24 + 24 + + + + X + + + @@ -677,6 +690,11 @@ QToolButton
gui/buttonswitch.h
+ + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp index dad7fced7..2d9e27af8 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp @@ -41,6 +41,8 @@ void HackRFInputSettings::resetToDefaults() m_iqCorrection = false; m_devSampleRate = 2400000; m_fileRecordName = ""; + m_transverterMode = false; + m_transverterDeltaFrequency = 0; m_useReverseAPI = false; m_reverseAPIAddress = "127.0.0.1"; m_reverseAPIPort = 8888; @@ -66,6 +68,8 @@ QByteArray HackRFInputSettings::serialize() const s.writeString(15, m_reverseAPIAddress); s.writeU32(16, m_reverseAPIPort); s.writeU32(17, m_reverseAPIDeviceIndex); + s.writeBool(18, m_transverterMode); + s.writeS64(19, m_transverterDeltaFrequency); return s.final(); } @@ -109,6 +113,8 @@ bool HackRFInputSettings::deserialize(const QByteArray& data) d.readU32(17, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readBool(18, &m_transverterMode, false); + d.readS64(19, &m_transverterDeltaFrequency, 0); return true; } diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.h b/plugins/samplesource/hackrfinput/hackrfinputsettings.h index c15c58460..008acaf5b 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.h +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.h @@ -41,6 +41,8 @@ struct HackRFInputSettings { bool m_dcBlock; bool m_iqCorrection; QString m_fileRecordName; + bool m_transverterMode; + qint64 m_transverterDeltaFrequency; bool m_useReverseAPI; QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index a6446adeb..0188a3823 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -3545,6 +3545,13 @@ margin-bottom: 20px; "fileRecordName" : { "type" : "string" }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -28214,7 +28221,7 @@ except ApiException as e:
- Generated 2019-08-11T10:07:35.543+02:00 + Generated 2019-08-27T08:26:32.301+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/HackRF.yaml b/sdrbase/resources/webapi/doc/swagger/include/HackRF.yaml index eafe6555e..38f187ab9 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/HackRF.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/HackRF.yaml @@ -29,6 +29,11 @@ HackRFInputSettings: type: integer fileRecordName: type: string + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/api/swagger/include/HackRF.yaml b/swagger/sdrangel/api/swagger/include/HackRF.yaml index eafe6555e..38f187ab9 100644 --- a/swagger/sdrangel/api/swagger/include/HackRF.yaml +++ b/swagger/sdrangel/api/swagger/include/HackRF.yaml @@ -29,6 +29,11 @@ HackRFInputSettings: type: integer fileRecordName: type: string + transverterMode: + type: integer + transverterDeltaFrequency: + type: integer + format: int64 useReverseAPI: description: Synchronize with reverse API (1 for yes, 0 for no) type: integer diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index a6446adeb..0188a3823 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -3545,6 +3545,13 @@ margin-bottom: 20px; "fileRecordName" : { "type" : "string" }, + "transverterMode" : { + "type" : "integer" + }, + "transverterDeltaFrequency" : { + "type" : "integer", + "format" : "int64" + }, "useReverseAPI" : { "type" : "integer", "description" : "Synchronize with reverse API (1 for yes, 0 for no)" @@ -28214,7 +28221,7 @@ except ApiException as e:
- Generated 2019-08-11T10:07:35.543+02:00 + Generated 2019-08-27T08:26:32.301+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.cpp index ec33f6872..47f158c18 100644 --- a/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.cpp @@ -54,6 +54,10 @@ SWGHackRFInputSettings::SWGHackRFInputSettings() { m_iq_correction_isSet = false; file_record_name = nullptr; m_file_record_name_isSet = false; + transverter_mode = 0; + m_transverter_mode_isSet = false; + transverter_delta_frequency = 0L; + m_transverter_delta_frequency_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = nullptr; @@ -96,6 +100,10 @@ SWGHackRFInputSettings::init() { m_iq_correction_isSet = false; file_record_name = new QString(""); m_file_record_name_isSet = false; + transverter_mode = 0; + m_transverter_mode_isSet = false; + transverter_delta_frequency = 0L; + m_transverter_delta_frequency_isSet = false; use_reverse_api = 0; m_use_reverse_api_isSet = false; reverse_api_address = new QString(""); @@ -124,6 +132,8 @@ SWGHackRFInputSettings::cleanup() { delete file_record_name; } + + if(reverse_api_address != nullptr) { delete reverse_api_address; } @@ -168,6 +178,10 @@ SWGHackRFInputSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&file_record_name, pJson["fileRecordName"], "QString", "QString"); + ::SWGSDRangel::setValue(&transverter_mode, pJson["transverterMode"], "qint32", ""); + + ::SWGSDRangel::setValue(&transverter_delta_frequency, pJson["transverterDeltaFrequency"], "qint64", ""); + ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); @@ -231,6 +245,12 @@ SWGHackRFInputSettings::asJsonObject() { if(file_record_name != nullptr && *file_record_name != QString("")){ toJsonValue(QString("fileRecordName"), file_record_name, obj, QString("QString")); } + if(m_transverter_mode_isSet){ + obj->insert("transverterMode", QJsonValue(transverter_mode)); + } + if(m_transverter_delta_frequency_isSet){ + obj->insert("transverterDeltaFrequency", QJsonValue(transverter_delta_frequency)); + } if(m_use_reverse_api_isSet){ obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); } @@ -377,6 +397,26 @@ SWGHackRFInputSettings::setFileRecordName(QString* file_record_name) { this->m_file_record_name_isSet = true; } +qint32 +SWGHackRFInputSettings::getTransverterMode() { + return transverter_mode; +} +void +SWGHackRFInputSettings::setTransverterMode(qint32 transverter_mode) { + this->transverter_mode = transverter_mode; + this->m_transverter_mode_isSet = true; +} + +qint64 +SWGHackRFInputSettings::getTransverterDeltaFrequency() { + return transverter_delta_frequency; +} +void +SWGHackRFInputSettings::setTransverterDeltaFrequency(qint64 transverter_delta_frequency) { + this->transverter_delta_frequency = transverter_delta_frequency; + this->m_transverter_delta_frequency_isSet = true; +} + qint32 SWGHackRFInputSettings::getUseReverseApi() { return use_reverse_api; @@ -461,6 +501,12 @@ SWGHackRFInputSettings::isSet(){ if(file_record_name && *file_record_name != QString("")){ isObjectUpdated = true; break; } + if(m_transverter_mode_isSet){ + isObjectUpdated = true; break; + } + if(m_transverter_delta_frequency_isSet){ + isObjectUpdated = true; break; + } if(m_use_reverse_api_isSet){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.h b/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.h index bc8e43b11..ffbd46951 100644 --- a/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGHackRFInputSettings.h @@ -81,6 +81,12 @@ public: QString* getFileRecordName(); void setFileRecordName(QString* file_record_name); + qint32 getTransverterMode(); + void setTransverterMode(qint32 transverter_mode); + + qint64 getTransverterDeltaFrequency(); + void setTransverterDeltaFrequency(qint64 transverter_delta_frequency); + qint32 getUseReverseApi(); void setUseReverseApi(qint32 use_reverse_api); @@ -136,6 +142,12 @@ private: QString* file_record_name; bool m_file_record_name_isSet; + qint32 transverter_mode; + bool m_transverter_mode_isSet; + + qint64 transverter_delta_frequency; + bool m_transverter_delta_frequency_isSet; + qint32 use_reverse_api; bool m_use_reverse_api_isSet;