diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp index bf8304465..765f6bc90 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.cpp @@ -57,7 +57,7 @@ BladeRF2MIMO::BladeRF2MIMO(DeviceAPI *deviceAPI) : if (m_dev) { - const bladerf_gain_modes *modes = 0; + const bladerf_gain_modes *modes = nullptr; int nbModes = m_dev->getGainModesRx(&modes); if (modes) @@ -910,10 +910,10 @@ void BladeRF2MIMO::getRxBandwidthRange(int& min, int& max, int& step) } } -void BladeRF2MIMO::getRxGlobalGainRange(int& min, int& max, int& step) +void BladeRF2MIMO::getRxGlobalGainRange(int& min, int& max, int& step, float& scale) { if (m_dev) { - m_dev->getGlobalGainRangeRx(min, max, step); + m_dev->getGlobalGainRangeRx(min, max, step, scale); } } @@ -938,10 +938,10 @@ void BladeRF2MIMO::getTxBandwidthRange(int& min, int& max, int& step) } } -void BladeRF2MIMO::getTxGlobalGainRange(int& min, int& max, int& step) +void BladeRF2MIMO::getTxGlobalGainRange(int& min, int& max, int& step, float& scale) { if (m_dev) { - m_dev->getGlobalGainRangeTx(min, max, step); + m_dev->getGlobalGainRangeTx(min, max, step, scale); } } diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.h b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.h index 0ad5bf799..6bac6728d 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimo.h +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimo.h @@ -158,13 +158,13 @@ public: void getRxFrequencyRange(uint64_t& min, uint64_t& max, int& step); void getRxSampleRateRange(int& min, int& max, int& step); void getRxBandwidthRange(int& min, int& max, int& step); - void getRxGlobalGainRange(int& min, int& max, int& step); + void getRxGlobalGainRange(int& min, int& max, int& step, float& scale); const std::vector& getRxGainModes() { return m_rxGainModes; } void getTxFrequencyRange(uint64_t& min, uint64_t& max, int& step); void getTxSampleRateRange(int& min, int& max, int& step); void getTxBandwidthRange(int& min, int& max, int& step); - void getTxGlobalGainRange(int& min, int& max, int& step); + void getTxGlobalGainRange(int& min, int& max, int& step, float& scale); bool getRxRunning() const { return m_runningRx; } bool getTxRunning() const { return m_runningTx; } diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp index 984795de7..04be2a4a6 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.cpp @@ -83,6 +83,8 @@ BladeRF2MIMOGui::BladeRF2MIMOGui(DeviceUISet *deviceUISet, QWidget* parent) : m_sampleMIMO->getTxSampleRateRange(minTx, maxTx, stepTx); m_srMin = std::max(minRx, minTx); m_srMax = std::min(maxRx, maxTx); + m_sampleMIMO->getRxGlobalGainRange(m_gainMinRx, m_gainMaxRx, m_gainStepRx, m_gainScaleRx); + m_sampleMIMO->getTxGlobalGainRange(m_gainMinTx, m_gainMaxTx, m_gainStepTx, m_gainScaleTx); displayGainModes(); displaySettings(); @@ -186,17 +188,10 @@ void BladeRF2MIMOGui::displaySettings() ui->gainMode->setEnabled(true); ui->fcPos->setCurrentIndex((int) m_settings.m_fcPosRx); - if (m_streamIndex == 0) - { + if (m_streamIndex == 0) { ui->gainMode->setCurrentIndex(m_settings.m_rx0GainMode); - ui->gainText->setText(tr("%1 dB").arg(m_settings.m_rx0GlobalGain)); - ui->gain->setValue(m_settings.m_rx0GlobalGain); - } - else if (m_streamIndex == 1) - { + } else if (m_streamIndex == 1) { ui->gainMode->setCurrentIndex(m_settings.m_rx1GainMode); - ui->gainText->setText(tr("%1 dB").arg(m_settings.m_rx1GlobalGain)); - ui->gain->setValue(m_settings.m_rx1GlobalGain); } } else @@ -218,19 +213,10 @@ void BladeRF2MIMOGui::displaySettings() ui->decim->setToolTip(QString("Interpolation factor")); ui->gainMode->setEnabled(false); ui->fcPos->setCurrentIndex((int) m_settings.m_fcPosTx); - - if (m_streamIndex == 0) - { - ui->gainText->setText(tr("%1 dB").arg(m_settings.m_tx0GlobalGain)); - ui->gain->setValue(m_settings.m_tx0GlobalGain); - } - else if (m_streamIndex == 1) - { - ui->gainText->setText(tr("%1 dB").arg(m_settings.m_tx1GlobalGain)); - ui->gain->setValue(m_settings.m_tx1GlobalGain); - } } + displayGain(); + ui->sampleRate->setValue(m_settings.m_devSampleRate); ui->LOppm->setValue(m_settings.m_LOppmTenths); ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); @@ -318,6 +304,40 @@ void BladeRF2MIMOGui::displayGainModes() ui->gainMode->blockSignals(false); } +void BladeRF2MIMOGui::displayGain() +{ + int min, max, step, gainDB; + float scale; + + if (m_rxElseTx) + { + m_sampleMIMO->getRxGlobalGainRange(min, max, step, scale); + + if (m_streamIndex == 0) { + gainDB = m_settings.m_rx0GlobalGain; + } else { + gainDB = m_settings.m_rx1GlobalGain; + } + } + else + { + m_sampleMIMO->getTxGlobalGainRange(min, max, step, scale); + + if (m_streamIndex == 0) { + gainDB = m_settings.m_tx0GlobalGain; + } else { + gainDB = m_settings.m_tx1GlobalGain; + } + } + + ui->gain->setMinimum(min/step); + ui->gain->setMaximum(max/step); + ui->gain->setSingleStep(1); + ui->gain->setPageStep(1); + ui->gain->setValue(getGainValue(gainDB, min, max, step, scale)); + ui->gainText->setText(tr("%1 dB").arg(QString::number(gainDB, 'f', 2))); +} + bool BladeRF2MIMOGui::handleMessage(const Message& message) { if (DSPMIMOSignalNotification::match(message)) @@ -581,7 +601,7 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index) { if (mode.m_value == BLADERF_GAIN_MANUAL) { - m_settings.m_rx0GlobalGain = ui->gain->value(); + setGainFromValue(ui->gain->value()); ui->gain->setEnabled(true); } else { ui->gain->setEnabled(false); @@ -597,7 +617,7 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index) { if (mode.m_value == BLADERF_GAIN_MANUAL) { - m_settings.m_rx1GlobalGain = ui->gain->value(); + setGainFromValue(ui->gain->value()); ui->gain->setEnabled(true); } else { ui->gain->setEnabled(false); @@ -613,28 +633,42 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index) void BladeRF2MIMOGui::on_gain_valueChanged(int value) { - ui->gainText->setText(tr("%1 dB").arg(value)); + float gainDB = setGainFromValue(value); + ui->gainText->setText(tr("%1 dB").arg(QString::number(gainDB, 'f', 2))); + sendSettings(); +} + +float BladeRF2MIMOGui::setGainFromValue(int value) +{ + int min, max, step; + float scale, gainDB; if (m_rxElseTx) { + m_sampleMIMO->getRxGlobalGainRange(min, max, step, scale); + gainDB = getGainDB(value, min, max, step, scale); + if (m_streamIndex == 0 || m_gainLock) { - m_settings.m_rx0GlobalGain = value; + m_settings.m_rx0GlobalGain = (int) gainDB; } if (m_streamIndex == 1 || m_gainLock) { - m_settings.m_rx1GlobalGain = value; + m_settings.m_rx1GlobalGain = (int) gainDB; } } else { + m_sampleMIMO->getTxGlobalGainRange(min, max, step, scale); + gainDB = getGainDB(value, min, max, step, scale); + if (m_streamIndex == 0 || m_gainLock) { - m_settings.m_tx0GlobalGain = value; + m_settings.m_tx0GlobalGain = (int) gainDB; } if (m_streamIndex == 1 || m_gainLock) { - m_settings.m_tx1GlobalGain = value; + m_settings.m_tx1GlobalGain = (int) gainDB; } } - sendSettings(); + return gainDB; } void BladeRF2MIMOGui::on_biasTee_toggled(bool checked) @@ -792,3 +826,19 @@ void BladeRF2MIMOGui::openDeviceSettingsDialog(const QPoint& p) sendSettings(); } + +float BladeRF2MIMOGui::getGainDB(int gainValue, int gainMin, int gainMax, int gainStep, float gainScale) +{ + float gain = gainValue * gainStep * gainScale; + qDebug("BladeRF2MIMOGui::getGainDB: gainValue: %d gainMin: %d gainMax: %d gainStep: %d gainScale: %f gain: %f", + gainValue, gainMin, gainMax, gainStep, gainScale, gain); + return gain; +} + +int BladeRF2MIMOGui::getGainValue(float gainDB, int gainMin, int gainMax, int gainStep, float gainScale) +{ + int gain = (gainDB/gainScale) / gainStep; + qDebug("BladeRF2MIMOGui::getGainValue: gainDB: %f m_gainMin: %d m_gainMax: %d m_gainStep: %d gainScale: %f gain: %d", + gainDB, gainMin, gainMax, gainStep, gainScale, gain); + return gain; +} \ No newline at end of file diff --git a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h index 92eccd9ad..dc2cb68e8 100644 --- a/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h +++ b/plugins/samplemimo/bladerf2mimo/bladerf2mimogui.h @@ -82,16 +82,23 @@ private: uint64_t m_fMinRx, m_fMaxRx; uint64_t m_fMinTx, m_fMaxTx; int m_fStepRx, m_fStepTx; + int m_gainMinRx, m_gainMaxRx, m_gainStepRx; + int m_gainMinTx, m_gainMaxTx, m_gainStepTx; + float m_gainScaleRx, m_gainScaleTx; void blockApplySettings(bool block) { m_doApplySettings = !block; } void displaySettings(); void displaySampleRate(); void displayFcTooltip(); void displayGainModes(); + void displayGain(); void sendSettings(); void updateSampleRateAndFrequency(); void updateFrequencyLimits(); void setCenterFrequencySetting(uint64_t kHzValue); + float getGainDB(int gainValue, int gainMin, int gainMax, int gainStep, float gainScale); + int getGainValue(float gainDB, int gainMin, int gainMax, int gainStep, float gainScale); + float setGainFromValue(int value); private slots: void handleInputMessages();