1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-22 08:04:49 -05:00

Fix RTLSDR E4000 gain and bandwidth settings. Add tuner type to GUI.

This commit is contained in:
Jon Beniston 2023-08-25 15:04:57 +01:00
parent 6105212bd4
commit 05914cc0ba
5 changed files with 53 additions and 6 deletions

View File

@ -1091,7 +1091,11 @@ if (WIN32 OR APPLE)
endif () endif ()
# Disable pkg-config to allow LIBUSB_INCLUDE_DIRS to be used # Disable pkg-config to allow LIBUSB_INCLUDE_DIRS to be used
set(DISABLE_PKGCONFIG "-DCMAKE_DISABLE_FIND_PACKAGE_PkgConfig=ON") set(DISABLE_PKGCONFIG "-DCMAKE_DISABLE_FIND_PACKAGE_PkgConfig=ON")
# needs libusb # If we want to use https://github.com/librtlsdr/librtlsdr instead of https://github.com/osmocom/rtl-sdr.git
# - Don't use DISABLE_PKGCONFIG
# - Use -DLIBUSB_INCLUDE_DIR instead of -DLIBUSB_INCLUDE_DIRS
# - Build target is rtl_sdr rather than rtlsdr
# - Use tag development otherwise it will not build with MSVC
ExternalProject_Add(rtlsdr ExternalProject_Add(rtlsdr
GIT_REPOSITORY https://github.com/osmocom/rtl-sdr.git GIT_REPOSITORY https://github.com/osmocom/rtl-sdr.git
GIT_TAG ${RTLSDR_TAG} GIT_TAG ${RTLSDR_TAG}

View File

@ -68,6 +68,14 @@ RTLSDRGui::RTLSDRGui(DeviceUISet *deviceUISet, QWidget* parent) :
m_gains = m_sampleSource->getGains(); m_gains = m_sampleSource->getGains();
displayGains(); displayGains();
rtlsdr_tuner tunerType = m_sampleSource->getTunerType();
// Disable widgets not relevent for this tuner
bool offsetTuningEnabled = (tunerType != RTLSDR_TUNER_R820T) && (tunerType != RTLSDR_TUNER_R828D);
if (!offsetTuningEnabled) {
ui->offsetTuning->setEnabled(false);
}
ui->tunerType->setText("Tuner: " + m_sampleSource->getTunerName());
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue); m_sampleSource->setMessageQueueToGUI(&m_inputMessageQueue);
} }
@ -474,6 +482,7 @@ void RTLSDRGui::on_checkBox_stateChanged(int state)
if (state == Qt::Checked) if (state == Qt::Checked)
{ {
ui->gain->setEnabled(false); ui->gain->setEnabled(false);
ui->offsetTuning->setEnabled(false);
m_settings.m_noModMode = true; m_settings.m_noModMode = true;
updateFrequencyLimits(); updateFrequencyLimits();
ui->centerFrequency->setValue(7000); ui->centerFrequency->setValue(7000);
@ -482,6 +491,7 @@ void RTLSDRGui::on_checkBox_stateChanged(int state)
else else
{ {
ui->gain->setEnabled(true); ui->gain->setEnabled(true);
ui->offsetTuning->setEnabled(true);
m_settings.m_noModMode = false; m_settings.m_noModMode = false;
updateFrequencyLimits(); updateFrequencyLimits();
ui->centerFrequency->setValue(434000); ui->centerFrequency->setValue(434000);

View File

@ -500,12 +500,12 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_direct"> <layout class="QHBoxLayout" name="horizontalLayout_direct">
<item> <item>
<widget class="QCheckBox" name="checkBox"> <widget class="QLabel" name="tunerType">
<property name="toolTip"> <property name="toolTip">
<string>RTLSDR special direct sampling mode (HF Bands)</string> <string>Tuner type</string>
</property> </property>
<property name="text"> <property name="text">
<string>No-mod DS</string> <string>Tuner: Unknown</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -522,6 +522,16 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="toolTip">
<string>RTLSDR special direct sampling mode (HF Bands)</string>
</property>
<property name="text">
<string>DS</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="offsetTuning"> <widget class="QCheckBox" name="offsetTuning">
<property name="toolTip"> <property name="toolTip">

View File

@ -57,6 +57,7 @@ RTLSDRInput::RTLSDRInput(DeviceAPI *deviceAPI) :
m_dev(0), m_dev(0),
m_rtlSDRThread(nullptr), m_rtlSDRThread(nullptr),
m_deviceDescription("RTLSDR"), m_deviceDescription("RTLSDR"),
m_tunerType(RTLSDR_TUNER_UNKNOWN),
m_running(false) m_running(false)
{ {
m_sampleFifo.setLabel(m_deviceDescription); m_sampleFifo.setLabel(m_deviceDescription);
@ -155,7 +156,9 @@ bool RTLSDRInput::openDevice()
return false; return false;
} }
qInfo("RTLSDRInput::openDevice: open: %s %s, SN: %s", vendor, product, serial); m_tunerType = rtlsdr_get_tuner_type(m_dev);
qInfo("RTLSDRInput::openDevice: open: %s %s, SN: %s Tuner: %s", vendor, product, serial, getTunerName());
m_deviceDescription = QString("%1 (SN %2)").arg(product).arg(serial); m_deviceDescription = QString("%1 (SN %2)").arg(product).arg(serial);
if ((res = rtlsdr_set_sample_rate(m_dev, 1152000)) < 0) if ((res = rtlsdr_set_sample_rate(m_dev, 1152000)) < 0)
@ -504,7 +507,8 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, const QList<QStr
} }
} }
if (settingsKeys.contains("offsetTuning") || force) // Reapply offset_tuning setting if bandwidth is changed, otherwise frequency response of filter looks wrong on E4000
if (settingsKeys.contains("offsetTuning") || settingsKeys.contains("rfBandwidth") || force)
{ {
if (m_dev != 0) if (m_dev != 0)
{ {
@ -520,6 +524,11 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, const QList<QStr
{ {
if(m_dev != 0) if(m_dev != 0)
{ {
// Nooelec E4000 SDRs appear to require tuner_gain_mode to be reset to manual before
// each call to set_tuner_gain, otherwise tuner AGC seems to be reenabled
if (rtlsdr_set_tuner_gain_mode(m_dev, 1) < 0) {
qCritical("RTLSDRInput::applySettings: error setting tuner gain mode to manual");
}
qDebug() << "Set tuner gain " << settings.m_gain; qDebug() << "Set tuner gain " << settings.m_gain;
if (rtlsdr_set_tuner_gain(m_dev, settings.m_gain) != 0) { if (rtlsdr_set_tuner_gain(m_dev, settings.m_gain) != 0) {
qCritical("RTLSDRInput::applySettings: rtlsdr_set_tuner_gain() failed"); qCritical("RTLSDRInput::applySettings: rtlsdr_set_tuner_gain() failed");
@ -566,6 +575,17 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, const QList<QStr
return true; return true;
} }
QString RTLSDRInput::getTunerName() const
{
const static QStringList names = {"Unknown", "E4000", "FC0012", "FC0013", "FC2580", "R820T", "R828D"};
if ((int) m_tunerType <= names.size()) {
return names[(int) m_tunerType];
} else {
return names[0];
}
}
void RTLSDRInput::set_ds_mode(int on) void RTLSDRInput::set_ds_mode(int on)
{ {
rtlsdr_set_direct_sampling(m_dev, on); rtlsdr_set_direct_sampling(m_dev, on);

View File

@ -133,6 +133,8 @@ public:
SWGSDRangel::SWGDeviceSettings& response); SWGSDRangel::SWGDeviceSettings& response);
const std::vector<int>& getGains() const { return m_gains; } const std::vector<int>& getGains() const { return m_gains; }
rtlsdr_tuner getTunerType() const { return m_tunerType; }
QString getTunerName() const;
void set_ds_mode(int on); void set_ds_mode(int on);
static const quint64 frequencyLowRangeMin; static const quint64 frequencyLowRangeMin;
@ -152,6 +154,7 @@ private:
RTLSDRThread* m_rtlSDRThread; RTLSDRThread* m_rtlSDRThread;
QString m_deviceDescription; QString m_deviceDescription;
std::vector<int> m_gains; std::vector<int> m_gains;
rtlsdr_tuner m_tunerType;
bool m_running; bool m_running;
QNetworkAccessManager *m_networkManager; QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest; QNetworkRequest m_networkRequest;