1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-24 10:50:29 -05:00

DSD demod: allow to set baud rate (2400 or 4800 not 9600 for now)

This commit is contained in:
f4exb 2016-08-06 11:03:05 +02:00
parent 5ca0c95dc5
commit 25b06d06d3
7 changed files with 108 additions and 3 deletions

View File

@ -29,8 +29,33 @@ DSDDecoder::DSDDecoder()
m_decoder.setUvQuality(3); // This is gr-dsd default
m_decoder.setModulationOptimizations(DSDcc::DSDDecoder::DSDModulationOptimAuto); // Initialize with auto detection of modulation optimization:
m_decoder.enableCosineFiltering(false);
m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800);
}
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);
}

View File

@ -50,6 +50,7 @@ public:
const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); }
void setAudioGain(float gain) { m_decoder.setAudioGain(gain); }
void setBaudRate(int baudRate);
private:
DSDcc::DSDDecoder m_decoder;

View File

@ -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_squelch = -30.0;
m_config.m_volume = 1.0;
m_config.m_baudRate = 4800;
m_config.m_audioMute = false;
m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
@ -78,6 +79,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
int demodGain,
int fmDeviation,
int volume,
int baudRate,
int squelchGate,
Real squelch,
bool audioMute)
@ -86,6 +88,7 @@ void DSDDemod::configure(MessageQueue* messageQueue,
demodGain,
fmDeviation,
volume,
baudRate,
squelchGate,
squelch,
audioMute);
@ -239,6 +242,7 @@ bool DSDDemod::handleMessage(const Message& cmd)
m_config.m_demodGain = cfg.getDemodGain();
m_config.m_fmDeviation = cfg.getFMDeviation();
m_config.m_volume = cfg.getVolume();
m_config.m_baudRate = cfg.getBaudRate();
m_config.m_squelchGate = cfg.getSquelchGate();
m_config.m_squelch = cfg.getSquelch();
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_fmDeviation: " << m_config.m_fmDeviation * 100
<< " m_volume: " << m_config.m_volume / 10.0
<< " m_baudRate: " << m_config.m_baudRate
<< " m_squelchGate" << m_config.m_squelchGate
<< " m_squelch: " << m_config.m_squelch
<< " m_audioMute: " << m_config.m_audioMute;
@ -303,7 +308,12 @@ void DSDDemod::apply()
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_rfBandwidth = m_config.m_rfBandwidth;
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_squelch = m_config.m_squelch;
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_audioMute = m_config.m_audioMute;
}

View File

@ -44,6 +44,7 @@ public:
int rfBandwidth,
int demodGain,
int volume,
int baudRate,
int fmDeviation,
int squelchGate,
Real squelch,
@ -72,6 +73,7 @@ private:
int getDemodGain() const { return m_demodGain; }
int getFMDeviation() const { return m_fmDeviation; }
int getVolume() const { return m_volume; }
int getBaudRate() const { return m_baudRate; }
int getSquelchGate() const { return m_squelchGate; }
Real getSquelch() const { return m_squelch; }
bool getAudioMute() const { return m_audioMute; }
@ -80,11 +82,12 @@ private:
int demodGain,
int fmDeviation,
int volume,
int baudRate,
int squelchGate,
Real squelch,
bool audioMute)
{
return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, squelchGate, squelch, audioMute);
return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, baudRate, squelchGate, squelch, audioMute);
}
private:
@ -92,6 +95,7 @@ private:
Real m_demodGain;
int m_fmDeviation;
int m_volume;
int m_baudRate;
int m_squelchGate;
Real m_squelch;
bool m_audioMute;
@ -100,6 +104,7 @@ private:
int demodGain,
int fmDeviation,
int volume,
int baudRate,
int squelchGate,
Real squelch,
bool audioMute) :
@ -108,6 +113,7 @@ private:
m_demodGain(demodGain),
m_fmDeviation(fmDeviation),
m_volume(volume),
m_baudRate(baudRate),
m_squelchGate(squelchGate),
m_squelch(squelch),
m_audioMute(audioMute)
@ -131,6 +137,7 @@ private:
int m_rfBandwidth;
int m_demodGain;
int m_volume;
int m_baudRate;
int m_fmDeviation;
int m_squelchGate;
Real m_squelch;
@ -143,6 +150,7 @@ private:
m_rfBandwidth(-1),
m_demodGain(-1),
m_volume(-1),
m_baudRate(4800),
m_fmDeviation(1),
m_squelchGate(1),
m_squelch(0),

View File

@ -36,6 +36,11 @@
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* gui = new DSDDemodGUI(pluginAPI, deviceAPI);
@ -76,6 +81,7 @@ void DSDDemodGUI::resetToDefaults()
ui->demodGain->setValue(100); // 100ths
ui->fmDeviation->setValue(50); // x100 Hz
ui->volume->setValue(20); // /10.0
ui->baudRate->setCurrentIndex(DSDDemodBaudRates::getDefaultRateIndex());
ui->squelchGate->setValue(5);
ui->squelch->setValue(-40);
ui->deltaFrequency->setValue(0);
@ -96,6 +102,7 @@ QByteArray DSDDemodGUI::serialize() const
s.writeS32(8, ui->squelchGate->value());
s.writeS32(9, ui->volume->value());
s.writeBlob(10, ui->scopeGUI->serialize());
s.writeS32(11, ui->baudRate->currentIndex());
return s.final();
}
@ -141,6 +148,8 @@ bool DSDDemodGUI::deserialize(const QByteArray& data)
ui->volume->setValue(tmp);
d.readBlob(10, &bytetmp);
ui->scopeGUI->deserialize(bytetmp);
d.readS32(11, &tmp, 20);
ui->baudRate->setCurrentIndex(tmp);
blockApplySettings(false);
m_channelMarker.blockSignals(false);
@ -210,6 +219,10 @@ void DSDDemodGUI::on_volume_valueChanged(int value)
applySettings();
}
void DSDDemodGUI::on_baudRate_currentIndexChanged(int index)
{
applySettings();
}
void DSDDemodGUI::on_squelchGate_valueChanged(int value)
{
@ -335,6 +348,7 @@ void DSDDemodGUI::applySettings()
ui->demodGain->value(),
ui->fmDeviation->value(),
ui->volume->value(),
DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()),
ui->squelchGate->value(), // in 10ths of ms
ui->squelch->value(),
ui->audioMute->isChecked());
@ -476,3 +490,28 @@ void DSDDemodGUI::tick()
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;
}

View File

@ -64,6 +64,7 @@ private slots:
void on_rfBW_valueChanged(int index);
void on_demodGain_valueChanged(int value);
void on_volume_valueChanged(int value);
void on_baudRate_currentIndexChanged(int index);
void on_fmDeviation_valueChanged(int value);
void on_squelchGate_valueChanged(int value);
void on_squelch_valueChanged(int value);
@ -109,4 +110,18 @@ private:
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

View File

@ -137,9 +137,15 @@
</item>
<item>
<widget class="QComboBox" name="baudRate">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>55</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>