New radio module

This commit is contained in:
AlexandreRouma
2021-12-04 17:46:48 +01:00
parent 62d2dfafd7
commit fe285c71ff
11 changed files with 125 additions and 47 deletions

View File

@@ -42,6 +42,7 @@ public:
demods[RADIO_DEMOD_LSB] = new demod::LSB();
demods[RADIO_DEMOD_DSB] = new demod::DSB();
demods[RADIO_DEMOD_CW] = new demod::CW();
demods[RADIO_DEMOD_RAW] = new demod::RAW();
// Initialize the VFO
vfo = sigpath::vfoManager.createVFO(name, ImGui::WaterfallVFO::REF_CENTER, 0, 200000, 200000, 50000, 200000, false);
@@ -74,7 +75,7 @@ public:
bw = std::clamp<double>(bw, demod->getMinBandwidth(), demod->getMaxBandwidth());
// Initialize
demod->init(name, &config, &squelch.out, bw, _demodOutputChangeHandler);
demod->init(name, &config, &squelch.out, bw, _demodOutputChangeHandler, stream.getSampleRate());
}
// Initialize DSP
@@ -87,13 +88,10 @@ public:
// Select the demodulator
selectDemodByID((DemodID)selectedDemodID);
// Start DSP
squelch.start();
resamp.start();
deemp.start();
// Start stream, the rest was started when selecting the demodulator
stream.start();
gui::menu.registerEntry(name, menuHandler, this, NULL);
gui::menu.registerEntry(name, menuHandler, this, this);
}
~RadioModule() {
@@ -104,10 +102,20 @@ public:
void enable() {
enabled = true;
if (!vfo) {
vfo = sigpath::vfoManager.createVFO(name, ImGui::WaterfallVFO::REF_CENTER, 0, 200000, 200000, 50000, 200000, false);
}
selectDemodByID((DemodID)selectedDemodID);
}
void disable() {
enabled = false;
squelch.stop();
if (selectedDemod) { selectedDemod->stop(); }
resamp.stop();
deemp.stop();
if (vfo) { sigpath::vfoManager.deleteVFO(vfo); }
vfo = NULL;
}
bool isEnabled() {
@@ -239,6 +247,9 @@ private:
if (selectedDemod) { selectedDemod->stop(); }
selectedDemod = demod;
// Give the demodulator the most recent audio SR
selectedDemod->AFSampRateChanged(audioSampleRate);
// Load config
bandwidth = selectedDemod->getDefaultBandwidth();
minBandwidth = selectedDemod->getMinBandwidth();
@@ -246,6 +257,7 @@ private:
bandwidthLocked = selectedDemod->getBandwidthLocked();
snapInterval = selectedDemod->getDefaultSnapInterval();
squelchLevel = MIN_SQUELCH;
deempAllowed = selectedDemod->getDeempAllowed();
deempMode = DEEMP_MODE_NONE;
squelchEnabled = false;
if (config.conf[name][selectedDemod->getName()].contains("snapInterval")) {
@@ -268,7 +280,7 @@ private:
// Configure VFO
if (vfo) {
vfo->setBandwidthLimits(minBandwidth, maxBandwidth, false);
vfo->setBandwidthLimits(minBandwidth, maxBandwidth, selectedDemod->getBandwidthLocked());
vfo->setReference(selectedDemod->getVFOReference());
vfo->setSnapInterval(snapInterval);
vfo->setSampleRate(selectedDemod->getIFSampleRate(), bandwidth);
@@ -278,33 +290,38 @@ private:
squelch.setLevel(squelchLevel);
setSquelchEnabled(squelchEnabled);
// Configure resampler
resamp.stop();
resamp.setInput(selectedDemod->getOutput());
resamp.setInSampleRate(selectedDemod->getAFSampleRate());
setAudioSampleRate(audioSampleRate);
resamp.start();
// Enable or disable post processing entirely depending on the demodulator's options
setPostProcEnabled(selectedDemod->getPostProcEnabled());
// Configure deemphasis
deempAllowed = selectedDemod->getDeempAllowed();
if (deempAllowed) {
setDeemphasisMode(deempMode);
}
else {
setDeemphasisMode(DEEMP_MODE_NONE);
if (postProcEnabled) {
// Configure resampler
resamp.stop();
resamp.setInput(selectedDemod->getOutput());
resamp.setInSampleRate(selectedDemod->getAFSampleRate());
setAudioSampleRate(audioSampleRate);
// Configure deemphasis
if (deempAllowed) {
setDeemphasisMode(deempMode);
}
else {
setDeemphasisMode(DEEMP_MODE_NONE);
}
}
// Start new demodulator
selectedDemod->start();
}
void setBandwidth(double bw) {
bandwidth = bw;
if (!selectedDemod) { return; }
float audioBW = std::min<float>(selectedDemod->getMaxAFBandwidth(), selectedDemod->getAFBandwidth(bandwidth));
audioBW = std::min<float>(audioBW, audioSampleRate / 2.0);
vfo->setBandwidth(bandwidth);
selectedDemod->setBandwidth(bandwidth);
if (selectedDemod->getDynamicAFBandwidth()) {
if (selectedDemod->getDynamicAFBandwidth() && postProcEnabled) {
win.setCutoff(audioBW);
win.setTransWidth(audioBW);
resamp.updateWindow(&win);
@@ -317,7 +334,17 @@ private:
void setAudioSampleRate(double sr) {
audioSampleRate = sr;
if (!selectedDemod) { return; }
selectedDemod->AFSampRateChanged(audioSampleRate);
if (!postProcEnabled) {
minBandwidth = selectedDemod->getMinBandwidth();
maxBandwidth = selectedDemod->getMaxBandwidth();
bandwidth = selectedDemod->getIFSampleRate();
vfo->setBandwidthLimits(minBandwidth, maxBandwidth, selectedDemod->getBandwidthLocked());
vfo->setSampleRate(selectedDemod->getIFSampleRate(), bandwidth);
return;
}
float audioBW = std::min<float>(selectedDemod->getMaxAFBandwidth(), selectedDemod->getAFBandwidth(bandwidth));
audioBW = std::min<float>(audioBW, audioSampleRate / 2.0);
resamp.stop();
deemp.stop();
deemp.setSampleRate(audioSampleRate);
@@ -330,9 +357,23 @@ private:
if (deempMode != DEEMP_MODE_NONE) { deemp.start(); }
}
void setPostProcEnabled(bool enable) {
postProcEnabled = enable;
if (!selectedDemod) { return; }
if (postProcEnabled) {
setDeemphasisMode(deempMode);
}
else {
resamp.stop();
deemp.stop();
stream.setInput(selectedDemod->getOutput());
}
}
void setDeemphasisMode(int mode) {
deempMode = mode;
if (mode != DEEMP_MODE_NONE) {
if (!postProcEnabled) { return; }
if (deempMode != DEEMP_MODE_NONE) {
// TODO: Investigate why not stopping the deemp here causes the DSP to stall
deemp.stop();
stream.setInput(&deemp.out);
@@ -349,6 +390,7 @@ private:
squelchEnabled = enable;
if (!selectedDemod) { return; }
if (squelchEnabled) {
squelch.setInput(vfo->output);
selectedDemod->setInput(&squelch.out);
squelch.start();
}
@@ -370,7 +412,12 @@ private:
static void demodOutputChangeHandler(dsp::stream<dsp::stereo_t>* output, void* ctx) {
RadioModule* _this = (RadioModule*)ctx;
_this->resamp.setInput(output);
if (_this->postProcEnabled) {
_this->resamp.setInput(output);
}
else {
_this->stream.setInput(output);
}
}
EventHandler<double> onUserChangedBandwidthHandler;
@@ -398,6 +445,7 @@ private:
int selectedDemodID = 1;
int deempMode = DEEMP_MODE_NONE;
bool deempAllowed;
bool postProcEnabled;
const double MIN_SQUELCH = -100.0;
const double MAX_SQUELCH = 0.0;