diff --git a/devices/limesdr/CMakeLists.txt b/devices/limesdr/CMakeLists.txt index 0313da1f3..799a66bba 100644 --- a/devices/limesdr/CMakeLists.txt +++ b/devices/limesdr/CMakeLists.txt @@ -3,11 +3,13 @@ project(limesdrdevice) set(limesdrdevice_SOURCES devicelimesdr.cpp devicelimesdrparam.cpp + devicelimesdrshared.cpp ) set(limesdrdevice_HEADERS devicelimesdr.h devicelimesdrparam.h + devicelimesdrshared.h ) include_directories( diff --git a/devices/limesdr/devicelimesdrshared.h b/devices/limesdr/devicelimesdrshared.h index 90926bfa5..e10855442 100644 --- a/devices/limesdr/devicelimesdrshared.h +++ b/devices/limesdr/devicelimesdrshared.h @@ -19,12 +19,34 @@ #include #include "devicelimesdrparam.h" +#include "util/message.h" /** * Structure shared by a buddy with other buddies */ -struct DeviceLimeSDRShared +class DeviceLimeSDRShared { +public: + class MsgCrossReportToGUI : public Message { + MESSAGE_CLASS_DECLARATION + + public: + int getSampleRate() const { return m_sampleRate; } + + static MsgCrossReportToGUI* create(int sampleRate) + { + return new MsgCrossReportToGUI(sampleRate); + } + + private: + int m_sampleRate; + + MsgCrossReportToGUI(int sampleRate) : + Message(), + m_sampleRate(sampleRate) + { } + }; + class ThreadInterface { public: @@ -37,13 +59,15 @@ struct DeviceLimeSDRShared ThreadInterface *m_thread; //!< holds the thread address if started else 0 int m_ncoFrequency; uint64_t m_centerFrequency; + uint32_t m_log2Soft; DeviceLimeSDRShared() : m_deviceParams(0), m_channel(-1), m_thread(0), m_ncoFrequency(0), - m_centerFrequency(0) + m_centerFrequency(0), + m_log2Soft(0) {} ~DeviceLimeSDRShared() diff --git a/plugins/samplesink/limesdroutput/limesdroutput.cpp b/plugins/samplesink/limesdroutput/limesdroutput.cpp index d19a1f34b..a30efde15 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutput.cpp @@ -644,6 +644,7 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo { m_settings.m_log2SoftInterp = settings.m_log2SoftInterp; forwardChangeOwnDSP = true; + m_deviceShared.m_log2Soft = m_settings.m_log2SoftInterp; // for buddies if (m_limeSDROutputThread != 0) { @@ -755,11 +756,12 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo { qDebug("LimeSDROutput::applySettings: forward change to all buddies"); - int sampleRate = m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); // send to sink buddies @@ -770,7 +772,10 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo { DeviceLimeSDRShared *buddySharedPtr = (DeviceLimeSDRShared *) (*itSink)->getBuddySharedPtr(); int buddyNCOFreq = buddySharedPtr->m_ncoFrequency; - DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency + buddyNCOFreq); // do not change center frequency + uint32_t buddyLog2SoftInterp = buddySharedPtr->m_log2Soft; + DSPSignalNotification *notif = new DSPSignalNotification( + m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); MsgReportLimeSDRToGUI *report = MsgReportLimeSDRToGUI::create( m_settings.m_centerFrequency, @@ -788,12 +793,12 @@ bool LimeSDROutput::applySettings(const LimeSDROutputSettings& settings, bool fo DeviceLimeSDRShared *buddySharedPtr = (DeviceLimeSDRShared *) (*itSource)->getBuddySharedPtr(); uint64_t buddyCenterFreq = buddySharedPtr->m_centerFrequency; int buddyNCOFreq = buddySharedPtr->m_ncoFrequency; - DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, buddyCenterFreq + buddyNCOFreq); + uint32_t buddyLog2SoftDecim = buddySharedPtr->m_log2Soft; + DSPSignalNotification *notif = new DSPSignalNotification( + m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); - MsgReportLimeSDRToGUI *report = MsgReportLimeSDRToGUI::create( - buddyCenterFreq, - m_settings.m_devSampleRate, - m_settings.m_log2HardInterp); + DeviceLimeSDRShared::MsgCrossReportToGUI *report = DeviceLimeSDRShared::MsgCrossReportToGUI::create(m_settings.m_devSampleRate); (*itSource)->getDeviceOutputMessageQueue()->push(report); } } diff --git a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp index a39c2bb61..73d1b5bba 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputgui.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputgui.cpp @@ -182,6 +182,20 @@ void LimeSDROutputGUI::handleMessagesToGUI() delete message; } + else if (DeviceLimeSDRShared::MsgCrossReportToGUI::match(*message)) + { + DeviceLimeSDRShared::MsgCrossReportToGUI *report = (DeviceLimeSDRShared::MsgCrossReportToGUI *) message; + m_settings.m_devSampleRate = report->getSampleRate(); + + blockApplySettings(true); + displaySettings(); + blockApplySettings(false); + + LimeSDROutput::MsgSetReferenceConfig* conf = LimeSDROutput::MsgSetReferenceConfig::create(m_settings); + m_sampleSink->getInputMessageQueue()->push(conf); + + delete message; + } else if (LimeSDROutput::MsgReportStreamInfo::match(*message)) { LimeSDROutput::MsgReportStreamInfo *report = (LimeSDROutput::MsgReportStreamInfo *) message; diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index c63109050..592c23643 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -26,6 +26,7 @@ #include "limesdrinput.h" #include "limesdrinputthread.h" #include "limesdr/devicelimesdrparam.h" +#include "limesdr/devicelimesdrshared.h" #include "limesdr/devicelimesdr.h" MESSAGE_CLASS_DEFINITION(LimeSDRInput::MsgConfigureLimeSDR, Message) @@ -666,6 +667,7 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc { m_settings.m_log2SoftDecim = settings.m_log2SoftDecim; forwardChangeOwnDSP = true; + m_deviceShared.m_log2Soft = m_settings.m_log2SoftDecim; // for buddies if (m_limeSDRInputThread != 0) { @@ -777,11 +779,12 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc { qDebug("LimeSDRInput::applySettings: forward change to all buddies"); - int sampleRate = m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); // send to source buddies @@ -792,7 +795,10 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc { DeviceLimeSDRShared *buddySharedPtr = (DeviceLimeSDRShared *) (*itSource)->getBuddySharedPtr(); int buddyNCOFreq = buddySharedPtr->m_ncoFrequency; - DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency + buddyNCOFreq); + uint32_t buddyLog2Decim = buddySharedPtr->m_log2Soft; + DSPSignalNotification *notif = new DSPSignalNotification( + m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); MsgReportLimeSDRToGUI *report = MsgReportLimeSDRToGUI::create( m_settings.m_centerFrequency, @@ -810,12 +816,12 @@ bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool forc DeviceLimeSDRShared *buddySharedPtr = (DeviceLimeSDRShared *) (*itSink)->getBuddySharedPtr(); uint64_t buddyCenterFreq = buddySharedPtr->m_centerFrequency; int buddyNCOFreq = buddySharedPtr->m_ncoFrequency; - DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, buddyCenterFreq + buddyNCOFreq); // do not change center frequency + uint32_t buddyLog2Interp = buddySharedPtr->m_log2Soft; + DSPSignalNotification *notif = new DSPSignalNotification( + m_settings.m_devSampleRate/(1<getDeviceInputMessageQueue()->push(notif); - MsgReportLimeSDRToGUI *report = MsgReportLimeSDRToGUI::create( - buddyCenterFreq, - m_settings.m_devSampleRate, - m_settings.m_log2HardDecim); + DeviceLimeSDRShared::MsgCrossReportToGUI *report = DeviceLimeSDRShared::MsgCrossReportToGUI::create(m_settings.m_devSampleRate); (*itSink)->getDeviceOutputMessageQueue()->push(report); } } diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp index a35f4c7f8..ed9e4faff 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -185,6 +185,20 @@ void LimeSDRInputGUI::handleMessagesToGUI() delete message; } + else if (DeviceLimeSDRShared::MsgCrossReportToGUI::match(*message)) + { + DeviceLimeSDRShared::MsgCrossReportToGUI *report = (DeviceLimeSDRShared::MsgCrossReportToGUI *) message; + m_settings.m_devSampleRate = report->getSampleRate(); + + blockApplySettings(true); + displaySettings(); + blockApplySettings(false); + + LimeSDRInput::MsgSetReferenceConfig* conf = LimeSDRInput::MsgSetReferenceConfig::create(m_settings); + m_sampleSource->getInputMessageQueue()->push(conf); + + delete message; + } else if (LimeSDRInput::MsgReportStreamInfo::match(*message)) { LimeSDRInput::MsgReportStreamInfo *report = (LimeSDRInput::MsgReportStreamInfo *) message;