diff --git a/devices/usrp/deviceusrp.cpp b/devices/usrp/deviceusrp.cpp index 0eb5a1116..843027958 100644 --- a/devices/usrp/deviceusrp.cpp +++ b/devices/usrp/deviceusrp.cpp @@ -52,7 +52,7 @@ void DeviceUSRP::enumOriginDevices(const QString& hardwareId, PluginInterface::O qDebug() << "DeviceUSRP::enumOriginDevices: found USRP device " << displayedName; DeviceUSRPParams usrpParams; - usrpParams.open(id.toStdString().c_str()); + usrpParams.open(id.toStdString().c_str(), true); usrpParams.close(); originDevices.append(PluginInterface::OriginDevice( diff --git a/devices/usrp/deviceusrpparam.cpp b/devices/usrp/deviceusrpparam.cpp index 3d68c54b9..c54ec22a9 100644 --- a/devices/usrp/deviceusrpparam.cpp +++ b/devices/usrp/deviceusrpparam.cpp @@ -19,7 +19,7 @@ #include #include "deviceusrpparam.h" -bool DeviceUSRPParams::open(const char *deviceStr) +bool DeviceUSRPParams::open(const char *deviceStr, bool channelNumOnly) { qDebug("DeviceUSRPParams::open: %s", (const char *) deviceStr); @@ -32,37 +32,71 @@ bool DeviceUSRPParams::open(const char *deviceStr) m_nbRxChannels = m_dev->get_rx_num_channels(); m_nbTxChannels = m_dev->get_tx_num_channels(); - m_lpfRangeRx = m_dev->get_rx_bandwidth_range(); - m_lpfRangeTx = m_dev->get_tx_bandwidth_range(); + // Speed up program initialisation, by not getting all properties + // If we could find out number of channles without ::make ing the device + // that would be even better + if (!channelNumOnly) + { + m_lpfRangeRx = m_dev->get_rx_bandwidth_range(); + m_lpfRangeTx = m_dev->get_tx_bandwidth_range(); - m_loRangeRx = m_dev->get_fe_rx_freq_range(); - m_loRangeTx = m_dev->get_fe_tx_freq_range(); + m_loRangeRx = m_dev->get_fe_rx_freq_range(); + m_loRangeTx = m_dev->get_fe_tx_freq_range(); - m_srRangeRx = m_dev->get_rx_rates(); - m_srRangeTx = m_dev->get_tx_rates(); + // For some devices (B210), rx/tx_rates vary with master_clock_rate + // Note master_clock_rate is rate between FPGA and RFIC + // tx/rx_rate is rate between PC and FPGA + uhd::meta_range_t clockRange = m_dev->get_master_clock_rate_range(); + if (clockRange.start() == clockRange.stop()) + { + m_srRangeRx = m_dev->get_rx_rates(); + m_srRangeTx = m_dev->get_tx_rates(); + } + else + { + // Find max and min sample rate, for max and min master clock rates + m_dev->set_master_clock_rate(clockRange.start()); + uhd::meta_range_t rxLow = m_dev->get_rx_rates(); + uhd::meta_range_t txLow = m_dev->get_tx_rates(); - m_gainRangeRx = m_dev->get_rx_gain_range(); - m_gainRangeTx = m_dev->get_tx_gain_range(); + m_dev->set_master_clock_rate(clockRange.stop()); + uhd::meta_range_t rxHigh = m_dev->get_rx_rates(); + uhd::meta_range_t txHigh = m_dev->get_tx_rates(); - std::vector txAntennas = m_dev->get_tx_antennas(); - m_txAntennas.reserve(txAntennas.size()); - for(size_t i = 0, l = txAntennas.size(); i < l; ++i) - m_txAntennas << QString::fromStdString(txAntennas[i]); + m_srRangeRx = uhd::meta_range_t(std::min(rxLow.start(), rxHigh.start()), std::max(rxLow.stop(), rxHigh.stop())); + m_srRangeTx = uhd::meta_range_t(std::min(txLow.start(), txHigh.start()), std::max(txLow.stop(), txHigh.stop())); - std::vector rxAntennas = m_dev->get_rx_antennas(); - m_rxAntennas.reserve(rxAntennas.size()); - for(size_t i = 0, l = rxAntennas.size(); i < l; ++i) - m_rxAntennas << QString::fromStdString(rxAntennas[i]); + // Need to restore automatic clock rate + uhd::property_tree::sptr properties = m_dev->get_tree(); + if (properties->exists("/mboards/0/auto_tick_rate")) + { + properties->access("/mboards/0/auto_tick_rate").set(true); + } + } - std::vector rxGainNames = m_dev->get_rx_gain_names(); - m_rxGainNames.reserve(rxGainNames.size()); - for(size_t i = 0, l = rxGainNames.size(); i < l; ++i) - m_rxGainNames << QString::fromStdString(rxGainNames[i]); + m_gainRangeRx = m_dev->get_rx_gain_range(); + m_gainRangeTx = m_dev->get_tx_gain_range(); - std::vector clockSources = m_dev->get_clock_sources(0); - m_clockSources.reserve(clockSources.size()); - for(size_t i = 0, l = clockSources.size(); i < l; ++i) - m_clockSources << QString::fromStdString(clockSources[i]); + std::vector txAntennas = m_dev->get_tx_antennas(); + m_txAntennas.reserve(txAntennas.size()); + for(size_t i = 0, l = txAntennas.size(); i < l; ++i) + m_txAntennas << QString::fromStdString(txAntennas[i]); + + std::vector rxAntennas = m_dev->get_rx_antennas(); + m_rxAntennas.reserve(rxAntennas.size()); + for(size_t i = 0, l = rxAntennas.size(); i < l; ++i) + m_rxAntennas << QString::fromStdString(rxAntennas[i]); + + std::vector rxGainNames = m_dev->get_rx_gain_names(); + m_rxGainNames.reserve(rxGainNames.size()); + for(size_t i = 0, l = rxGainNames.size(); i < l; ++i) + m_rxGainNames << QString::fromStdString(rxGainNames[i]); + + std::vector clockSources = m_dev->get_clock_sources(0); + m_clockSources.reserve(clockSources.size()); + for(size_t i = 0, l = clockSources.size(); i < l; ++i) + m_clockSources << QString::fromStdString(clockSources[i]); + } return true; } diff --git a/devices/usrp/deviceusrpparam.h b/devices/usrp/deviceusrpparam.h index 1a8eaf112..e61b982fb 100644 --- a/devices/usrp/deviceusrpparam.h +++ b/devices/usrp/deviceusrpparam.h @@ -47,11 +47,6 @@ struct DEVICES_API DeviceUSRPParams uhd::meta_range_t m_srRangeTx; //!< Sample rate range uhd::gain_range_t m_gainRangeRx; //!< Gain range for Rx uhd::gain_range_t m_gainRangeTx; //!< Gain range for Tx - float m_sampleRate; //!< Sample rate between host and device - int m_log2OvSRRx; //!< log2 of Rx oversampling (0..5) - int m_log2OvSRTx; //!< log2 of Tx oversampling (0..5) - float m_rxFrequency; //!< Rx frequency - float m_txFrequency; //!< Tx frequency QStringList m_txAntennas; //!< List of Tx antenna names QStringList m_rxAntennas; //!< List of Rx antenna names QStringList m_rxGainNames; //!< List of Rx gain stages - Currently this seems limited to "PGA" @@ -61,11 +56,6 @@ struct DEVICES_API DeviceUSRPParams m_dev(), m_nbRxChannels(0), m_nbTxChannels(0), - m_sampleRate(1e6), - m_log2OvSRRx(0), - m_log2OvSRTx(0), - m_rxFrequency(1e6), - m_txFrequency(1e6), m_lpfRangeRx(), m_lpfRangeTx(), m_loRangeRx(), @@ -84,7 +74,7 @@ struct DEVICES_API DeviceUSRPParams /** * Opens and initialize the device and obtain information (# channels, ranges, ...) */ - bool open(const char *deviceStr); + bool open(const char *deviceStr, bool channelNumOnly); void close(); uhd::usrp::multi_usrp::sptr getDevice() { return m_dev; } diff --git a/devices/usrp/deviceusrpshared.h b/devices/usrp/deviceusrpshared.h index 7ee429759..109661348 100644 --- a/devices/usrp/deviceusrpshared.h +++ b/devices/usrp/deviceusrpshared.h @@ -37,18 +37,21 @@ public: int getDevSampleRate() const { return m_devSampleRate; } uint64_t getCenterFrequency() const { return m_centerFrequency; } int getLOOffset() const { return m_loOffset; } + int getMasterClockRate() const { return m_masterClockRate; } bool getRxElseTx() const { return m_rxElseTx; } static MsgReportBuddyChange* create( int devSampleRate, uint64_t centerFrequency, int loOffset, + int masterClockRate, bool rxElseTx) { return new MsgReportBuddyChange( devSampleRate, centerFrequency, loOffset, + masterClockRate, rxElseTx); } @@ -56,17 +59,20 @@ public: int m_devSampleRate; //!< device/host sample rate uint64_t m_centerFrequency; //!< Center frequency int m_loOffset; //!< LO offset + int m_masterClockRate; //!< FPGA/RFIC sample rate bool m_rxElseTx; //!< tells which side initiated the message MsgReportBuddyChange( int devSampleRate, uint64_t centerFrequency, int loOffset, + int masterClockRate, bool rxElseTx) : Message(), m_devSampleRate(devSampleRate), m_centerFrequency(centerFrequency), m_loOffset(loOffset), + m_masterClockRate(masterClockRate), m_rxElseTx(rxElseTx) { } }; diff --git a/plugins/samplesink/usrpoutput/usrpoutput.cpp b/plugins/samplesink/usrpoutput/usrpoutput.cpp index b389c67da..a8ecc8261 100644 --- a/plugins/samplesink/usrpoutput/usrpoutput.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutput.cpp @@ -175,7 +175,7 @@ bool USRPOutput::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 } @@ -533,31 +533,31 @@ bool USRPOutput::handleMessage(const Message& message) { DeviceUSRPShared::MsgReportBuddyChange& report = (DeviceUSRPShared::MsgReportBuddyChange&) message; - if (report.getRxElseTx() && m_running) - { - double host_Hz; - - host_Hz = m_deviceShared.m_deviceParams->getDevice()->get_tx_rate(m_deviceShared.m_channel); - m_settings.m_devSampleRate = roundf(host_Hz); - - qDebug() << "USRPOutput::handleMessage: MsgReportBuddyChange:" - << " m_devSampleRate: " << m_settings.m_devSampleRate; - } - else + if (!report.getRxElseTx()) { + // Tx 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(); } + // Master clock rate is common between all buddies + int masterClockRate = report.getMasterClockRate(); + if (masterClockRate > 0) + m_settings.m_masterClockRate = masterClockRate; + qDebug() << "USRPOutput::handleMessage MsgReportBuddyChange"; + qDebug() << "m_masterClockRate " << m_settings.m_masterClockRate; DSPSignalNotification *notif = new DSPSignalNotification( m_settings.m_devSampleRate/(1<getDeviceEngineInputMessageQueue()->push(notif); - DeviceUSRPShared::MsgReportBuddyChange *reportToGUI = DeviceUSRPShared::MsgReportBuddyChange::create( - m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, false); - getMessageQueueToGUI()->push(reportToGUI); + if (getMessageQueueToGUI()) + { + DeviceUSRPShared::MsgReportBuddyChange *reportToGUI = DeviceUSRPShared::MsgReportBuddyChange::create( + m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, false); + getMessageQueueToGUI()->push(reportToGUI); + } return true; } @@ -617,6 +617,7 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt bool forwardChangeAllDSP = false; bool forwardClockSource = false; bool ownThreadWasRunning = false; + bool checkRates = false; QList reverseAPIKeys; try @@ -665,10 +666,8 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt if (m_deviceShared.m_deviceParams->getDevice() && (m_channelAcquired || preGetStream)) { m_deviceShared.m_deviceParams->getDevice()->set_tx_rate(settings.m_devSampleRate, m_deviceShared.m_channel); - double actualSampleRate = m_deviceShared.m_deviceParams->getDevice()->get_tx_rate(m_deviceShared.m_channel); - qDebug("USRPOutput::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("USRPOutput::applySettings: set sample rate set to %d", settings.m_devSampleRate); + checkRates = true; } } @@ -776,6 +775,17 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt 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_tx_rate(m_deviceShared.m_channel); + qDebug("USRPOutput::applySettings: actual sample rate %f", actualSampleRate); + double masterClockRate = m_deviceShared.m_deviceParams->getDevice()->get_master_clock_rate(); + qDebug("USRPOutput::applySettings: master_clock_rate %f", masterClockRate); + m_settings.m_devSampleRate = actualSampleRate; + m_settings.m_masterClockRate = masterClockRate; + } + // forward changes to buddies or oneself if (forwardChangeAllDSP) @@ -795,7 +805,7 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt for (; itSink != sinkBuddies.end(); ++itSink) { DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create( - m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, false); + m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, false); (*itSink)->getSamplingDeviceInputMessageQueue()->push(report); } @@ -806,9 +816,17 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt for (; itSource != sourceBuddies.end(); ++itSource) { DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create( - m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, false); + m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, false); (*itSource)->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, false); + m_deviceAPI->getSamplingDeviceGUIMessageQueue()->push(report); + } } else if (forwardChangeTxDSP) { @@ -827,7 +845,7 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt for (; itSink != sinkBuddies.end(); ++itSink) { DeviceUSRPShared::MsgReportBuddyChange *report = DeviceUSRPShared::MsgReportBuddyChange::create( - m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, false); + m_settings.m_devSampleRate, m_settings.m_centerFrequency, m_settings.m_loOffset, m_settings.m_masterClockRate, false); (*itSink)->getSamplingDeviceInputMessageQueue()->push(report); } } @@ -856,6 +874,14 @@ bool USRPOutput::applySettings(const USRPOutputSettings& settings, bool preGetSt } } + // send to GUI in case requested clock isn't detected + if (m_deviceAPI->getSamplingDeviceGUIMessageQueue()) + { + DeviceUSRPShared::MsgReportClockSourceChange *report = DeviceUSRPShared::MsgReportClockSourceChange::create( + m_settings.m_clockSource); + m_deviceAPI->getSamplingDeviceGUIMessageQueue()->push(report); + } + // send to source buddies const std::vector& sourceBuddies = m_deviceAPI->getSourceBuddies(); std::vector::const_iterator itSource = sourceBuddies.begin(); diff --git a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp index bdf013cf2..ac82612db 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputgui.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutputgui.cpp @@ -180,9 +180,10 @@ bool USRPOutputGUI::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(); } @@ -291,12 +292,20 @@ void USRPOutputGUI::updateSampleRateAndFrequency() void USRPOutputGUI::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); } diff --git a/plugins/samplesink/usrpoutput/usrpoutputgui.ui b/plugins/samplesink/usrpoutput/usrpoutputgui.ui index 49abaea36..acb0c037e 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputgui.ui +++ b/plugins/samplesink/usrpoutput/usrpoutputgui.ui @@ -75,6 +75,16 @@ + + + + Master clock rate (sample rate between FPGA and RFIC) (k or MS/s) + + + 00000k + + + diff --git a/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp b/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp index 941962b9b..c342eb25f 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp +++ b/plugins/samplesink/usrpoutput/usrpoutputsettings.cpp @@ -27,6 +27,7 @@ USRPOutputSettings::USRPOutputSettings() void USRPOutputSettings::resetToDefaults() { + m_masterClockRate = -1; // Calculated by UHD m_centerFrequency = 435000*1000; m_devSampleRate = 3000000; m_loOffset = 0; diff --git a/plugins/samplesink/usrpoutput/usrpoutputsettings.h b/plugins/samplesink/usrpoutput/usrpoutputsettings.h index 899a60c72..80e20d281 100644 --- a/plugins/samplesink/usrpoutput/usrpoutputsettings.h +++ b/plugins/samplesink/usrpoutput/usrpoutputsettings.h @@ -30,6 +30,7 @@ */ struct USRPOutputSettings { + int m_masterClockRate; // global settings to be saved uint64_t m_centerFrequency; int m_devSampleRate; diff --git a/plugins/samplesource/usrpinput/usrpinput.cpp b/plugins/samplesource/usrpinput/usrpinput.cpp index 52d26c3b3..f81b67d0a 100644 --- a/plugins/samplesource/usrpinput/usrpinput.cpp +++ b/plugins/samplesource/usrpinput/usrpinput.cpp @@ -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<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 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); } } diff --git a/plugins/samplesource/usrpinput/usrpinputgui.cpp b/plugins/samplesource/usrpinput/usrpinputgui.cpp index e63b48f3b..485d9ef1e 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.cpp +++ b/plugins/samplesource/usrpinput/usrpinputgui.cpp @@ -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); } diff --git a/plugins/samplesource/usrpinput/usrpinputgui.ui b/plugins/samplesource/usrpinput/usrpinputgui.ui index c599ad659..9ac893c4f 100644 --- a/plugins/samplesource/usrpinput/usrpinputgui.ui +++ b/plugins/samplesource/usrpinput/usrpinputgui.ui @@ -75,6 +75,16 @@ + + + + Master clock rate (sample rate between FPGA and RFIC) (k or MS/s) + + + 00000k + + + @@ -799,17 +809,17 @@
gui/valuedial.h
1 - - TransverterButton - QPushButton -
gui/transverterbutton.h
-
ValueDialZ QWidget
gui/valuedialz.h
1
+ + TransverterButton + QPushButton +
gui/transverterbutton.h
+
diff --git a/plugins/samplesource/usrpinput/usrpinputsettings.cpp b/plugins/samplesource/usrpinput/usrpinputsettings.cpp index 0a8adf6b4..1a7c0b2be 100644 --- a/plugins/samplesource/usrpinput/usrpinputsettings.cpp +++ b/plugins/samplesource/usrpinput/usrpinputsettings.cpp @@ -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; diff --git a/plugins/samplesource/usrpinput/usrpinputsettings.h b/plugins/samplesource/usrpinput/usrpinputsettings.h index a485d2e80..9f6aa5372 100644 --- a/plugins/samplesource/usrpinput/usrpinputsettings.h +++ b/plugins/samplesource/usrpinput/usrpinputsettings.h @@ -34,6 +34,7 @@ struct USRPInputSettings GAIN_MANUAL } GainMode; + int m_masterClockRate; // global settings to be saved uint64_t m_centerFrequency; int m_devSampleRate;