mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-12 18:58:48 -04:00
Add master clock rate display to GUI.
Calculate full range of sample rates supported, by varying master clock. Check if requested sample rate can be met.
This commit is contained in:
@@ -202,7 +202,7 @@ bool USRPInput::openDevice()
|
||||
m_deviceShared.m_deviceParams = new DeviceUSRPParams();
|
||||
char serial[256];
|
||||
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||
m_deviceShared.m_deviceParams->open(serial);
|
||||
m_deviceShared.m_deviceParams->open(serial, false);
|
||||
m_deviceShared.m_channel = requestedChannel; // acknowledge the requested channel
|
||||
}
|
||||
|
||||
@@ -548,20 +548,17 @@ bool USRPInput::handleMessage(const Message& message)
|
||||
|
||||
if (report.getRxElseTx())
|
||||
{
|
||||
// Rx buddy changed settings, we need to copy
|
||||
m_settings.m_devSampleRate = report.getDevSampleRate();
|
||||
m_settings.m_centerFrequency = report.getCenterFrequency();
|
||||
m_settings.m_loOffset = report.getLOOffset();
|
||||
}
|
||||
else if (m_running)
|
||||
{
|
||||
double host_Hz;
|
||||
|
||||
host_Hz = m_deviceShared.m_deviceParams->getDevice()->get_rx_rate(m_deviceShared.m_channel);
|
||||
m_settings.m_devSampleRate = roundf(host_Hz);
|
||||
|
||||
qDebug() << "USRPInput::handleMessage: MsgReportBuddyChange:"
|
||||
<< " m_devSampleRate: " << m_settings.m_devSampleRate;
|
||||
}
|
||||
// Master clock rate is common between all buddies
|
||||
int masterClockRate = report.getMasterClockRate();
|
||||
if (masterClockRate > 0)
|
||||
m_settings.m_masterClockRate = masterClockRate;
|
||||
qDebug() << "USRPInput::handleMessage MsgReportBuddyChange";
|
||||
qDebug() << "m_masterClockRate " << m_settings.m_masterClockRate;
|
||||
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(
|
||||
m_settings.m_devSampleRate/(1<<m_settings.m_log2SoftDecim),
|
||||
@@ -571,7 +568,7 @@ bool USRPInput::handleMessage(const Message& message)
|
||||
if (getMessageQueueToGUI())
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange *reportToGUI = DeviceUSRPShared::MsgReportBuddyChange::create(
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, true);
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, true);
|
||||
getMessageQueueToGUI()->push(reportToGUI);
|
||||
}
|
||||
|
||||
@@ -656,6 +653,7 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
bool forwardClockSource = false;
|
||||
bool ownThreadWasRunning = false;
|
||||
bool reapplySomeSettings = false;
|
||||
bool checkRates = false;
|
||||
QList<QString> reverseAPIKeys;
|
||||
|
||||
try
|
||||
@@ -704,10 +702,8 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
if (m_deviceShared.m_deviceParams->getDevice() && (m_channelAcquired || preGetStream))
|
||||
{
|
||||
m_deviceShared.m_deviceParams->getDevice()->set_rx_rate(settings.m_devSampleRate, m_deviceShared.m_channel);
|
||||
double actualSampleRate = m_deviceShared.m_deviceParams->getDevice()->get_rx_rate(m_deviceShared.m_channel);
|
||||
qDebug("USRPInput::applySettings: set sample rate set to %d - actual rate %f", settings.m_devSampleRate,
|
||||
actualSampleRate);
|
||||
m_deviceShared.m_deviceParams->m_sampleRate = m_settings.m_devSampleRate;
|
||||
qDebug("USRPInput::applySettings: set sample rate set to %d", settings.m_devSampleRate);
|
||||
checkRates = true;
|
||||
reapplySomeSettings = true;
|
||||
}
|
||||
}
|
||||
@@ -845,6 +841,17 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
|
||||
m_settings = settings;
|
||||
|
||||
if (checkRates)
|
||||
{
|
||||
// Check if requested rate could actually be met and what master clock rate we ended up with
|
||||
double actualSampleRate = m_deviceShared.m_deviceParams->getDevice()->get_rx_rate(m_deviceShared.m_channel);
|
||||
qDebug("USRPInput::applySettings: actual sample rate %f", actualSampleRate);
|
||||
double masterClockRate = m_deviceShared.m_deviceParams->getDevice()->get_master_clock_rate();
|
||||
qDebug("USRPInput::applySettings: master_clock_rate %f", masterClockRate);
|
||||
m_settings.m_devSampleRate = actualSampleRate;
|
||||
m_settings.m_masterClockRate = masterClockRate;
|
||||
}
|
||||
|
||||
// forward changes to buddies or oneself
|
||||
|
||||
if (forwardChangeAllDSP)
|
||||
@@ -864,7 +871,7 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
for (; itSource != sourceBuddies.end(); ++itSource)
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create(
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, true);
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, true);
|
||||
(*itSource)->getSamplingDeviceInputMessageQueue()->push(report);
|
||||
}
|
||||
|
||||
@@ -875,9 +882,17 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
for (; itSink != sinkBuddies.end(); ++itSink)
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create(
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, true);
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, true);
|
||||
(*itSink)->getSamplingDeviceInputMessageQueue()->push(report);
|
||||
}
|
||||
|
||||
// send to GUI so it can see master clock rate and if actual rate differs
|
||||
if (m_deviceAPI->getSamplingDeviceGUIMessageQueue())
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create(
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, true);
|
||||
m_deviceAPI->getSamplingDeviceGUIMessageQueue()->push(report);
|
||||
}
|
||||
}
|
||||
else if (forwardChangeRxDSP)
|
||||
{
|
||||
@@ -896,7 +911,7 @@ bool USRPInput::applySettings(const USRPInputSettings& settings, bool preGetStre
|
||||
for (; itSource != sourceBuddies.end(); ++itSource)
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create(
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, true);
|
||||
m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, true);
|
||||
(*itSource)->getSamplingDeviceInputMessageQueue()->push(report);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,9 +163,10 @@ bool USRPInputGUI::handleMessage(const Message& message)
|
||||
else if (DeviceUSRPShared::MsgReportBuddyChange::match(message))
|
||||
{
|
||||
DeviceUSRPShared::MsgReportBuddyChange& report = (DeviceUSRPShared::MsgReportBuddyChange&) message;
|
||||
m_settings.m_devSampleRate = report.getDevSampleRate();
|
||||
m_settings.m_masterClockRate = report.getMasterClockRate();
|
||||
|
||||
if (report.getRxElseTx()) {
|
||||
m_settings.m_devSampleRate = report.getDevSampleRate();
|
||||
m_settings.m_centerFrequency = report.getCenterFrequency();
|
||||
m_settings.m_loOffset = report.getLOOffset();
|
||||
}
|
||||
@@ -287,12 +288,20 @@ void USRPInputGUI::handleInputMessages()
|
||||
void USRPInputGUI::updateSampleRate()
|
||||
{
|
||||
uint32_t sr = m_settings.m_devSampleRate;
|
||||
int cr = m_settings.m_masterClockRate;
|
||||
|
||||
if (sr < 100000000) {
|
||||
ui->sampleRateLabel->setText(tr("%1k").arg(QString::number(sr / 1000.0f, 'g', 5)));
|
||||
} else {
|
||||
ui->sampleRateLabel->setText(tr("%1M").arg(QString::number(sr / 1000000.0f, 'g', 5)));
|
||||
}
|
||||
if (cr < 0) {
|
||||
ui->masterClockRateLabel->setText("-");
|
||||
} else if (cr < 100000000) {
|
||||
ui->masterClockRateLabel->setText(tr("%1k").arg(QString::number(cr / 1000.0f, 'g', 5)));
|
||||
} else {
|
||||
ui->masterClockRateLabel->setText(tr("%1M").arg(QString::number(cr / 1000000.0f, 'g', 5)));
|
||||
}
|
||||
// LO offset shouldn't be greater than half the sample rate
|
||||
ui->loOffset->setValueRange(false, 5, -(int32_t)sr/2/1000, (int32_t)sr/2/1000);
|
||||
}
|
||||
|
||||
@@ -75,6 +75,16 @@
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="freqLeftBotLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="masterClockRateLabel">
|
||||
<property name="toolTip">
|
||||
<string>Master clock rate (sample rate between FPGA and RFIC) (k or MS/s)</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>00000k</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="sampleRateLabel">
|
||||
<property name="minimumSize">
|
||||
@@ -799,17 +809,17 @@
|
||||
<header>gui/valuedial.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>TransverterButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header>gui/transverterbutton.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>ValueDialZ</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>gui/valuedialz.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>TransverterButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header>gui/transverterbutton.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../../../sdrgui/resources/res.qrc"/>
|
||||
|
||||
@@ -26,6 +26,7 @@ USRPInputSettings::USRPInputSettings()
|
||||
|
||||
void USRPInputSettings::resetToDefaults()
|
||||
{
|
||||
m_masterClockRate = -1; // Calculated by UHD
|
||||
m_centerFrequency = 435000*1000;
|
||||
m_devSampleRate = 3000000;
|
||||
m_loOffset = 0;
|
||||
|
||||
@@ -34,6 +34,7 @@ struct USRPInputSettings
|
||||
GAIN_MANUAL
|
||||
} GainMode;
|
||||
|
||||
int m_masterClockRate;
|
||||
// global settings to be saved
|
||||
uint64_t m_centerFrequency;
|
||||
int m_devSampleRate;
|
||||
|
||||
Reference in New Issue
Block a user