mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-29 21:42:26 -04:00
DSD demod: allow to set baud rate (2400 or 4800 not 9600 for now)
This commit is contained in:
parent
5ca0c95dc5
commit
25b06d06d3
@ -29,8 +29,33 @@ DSDDecoder::DSDDecoder()
|
|||||||
m_decoder.setUvQuality(3); // This is gr-dsd default
|
m_decoder.setUvQuality(3); // This is gr-dsd default
|
||||||
m_decoder.setModulationOptimizations(DSDcc::DSDDecoder::DSDModulationOptimAuto); // Initialize with auto detection of modulation optimization:
|
m_decoder.setModulationOptimizations(DSDcc::DSDDecoder::DSDModulationOptimAuto); // Initialize with auto detection of modulation optimization:
|
||||||
m_decoder.enableCosineFiltering(false);
|
m_decoder.enableCosineFiltering(false);
|
||||||
|
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800);
|
||||||
}
|
}
|
||||||
|
|
||||||
DSDDecoder::~DSDDecoder()
|
DSDDecoder::~DSDDecoder()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DSDDecoder::setBaudRate(int baudRate)
|
||||||
|
{
|
||||||
|
if (baudRate == 2400)
|
||||||
|
{
|
||||||
|
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate2400);
|
||||||
|
}
|
||||||
|
else if (baudRate == 4800)
|
||||||
|
{
|
||||||
|
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800);
|
||||||
|
}
|
||||||
|
else if (baudRate == 9600)
|
||||||
|
{
|
||||||
|
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate9600);
|
||||||
|
}
|
||||||
|
else // default 4800 bauds
|
||||||
|
{
|
||||||
|
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800);
|
||||||
|
}
|
||||||
|
|
||||||
|
// when setting baud rate activate detection of all possible modes for this rate
|
||||||
|
// because on the other hand when a mode is selected then the baud rate is automatically changed
|
||||||
|
m_decoder.setDecodeMode(DSDcc::DSDDecoder::DSDDecodeAuto, true);
|
||||||
|
}
|
||||||
|
@ -50,6 +50,7 @@ public:
|
|||||||
const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); }
|
const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); }
|
||||||
|
|
||||||
void setAudioGain(float gain) { m_decoder.setAudioGain(gain); }
|
void setAudioGain(float gain) { m_decoder.setAudioGain(gain); }
|
||||||
|
void setBaudRate(int baudRate);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DSDcc::DSDDecoder m_decoder;
|
DSDcc::DSDDecoder m_decoder;
|
||||||
|
@ -51,6 +51,7 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) :
|
|||||||
m_config.m_squelchGate = 5; // 10s of ms at 48000 Hz sample rate. Corresponds to 2400 for AGC attack
|
m_config.m_squelchGate = 5; // 10s of ms at 48000 Hz sample rate. Corresponds to 2400 for AGC attack
|
||||||
m_config.m_squelch = -30.0;
|
m_config.m_squelch = -30.0;
|
||||||
m_config.m_volume = 1.0;
|
m_config.m_volume = 1.0;
|
||||||
|
m_config.m_baudRate = 4800;
|
||||||
m_config.m_audioMute = false;
|
m_config.m_audioMute = false;
|
||||||
m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
|
||||||
|
|
||||||
@ -78,6 +79,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
|
|||||||
int demodGain,
|
int demodGain,
|
||||||
int fmDeviation,
|
int fmDeviation,
|
||||||
int volume,
|
int volume,
|
||||||
|
int baudRate,
|
||||||
int squelchGate,
|
int squelchGate,
|
||||||
Real squelch,
|
Real squelch,
|
||||||
bool audioMute)
|
bool audioMute)
|
||||||
@ -86,6 +88,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
|
|||||||
demodGain,
|
demodGain,
|
||||||
fmDeviation,
|
fmDeviation,
|
||||||
volume,
|
volume,
|
||||||
|
baudRate,
|
||||||
squelchGate,
|
squelchGate,
|
||||||
squelch,
|
squelch,
|
||||||
audioMute);
|
audioMute);
|
||||||
@ -239,6 +242,7 @@ bool DSDDemod::handleMessage(const Message& cmd)
|
|||||||
m_config.m_demodGain = cfg.getDemodGain();
|
m_config.m_demodGain = cfg.getDemodGain();
|
||||||
m_config.m_fmDeviation = cfg.getFMDeviation();
|
m_config.m_fmDeviation = cfg.getFMDeviation();
|
||||||
m_config.m_volume = cfg.getVolume();
|
m_config.m_volume = cfg.getVolume();
|
||||||
|
m_config.m_baudRate = cfg.getBaudRate();
|
||||||
m_config.m_squelchGate = cfg.getSquelchGate();
|
m_config.m_squelchGate = cfg.getSquelchGate();
|
||||||
m_config.m_squelch = cfg.getSquelch();
|
m_config.m_squelch = cfg.getSquelch();
|
||||||
m_config.m_audioMute = cfg.getAudioMute();
|
m_config.m_audioMute = cfg.getAudioMute();
|
||||||
@ -249,6 +253,7 @@ bool DSDDemod::handleMessage(const Message& cmd)
|
|||||||
<< " m_demodGain: " << m_config.m_demodGain / 100.0
|
<< " m_demodGain: " << m_config.m_demodGain / 100.0
|
||||||
<< " m_fmDeviation: " << m_config.m_fmDeviation * 100
|
<< " m_fmDeviation: " << m_config.m_fmDeviation * 100
|
||||||
<< " m_volume: " << m_config.m_volume / 10.0
|
<< " m_volume: " << m_config.m_volume / 10.0
|
||||||
|
<< " m_baudRate: " << m_config.m_baudRate
|
||||||
<< " m_squelchGate" << m_config.m_squelchGate
|
<< " m_squelchGate" << m_config.m_squelchGate
|
||||||
<< " m_squelch: " << m_config.m_squelch
|
<< " m_squelch: " << m_config.m_squelch
|
||||||
<< " m_audioMute: " << m_config.m_audioMute;
|
<< " m_audioMute: " << m_config.m_audioMute;
|
||||||
@ -303,7 +308,12 @@ void DSDDemod::apply()
|
|||||||
m_dsdDecoder.setAudioGain(m_config.m_volume / 10.0f);
|
m_dsdDecoder.setAudioGain(m_config.m_volume / 10.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
|
if (m_config.m_baudRate != m_running.m_baudRate)
|
||||||
|
{
|
||||||
|
m_dsdDecoder.setBaudRate(m_config.m_baudRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
|
||||||
m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset;
|
m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset;
|
||||||
m_running.m_rfBandwidth = m_config.m_rfBandwidth;
|
m_running.m_rfBandwidth = m_config.m_rfBandwidth;
|
||||||
m_running.m_demodGain = m_config.m_demodGain;
|
m_running.m_demodGain = m_config.m_demodGain;
|
||||||
@ -311,6 +321,7 @@ void DSDDemod::apply()
|
|||||||
m_running.m_squelchGate = m_config.m_squelchGate;
|
m_running.m_squelchGate = m_config.m_squelchGate;
|
||||||
m_running.m_squelch = m_config.m_squelch;
|
m_running.m_squelch = m_config.m_squelch;
|
||||||
m_running.m_volume = m_config.m_volume;
|
m_running.m_volume = m_config.m_volume;
|
||||||
|
m_running.m_baudRate = m_config.m_baudRate;
|
||||||
m_running.m_audioSampleRate = m_config.m_audioSampleRate;
|
m_running.m_audioSampleRate = m_config.m_audioSampleRate;
|
||||||
m_running.m_audioMute = m_config.m_audioMute;
|
m_running.m_audioMute = m_config.m_audioMute;
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ public:
|
|||||||
int rfBandwidth,
|
int rfBandwidth,
|
||||||
int demodGain,
|
int demodGain,
|
||||||
int volume,
|
int volume,
|
||||||
|
int baudRate,
|
||||||
int fmDeviation,
|
int fmDeviation,
|
||||||
int squelchGate,
|
int squelchGate,
|
||||||
Real squelch,
|
Real squelch,
|
||||||
@ -72,6 +73,7 @@ private:
|
|||||||
int getDemodGain() const { return m_demodGain; }
|
int getDemodGain() const { return m_demodGain; }
|
||||||
int getFMDeviation() const { return m_fmDeviation; }
|
int getFMDeviation() const { return m_fmDeviation; }
|
||||||
int getVolume() const { return m_volume; }
|
int getVolume() const { return m_volume; }
|
||||||
|
int getBaudRate() const { return m_baudRate; }
|
||||||
int getSquelchGate() const { return m_squelchGate; }
|
int getSquelchGate() const { return m_squelchGate; }
|
||||||
Real getSquelch() const { return m_squelch; }
|
Real getSquelch() const { return m_squelch; }
|
||||||
bool getAudioMute() const { return m_audioMute; }
|
bool getAudioMute() const { return m_audioMute; }
|
||||||
@ -80,11 +82,12 @@ private:
|
|||||||
int demodGain,
|
int demodGain,
|
||||||
int fmDeviation,
|
int fmDeviation,
|
||||||
int volume,
|
int volume,
|
||||||
|
int baudRate,
|
||||||
int squelchGate,
|
int squelchGate,
|
||||||
Real squelch,
|
Real squelch,
|
||||||
bool audioMute)
|
bool audioMute)
|
||||||
{
|
{
|
||||||
return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, squelchGate, squelch, audioMute);
|
return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, baudRate, squelchGate, squelch, audioMute);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -92,6 +95,7 @@ private:
|
|||||||
Real m_demodGain;
|
Real m_demodGain;
|
||||||
int m_fmDeviation;
|
int m_fmDeviation;
|
||||||
int m_volume;
|
int m_volume;
|
||||||
|
int m_baudRate;
|
||||||
int m_squelchGate;
|
int m_squelchGate;
|
||||||
Real m_squelch;
|
Real m_squelch;
|
||||||
bool m_audioMute;
|
bool m_audioMute;
|
||||||
@ -100,6 +104,7 @@ private:
|
|||||||
int demodGain,
|
int demodGain,
|
||||||
int fmDeviation,
|
int fmDeviation,
|
||||||
int volume,
|
int volume,
|
||||||
|
int baudRate,
|
||||||
int squelchGate,
|
int squelchGate,
|
||||||
Real squelch,
|
Real squelch,
|
||||||
bool audioMute) :
|
bool audioMute) :
|
||||||
@ -108,6 +113,7 @@ private:
|
|||||||
m_demodGain(demodGain),
|
m_demodGain(demodGain),
|
||||||
m_fmDeviation(fmDeviation),
|
m_fmDeviation(fmDeviation),
|
||||||
m_volume(volume),
|
m_volume(volume),
|
||||||
|
m_baudRate(baudRate),
|
||||||
m_squelchGate(squelchGate),
|
m_squelchGate(squelchGate),
|
||||||
m_squelch(squelch),
|
m_squelch(squelch),
|
||||||
m_audioMute(audioMute)
|
m_audioMute(audioMute)
|
||||||
@ -131,6 +137,7 @@ private:
|
|||||||
int m_rfBandwidth;
|
int m_rfBandwidth;
|
||||||
int m_demodGain;
|
int m_demodGain;
|
||||||
int m_volume;
|
int m_volume;
|
||||||
|
int m_baudRate;
|
||||||
int m_fmDeviation;
|
int m_fmDeviation;
|
||||||
int m_squelchGate;
|
int m_squelchGate;
|
||||||
Real m_squelch;
|
Real m_squelch;
|
||||||
@ -143,6 +150,7 @@ private:
|
|||||||
m_rfBandwidth(-1),
|
m_rfBandwidth(-1),
|
||||||
m_demodGain(-1),
|
m_demodGain(-1),
|
||||||
m_volume(-1),
|
m_volume(-1),
|
||||||
|
m_baudRate(4800),
|
||||||
m_fmDeviation(1),
|
m_fmDeviation(1),
|
||||||
m_squelchGate(1),
|
m_squelchGate(1),
|
||||||
m_squelch(0),
|
m_squelch(0),
|
||||||
|
@ -36,6 +36,11 @@
|
|||||||
|
|
||||||
const QString DSDDemodGUI::m_channelID = "sdrangel.channel.dsddemod";
|
const QString DSDDemodGUI::m_channelID = "sdrangel.channel.dsddemod";
|
||||||
|
|
||||||
|
unsigned int DSDDemodBaudRates::m_rates[] = {2400, 4800};
|
||||||
|
unsigned int DSDDemodBaudRates::m_nb_rates = 2;
|
||||||
|
unsigned int DSDDemodBaudRates::m_defaultRateIndex = 1; // 4800 bauds
|
||||||
|
|
||||||
|
|
||||||
DSDDemodGUI* DSDDemodGUI::create(PluginAPI* pluginAPI, DeviceAPI *deviceAPI)
|
DSDDemodGUI* DSDDemodGUI::create(PluginAPI* pluginAPI, DeviceAPI *deviceAPI)
|
||||||
{
|
{
|
||||||
DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceAPI);
|
DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceAPI);
|
||||||
@ -76,6 +81,7 @@ void DSDDemodGUI::resetToDefaults()
|
|||||||
ui->demodGain->setValue(100); // 100ths
|
ui->demodGain->setValue(100); // 100ths
|
||||||
ui->fmDeviation->setValue(50); // x100 Hz
|
ui->fmDeviation->setValue(50); // x100 Hz
|
||||||
ui->volume->setValue(20); // /10.0
|
ui->volume->setValue(20); // /10.0
|
||||||
|
ui->baudRate->setCurrentIndex(DSDDemodBaudRates::getDefaultRateIndex());
|
||||||
ui->squelchGate->setValue(5);
|
ui->squelchGate->setValue(5);
|
||||||
ui->squelch->setValue(-40);
|
ui->squelch->setValue(-40);
|
||||||
ui->deltaFrequency->setValue(0);
|
ui->deltaFrequency->setValue(0);
|
||||||
@ -96,6 +102,7 @@ QByteArray DSDDemodGUI::serialize() const
|
|||||||
s.writeS32(8, ui->squelchGate->value());
|
s.writeS32(8, ui->squelchGate->value());
|
||||||
s.writeS32(9, ui->volume->value());
|
s.writeS32(9, ui->volume->value());
|
||||||
s.writeBlob(10, ui->scopeGUI->serialize());
|
s.writeBlob(10, ui->scopeGUI->serialize());
|
||||||
|
s.writeS32(11, ui->baudRate->currentIndex());
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +148,8 @@ bool DSDDemodGUI::deserialize(const QByteArray& data)
|
|||||||
ui->volume->setValue(tmp);
|
ui->volume->setValue(tmp);
|
||||||
d.readBlob(10, &bytetmp);
|
d.readBlob(10, &bytetmp);
|
||||||
ui->scopeGUI->deserialize(bytetmp);
|
ui->scopeGUI->deserialize(bytetmp);
|
||||||
|
d.readS32(11, &tmp, 20);
|
||||||
|
ui->baudRate->setCurrentIndex(tmp);
|
||||||
|
|
||||||
blockApplySettings(false);
|
blockApplySettings(false);
|
||||||
m_channelMarker.blockSignals(false);
|
m_channelMarker.blockSignals(false);
|
||||||
@ -210,6 +219,10 @@ void DSDDemodGUI::on_volume_valueChanged(int value)
|
|||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DSDDemodGUI::on_baudRate_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
void DSDDemodGUI::on_squelchGate_valueChanged(int value)
|
void DSDDemodGUI::on_squelchGate_valueChanged(int value)
|
||||||
{
|
{
|
||||||
@ -335,6 +348,7 @@ void DSDDemodGUI::applySettings()
|
|||||||
ui->demodGain->value(),
|
ui->demodGain->value(),
|
||||||
ui->fmDeviation->value(),
|
ui->fmDeviation->value(),
|
||||||
ui->volume->value(),
|
ui->volume->value(),
|
||||||
|
DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()),
|
||||||
ui->squelchGate->value(), // in 10ths of ms
|
ui->squelchGate->value(), // in 10ths of ms
|
||||||
ui->squelch->value(),
|
ui->squelch->value(),
|
||||||
ui->audioMute->isChecked());
|
ui->audioMute->isChecked());
|
||||||
@ -476,3 +490,28 @@ void DSDDemodGUI::tick()
|
|||||||
m_tickCount = 0;
|
m_tickCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int DSDDemodBaudRates::getRate(unsigned int rate_index)
|
||||||
|
{
|
||||||
|
if (rate_index < m_nb_rates)
|
||||||
|
{
|
||||||
|
return m_rates[rate_index];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return m_rates[m_defaultRateIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int DSDDemodBaudRates::getRateIndex(unsigned int rate)
|
||||||
|
{
|
||||||
|
for (unsigned int i=0; i < m_nb_rates; i++)
|
||||||
|
{
|
||||||
|
if (rate == m_rates[i])
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_defaultRateIndex;
|
||||||
|
}
|
||||||
|
@ -64,6 +64,7 @@ private slots:
|
|||||||
void on_rfBW_valueChanged(int index);
|
void on_rfBW_valueChanged(int index);
|
||||||
void on_demodGain_valueChanged(int value);
|
void on_demodGain_valueChanged(int value);
|
||||||
void on_volume_valueChanged(int value);
|
void on_volume_valueChanged(int value);
|
||||||
|
void on_baudRate_currentIndexChanged(int index);
|
||||||
void on_fmDeviation_valueChanged(int value);
|
void on_fmDeviation_valueChanged(int value);
|
||||||
void on_squelchGate_valueChanged(int value);
|
void on_squelchGate_valueChanged(int value);
|
||||||
void on_squelch_valueChanged(int value);
|
void on_squelch_valueChanged(int value);
|
||||||
@ -109,4 +110,18 @@ private:
|
|||||||
void enterEvent(QEvent*);
|
void enterEvent(QEvent*);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DSDDemodBaudRates
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static unsigned int getRate(unsigned int rate_index);
|
||||||
|
static unsigned int getRateIndex(unsigned int rate);
|
||||||
|
static unsigned int getDefaultRate() { return m_rates[m_defaultRateIndex]; }
|
||||||
|
static unsigned int getDefaultRateIndex() { return m_defaultRateIndex; }
|
||||||
|
static unsigned int getNbRates();
|
||||||
|
private:
|
||||||
|
static unsigned int m_nb_rates;
|
||||||
|
static unsigned int m_rates[2];
|
||||||
|
static unsigned int m_defaultRateIndex;
|
||||||
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_DSDDEMODGUI_H
|
#endif // INCLUDE_DSDDEMODGUI_H
|
||||||
|
@ -137,9 +137,15 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="baudRate">
|
<widget class="QComboBox" name="baudRate">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>60</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>55</width>
|
<width>16777215</width>
|
||||||
<height>16777215</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user