diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 9a4d5db..1c9718f 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -108,7 +108,12 @@ void DemodulatorPreThread::run() { sampleRateChanged.store(false); audioSampleRateChanged.store(false); demodTypeChanged.store(false); - } else if (cModemKit && cModem && (bandwidthChanged.load() || sampleRateChanged.load() || audioSampleRateChanged.load()) && (newSampleRate && newAudioSampleRate && newBandwidth)) { + } + else if ( + cModemKit && cModem && + (bandwidthChanged.load() || sampleRateChanged.load() || audioSampleRateChanged.load() || cModem->shouldRebuildKit()) && + (newSampleRate && newAudioSampleRate && newBandwidth) + ) { DemodulatorWorkerThreadCommand command(DemodulatorWorkerThreadCommand::DEMOD_WORKER_THREAD_CMD_BUILD_FILTERS); command.frequency = newFrequency; command.sampleRate = newSampleRate; diff --git a/src/demod/DemodulatorWorkerThread.cpp b/src/demod/DemodulatorWorkerThread.cpp index 46fdadb..fcf4276 100644 --- a/src/demod/DemodulatorWorkerThread.cpp +++ b/src/demod/DemodulatorWorkerThread.cpp @@ -72,6 +72,9 @@ void DemodulatorWorkerThread::run() { } else if (makeDemod) { cModemKit = nullptr; } + if (cModem != nullptr) { + cModem->clearRebuildKit(); + } float As = 60.0f; // stop-band attenuation [dB] diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index 69adc7b..21fb816 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -55,3 +55,15 @@ Modem::Modem() { Modem::~Modem() { } + +bool Modem::shouldRebuildKit() { + return refreshKit.load(); +} + +void Modem::rebuildKit() { + refreshKit.store(true); +} + +void Modem::clearRebuildKit() { + refreshKit.store(false); +} diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index 7edb2d5..1ca1ece 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -4,6 +4,7 @@ #include "IOThread.h" #include "AudioThread.h" #include +#include class ModemKit { public: @@ -108,9 +109,12 @@ class Modem { public: static void addModemFactory(Modem *factorySingle); static ModemFactoryList getFactories(); + static Modem *makeModem(std::string modemType); + virtual std::string getType() = 0; virtual std::string getName() = 0; + virtual Modem *factory() = 0; Modem(); @@ -126,6 +130,12 @@ public: virtual void disposeKit(ModemKit *kit) = 0; virtual void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) = 0; + + bool shouldRebuildKit(); + void rebuildKit(); + void clearRebuildKit(); + private: static ModemFactoryList modemFactories; + std::atomic_bool refreshKit; }; diff --git a/src/modules/modem/digital/ModemFSK.cpp b/src/modules/modem/digital/ModemFSK.cpp index aad5bfd..38c9871 100644 --- a/src/modules/modem/digital/ModemFSK.cpp +++ b/src/modules/modem/digital/ModemFSK.cpp @@ -1,6 +1,7 @@ #include "ModemFSK.h" ModemFSK::ModemFSK() { + // DMR defaults? bps = 9600; spacing = 7000; } @@ -12,14 +13,42 @@ Modem *ModemFSK::factory() { ModemArgInfoList ModemFSK::getSettings() { ModemArgInfoList args; + ModemArgInfo bpsArg; + bpsArg.key = "bps"; + bpsArg.name = "Bits per-symbol"; + bpsArg.value = std::to_string(bps); + bpsArg.description = "FSK modem bits-per-symbol"; + bpsArg.type = ModemArgInfo::STRING; + + std::vector bpsOpts; + bpsOpts.push_back("9600"); + bpsArg.options = bpsOpts; + + args.push_back(bpsArg); + + ModemArgInfo spacingArg; + spacingArg.key = "spacing"; + spacingArg.name = "Symbol Spacing?"; + spacingArg.description = "Not quite sure yet :-)"; + spacingArg.type = ModemArgInfo::STRING; + spacingArg.value = std::to_string(spacing); + + std::vector spacingOpts; + spacingOpts.push_back("7000"); + spacingArg.options = spacingOpts; + + args.push_back(spacingArg); + return args; } void ModemFSK::writeSetting(std::string setting, std::string value) { if (setting == "bps") { - + bps = std::stoi(value); + rebuildKit(); } else if (setting == "spacing") { - + spacing = std::stoi(value); + rebuildKit(); } } @@ -35,8 +64,8 @@ std::string ModemFSK::readSetting(std::string setting) { ModemKit *ModemFSK::buildKit(long long sampleRate, int audioSampleRate) { ModemKitFSK *dkit = new ModemKitFSK; dkit->m = 1; - dkit->k = sampleRate / 9600; - dkit->bandwidth = 7000.0 / sampleRate; + dkit->k = sampleRate / bps; + dkit->bandwidth = double(spacing) / sampleRate; dkit->demodFSK = fskdem_create(dkit->m, dkit->k, dkit->bandwidth);