1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-01 22:42:25 -04:00

UDP source: use settings class

This commit is contained in:
f4exb 2017-10-07 05:44:43 +02:00
parent 8bee1b600c
commit bb6b313bc8
6 changed files with 301 additions and 362 deletions

View File

@ -29,6 +29,7 @@
const Real UDPSrc::m_agcTarget = 16384.0f; const Real UDPSrc::m_agcTarget = 16384.0f;
MESSAGE_CLASS_DEFINITION(UDPSrc::MsgConfigureUDPSrc, Message)
MESSAGE_CLASS_DEFINITION(UDPSrc::MsgConfigureChannelizer, Message) MESSAGE_CLASS_DEFINITION(UDPSrc::MsgConfigureChannelizer, Message)
MESSAGE_CLASS_DEFINITION(UDPSrc::MsgUDPSrcConfigure, Message) MESSAGE_CLASS_DEFINITION(UDPSrc::MsgUDPSrcConfigure, Message)
MESSAGE_CLASS_DEFINITION(UDPSrc::MsgUDPSrcConfigureImmediate, Message) MESSAGE_CLASS_DEFINITION(UDPSrc::MsgUDPSrcConfigureImmediate, Message)
@ -138,7 +139,7 @@ void UDPSrc::configureImmediate(MessageQueue* messageQueue,
Real boost, Real boost,
int volume, int volume,
Real squelchDB, Real squelchDB,
Real squelchGate, int squelchGate,
bool squelchEnabled, bool squelchEnabled,
bool agc, bool agc,
bool force) bool force)
@ -358,8 +359,6 @@ void UDPSrc::stop()
bool UDPSrc::handleMessage(const Message& cmd) bool UDPSrc::handleMessage(const Message& cmd)
{ {
qDebug() << "UDPSrc::handleMessage";
if (DownChannelizer::MsgChannelizerNotification::match(cmd)) if (DownChannelizer::MsgChannelizerNotification::match(cmd))
{ {
DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd;
@ -382,6 +381,60 @@ bool UDPSrc::handleMessage(const Message& cmd)
cfg.getSampleRate(), cfg.getSampleRate(),
cfg.getCenterFrequency()); cfg.getCenterFrequency());
qDebug() << "UDPSrc::handleMessage: MsgConfigureChannelizer:"
<< " sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
return true;
}
else if (MsgConfigureUDPSrc::match(cmd))
{
MsgConfigureUDPSrc& cfg = (MsgConfigureUDPSrc&) cmd;
UDPSrcSettings settings = cfg.getSettings();
// These settings are set with DownChannelizer::MsgChannelizerNotification
settings.m_inputSampleRate = m_settings.m_inputSampleRate;
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
m_config.m_audioActive = m_settings.m_audioActive;
m_config.m_audioStereo = m_settings.m_audioStereo;
m_config.m_gain = m_settings.m_gain;
m_config.m_volume = m_settings.m_volume;
m_config.m_squelch = CalcDb::powerFromdB((double) m_settings.m_squelchdB);
m_config.m_squelchGate = m_settings.m_squelchGate;
m_config.m_squelchEnabled = m_settings.m_squelchEnabled;
m_config.m_agc = m_settings.m_agc;
m_config.m_sampleFormat = m_settings.m_sampleFormat;
m_config.m_outputSampleRate = m_settings.m_outputSampleRate;
m_config.m_rfBandwidth = m_settings.m_rfBandwidth;
m_config.m_udpAddressStr = m_settings.m_udpAddress;
m_config.m_udpPort = m_settings.m_udpPort;
m_config.m_audioPort = m_settings.m_audioPort;
m_config.m_fmDeviation = m_settings.m_fmDeviation;
apply(cfg.getForce());
qDebug() << "UDPSrc::handleMessage: MsgConfigureUDPSrc: "
<< " m_inputSampleRate: " << m_config.m_inputSampleRate
<< " m_inputFrequencyOffset: " << m_config.m_inputFrequencyOffset
<< " m_audioActive: " << m_config.m_audioActive
<< " m_audioStereo: " << m_config.m_audioStereo
<< " m_gain: " << m_config.m_gain
<< " m_squelchEnabled: " << m_config.m_squelchEnabled
<< " m_squelch: " << m_config.m_squelch
<< " getSquelchDB: " << m_settings.m_squelchdB
<< " m_squelchGate" << m_config.m_squelchGate
<< " m_agc" << m_config.m_agc
<< " m_sampleFormat: " << m_config.m_sampleFormat
<< " m_outputSampleRate: " << m_config.m_outputSampleRate
<< " m_rfBandwidth: " << m_config.m_rfBandwidth
<< " m_fmDeviation: " << m_config.m_fmDeviation
<< " m_udpAddressStr: " << m_config.m_udpAddressStr
<< " m_udpPort: " << m_config.m_udpPort
<< " m_audioPort: " << m_config.m_audioPort
<< " force: " << cfg.getForce();
return true; return true;
} }
else if (MsgUDPSrcConfigureImmediate::match(cmd)) else if (MsgUDPSrcConfigureImmediate::match(cmd))
@ -407,7 +460,13 @@ bool UDPSrc::handleMessage(const Message& cmd)
<< " m_squelch: " << m_config.m_squelch << " m_squelch: " << m_config.m_squelch
<< " getSquelchDB: " << cfg.getSquelchDB() << " getSquelchDB: " << cfg.getSquelchDB()
<< " m_squelchGate" << m_config.m_squelchGate << " m_squelchGate" << m_config.m_squelchGate
<< " m_agc" << m_config.m_agc; << " m_agc" << m_config.m_agc
<< " m_sampleFormat: " << m_config.m_sampleFormat
<< " m_outputSampleRate: " << m_config.m_outputSampleRate
<< " m_rfBandwidth: " << m_config.m_rfBandwidth
<< " m_udpAddressStr: " << m_config.m_udpAddressStr
<< " m_udpPort: " << m_config.m_udpPort
<< " m_audioPort: " << m_config.m_audioPort;
return true; return true;
@ -426,9 +485,13 @@ bool UDPSrc::handleMessage(const Message& cmd)
apply(cfg.getForce()); apply(cfg.getForce());
qDebug() << "UDPSrc::handleMessage: MsgUDPSrcConfigure: m_sampleFormat: " << m_config.m_sampleFormat qDebug() << "UDPSrc::handleMessage: MsgUDPSrcConfigure:"
<< " m_inputSampleRate: " << m_config.m_inputSampleRate
<< " m_inputFrequencyOffset: " << m_config.m_inputFrequencyOffset
<< " m_sampleFormat: " << m_config.m_sampleFormat
<< " m_outputSampleRate: " << m_config.m_outputSampleRate << " m_outputSampleRate: " << m_config.m_outputSampleRate
<< " m_rfBandwidth: " << m_config.m_rfBandwidth << " m_rfBandwidth: " << m_config.m_rfBandwidth
<< " m_fmDeviation: " << m_config.m_fmDeviation
<< " m_udpAddressStr: " << m_config.m_udpAddressStr << " m_udpAddressStr: " << m_config.m_udpAddressStr
<< " m_udpPort: " << m_config.m_udpPort << " m_udpPort: " << m_config.m_udpPort
<< " m_audioPort: " << m_config.m_audioPort; << " m_audioPort: " << m_config.m_audioPort;
@ -480,13 +543,14 @@ void UDPSrc::apply(bool force)
} }
else else
{ {
m_squelchGate = m_config.m_outputSampleRate * m_config.m_squelchGate; m_squelchGate = (m_config.m_outputSampleRate * m_config.m_squelchGate) / 100;
} }
m_squelchRelease = m_config.m_outputSampleRate * m_config.m_squelchGate; m_squelchRelease = (m_config.m_outputSampleRate * m_config.m_squelchGate) / 100;
initSquelch(m_squelchOpen); initSquelch(m_squelchOpen);
m_agc.resize(m_config.m_outputSampleRate * 0.2, m_agcTarget); // Fixed 200 ms m_agc.resize(m_config.m_outputSampleRate * 0.2, m_agcTarget); // Fixed 200 ms
m_agc.setStepDownDelay( m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate)); int stepDownDelay = (m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 1 : m_config.m_squelchGate))/100;
m_agc.setStepDownDelay(stepDownDelay);
m_agc.setGate(m_config.m_outputSampleRate * 0.05); m_agc.setGate(m_config.m_outputSampleRate * 0.05);
m_bandpass.create(301, m_config.m_outputSampleRate, 300.0, m_config.m_rfBandwidth / 2.0f); m_bandpass.create(301, m_config.m_outputSampleRate, 300.0, m_config.m_rfBandwidth / 2.0f);
@ -520,12 +584,13 @@ void UDPSrc::apply(bool force)
} }
else else
{ {
m_squelchGate = m_config.m_outputSampleRate * m_config.m_squelchGate; m_squelchGate = (m_config.m_outputSampleRate * m_config.m_squelchGate)/100;
} }
m_squelchRelease = m_config.m_outputSampleRate * m_config.m_squelchGate; m_squelchRelease = (m_config.m_outputSampleRate * m_config.m_squelchGate)/100;
initSquelch(m_squelchOpen); initSquelch(m_squelchOpen);
m_agc.setStepDownDelay(m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 0.01 : m_config.m_squelchGate)); // same delay for up and down int stepDownDelay = (m_config.m_outputSampleRate * (m_config.m_squelchGate == 0 ? 1 : m_config.m_squelchGate))/100;
m_agc.setStepDownDelay(stepDownDelay); // same delay for up and down
} }
if ((m_config.m_squelch != m_running.m_squelch) || force) if ((m_config.m_squelch != m_running.m_squelch) || force)

View File

@ -43,6 +43,29 @@ class UDPSrc : public BasebandSampleSink {
Q_OBJECT Q_OBJECT
public: public:
class MsgConfigureUDPSrc : public Message {
MESSAGE_CLASS_DECLARATION
public:
const UDPSrcSettings& getSettings() const { return m_settings; }
bool getForce() const { return m_force; }
static MsgConfigureUDPSrc* create(const UDPSrcSettings& settings, bool force)
{
return new MsgConfigureUDPSrc(settings, force);
}
private:
UDPSrcSettings m_settings;
bool m_force;
MsgConfigureUDPSrc(const UDPSrcSettings& settings, bool force) :
Message(),
m_settings(settings),
m_force(force)
{ }
};
class MsgConfigureChannelizer : public Message { class MsgConfigureChannelizer : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION
@ -66,20 +89,6 @@ public:
{ } { }
}; };
// enum SampleFormat {
// FormatS16LE,
// FormatNFM,
// FormatNFMMono,
// FormatLSB,
// FormatUSB,
// FormatLSBMono,
// FormatUSBMono,
// FormatAMMono,
// FormatAMNoDCMono,
// FormatAMBPFMono,
// FormatNone
// };
UDPSrc(DeviceSourceAPI *deviceAPI); UDPSrc(DeviceSourceAPI *deviceAPI);
virtual ~UDPSrc(); virtual ~UDPSrc();
void setSpectrum(BasebandSampleSink* spectrum) { m_spectrum = spectrum; } void setSpectrum(BasebandSampleSink* spectrum) { m_spectrum = spectrum; }
@ -99,7 +108,7 @@ public:
Real gain, Real gain,
int volume, int volume,
Real squelchDB, Real squelchDB,
Real squelchGate, int squelchGate,
bool squelchEnabled, bool squelchEnabled,
bool agc, bool agc,
bool force); bool force);
@ -191,7 +200,7 @@ protected:
bool getAudioActive() const { return m_audioActive; } bool getAudioActive() const { return m_audioActive; }
bool getAudioStereo() const { return m_audioStereo; } bool getAudioStereo() const { return m_audioStereo; }
Real getSquelchDB() const { return m_squelchDB; } Real getSquelchDB() const { return m_squelchDB; }
Real getSquelchGate() const { return m_squelchGate; } int getSquelchGate() const { return m_squelchGate; }
bool getSquelchEnabled() const { return m_squelchEnabled; } bool getSquelchEnabled() const { return m_squelchEnabled; }
bool getAGC() const { return m_agc; } bool getAGC() const { return m_agc; }
bool getForce() const { return m_force; } bool getForce() const { return m_force; }
@ -199,10 +208,10 @@ protected:
static MsgUDPSrcConfigureImmediate* create( static MsgUDPSrcConfigureImmediate* create(
bool audioActive, bool audioActive,
bool audioStereo, bool audioStereo,
int gain, Real gain,
int volume, int volume,
Real squelchDB, Real squelchDB,
Real squelchGate, int squelchGate,
bool squelchEnabled, bool squelchEnabled,
bool agc, bool agc,
bool force) bool force)
@ -225,7 +234,7 @@ protected:
bool m_audioActive; bool m_audioActive;
bool m_audioStereo; bool m_audioStereo;
Real m_squelchDB; Real m_squelchDB;
Real m_squelchGate; // seconds int m_squelchGate; // 100ths seconds
bool m_squelchEnabled; bool m_squelchEnabled;
bool m_agc; bool m_agc;
bool m_force; bool m_force;
@ -236,7 +245,7 @@ protected:
Real gain, Real gain,
int volume, int volume,
Real squelchDB, Real squelchDB,
Real squelchGate, int squelchGate,
bool squelchEnabled, bool squelchEnabled,
bool agc, bool agc,
bool force) : bool force) :
@ -283,7 +292,7 @@ protected:
bool m_channelMute; bool m_channelMute;
Real m_gain; Real m_gain;
Real m_squelch; //!< squared magnitude Real m_squelch; //!< squared magnitude
Real m_squelchGate; //!< seconds int m_squelchGate; //!< 100ths seconds
bool m_squelchEnabled; bool m_squelchEnabled;
bool m_agc; bool m_agc;
bool m_audioActive; bool m_audioActive;
@ -304,7 +313,7 @@ protected:
m_channelMute(false), m_channelMute(false),
m_gain(1.0), m_gain(1.0),
m_squelch(1e-6), m_squelch(1e-6),
m_squelchGate(0.0), m_squelchGate(5),
m_squelchEnabled(true), m_squelchEnabled(true),
m_agc(false), m_agc(false),
m_audioActive(false), m_audioActive(false),
@ -318,6 +327,7 @@ protected:
Config m_config; Config m_config;
Config m_running; Config m_running;
UDPSrcSettings m_settings;
DeviceSourceAPI *m_deviceAPI; DeviceSourceAPI *m_deviceAPI;
ThreadedBasebandSampleSink* m_threadedChannelizer; ThreadedBasebandSampleSink* m_threadedChannelizer;

View File

@ -69,53 +69,18 @@ void UDPSrcGUI::resetToDefaults()
displaySettings(); displaySettings();
applySettingsImmediate(true); applySettingsImmediate(true);
applySettings(true); applySettings(true);
// blockApplySettings(true);
//
// ui->sampleFormat->setCurrentIndex(0);
// ui->sampleRate->setText("48000");
// ui->rfBandwidth->setText("32000");
// ui->fmDeviation->setText("2500");
// ui->spectrumGUI->resetToDefaults();
// ui->gain->setValue(10);
// ui->volume->setValue(20);
// ui->audioActive->setChecked(false);
// ui->audioStereo->setChecked(false);
// ui->agc->setChecked(false);
// m_channelMarker.setUDPAddress("127.0.0.1");
// m_channelMarker.setUDPSendPort(9999);
// m_channelMarker.setUDPReceivePort(9998);
//
// blockApplySettings(false);
// applySettingsImmediate();
// applySettings();
} }
QByteArray UDPSrcGUI::serialize() const QByteArray UDPSrcGUI::serialize() const
{ {
return m_settings.serialize(); return m_settings.serialize();
// SimpleSerializer s(1);
// s.writeS32(2, m_channelMarker.getCenterFrequency());
// s.writeS32(3, m_sampleFormat);
// s.writeReal(4, m_outputSampleRate);
// s.writeReal(5, m_rfBandwidth);
// s.writeBlob(6, m_channelMarker.serialize());
// s.writeBlob(7, ui->spectrumGUI->serialize());
// s.writeS32(8, ui->gain->value());
// s.writeBool(11, m_audioActive);
// s.writeS32(12, (qint32)m_volume);
// s.writeBool(14, m_audioStereo);
// s.writeS32(15, m_fmDeviation);
// s.writeS32(16, ui->squelch->value());
// s.writeS32(17, ui->squelchGate->value());
// s.writeBool(18, ui->agc->isChecked());
// return s.final();
} }
bool UDPSrcGUI::deserialize(const QByteArray& data) bool UDPSrcGUI::deserialize(const QByteArray& data)
{ {
if(m_settings.deserialize(data)) if(m_settings.deserialize(data))
{ {
qDebug("UDPSrcGUI::deserialize: m_squelchGate: %d", m_settings.m_squelchGate);
displaySettings(); displaySettings();
applySettingsImmediate(true); applySettingsImmediate(true);
applySettings(true); applySettings(true);
@ -124,108 +89,6 @@ bool UDPSrcGUI::deserialize(const QByteArray& data)
resetToDefaults(); resetToDefaults();
return false; return false;
} }
// SimpleDeserializer d(data);
//
// if (!d.isValid())
// {
// resetToDefaults();
// return false;
// }
//
// if (d.getVersion() == 1)
// {
// QByteArray bytetmp;
// QString strtmp;
// qint32 s32tmp;
// Real realtmp;
// bool booltmp;
//
// blockApplySettings(true);
// m_channelMarker.blockSignals(true);
//
// d.readBlob(6, &bytetmp);
// m_channelMarker.deserialize(bytetmp);
//
// d.readS32(2, &s32tmp, 0);
// m_channelMarker.setCenterFrequency(s32tmp);
// d.readS32(3, &s32tmp, UDPSrcSettings::FormatS16LE);
// switch(s32tmp) {
// case UDPSrcSettings::FormatS16LE:
// ui->sampleFormat->setCurrentIndex(0);
// break;
// case UDPSrcSettings::FormatNFM:
// ui->sampleFormat->setCurrentIndex(1);
// break;
// case UDPSrcSettings::FormatNFMMono:
// ui->sampleFormat->setCurrentIndex(2);
// break;
// case UDPSrcSettings::FormatLSB:
// ui->sampleFormat->setCurrentIndex(3);
// break;
// case UDPSrcSettings::FormatUSB:
// ui->sampleFormat->setCurrentIndex(4);
// break;
// case UDPSrcSettings::FormatLSBMono:
// ui->sampleFormat->setCurrentIndex(5);
// break;
// case UDPSrcSettings::FormatUSBMono:
// ui->sampleFormat->setCurrentIndex(6);
// break;
// case UDPSrcSettings::FormatAMMono:
// ui->sampleFormat->setCurrentIndex(7);
// break;
// case UDPSrcSettings::FormatAMNoDCMono:
// ui->sampleFormat->setCurrentIndex(8);
// break;
// case UDPSrcSettings::FormatAMBPFMono:
// ui->sampleFormat->setCurrentIndex(9);
// break;
// default:
// ui->sampleFormat->setCurrentIndex(0);
// break;
// }
// d.readReal(4, &realtmp, 48000);
// ui->sampleRate->setText(QString("%1").arg(realtmp, 0));
// d.readReal(5, &realtmp, 32000);
// ui->rfBandwidth->setText(QString("%1").arg(realtmp, 0));
// d.readBlob(7, &bytetmp);
// ui->spectrumGUI->deserialize(bytetmp);
// d.readS32(8, &s32tmp, 10);
// ui->gain->setValue(s32tmp);
// ui->gainText->setText(tr("%1").arg(s32tmp/10.0, 0, 'f', 1));
// d.readBool(11, &booltmp, false);
// ui->audioActive->setChecked(booltmp);
// d.readS32(12, &s32tmp, 20);
// ui->volume->setValue(s32tmp);
// ui->volumeText->setText(QString("%1").arg(s32tmp));
// d.readBool(14, &booltmp, false);
// ui->audioStereo->setChecked(booltmp);
// d.readS32(15, &s32tmp, 2500);
// ui->fmDeviation->setText(QString("%1").arg(s32tmp));
// d.readS32(16, &s32tmp, -60);
// ui->squelch->setValue(s32tmp);
// ui->squelchText->setText(tr("%1").arg(s32tmp*1.0, 0, 'f', 0));
// d.readS32(17, &s32tmp, 5);
// ui->squelchGate->setValue(s32tmp);
// ui->squelchGateText->setText(tr("%1").arg(s32tmp*10.0, 0, 'f', 0));
// d.readBool(18, &booltmp, false);
// ui->agc->setChecked(booltmp);
//
// blockApplySettings(false);
// m_channelMarker.blockSignals(false);
//
// this->setWindowTitle(m_channelMarker.getTitle());
// displaySettings();
// applySettingsImmediate(true);
// applySettings(true);
// return true;
// }
// else
// {
// resetToDefaults();
// return false;
// }
} }
bool UDPSrcGUI::handleMessage(const Message& message __attribute__((unused))) bool UDPSrcGUI::handleMessage(const Message& message __attribute__((unused)))
@ -236,11 +99,13 @@ bool UDPSrcGUI::handleMessage(const Message& message __attribute__((unused)))
void UDPSrcGUI::channelMarkerChanged() void UDPSrcGUI::channelMarkerChanged()
{ {
this->setWindowTitle(m_channelMarker.getTitle()); //m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); //m_settings.m_rfBandwidth = m_channelMarker.getBandwidth();
m_settings.m_udpAddress = m_channelMarker.getUDPAddress(), m_settings.m_udpAddress = m_channelMarker.getUDPAddress(),
m_settings.m_udpPort = m_channelMarker.getUDPSendPort(), m_settings.m_udpPort = m_channelMarker.getUDPSendPort(),
m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); m_settings.m_rgbColor = m_channelMarker.getColor().rgb();
this->setWindowTitle(m_channelMarker.getTitle());
setTitleColor(m_settings.m_rgbColor);
displayUDPAddress(); displayUDPAddress();
applySettings(); applySettings();
} }
@ -277,9 +142,8 @@ UDPSrcGUI::UDPSrcGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidget*
m_channelPowerAvg(4, 1e-10), m_channelPowerAvg(4, 1e-10),
m_inPowerAvg(4, 1e-10), m_inPowerAvg(4, 1e-10),
m_tickCount(0), m_tickCount(0),
m_gain(1.0), m_doApplySettings(true),
m_volume(20), m_rfBandwidthChanged(false)
m_doApplySettings(true)
{ {
ui->setupUi(this); ui->setupUi(this);
connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
@ -356,10 +220,42 @@ void UDPSrcGUI::displaySettings()
m_channelMarker.blockSignals(false); m_channelMarker.blockSignals(false);
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
ui->sampleRate->setText(QString("%1").arg(m_settings.m_outputSampleRate, 0)); ui->sampleRate->setText(QString("%1").arg(m_settings.m_outputSampleRate, 0));
setSampleFormatIndex(m_settings.m_sampleFormat);
switch(m_settings.m_sampleFormat) ui->squelch->setValue(m_settings.m_squelchdB);
ui->squelchText->setText(tr("%1").arg(ui->squelch->value()*1.0, 0, 'f', 0));
qDebug("UDPSrcGUI::deserialize: m_squelchGate: %d", m_settings.m_squelchGate);
ui->squelchGate->setValue(m_settings.m_squelchGate);
ui->squelchGateText->setText(tr("%1").arg(m_settings.m_squelchGate*10.0, 0, 'f', 0));
ui->rfBandwidth->setText(QString("%1").arg(m_settings.m_rfBandwidth, 0));
ui->fmDeviation->setText(QString("%1").arg(m_settings.m_fmDeviation, 0));
ui->agc->setChecked(m_settings.m_agc);
ui->audioActive->setChecked(m_settings.m_audioActive);
ui->audioStereo->setChecked(m_settings.m_audioStereo);
ui->volume->setValue(m_settings.m_volume);
ui->volumeText->setText(QString("%1").arg(ui->volume->value()));
ui->gain->setValue(m_settings.m_gain*10.0);
ui->gainText->setText(tr("%1").arg(ui->gain->value()/10.0, 0, 'f', 1));
ui->glSpectrum->setSampleRate(m_settings.m_outputSampleRate);
displayUDPAddress();
}
void UDPSrcGUI::displayUDPAddress()
{
ui->addressText->setText(tr("%1:%2/%3").arg(m_channelMarker.getUDPAddress()).arg(m_channelMarker.getUDPSendPort()).arg(m_channelMarker.getUDPReceivePort()));
}
void UDPSrcGUI::setSampleFormatIndex(const UDPSrcSettings::SampleFormat& sampleFormat)
{
switch(sampleFormat)
{ {
case UDPSrcSettings::FormatS16LE: case UDPSrcSettings::FormatS16LE:
ui->sampleFormat->setCurrentIndex(0); ui->sampleFormat->setCurrentIndex(0);
@ -395,168 +291,99 @@ void UDPSrcGUI::displaySettings()
ui->sampleFormat->setCurrentIndex(0); ui->sampleFormat->setCurrentIndex(0);
break; break;
} }
ui->squelch->setValue(m_settings.m_squelch);
ui->squelchText->setText(tr("%1").arg(ui->squelch->value()*1.0, 0, 'f', 0));
ui->squelchGate->setValue(m_settings.m_squelchGate*100.0);
ui->squelchGateText->setText(tr("%1").arg(ui->squelchGate->value()*10.0, 0, 'f', 0));
ui->rfBandwidth->setText(QString("%1").arg(m_settings.m_rfBandwidth, 0));
ui->fmDeviation->setText(QString("%1").arg(m_settings.m_fmDeviation, 0));
ui->agc->setChecked(m_settings.m_agc);
ui->audioActive->setChecked(m_settings.m_audioActive);
ui->audioStereo->setChecked(m_settings.m_audioStereo);
ui->volume->setValue(m_settings.m_volume);
ui->volumeText->setText(QString("%1").arg(ui->volume->value()));
ui->gain->setValue(m_settings.m_gain*10.0);
ui->gainText->setText(tr("%1").arg(ui->gain->value()/10.0, 0, 'f', 1));
ui->squelch->setValue(m_settings.m_squelch);
ui->squelchText->setText(tr("%1").arg(ui->squelch->value()*1.0, 0, 'f', 0));
ui->squelchGate->setValue(m_settings.m_squelchGate*100.0);
ui->squelchGateText->setText(tr("%1").arg(ui->squelchGate->value()*10.0, 0, 'f', 0));
displayUDPAddress();
} }
void UDPSrcGUI::displayUDPAddress() void UDPSrcGUI::setSampleFormat(int index)
{ {
ui->addressText->setText(tr("%1:%2/%3").arg(m_channelMarker.getUDPAddress()).arg(m_channelMarker.getUDPSendPort()).arg(m_channelMarker.getUDPReceivePort())); switch(index)
{
case 0:
m_settings.m_sampleFormat = UDPSrcSettings::FormatS16LE;
ui->fmDeviation->setEnabled(false);
break;
case 1:
m_settings.m_sampleFormat = UDPSrcSettings::FormatNFM;
ui->fmDeviation->setEnabled(true);
break;
case 2:
m_settings.m_sampleFormat = UDPSrcSettings::FormatNFMMono;
ui->fmDeviation->setEnabled(true);
break;
case 3:
m_settings.m_sampleFormat = UDPSrcSettings::FormatLSB;
ui->fmDeviation->setEnabled(false);
break;
case 4:
m_settings.m_sampleFormat = UDPSrcSettings::FormatUSB;
ui->fmDeviation->setEnabled(false);
break;
case 5:
m_settings.m_sampleFormat = UDPSrcSettings::FormatLSBMono;
ui->fmDeviation->setEnabled(false);
break;
case 6:
m_settings.m_sampleFormat = UDPSrcSettings::FormatUSBMono;
ui->fmDeviation->setEnabled(false);
break;
case 7:
m_settings.m_sampleFormat = UDPSrcSettings::FormatAMMono;
ui->fmDeviation->setEnabled(false);
break;
case 8:
m_settings.m_sampleFormat = UDPSrcSettings::FormatAMNoDCMono;
ui->fmDeviation->setEnabled(false);
break;
case 9:
m_settings.m_sampleFormat = UDPSrcSettings::FormatAMBPFMono;
ui->fmDeviation->setEnabled(false);
break;
default:
m_settings.m_sampleFormat = UDPSrcSettings::FormatS16LE;
ui->fmDeviation->setEnabled(false);
break;
}
} }
void UDPSrcGUI::applySettingsImmediate(bool force) void UDPSrcGUI::applySettingsImmediate(bool force)
{ {
if (m_doApplySettings) if (m_doApplySettings)
{ {
m_audioActive = ui->audioActive->isChecked(); UDPSrc::MsgConfigureUDPSrc* message = UDPSrc::MsgConfigureUDPSrc::create( m_settings, force);
m_audioStereo = ui->audioStereo->isChecked(); m_udpSrc->getInputMessageQueue()->push(message);
m_gain = ui->gain->value() / 10.0;
m_volume = ui->volume->value();
m_udpSrc->configureImmediate(m_udpSrc->getInputMessageQueue(), // m_udpSrc->configureImmediate(m_udpSrc->getInputMessageQueue(),
m_audioActive, // m_settings.m_audioActive,
m_audioStereo, // m_settings.m_audioStereo,
m_gain, // m_settings.m_gain,
m_volume, // m_settings.m_volume,
ui->squelch->value() * 1.0f, // m_settings.m_squelch,
ui->squelchGate->value() * 0.01f, // m_settings.m_squelchGate,
ui->squelch->value() != -100, // m_settings.m_squelch != -100,
ui->agc->isChecked(), // m_settings.m_agc,
force); // force);
} }
} }
void UDPSrcGUI::applySettings(bool force) void UDPSrcGUI::applySettings(bool force)
{ {
if (m_doApplySettings) if (m_doApplySettings)
{ {
bool ok;
Real outputSampleRate = ui->sampleRate->text().toDouble(&ok);
if((!ok) || (outputSampleRate < 1000))
{
outputSampleRate = 48000;
}
Real rfBandwidth = ui->rfBandwidth->text().toDouble(&ok);
if((!ok) || (rfBandwidth > outputSampleRate))
{
rfBandwidth = outputSampleRate;
}
int fmDeviation = ui->fmDeviation->text().toInt(&ok);
if ((!ok) || (fmDeviation < 1))
{
fmDeviation = 2500;
}
setTitleColor(m_channelMarker.getColor());
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
ui->sampleRate->setText(QString("%1").arg(outputSampleRate, 0));
ui->rfBandwidth->setText(QString("%1").arg(rfBandwidth, 0));
ui->fmDeviation->setText(QString("%1").arg(fmDeviation));
m_channelMarker.disconnect(this, SLOT(channelMarkerChanged()));
m_channelMarker.setBandwidth((int)rfBandwidth);
connect(&m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
ui->glSpectrum->setSampleRate(outputSampleRate);
UDPSrc::MsgConfigureChannelizer* channelConfigMsg = UDPSrc::MsgConfigureChannelizer::create( UDPSrc::MsgConfigureChannelizer* channelConfigMsg = UDPSrc::MsgConfigureChannelizer::create(
outputSampleRate, m_channelMarker.getCenterFrequency()); m_settings.m_outputSampleRate, m_channelMarker.getCenterFrequency());
m_udpSrc->getInputMessageQueue()->push(channelConfigMsg); m_udpSrc->getInputMessageQueue()->push(channelConfigMsg);
UDPSrcSettings::SampleFormat sampleFormat; UDPSrc::MsgConfigureUDPSrc* message = UDPSrc::MsgConfigureUDPSrc::create( m_settings, force);
m_udpSrc->getInputMessageQueue()->push(message);
switch(ui->sampleFormat->currentIndex()) // m_udpSrc->configure(m_udpSrc->getInputMessageQueue(),
{ // m_settings.m_sampleFormat,
case 0: // m_settings.m_outputSampleRate,
sampleFormat = UDPSrcSettings::FormatS16LE; // m_settings.m_rfBandwidth,
ui->fmDeviation->setEnabled(false); // m_settings.m_fmDeviation,
break; // m_channelMarker.getUDPAddress(),
case 1: // m_channelMarker.getUDPSendPort(),
sampleFormat = UDPSrcSettings::FormatNFM; // m_channelMarker.getUDPReceivePort(),
ui->fmDeviation->setEnabled(true); // force);
break;
case 2:
sampleFormat = UDPSrcSettings::FormatNFMMono;
ui->fmDeviation->setEnabled(true);
break;
case 3:
sampleFormat = UDPSrcSettings::FormatLSB;
ui->fmDeviation->setEnabled(false);
break;
case 4:
sampleFormat = UDPSrcSettings::FormatUSB;
ui->fmDeviation->setEnabled(false);
break;
case 5:
sampleFormat = UDPSrcSettings::FormatLSBMono;
ui->fmDeviation->setEnabled(false);
break;
case 6:
sampleFormat = UDPSrcSettings::FormatUSBMono;
ui->fmDeviation->setEnabled(false);
break;
case 7:
sampleFormat = UDPSrcSettings::FormatAMMono;
ui->fmDeviation->setEnabled(false);
break;
case 8:
sampleFormat = UDPSrcSettings::FormatAMNoDCMono;
ui->fmDeviation->setEnabled(false);
break;
case 9:
sampleFormat = UDPSrcSettings::FormatAMBPFMono;
ui->fmDeviation->setEnabled(false);
break;
default:
sampleFormat = UDPSrcSettings::FormatS16LE;
ui->fmDeviation->setEnabled(false);
break;
}
m_sampleFormat = sampleFormat;
m_outputSampleRate = outputSampleRate;
m_rfBandwidth = rfBandwidth;
m_fmDeviation = fmDeviation;
m_udpSrc->configure(m_udpSrc->getInputMessageQueue(),
sampleFormat,
outputSampleRate,
rfBandwidth,
fmDeviation,
m_channelMarker.getUDPAddress(),
m_channelMarker.getUDPSendPort(),
m_channelMarker.getUDPReceivePort(),
force);
ui->applyBtn->setEnabled(false); ui->applyBtn->setEnabled(false);
ui->applyBtn->setStyleSheet("QPushButton { background:rgb(79,79,79); }"); ui->applyBtn->setStyleSheet("QPushButton { background:rgb(79,79,79); }");
@ -566,6 +393,8 @@ void UDPSrcGUI::applySettings(bool force)
void UDPSrcGUI::on_deltaFrequency_changed(qint64 value) void UDPSrcGUI::on_deltaFrequency_changed(qint64 value)
{ {
m_channelMarker.setCenterFrequency(value); m_channelMarker.setCenterFrequency(value);
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
applySettings();
} }
void UDPSrcGUI::on_sampleFormat_currentIndexChanged(int index) void UDPSrcGUI::on_sampleFormat_currentIndexChanged(int index)
@ -576,87 +405,131 @@ void UDPSrcGUI::on_sampleFormat_currentIndexChanged(int index)
ui->fmDeviation->setEnabled(false); ui->fmDeviation->setEnabled(false);
} }
setSampleFormat(index);
ui->applyBtn->setEnabled(true); ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
} }
void UDPSrcGUI::on_sampleRate_textEdited(const QString& arg1 __attribute__((unused))) void UDPSrcGUI::on_sampleRate_textEdited(const QString& arg1 __attribute__((unused)))
{ {
bool ok;
Real outputSampleRate = ui->sampleRate->text().toDouble(&ok);
if((!ok) || (outputSampleRate < 1000))
{
m_settings.m_outputSampleRate = 48000;
ui->sampleRate->setText(QString("%1").arg(outputSampleRate, 0));
}
else
{
m_settings.m_outputSampleRate = outputSampleRate;
}
ui->applyBtn->setEnabled(true); ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
} }
void UDPSrcGUI::on_rfBandwidth_textEdited(const QString& arg1 __attribute__((unused))) void UDPSrcGUI::on_rfBandwidth_textEdited(const QString& arg1 __attribute__((unused)))
{ {
bool ok;
Real rfBandwidth = ui->rfBandwidth->text().toDouble(&ok);
if((!ok) || (rfBandwidth > m_settings.m_outputSampleRate))
{
m_settings.m_rfBandwidth = m_settings.m_outputSampleRate;
ui->rfBandwidth->setText(QString("%1").arg(m_settings.m_rfBandwidth, 0));
}
else
{
m_settings.m_rfBandwidth = rfBandwidth;
}
m_rfBandwidthChanged = true;
ui->applyBtn->setEnabled(true); ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
} }
void UDPSrcGUI::on_fmDeviation_textEdited(const QString& arg1 __attribute__((unused))) void UDPSrcGUI::on_fmDeviation_textEdited(const QString& arg1 __attribute__((unused)))
{ {
ui->applyBtn->setEnabled(true); bool ok;
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); int fmDeviation = ui->fmDeviation->text().toInt(&ok);
if ((!ok) || (fmDeviation < 1))
{
m_settings.m_fmDeviation = 2500;
ui->fmDeviation->setText(QString("%1").arg(m_settings.m_fmDeviation));
}
else
{
m_settings.m_fmDeviation = fmDeviation;
} }
void UDPSrcGUI::on_udpAddress_textEdited(const QString& arg1 __attribute__((unused)))
{
ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
}
void UDPSrcGUI::on_udpPort_textEdited(const QString& arg1 __attribute__((unused)))
{
ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
}
void UDPSrcGUI::on_audioPort_textEdited(const QString& arg1 __attribute__((unused)))
{
ui->applyBtn->setEnabled(true); ui->applyBtn->setEnabled(true);
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }"); ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
} }
void UDPSrcGUI::on_applyBtn_clicked() void UDPSrcGUI::on_applyBtn_clicked()
{ {
if (m_rfBandwidthChanged)
{
blockApplySettings(true);
m_channelMarker.setBandwidth((int) m_settings.m_rfBandwidth);
m_rfBandwidthChanged = false;
blockApplySettings(false);
}
ui->glSpectrum->setSampleRate(m_settings.m_outputSampleRate);
applySettings(); applySettings();
} }
void UDPSrcGUI::on_audioActive_toggled(bool active __attribute__((unused))) void UDPSrcGUI::on_audioActive_toggled(bool active)
{ {
m_settings.m_audioActive = active;
applySettingsImmediate(); applySettingsImmediate();
} }
void UDPSrcGUI::on_audioStereo_toggled(bool stereo __attribute__((unused))) void UDPSrcGUI::on_audioStereo_toggled(bool stereo)
{ {
m_settings.m_audioStereo = stereo;
applySettingsImmediate(); applySettingsImmediate();
} }
void UDPSrcGUI::on_agc_toggled(bool agc __attribute__((unused))) void UDPSrcGUI::on_agc_toggled(bool agc)
{ {
m_settings.m_agc = agc;
applySettingsImmediate(); applySettingsImmediate();
} }
void UDPSrcGUI::on_gain_valueChanged(int value) void UDPSrcGUI::on_gain_valueChanged(int value)
{ {
m_settings.m_gain = value / 10.0;
ui->gainText->setText(tr("%1").arg(value/10.0, 0, 'f', 1)); ui->gainText->setText(tr("%1").arg(value/10.0, 0, 'f', 1));
applySettingsImmediate(); applySettingsImmediate();
} }
void UDPSrcGUI::on_volume_valueChanged(int value) void UDPSrcGUI::on_volume_valueChanged(int value)
{ {
m_settings.m_volume = value;
ui->volumeText->setText(QString("%1").arg(value)); ui->volumeText->setText(QString("%1").arg(value));
applySettingsImmediate(); applySettingsImmediate();
} }
void UDPSrcGUI::on_squelch_valueChanged(int value) void UDPSrcGUI::on_squelch_valueChanged(int value)
{ {
m_settings.m_squelchdB = value;
if (value == -100) // means disabled if (value == -100) // means disabled
{ {
ui->squelchText->setText("---"); ui->squelchText->setText("---");
m_settings.m_squelchEnabled = false;
} }
else else
{ {
ui->squelchText->setText(tr("%1").arg(value*1.0, 0, 'f', 0)); ui->squelchText->setText(tr("%1").arg(value*1.0, 0, 'f', 0));
m_settings.m_squelchEnabled = true;
} }
applySettingsImmediate(); applySettingsImmediate();
@ -664,6 +537,7 @@ void UDPSrcGUI::on_squelch_valueChanged(int value)
void UDPSrcGUI::on_squelchGate_valueChanged(int value) void UDPSrcGUI::on_squelchGate_valueChanged(int value)
{ {
m_settings.m_squelchGate = value;
ui->squelchGateText->setText(tr("%1").arg(value*10.0, 0, 'f', 0)); ui->squelchGateText->setText(tr("%1").arg(value*10.0, 0, 'f', 0));
applySettingsImmediate(); applySettingsImmediate();
} }

View File

@ -63,9 +63,6 @@ private slots:
void on_sampleFormat_currentIndexChanged(int index); void on_sampleFormat_currentIndexChanged(int index);
void on_sampleRate_textEdited(const QString& arg1); void on_sampleRate_textEdited(const QString& arg1);
void on_rfBandwidth_textEdited(const QString& arg1); void on_rfBandwidth_textEdited(const QString& arg1);
void on_udpAddress_textEdited(const QString& arg1);
void on_udpPort_textEdited(const QString& arg1);
void on_audioPort_textEdited(const QString& arg1);
void on_fmDeviation_textEdited(const QString& arg1); void on_fmDeviation_textEdited(const QString& arg1);
void on_audioActive_toggled(bool active); void on_audioActive_toggled(bool active);
void on_audioStereo_toggled(bool stereo); void on_audioStereo_toggled(bool stereo);
@ -91,15 +88,8 @@ private:
uint32_t m_tickCount; uint32_t m_tickCount;
// settings // settings
UDPSrcSettings::SampleFormat m_sampleFormat;
Real m_outputSampleRate;
Real m_rfBandwidth;
int m_fmDeviation;
Real m_gain;
bool m_audioActive;
bool m_audioStereo;
int m_volume;
bool m_doApplySettings; bool m_doApplySettings;
bool m_rfBandwidthChanged;
MessageQueue m_inputMessageQueue; MessageQueue m_inputMessageQueue;
// RF path // RF path
@ -113,6 +103,8 @@ private:
void applySettingsImmediate(bool force = false); void applySettingsImmediate(bool force = false);
void displaySettings(); void displaySettings();
void displayUDPAddress(); void displayUDPAddress();
void setSampleFormat(int index);
void setSampleFormatIndex(const UDPSrcSettings::SampleFormat& sampleFormat);
void leaveEvent(QEvent*); void leaveEvent(QEvent*);
void enterEvent(QEvent*); void enterEvent(QEvent*);

View File

@ -38,7 +38,7 @@ void UDPSrcSettings::resetToDefaults()
m_fmDeviation = 2500; m_fmDeviation = 2500;
m_channelMute = false; m_channelMute = false;
m_gain = 1.0; m_gain = 1.0;
m_squelch = -60.0; m_squelchdB = -60;
m_squelchGate = 0.0; m_squelchGate = 0.0;
m_squelchEnabled = true; m_squelchEnabled = true;
m_agc = false; m_agc = false;
@ -55,7 +55,7 @@ QByteArray UDPSrcSettings::serialize() const
{ {
SimpleSerializer s(1); SimpleSerializer s(1);
s.writeS32(2, m_inputFrequencyOffset); s.writeS32(2, m_inputFrequencyOffset);
s.writeS32(3, m_sampleFormat); s.writeS32(3, (int) m_sampleFormat);
s.writeReal(4, m_outputSampleRate); s.writeReal(4, m_outputSampleRate);
s.writeReal(5, m_rfBandwidth); s.writeReal(5, m_rfBandwidth);
@ -73,8 +73,8 @@ QByteArray UDPSrcSettings::serialize() const
s.writeS32(12, m_volume); s.writeS32(12, m_volume);
s.writeBool(14, m_audioStereo); s.writeBool(14, m_audioStereo);
s.writeS32(15, m_fmDeviation); s.writeS32(15, m_fmDeviation);
s.writeS32(16, m_squelch); s.writeS32(16, m_squelchdB);
s.writeS32(17, m_squelchGate * 100.0); s.writeS32(17, m_squelchGate);
s.writeBool(18, m_agc); s.writeBool(18, m_agc);
return s.final(); return s.final();
@ -127,10 +127,8 @@ bool UDPSrcSettings::deserialize(const QByteArray& data)
d.readS32(12, &m_volume, 20); d.readS32(12, &m_volume, 20);
d.readBool(14, &m_audioStereo, false); d.readBool(14, &m_audioStereo, false);
d.readS32(15, &m_fmDeviation, 2500); d.readS32(15, &m_fmDeviation, 2500);
d.readS32(16, &s32tmp, -60); d.readS32(16, &m_squelchdB, -60);
m_squelch = s32tmp * 1.0; d.readS32(17, &m_squelchGate, 5);
d.readS32(17, &s32tmp, 5);
m_squelchGate = s32tmp / 100.0;
d.readBool(18, &m_agc, false); d.readBool(18, &m_agc, false);
return true; return true;
} }

View File

@ -47,8 +47,8 @@ struct UDPSrcSettings
int m_fmDeviation; int m_fmDeviation;
bool m_channelMute; bool m_channelMute;
float m_gain; float m_gain;
float m_squelch; //!< squared magnitude int m_squelchdB; //!< power dB
float m_squelchGate; //!< seconds int m_squelchGate; //!< 100ths seconds
bool m_squelchEnabled; bool m_squelchEnabled;
bool m_agc; bool m_agc;
bool m_audioActive; bool m_audioActive;