mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-29 19:28:47 -05:00
ATV Demod: effective sample rate reporting from demod to GUI
This commit is contained in:
parent
4c983abd0b
commit
f6cbdbe1ed
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureATVDemod, Message)
|
MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureATVDemod, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureRFATVDemod, Message)
|
MESSAGE_CLASS_DEFINITION(ATVDemod::MsgConfigureRFATVDemod, Message)
|
||||||
|
MESSAGE_CLASS_DEFINITION(ATVDemod::MsgReportEffectiveSampleRate, Message)
|
||||||
|
|
||||||
const float ATVDemod::m_fltSecondToUs = 1000000.0f;
|
const float ATVDemod::m_fltSecondToUs = 1000000.0f;
|
||||||
const int ATVDemod::m_ssbFftLen = 1024;
|
const int ATVDemod::m_ssbFftLen = 1024;
|
||||||
@ -63,7 +64,6 @@ ATVDemod::ATVDemod() :
|
|||||||
m_intSynchroPoints=0;
|
m_intSynchroPoints=0;
|
||||||
m_intNumberOfLines=0;
|
m_intNumberOfLines=0;
|
||||||
m_intNumberOfRowsToDisplay=0;
|
m_intNumberOfRowsToDisplay=0;
|
||||||
m_intTVSampleRate = 0;
|
|
||||||
|
|
||||||
m_objMagSqAverage.resize(32, 1.0);
|
m_objMagSqAverage.resize(32, 1.0);
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ ATVDemod::~ATVDemod()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ATVDemod::setATVScreen(ATVScreen *objScreen)
|
void ATVDemod::setATVScreen(ATVScreen *objScreen)
|
||||||
{
|
{
|
||||||
m_objRegisteredATVScreen = objScreen;
|
m_objRegisteredATVScreen = objScreen;
|
||||||
}
|
}
|
||||||
@ -596,20 +596,21 @@ void ATVDemod::applySettings()
|
|||||||
|| (m_objRFConfig.m_fltRFBandwidth != m_objRFRunning.m_fltRFBandwidth))
|
|| (m_objRFConfig.m_fltRFBandwidth != m_objRFRunning.m_fltRFBandwidth))
|
||||||
{
|
{
|
||||||
m_objSettingsMutex.lock();
|
m_objSettingsMutex.lock();
|
||||||
m_intTVSampleRate = (m_objConfig.m_intSampleRate / 1000000) * 1000000; // make sure working sample rate is a multiple of rate units
|
|
||||||
|
|
||||||
if (m_intTVSampleRate > 0)
|
m_objConfigPrivate.m_intTVSampleRate = (m_objConfig.m_intSampleRate / 1000000) * 1000000; // make sure working sample rate is a multiple of rate units
|
||||||
|
|
||||||
|
if (m_objConfigPrivate.m_intTVSampleRate > 0)
|
||||||
{
|
{
|
||||||
m_interpolatorDistance = (Real) m_intTVSampleRate / (Real) m_objConfig.m_intSampleRate;
|
m_interpolatorDistance = (Real) m_objConfigPrivate.m_intTVSampleRate / (Real) m_objConfig.m_intSampleRate;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_intTVSampleRate = m_objConfig.m_intSampleRate;
|
m_objConfigPrivate.m_intTVSampleRate = m_objConfig.m_intSampleRate;
|
||||||
m_interpolatorDistance = 1.0f;
|
m_interpolatorDistance = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolator.create(48, m_intTVSampleRate, m_objRFConfig.m_fltRFBandwidth / 2.2, 3.0);
|
m_interpolator.create(48, m_objConfigPrivate.m_intTVSampleRate, m_objRFConfig.m_fltRFBandwidth / 2.2, 3.0);
|
||||||
m_objSettingsMutex.unlock();
|
m_objSettingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,8 +637,19 @@ void ATVDemod::applySettings()
|
|||||||
m_objSettingsMutex.unlock();
|
m_objSettingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_objConfigPrivate.m_intTVSampleRate != m_objRunningPrivate.m_intTVSampleRate)
|
||||||
|
|| (m_objConfig.m_intSampleRate != m_objRunning.m_intSampleRate)
|
||||||
|
|| (m_objRFConfig.m_blndecimatorEnable != m_objRFRunning.m_blndecimatorEnable))
|
||||||
|
{
|
||||||
|
int sampleRate = m_objRFConfig.m_blndecimatorEnable ? m_objConfigPrivate.m_intTVSampleRate : m_objConfig.m_intSampleRate;
|
||||||
|
MsgReportEffectiveSampleRate *report;
|
||||||
|
report = MsgReportEffectiveSampleRate::create(sampleRate);
|
||||||
|
getOutputMessageQueue()->push(report);
|
||||||
|
}
|
||||||
|
|
||||||
m_objRunning = m_objConfig;
|
m_objRunning = m_objConfig;
|
||||||
m_objRFRunning = m_objRFConfig;
|
m_objRFRunning = m_objRFConfig;
|
||||||
|
m_objRunningPrivate = m_objConfigPrivate;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ATVDemod::getSampleRate()
|
int ATVDemod::getSampleRate()
|
||||||
|
@ -96,6 +96,27 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MsgReportEffectiveSampleRate : public Message
|
||||||
|
{
|
||||||
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
public:
|
||||||
|
int getSampleRate() const { return m_sampleRate; }
|
||||||
|
|
||||||
|
static MsgReportEffectiveSampleRate* create(int sampleRate)
|
||||||
|
{
|
||||||
|
return new MsgReportEffectiveSampleRate(sampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int m_sampleRate;
|
||||||
|
|
||||||
|
MsgReportEffectiveSampleRate(int sampleRate) :
|
||||||
|
Message(),
|
||||||
|
m_sampleRate(sampleRate)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
ATVDemod();
|
ATVDemod();
|
||||||
~ATVDemod();
|
~ATVDemod();
|
||||||
|
|
||||||
@ -121,11 +142,19 @@ public:
|
|||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
bool setATVScreen(ATVScreen *objScreen);
|
void setATVScreen(ATVScreen *objScreen);
|
||||||
int getSampleRate();
|
int getSampleRate();
|
||||||
double getMagSq() const { return m_objMagSqAverage.average(); } //!< Beware this is scaled to 2^30
|
double getMagSq() const { return m_objMagSqAverage.average(); } //!< Beware this is scaled to 2^30
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct ATVConfigPrivate
|
||||||
|
{
|
||||||
|
int m_intTVSampleRate;
|
||||||
|
|
||||||
|
ATVConfigPrivate() :
|
||||||
|
m_intTVSampleRate(0)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
class MsgConfigureATVDemod : public Message
|
class MsgConfigureATVDemod : public Message
|
||||||
{
|
{
|
||||||
@ -255,7 +284,6 @@ private:
|
|||||||
|
|
||||||
MovingAverage<double> m_objMagSqAverage;
|
MovingAverage<double> m_objMagSqAverage;
|
||||||
|
|
||||||
int m_intTVSampleRate;
|
|
||||||
NCO m_nco;
|
NCO m_nco;
|
||||||
|
|
||||||
// Interpolator group for decimation and/or double sideband RF filtering
|
// Interpolator group for decimation and/or double sideband RF filtering
|
||||||
@ -277,6 +305,9 @@ private:
|
|||||||
ATVRFConfig m_objRFRunning;
|
ATVRFConfig m_objRFRunning;
|
||||||
ATVRFConfig m_objRFConfig;
|
ATVRFConfig m_objRFConfig;
|
||||||
|
|
||||||
|
ATVConfigPrivate m_objRunningPrivate;
|
||||||
|
ATVConfigPrivate m_objConfigPrivate;
|
||||||
|
|
||||||
QMutex m_objSettingsMutex;
|
QMutex m_objSettingsMutex;
|
||||||
|
|
||||||
static const float m_fltSecondToUs;
|
static const float m_fltSecondToUs;
|
||||||
|
@ -170,7 +170,34 @@ bool ATVDemodGUI::deserialize(const QByteArray& arrData)
|
|||||||
|
|
||||||
bool ATVDemodGUI::handleMessage(const Message& objMessage)
|
bool ATVDemodGUI::handleMessage(const Message& objMessage)
|
||||||
{
|
{
|
||||||
return false;
|
if (ATVDemod::MsgReportEffectiveSampleRate::match(objMessage))
|
||||||
|
{
|
||||||
|
int sampleRate = ((ATVDemod::MsgReportEffectiveSampleRate&)objMessage).getSampleRate();
|
||||||
|
ui->channelSampleRateText->setText(tr("%1k").arg(sampleRate/1000.0f, 0, 'f', 0));
|
||||||
|
|
||||||
|
// filter sliders range
|
||||||
|
if (ui->modulation->currentIndex() == (int) ATVDemod::ATV_VAML)
|
||||||
|
{
|
||||||
|
ui->rfBW->setMaximum(sampleRate / 200000);
|
||||||
|
ui->rfOppBW->setMaximum(sampleRate / 200000);
|
||||||
|
}
|
||||||
|
else if (ui->modulation->currentIndex() == (int) ATVDemod::ATV_VAMU)
|
||||||
|
{
|
||||||
|
ui->rfBW->setMaximum(sampleRate / 200000);
|
||||||
|
ui->rfOppBW->setMaximum(sampleRate / 200000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->rfBW->setMaximum(sampleRate / 100000);
|
||||||
|
ui->rfOppBW->setMaximum(sampleRate / 100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATVDemodGUI::viewChanged()
|
void ATVDemodGUI::viewChanged()
|
||||||
@ -181,34 +208,9 @@ void ATVDemodGUI::viewChanged()
|
|||||||
void ATVDemodGUI::channelSampleRateChanged()
|
void ATVDemodGUI::channelSampleRateChanged()
|
||||||
{
|
{
|
||||||
qDebug("ATVDemodGUI::channelSampleRateChanged");
|
qDebug("ATVDemodGUI::channelSampleRateChanged");
|
||||||
ui->channelSampleRateText->setText(tr("%1k").arg(m_objChannelizer->getInputSampleRate()/1000.0f, 0, 'f', 0));
|
|
||||||
|
|
||||||
applySettings();
|
applySettings();
|
||||||
|
|
||||||
// filter sliders
|
|
||||||
|
|
||||||
if (ui->modulation->currentIndex() == (int) ATVDemod::ATV_VAML)
|
|
||||||
{
|
|
||||||
ui->rfBW->setMaximum(m_objChannelizer->getInputSampleRate() / 200000);
|
|
||||||
ui->rfOppBW->setMaximum(m_objChannelizer->getInputSampleRate() / 200000);
|
|
||||||
m_objChannelMarker.setBandwidth(ui->rfBW->value()*100000);
|
|
||||||
m_objChannelMarker.setOppositeBandwidth(ui->rfOppBW->value()*100000);
|
|
||||||
m_objChannelMarker.setSidebands(ChannelMarker::vlsb);
|
|
||||||
}
|
|
||||||
else if (ui->modulation->currentIndex() == (int) ATVDemod::ATV_VAMU)
|
|
||||||
{
|
|
||||||
ui->rfBW->setMaximum(m_objChannelizer->getInputSampleRate() / 200000);
|
|
||||||
ui->rfOppBW->setMaximum(m_objChannelizer->getInputSampleRate() / 200000);
|
|
||||||
m_objChannelMarker.setBandwidth(ui->rfBW->value()*100000);
|
|
||||||
m_objChannelMarker.setOppositeBandwidth(ui->rfOppBW->value()*100000);
|
|
||||||
m_objChannelMarker.setSidebands(ChannelMarker::vusb);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui->rfBW->setMaximum(m_objChannelizer->getInputSampleRate() / 100000);
|
|
||||||
ui->rfOppBW->setMaximum(m_objChannelizer->getInputSampleRate() / 100000);
|
|
||||||
m_objChannelMarker.setSidebands(ChannelMarker::dsb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// channel marker
|
// channel marker
|
||||||
|
|
||||||
@ -244,6 +246,19 @@ void ATVDemodGUI::channelSampleRateChanged()
|
|||||||
applyRFSettings();
|
applyRFSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ATVDemodGUI::handleSourceMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = m_objATVDemod->getOutputMessageQueue()->pop()) != 0)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message))
|
||||||
|
{
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
void ATVDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -307,6 +322,8 @@ ATVDemodGUI::ATVDemodGUI(PluginAPI* objPluginAPI, DeviceSourceAPI *objDeviceAPI,
|
|||||||
m_objMagSqAverage.resize(4, 1.0);
|
m_objMagSqAverage.resize(4, 1.0);
|
||||||
|
|
||||||
resetToDefaults(); // does applySettings()
|
resetToDefaults(); // does applySettings()
|
||||||
|
|
||||||
|
connect(m_objATVDemod->getOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ATVDemodGUI::~ATVDemodGUI()
|
ATVDemodGUI::~ATVDemodGUI()
|
||||||
|
@ -59,6 +59,7 @@ public:
|
|||||||
private slots:
|
private slots:
|
||||||
void viewChanged();
|
void viewChanged();
|
||||||
void channelSampleRateChanged();
|
void channelSampleRateChanged();
|
||||||
|
void handleSourceMessages();
|
||||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||||
void onMenuDoubleClicked();
|
void onMenuDoubleClicked();
|
||||||
void tick();
|
void tick();
|
||||||
|
Loading…
Reference in New Issue
Block a user