diff --git a/plugins/samplesource/airspy/airspygui.cpp b/plugins/samplesource/airspy/airspygui.cpp
index 81b38db59..bb7756dc2 100644
--- a/plugins/samplesource/airspy/airspygui.cpp
+++ b/plugins/samplesource/airspy/airspygui.cpp
@@ -42,7 +42,7 @@ AirspyGui::AirspyGui(DeviceSourceAPI *deviceAPI, QWidget* parent) :
ui->setupUi(this);
ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
- ui->centerFrequency->setValueRange(7, 24000U, 1900000U);
+ updateFrequencyLimits();
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
@@ -114,17 +114,6 @@ bool AirspyGui::deserialize(const QByteArray& data)
bool AirspyGui::handleMessage(const Message& message __attribute__((unused)))
{
return false;
-// if (AirspyInput::MsgReportAirspy::match(message))
-// {
-// qDebug() << "AirspyGui::handleMessage: MsgReportAirspy";
-// m_rates = ((AirspyInput::MsgReportAirspy&) message).getSampleRates();
-// displaySampleRates();
-// return true;
-// }
-// else
-// {
-// return false;
-// }
}
void AirspyGui::handleInputMessages()
@@ -162,8 +151,26 @@ void AirspyGui::updateSampleRateAndFrequency()
ui->deviceRateText->setText(tr("%1k").arg((float)m_sampleRate / 1000));
}
+void AirspyGui::updateFrequencyLimits()
+{
+ // values in kHz
+ qint64 deltaFrequency = m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency/1000 : 0;
+ qint64 minLimit = AirspyInput::loLowLimitFreq/1000 + deltaFrequency;
+ qint64 maxLimit = AirspyInput::loHighLimitFreq/1000 + deltaFrequency;
+
+ minLimit = minLimit < 0 ? 0 : minLimit > 9999999 ? 9999999 : minLimit;
+ maxLimit = maxLimit < 0 ? 0 : maxLimit > 9999999 ? 9999999 : maxLimit;
+
+ qDebug("AirspyGui::updateFrequencyLimits: delta: %lld min: %lld max: %lld", deltaFrequency, minLimit, maxLimit);
+
+ ui->centerFrequency->setValueRange(7, minLimit, maxLimit);
+}
+
void AirspyGui::displaySettings()
{
+ ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency);
+ ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
+ updateFrequencyLimits();
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
ui->LOppm->setValue(m_settings.m_LOppmTenths);
@@ -355,6 +362,16 @@ void AirspyGui::on_record_toggled(bool checked)
m_sampleSource->getInputMessageQueue()->push(message);
}
+void AirspyGui::on_transverter_clicked()
+{
+ m_settings.m_transverterMode = ui->transverter->getDeltaFrequencyAcive();
+ m_settings.m_transverterDeltaFrequency = ui->transverter->getDeltaFrequency();
+ qDebug("AirspyGui::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 AirspyGui::updateHardware()
{
qDebug() << "AirspyGui::updateHardware";
diff --git a/plugins/samplesource/airspy/airspygui.h b/plugins/samplesource/airspy/airspygui.h
index 145caca75..66bdc10d0 100644
--- a/plugins/samplesource/airspy/airspygui.h
+++ b/plugins/samplesource/airspy/airspygui.h
@@ -72,6 +72,7 @@ private:
void displaySampleRates();
void sendSettings();
void updateSampleRateAndFrequency();
+ void updateFrequencyLimits();
private slots:
void on_centerFrequency_changed(quint64 value);
@@ -89,6 +90,7 @@ private slots:
void on_mixAGC_stateChanged(int state);
void on_startStop_toggled(bool checked);
void on_record_toggled(bool checked);
+ void on_transverter_clicked();
void updateHardware();
void updateStatus();
void handleInputMessages();
diff --git a/plugins/samplesource/airspy/airspygui.ui b/plugins/samplesource/airspy/airspygui.ui
index 29095605b..f26919185 100644
--- a/plugins/samplesource/airspy/airspygui.ui
+++ b/plugins/samplesource/airspy/airspygui.ui
@@ -267,6 +267,22 @@
+ -
+
+
+
+ 24
+ 24
+
+
+
+ Transverter frequency translation dialog
+
+
+ X
+
+
+
-
@@ -645,6 +661,11 @@
QToolButton
+
+ TransverterButton
+ QPushButton
+
+
diff --git a/plugins/samplesource/airspy/airspyinput.cpp b/plugins/samplesource/airspy/airspyinput.cpp
index 8c7e4865f..fdea8467e 100644
--- a/plugins/samplesource/airspy/airspyinput.cpp
+++ b/plugins/samplesource/airspy/airspyinput.cpp
@@ -30,7 +30,9 @@
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgFileRecord, Message)
-//MESSAGE_CLASS_DEFINITION(AirspyInput::MsgReportAirspy, Message)
+
+const qint64 AirspyInput::loLowLimitFreq = 24000000L;
+const qint64 AirspyInput::loHighLimitFreq = 1900000000L;
AirspyInput::AirspyInput(DeviceSourceAPI *deviceAPI) :
m_deviceAPI(deviceAPI),
@@ -332,15 +334,22 @@ bool AirspyInput::applySettings(const AirspySettings& settings, bool force)
}
}
- qint64 deviceCenterFrequency = m_settings.m_centerFrequency;
- qint64 f_img = deviceCenterFrequency;
- quint32 devSampleRate = m_sampleRates[m_settings.m_devSampleRateIndex];
-
- if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency) ||
- (m_settings.m_LOppmTenths != settings.m_LOppmTenths) ||
- (m_settings.m_fcPos != settings.m_fcPos))
+ if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency)
+ || (m_settings.m_LOppmTenths != settings.m_LOppmTenths)
+ || (m_settings.m_fcPos != settings.m_fcPos)
+ || (m_settings.m_transverterMode != settings.m_transverterMode)
+ || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency))
{
- m_settings.m_centerFrequency = settings.m_centerFrequency;
+ m_settings.m_centerFrequency = settings.m_centerFrequency;
+ m_settings.m_transverterMode = settings.m_transverterMode;
+ m_settings.m_transverterDeltaFrequency = settings.m_transverterDeltaFrequency;
+
+ qint64 deviceCenterFrequency = m_settings.m_centerFrequency;
+ deviceCenterFrequency -= m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency : 0;
+ deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency;
+ qint64 f_img = deviceCenterFrequency;
+ quint32 devSampleRate = m_sampleRates[m_settings.m_devSampleRateIndex];
+
m_settings.m_LOppmTenths = settings.m_LOppmTenths;
if ((m_settings.m_log2Decim == 0) || (settings.m_fcPos == AirspySettings::FC_POS_CENTER))
@@ -503,7 +512,7 @@ bool AirspyInput::applySettings(const AirspySettings& settings, bool force)
if (forwardChange)
{
- int sampleRate = devSampleRate/(1<handleMessage(*notif); // forward to file sink
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
diff --git a/plugins/samplesource/airspy/airspyinput.h b/plugins/samplesource/airspy/airspyinput.h
index d8af4f729..9981367b5 100644
--- a/plugins/samplesource/airspy/airspyinput.h
+++ b/plugins/samplesource/airspy/airspyinput.h
@@ -68,26 +68,6 @@ public:
{ }
};
-// class MsgReportAirspy : public Message {
-// MESSAGE_CLASS_DECLARATION
-//
-// public:
-// const std::vector& getSampleRates() const { return m_sampleRates; }
-//
-// static MsgReportAirspy* create(const std::vector& sampleRates)
-// {
-// return new MsgReportAirspy(sampleRates);
-// }
-//
-// protected:
-// std::vector m_sampleRates;
-//
-// MsgReportAirspy(const std::vector& sampleRates) :
-// Message(),
-// m_sampleRates(sampleRates)
-// { }
-// };
-
AirspyInput(DeviceSourceAPI *deviceAPI);
virtual ~AirspyInput();
virtual void destroy();
@@ -102,6 +82,9 @@ public:
virtual bool handleMessage(const Message& message);
+ static const qint64 loLowLimitFreq;
+ static const qint64 loHighLimitFreq;
+
private:
bool openDevice();
void closeDevice();
diff --git a/plugins/samplesource/airspy/airspysettings.cpp b/plugins/samplesource/airspy/airspysettings.cpp
index dca1edc7b..ef8dbb1a0 100644
--- a/plugins/samplesource/airspy/airspysettings.cpp
+++ b/plugins/samplesource/airspy/airspysettings.cpp
@@ -38,6 +38,8 @@ void AirspySettings::resetToDefaults()
m_biasT = false;
m_dcBlock = false;
m_iqCorrection = false;
+ m_transverterMode = false;
+ m_transverterDeltaFrequency = 0;
}
QByteArray AirspySettings::serialize() const
@@ -56,6 +58,8 @@ QByteArray AirspySettings::serialize() const
s.writeBool(10, m_iqCorrection);
s.writeBool(11, m_lnaAGC);
s.writeBool(12, m_mixerAGC);
+ s.writeBool(13, m_transverterMode);
+ s.writeS64(14, m_transverterDeltaFrequency);
return s.final();
}
@@ -87,6 +91,8 @@ bool AirspySettings::deserialize(const QByteArray& data)
d.readBool(10, &m_iqCorrection, false);
d.readBool(11, &m_lnaAGC, false);
d.readBool(12, &m_mixerAGC, false);
+ d.readBool(13, &m_transverterMode, false);
+ d.readS64(14, &m_transverterDeltaFrequency, 0);
return true;
}
diff --git a/plugins/samplesource/airspy/airspysettings.h b/plugins/samplesource/airspy/airspysettings.h
index 6cbf16aec..4e42fe061 100644
--- a/plugins/samplesource/airspy/airspysettings.h
+++ b/plugins/samplesource/airspy/airspysettings.h
@@ -37,6 +37,8 @@ struct AirspySettings {
bool m_biasT;
bool m_dcBlock;
bool m_iqCorrection;
+ bool m_transverterMode;
+ qint64 m_transverterDeltaFrequency;
AirspySettings();
void resetToDefaults();
diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
index 0eebfe1cb..533f9f2c0 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
+++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
@@ -372,9 +372,8 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force)
m_settings.m_transverterMode = settings.m_transverterMode;
m_settings.m_transverterDeltaFrequency = settings.m_transverterDeltaFrequency;
qint64 deviceCenterFrequency = m_settings.m_centerFrequency;
-
deviceCenterFrequency -= m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency : 0;
-
+ deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency;
qint64 f_img = deviceCenterFrequency;
quint32 devSampleRate = m_settings.m_devSampleRate;
@@ -398,8 +397,6 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force)
}
}
- deviceCenterFrequency = deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency;
-
if (m_dev != 0)
{
if (rtlsdr_set_center_freq( m_dev, deviceCenterFrequency ) != 0)