1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-11-10 00:00:42 -05:00

BladeRF2 MIMO: fixed global gain setting

This commit is contained in:
f4exb 2020-09-15 01:47:35 +02:00
parent 79b321952e
commit 2567abc74a
4 changed files with 92 additions and 35 deletions

View File

@ -57,7 +57,7 @@ BladeRF2MIMO::BladeRF2MIMO(DeviceAPI *deviceAPI) :
if (m_dev) if (m_dev)
{ {
const bladerf_gain_modes *modes = 0; const bladerf_gain_modes *modes = nullptr;
int nbModes = m_dev->getGainModesRx(&modes); int nbModes = m_dev->getGainModesRx(&modes);
if (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) { 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) { if (m_dev) {
m_dev->getGlobalGainRangeTx(min, max, step); m_dev->getGlobalGainRangeTx(min, max, step, scale);
} }
} }

View File

@ -158,13 +158,13 @@ public:
void getRxFrequencyRange(uint64_t& min, uint64_t& max, int& step); void getRxFrequencyRange(uint64_t& min, uint64_t& max, int& step);
void getRxSampleRateRange(int& min, int& max, int& step); void getRxSampleRateRange(int& min, int& max, int& step);
void getRxBandwidthRange(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<GainMode>& getRxGainModes() { return m_rxGainModes; } const std::vector<GainMode>& getRxGainModes() { return m_rxGainModes; }
void getTxFrequencyRange(uint64_t& min, uint64_t& max, int& step); void getTxFrequencyRange(uint64_t& min, uint64_t& max, int& step);
void getTxSampleRateRange(int& min, int& max, int& step); void getTxSampleRateRange(int& min, int& max, int& step);
void getTxBandwidthRange(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 getRxRunning() const { return m_runningRx; }
bool getTxRunning() const { return m_runningTx; } bool getTxRunning() const { return m_runningTx; }

View File

@ -83,6 +83,8 @@ BladeRF2MIMOGui::BladeRF2MIMOGui(DeviceUISet *deviceUISet, QWidget* parent) :
m_sampleMIMO->getTxSampleRateRange(minTx, maxTx, stepTx); m_sampleMIMO->getTxSampleRateRange(minTx, maxTx, stepTx);
m_srMin = std::max(minRx, minTx); m_srMin = std::max(minRx, minTx);
m_srMax = std::min(maxRx, maxTx); 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(); displayGainModes();
displaySettings(); displaySettings();
@ -186,17 +188,10 @@ void BladeRF2MIMOGui::displaySettings()
ui->gainMode->setEnabled(true); ui->gainMode->setEnabled(true);
ui->fcPos->setCurrentIndex((int) m_settings.m_fcPosRx); ui->fcPos->setCurrentIndex((int) m_settings.m_fcPosRx);
if (m_streamIndex == 0) if (m_streamIndex == 0) {
{
ui->gainMode->setCurrentIndex(m_settings.m_rx0GainMode); ui->gainMode->setCurrentIndex(m_settings.m_rx0GainMode);
ui->gainText->setText(tr("%1 dB").arg(m_settings.m_rx0GlobalGain)); } else if (m_streamIndex == 1) {
ui->gain->setValue(m_settings.m_rx0GlobalGain);
}
else if (m_streamIndex == 1)
{
ui->gainMode->setCurrentIndex(m_settings.m_rx1GainMode); 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 else
@ -218,19 +213,10 @@ void BladeRF2MIMOGui::displaySettings()
ui->decim->setToolTip(QString("Interpolation factor")); ui->decim->setToolTip(QString("Interpolation factor"));
ui->gainMode->setEnabled(false); ui->gainMode->setEnabled(false);
ui->fcPos->setCurrentIndex((int) m_settings.m_fcPosTx); 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->sampleRate->setValue(m_settings.m_devSampleRate);
ui->LOppm->setValue(m_settings.m_LOppmTenths); ui->LOppm->setValue(m_settings.m_LOppmTenths);
ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); 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); 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) bool BladeRF2MIMOGui::handleMessage(const Message& message)
{ {
if (DSPMIMOSignalNotification::match(message)) if (DSPMIMOSignalNotification::match(message))
@ -581,7 +601,7 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index)
{ {
if (mode.m_value == BLADERF_GAIN_MANUAL) if (mode.m_value == BLADERF_GAIN_MANUAL)
{ {
m_settings.m_rx0GlobalGain = ui->gain->value(); setGainFromValue(ui->gain->value());
ui->gain->setEnabled(true); ui->gain->setEnabled(true);
} else { } else {
ui->gain->setEnabled(false); ui->gain->setEnabled(false);
@ -597,7 +617,7 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index)
{ {
if (mode.m_value == BLADERF_GAIN_MANUAL) if (mode.m_value == BLADERF_GAIN_MANUAL)
{ {
m_settings.m_rx1GlobalGain = ui->gain->value(); setGainFromValue(ui->gain->value());
ui->gain->setEnabled(true); ui->gain->setEnabled(true);
} else { } else {
ui->gain->setEnabled(false); ui->gain->setEnabled(false);
@ -613,28 +633,42 @@ void BladeRF2MIMOGui::on_gainMode_currentIndexChanged(int index)
void BladeRF2MIMOGui::on_gain_valueChanged(int value) 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) if (m_rxElseTx)
{ {
m_sampleMIMO->getRxGlobalGainRange(min, max, step, scale);
gainDB = getGainDB(value, min, max, step, scale);
if (m_streamIndex == 0 || m_gainLock) { if (m_streamIndex == 0 || m_gainLock) {
m_settings.m_rx0GlobalGain = value; m_settings.m_rx0GlobalGain = (int) gainDB;
} }
if (m_streamIndex == 1 || m_gainLock) { if (m_streamIndex == 1 || m_gainLock) {
m_settings.m_rx1GlobalGain = value; m_settings.m_rx1GlobalGain = (int) gainDB;
} }
} }
else else
{ {
m_sampleMIMO->getTxGlobalGainRange(min, max, step, scale);
gainDB = getGainDB(value, min, max, step, scale);
if (m_streamIndex == 0 || m_gainLock) { if (m_streamIndex == 0 || m_gainLock) {
m_settings.m_tx0GlobalGain = value; m_settings.m_tx0GlobalGain = (int) gainDB;
} }
if (m_streamIndex == 1 || m_gainLock) { 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) void BladeRF2MIMOGui::on_biasTee_toggled(bool checked)
@ -792,3 +826,19 @@ void BladeRF2MIMOGui::openDeviceSettingsDialog(const QPoint& p)
sendSettings(); 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;
}

View File

@ -82,16 +82,23 @@ private:
uint64_t m_fMinRx, m_fMaxRx; uint64_t m_fMinRx, m_fMaxRx;
uint64_t m_fMinTx, m_fMaxTx; uint64_t m_fMinTx, m_fMaxTx;
int m_fStepRx, m_fStepTx; 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 blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
void displaySampleRate(); void displaySampleRate();
void displayFcTooltip(); void displayFcTooltip();
void displayGainModes(); void displayGainModes();
void displayGain();
void sendSettings(); void sendSettings();
void updateSampleRateAndFrequency(); void updateSampleRateAndFrequency();
void updateFrequencyLimits(); void updateFrequencyLimits();
void setCenterFrequencySetting(uint64_t kHzValue); 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: private slots:
void handleInputMessages(); void handleInputMessages();