LimeSDR: fixed reporting sample rate to buddies

pull/27/head
f4exb 2017-04-23 03:36:10 +02:00
rodzic 5556e65503
commit 7ad6533b1f
6 zmienionych plików z 83 dodań i 18 usunięć

Wyświetl plik

@ -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(

Wyświetl plik

@ -19,12 +19,34 @@
#include <cstddef>
#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()

Wyświetl plik

@ -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<<m_settings.m_log2SoftInterp);
int ncoShift = m_settings.m_ncoEnable ? m_settings.m_ncoFrequency : 0;
// send to self first
DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency + ncoShift);
DSPSignalNotification *notif = new DSPSignalNotification(
m_settings.m_devSampleRate/(1<<m_settings.m_log2SoftInterp),
m_settings.m_centerFrequency + ncoShift);
m_deviceAPI->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<<buddyLog2SoftInterp),
m_settings.m_centerFrequency + buddyNCOFreq); // do not change center frequency
(*itSink)->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<<buddyLog2SoftDecim),
buddyCenterFreq + buddyNCOFreq);
(*itSource)->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);
}
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -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<<m_settings.m_log2SoftDecim);
int ncoShift = m_settings.m_ncoEnable ? m_settings.m_ncoFrequency : 0;
// send to self first
DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency + ncoShift);
DSPSignalNotification *notif = new DSPSignalNotification(
m_settings.m_devSampleRate/(1<<m_settings.m_log2SoftDecim),
m_settings.m_centerFrequency + ncoShift);
m_deviceAPI->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<<buddyLog2Decim),
m_settings.m_centerFrequency + buddyNCOFreq);
(*itSource)->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<<buddyLog2Interp),
buddyCenterFreq + buddyNCOFreq); // do not change center frequency
(*itSink)->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);
}
}

Wyświetl plik

@ -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;