diff --git a/devices/plutosdr/deviceplutosdrbox.cpp b/devices/plutosdr/deviceplutosdrbox.cpp index a9de7604f..07edd34be 100644 --- a/devices/plutosdr/deviceplutosdrbox.cpp +++ b/devices/plutosdr/deviceplutosdrbox.cpp @@ -61,7 +61,6 @@ DevicePlutoSDRBox::DevicePlutoSDRBox(const std::string& uri) : if (m_valid) { getXO(); - setTracking(); // int nb_channels = iio_device_get_channels_count(m_devRx); // for (int i = 0; i < nb_channels; i++) { // iio_channel_disable(iio_device_get_channel(m_devRx, i)); @@ -827,18 +826,3 @@ bool DevicePlutoSDRBox::getRateGovernors(std::string& rateGovernors) { return get_param(DEVICE_PHY, "trx_rate_governor", rateGovernors); } - -void DevicePlutoSDRBox::setTracking() -{ - // in_voltage_quadrature_tracking_en - char buff[100]; - std::vector params; - snprintf(buff, sizeof(buff), "in_voltage_quadrature_tracking_en=1"); - params.push_back(std::string(buff)); - snprintf(buff, sizeof(buff), "in_voltage_bb_dc_offset_tracking_en=1"); - params.push_back(std::string(buff)); - snprintf(buff, sizeof(buff), "in_voltage_rf_dc_offset_tracking_en=1"); - params.push_back(std::string(buff)); - set_params(DEVICE_PHY, params); -} - diff --git a/devices/plutosdr/deviceplutosdrbox.h b/devices/plutosdr/deviceplutosdrbox.h index 501eb9083..ae7021e5a 100644 --- a/devices/plutosdr/deviceplutosdrbox.h +++ b/devices/plutosdr/deviceplutosdrbox.h @@ -133,7 +133,6 @@ private: void formatFIRHeader(std::ostringstream& str, uint32_t intdec); void formatFIRCoefficients(std::ostringstream& str, uint32_t nbTaps, double normalizedBW); void getXO(); - void setTracking(); }; #endif /* DEVICES_PLUTOSDR_DEVICEPLUTOSDRBOX_H_ */ diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp index b68077d1b..5e45fda51 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp @@ -371,6 +371,9 @@ bool PlutoSDRInput::applySettings(const PlutoSDRInputSettings& settings, bool fo << " m_LOppmTenths: " << m_settings.m_LOppmTenths << " m_dcBlock: " << m_settings.m_dcBlock << " m_iqCorrection: " << m_settings.m_iqCorrection + << " m_hwBBDCBlock: " << m_settings.m_hwBBDCBlock + << " m_hwRFDCBlock: " << m_settings.m_hwRFDCBlock + << " m_hwIQCorrection: " << m_settings.m_hwIQCorrection << " m_lpfFIREnable: " << m_settings.m_lpfFIREnable << " m_lpfFIRBW: " << loc.toString(m_settings.m_lpfFIRBW) << " m_lpfFIRlog2Decim: " << m_settings.m_lpfFIRlog2Decim @@ -400,6 +403,15 @@ bool PlutoSDRInput::applySettings(const PlutoSDRInputSettings& settings, bool fo if ((m_settings.m_iqCorrection != settings.m_iqCorrection) || force) { reverseAPIKeys.append("iqCorrection"); } + if ((m_settings.m_hwBBDCBlock != settings.m_hwBBDCBlock) || force) { + reverseAPIKeys.append("hwBBDCBlock"); + } + if ((m_settings.m_hwRFDCBlock != settings.m_hwRFDCBlock) || force) { + reverseAPIKeys.append("hwRFDCBlock"); + } + if ((m_settings.m_hwIQCorrection != settings.m_hwIQCorrection) || force) { + reverseAPIKeys.append("hwIQCorrection"); + } if ((m_settings.m_lpfFIREnable != settings.m_lpfFIREnable) || force) { reverseAPIKeys.append("lpfFIREnable"); } @@ -592,6 +604,24 @@ bool PlutoSDRInput::applySettings(const PlutoSDRInputSettings& settings, bool fo paramsToSet = true; } + if ((m_settings.m_hwBBDCBlock != settings.m_hwBBDCBlock) || force) + { + params.push_back(QString(tr("in_voltage_bb_dc_offset_tracking_en=%1").arg(settings.m_hwBBDCBlock ? 1 : 0)).toStdString()); + paramsToSet = true; + } + + if ((m_settings.m_hwRFDCBlock != settings.m_hwRFDCBlock) || force) + { + params.push_back(QString(tr("in_voltage_rf_dc_offset_tracking_en=%1").arg(settings.m_hwRFDCBlock ? 1 : 0)).toStdString()); + paramsToSet = true; + } + + if ((m_settings.m_hwIQCorrection != settings.m_hwIQCorrection) || force) + { + params.push_back(QString(tr("in_voltage_quadrature_tracking_en=%1").arg(settings.m_hwIQCorrection ? 1 : 0)).toStdString()); + paramsToSet = true; + } + if (paramsToSet) { plutoBox->set_params(DevicePlutoSDRBox::DEVICE_PHY, params); @@ -798,6 +828,15 @@ int PlutoSDRInput::webapiSettingsPutPatch( if (deviceSettingsKeys.contains("iqCorrection")) { settings.m_iqCorrection = response.getPlutoSdrInputSettings()->getIqCorrection() != 0; } + if (deviceSettingsKeys.contains("hwBBDCBlock")) { + settings.m_hwBBDCBlock = response.getPlutoSdrInputSettings()->getHwBbdcBlock() != 0; + } + if (deviceSettingsKeys.contains("hwRFDCBlock")) { + settings.m_hwBBDCBlock = response.getPlutoSdrInputSettings()->getHwRfdcBlock() != 0; + } + if (deviceSettingsKeys.contains("hwIQCorrection")) { + settings.m_hwBBDCBlock = response.getPlutoSdrInputSettings()->getHwIqCorrection() != 0; + } if (deviceSettingsKeys.contains("log2Decim")) { settings.m_log2Decim = response.getPlutoSdrInputSettings()->getLog2Decim(); } @@ -875,6 +914,9 @@ void PlutoSDRInput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& r response.getPlutoSdrInputSettings()->setFcPos((int) settings.m_fcPos); response.getPlutoSdrInputSettings()->setDcBlock(settings.m_dcBlock ? 1 : 0); response.getPlutoSdrInputSettings()->setIqCorrection(settings.m_iqCorrection ? 1 : 0); + response.getPlutoSdrInputSettings()->setHwBbdcBlock(settings.m_hwBBDCBlock ? 1 : 0); + response.getPlutoSdrInputSettings()->setHwRfdcBlock(settings.m_hwRFDCBlock ? 1 : 0); + response.getPlutoSdrInputSettings()->setHwIqCorrection(settings.m_hwIQCorrection ? 1 : 0); response.getPlutoSdrInputSettings()->setLog2Decim(settings.m_log2Decim); response.getPlutoSdrInputSettings()->setLpfBw(settings.m_lpfBW); response.getPlutoSdrInputSettings()->setGain(settings.m_gain); @@ -955,6 +997,15 @@ void PlutoSDRInput::webapiReverseSendSettings(QList& deviceSettingsKeys if (deviceSettingsKeys.contains("iqCorrection") || force) { swgPlutoSdrInputSettings->setIqCorrection(settings.m_iqCorrection ? 1 : 0); } + if (deviceSettingsKeys.contains("hwBBDCBlock") || force) { + swgPlutoSdrInputSettings->setHwBbdcBlock(settings.m_hwBBDCBlock ? 1 : 0); + } + if (deviceSettingsKeys.contains("hwRFDCBlock") || force) { + swgPlutoSdrInputSettings->setHwRfdcBlock(settings.m_hwRFDCBlock ? 1 : 0); + } + if (deviceSettingsKeys.contains("hwIQCorrection") || force) { + swgPlutoSdrInputSettings->setHwIqCorrection(settings.m_hwIQCorrection ? 1 : 0); + } if (deviceSettingsKeys.contains("log2Decim") || force) { swgPlutoSdrInputSettings->setLog2Decim(settings.m_log2Decim); } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp index ca05c13d8..9f50fd108 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.cpp @@ -226,6 +226,25 @@ void PlutoSDRInputGui::on_iqImbalance_toggled(bool checked) sendSettings(); } +void PlutoSDRInputGui::on_rfDCOffset_toggled(bool checked) +{ + m_settings.m_hwRFDCBlock = checked; + sendSettings(); +} + +void PlutoSDRInputGui::on_bbDCOffset_toggled(bool checked) +{ + m_settings.m_hwBBDCBlock = checked; + sendSettings(); +} + +void PlutoSDRInputGui::on_hwIQImbalance_toggled(bool checked) +{ + m_settings.m_hwIQCorrection = checked; + sendSettings(); +} + + void PlutoSDRInputGui::on_swDecim_currentIndexChanged(int index) { m_settings.m_log2Decim = index > 6 ? 6 : index; @@ -378,6 +397,9 @@ void PlutoSDRInputGui::displaySettings() ui->dcOffset->setChecked(m_settings.m_dcBlock); ui->iqImbalance->setChecked(m_settings.m_iqCorrection); + ui->bbDCOffset->setChecked(m_settings.m_hwBBDCBlock); + ui->rfDCOffset->setChecked(m_settings.m_hwRFDCBlock); + ui->hwIQImbalance->setChecked(m_settings.m_hwIQCorrection); ui->loPPM->setValue(m_settings.m_LOppmTenths); ui->loPPMText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h index 39916821a..2c06a90ea 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputgui.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputgui.h @@ -85,6 +85,9 @@ private slots: void on_centerFrequency_changed(quint64 value); void on_loPPM_valueChanged(int value); void on_dcOffset_toggled(bool checked); + void on_rfDCOffset_toggled(bool checked); + void on_bbDCOffset_toggled(bool checked); + void on_hwIQImbalance_toggled(bool checked); void on_iqImbalance_toggled(bool checked); void on_swDecim_currentIndexChanged(int index); void on_fcPos_currentIndexChanged(int index); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp index 163e38d4b..c238be8b6 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.cpp @@ -35,6 +35,9 @@ void PlutoSDRInputSettings::resetToDefaults() m_devSampleRate = 2500 * 1000; m_dcBlock = false; m_iqCorrection = false; + m_hwBBDCBlock = true; + m_hwRFDCBlock = true; + m_hwIQCorrection = true; m_lpfBW = 1500000; m_lpfFIREnable = false; m_lpfFIRBW = 500000U; @@ -76,6 +79,9 @@ QByteArray PlutoSDRInputSettings::serialize() const s.writeString(19, m_reverseAPIAddress); s.writeU32(20, m_reverseAPIPort); s.writeU32(21, m_reverseAPIDeviceIndex); + s.writeBool(22, m_hwBBDCBlock); + s.writeBool(23, m_hwRFDCBlock); + s.writeBool(24, m_hwIQCorrection); return s.final(); } @@ -144,6 +150,10 @@ bool PlutoSDRInputSettings::deserialize(const QByteArray& data) d.readU32(21, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readBool(22, &m_hwBBDCBlock, true); + d.readBool(23, &m_hwRFDCBlock, true); + d.readBool(24, &m_hwIQCorrection, true); + return true; } else diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h index dfc81237e..34143ad9f 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputsettings.h @@ -68,6 +68,9 @@ struct PlutoSDRInputSettings { fcPos_t m_fcPos; bool m_dcBlock; bool m_iqCorrection; + bool m_hwBBDCBlock; //!< Hardware baseband DC blocking + bool m_hwRFDCBlock; //!< Hardware RF DC blocking + bool m_hwIQCorrection; //!< Hardware IQ correction quint32 m_log2Decim; quint32 m_lpfBW; //!< analog lowpass filter bandwidth (Hz) quint32 m_gain; //!< "hardware" gain diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index c4b3748b7..a9b44b534 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -4014,6 +4014,15 @@ margin-bottom: 20px; "iqCorrection" : { "type" : "integer" }, + "hwBBDCBlock" : { + "type" : "integer" + }, + "hwRFDCBlock" : { + "type" : "integer" + }, + "hwIQCorrection" : { + "type" : "integer" + }, "log2Decim" : { "type" : "integer" }, @@ -6287,7 +6296,7 @@ margin-bottom: 20px;