diff --git a/devices/bladerf2/devicebladerf2shared.cpp b/devices/bladerf2/devicebladerf2shared.cpp index 8d8c00eea..5068f816e 100644 --- a/devices/bladerf2/devicebladerf2shared.cpp +++ b/devices/bladerf2/devicebladerf2shared.cpp @@ -16,6 +16,8 @@ #include "devicebladerf2shared.h" +MESSAGE_CLASS_DEFINITION(DeviceBladeRF2Shared::MsgReportBuddyChange, Message) + DeviceBladeRF2Shared::DeviceBladeRF2Shared() : m_dev(0), m_channel(-1), diff --git a/devices/bladerf2/devicebladerf2shared.h b/devices/bladerf2/devicebladerf2shared.h index c72524a26..e8c5761a2 100644 --- a/devices/bladerf2/devicebladerf2shared.h +++ b/devices/bladerf2/devicebladerf2shared.h @@ -17,6 +17,7 @@ #ifndef DEVICES_BLADERF2_DEVICEBLADERF2SHARED_H_ #define DEVICES_BLADERF2_DEVICEBLADERF2SHARED_H_ +#include "util/message.h" #include "devicebladerf2.h" class SampleSinkFifo; @@ -56,6 +57,35 @@ public: virtual SampleSourceFifo *getFifo(unsigned int channel) = 0; }; + class MsgReportBuddyChange : public Message { + MESSAGE_CLASS_DECLARATION + + public: + bool getBiasTee() const { return m_biasTee; } + bool getRxElseTx() const { return m_rxElseTx; } + + static MsgReportBuddyChange* create( + bool biasTee, + bool rxElseTx) + { + return new MsgReportBuddyChange( + biasTee, + rxElseTx); + } + + private: + bool m_biasTee; + bool m_rxElseTx; //!< tells which side initiated the message + + MsgReportBuddyChange( + bool biasTee, + bool rxElseTx) : + Message(), + m_biasTee(biasTee), + m_rxElseTx(rxElseTx) + { } + }; + DeviceBladeRF2Shared(); ~DeviceBladeRF2Shared(); diff --git a/plugins/samplesource/bladerf2input/bladerf2input.cpp b/plugins/samplesource/bladerf2input/bladerf2input.cpp index d14df5a8d..3669ac4da 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2input.cpp @@ -431,6 +431,24 @@ bool BladeRF2Input::handleMessage(const Message& message) return true; } + else if (DeviceBladeRF2Shared::MsgReportBuddyChange::match(message)) + { + DeviceBladeRF2Shared::MsgReportBuddyChange& report = (DeviceBladeRF2Shared::MsgReportBuddyChange&) message; + + if (report.getRxElseTx()) + { + m_settings.m_biasTee = report.getBiasTee(); + } + + if (getMessageQueueToGUI()) + { + DeviceBladeRF2Shared::MsgReportBuddyChange *reportToGUI = DeviceBladeRF2Shared::MsgReportBuddyChange::create( + m_settings.m_biasTee, true); + getMessageQueueToGUI()->push(reportToGUI); + } + + return true; + } else if (MsgFileRecord::match(message)) { MsgFileRecord& conf = (MsgFileRecord&) message; @@ -480,7 +498,9 @@ bool BladeRF2Input::handleMessage(const Message& message) bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool force) { - bool forwardChange = false; + bool forwardChangeOwnDSP = false; + bool forwardChangeRxDSP = false; + bool forwardChangeAllDSP __attribute__((unused)) = false; struct bladerf *dev = m_deviceShared.m_dev->getDev(); qDebug() << "BladeRF2Input::applySettings: m_dev: " << dev; @@ -493,7 +513,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) { - forwardChange = true; + forwardChangeOwnDSP = true; if (dev != 0) { @@ -542,7 +562,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) { - forwardChange = true; + forwardChangeOwnDSP = true; if (m_deviceShared.m_inputThread != 0) { @@ -563,7 +583,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo (DeviceSampleSource::fcPos_t) settings.m_fcPos, settings.m_devSampleRate); - forwardChange = true; + forwardChangeOwnDSP = true; if (dev != 0) { @@ -578,7 +598,43 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo } } - if (forwardChange) + if ((m_settings.m_biasTee != settings.m_biasTee) || force) + { + m_deviceShared.m_dev->setBiasTeeRx(settings.m_biasTee); + forwardChangeRxDSP = true; + } + + if ((m_settings.m_globalGain != settings.m_globalGain) || force) + { + if (dev) + { + int status = bladerf_set_gain(dev, BLADERF_CHANNEL_RX(m_deviceShared.m_channel), settings.m_globalGain); + + if (status < 0) { + qWarning("BladeRF2Input::applySettings: bladerf_set_gain(%d) failed: %s", + settings.m_globalGain, bladerf_strerror(status)); + } else { + qDebug("BladeRF2Input::applySettings: bladerf_set_gain(%d)", settings.m_globalGain); + } + } + } + + if ((m_settings.m_gainMode != settings.m_gainMode) || force) + { + if (dev) + { + int status = bladerf_set_gain_mode(dev, BLADERF_CHANNEL_RX(m_deviceShared.m_channel), (bladerf_gain_mode) settings.m_gainMode); + + if (status < 0) { + qWarning("BladeRF2Input::applySettings: bladerf_set_gain_mode(%d) failed: %s", + settings.m_gainMode, bladerf_strerror(status)); + } else { + qDebug("BladeRF2Input::applySettings: bladerf_set_gain_mode(%d)", settings.m_gainMode); + } + } + } + + if (forwardChangeOwnDSP) { int sampleRate = settings.m_devSampleRate/(1<getDeviceEngineInputMessageQueue()->push(notif); } + if (forwardChangeRxDSP) + { + // send to source buddies + const std::vector& sourceBuddies = m_deviceAPI->getSourceBuddies(); + std::vector::const_iterator itSource = sourceBuddies.begin(); + + for (; itSource != sourceBuddies.end(); ++itSource) + { + DeviceBladeRF2Shared::MsgReportBuddyChange *report = DeviceBladeRF2Shared::MsgReportBuddyChange::create( + settings.m_biasTee, true); + (*itSource)->getSampleSourceInputMessageQueue()->push(report); + } + } + m_settings = settings; qDebug() << "BladeRF2Input::applySettings: " @@ -594,8 +664,11 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo << " m_log2Decim: " << m_settings.m_log2Decim << " m_fcPos: " << m_settings.m_fcPos << " m_devSampleRate: " << m_settings.m_devSampleRate + << " m_globalGain: " << m_settings.m_globalGain + << " m_gainMode: " << m_settings.m_gainMode << " m_dcBlock: " << m_settings.m_dcBlock - << " m_iqCorrection: " << m_settings.m_iqCorrection; + << " m_iqCorrection: " << m_settings.m_iqCorrection + << " m_biasTee: " << m_settings.m_biasTee; return true; } diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index f623e31e0..45add7cdd 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -590,9 +590,12 @@ bool LimeSDRInput::handleMessage(const Message& message) m_settings.m_centerFrequency + ncoShift); m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); - DeviceLimeSDRShared::MsgReportBuddyChange *reportToGUI = DeviceLimeSDRShared::MsgReportBuddyChange::create( - m_settings.m_devSampleRate, m_settings.m_log2HardDecim, m_settings.m_centerFrequency, true); - getMessageQueueToGUI()->push(reportToGUI); + if (getMessageQueueToGUI()) + { + DeviceLimeSDRShared::MsgReportBuddyChange *reportToGUI = DeviceLimeSDRShared::MsgReportBuddyChange::create( + m_settings.m_devSampleRate, m_settings.m_log2HardDecim, m_settings.m_centerFrequency, true); + getMessageQueueToGUI()->push(reportToGUI); + } return true; } @@ -603,9 +606,12 @@ bool LimeSDRInput::handleMessage(const Message& message) m_settings.m_extClock = report.getExtClock(); m_settings.m_extClockFreq = report.getExtClockFeq(); - DeviceLimeSDRShared::MsgReportClockSourceChange *reportToGUI = DeviceLimeSDRShared::MsgReportClockSourceChange::create( - m_settings.m_extClock, m_settings.m_extClockFreq); - getMessageQueueToGUI()->push(reportToGUI); + if (getMessageQueueToGUI()) + { + DeviceLimeSDRShared::MsgReportClockSourceChange *reportToGUI = DeviceLimeSDRShared::MsgReportClockSourceChange::create( + m_settings.m_extClock, m_settings.m_extClockFreq); + getMessageQueueToGUI()->push(reportToGUI); + } return true; }