From 096a1aa5fdb5308a5df4552bc6d4fba95c8cae72 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 22 Jul 2016 19:24:20 -0400 Subject: [PATCH 1/5] Temporary patch for bladerf until bandwidth option is available --- src/sdr/SoapySDRThread.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index a413cf4..b7e71b3 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -89,6 +89,12 @@ void SDRThread::init() { wxGetApp().sdrEnumThreadNotify(SDREnumerator::SDR_ENUM_MESSAGE, std::string("Activating stream.")); device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); + + // TODO: explore bandwidth setting option to see if this is necessary for others + if (device->getDriverKey() == "bladerf") { + device->setBandwidth(SOAPY_SDR_RX, 0, sampleRate.load()); + } + device->setFrequency(SOAPY_SDR_RX,0,"RF",frequency - offset.load()); device->activateStream(stream); if (devInfo->hasCORR(SOAPY_SDR_RX, 0)) { @@ -280,6 +286,10 @@ void SDRThread::updateSettings() { if (rate_changed.load()) { device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); + // TODO: explore bandwidth setting option to see if this is necessary for others + if (device->getDriverKey() == "bladerf") { + device->setBandwidth(SOAPY_SDR_RX, 0, sampleRate.load()); + } sampleRate.store(device->getSampleRate(SOAPY_SDR_RX,0)); numChannels.store(getOptimalChannelCount(sampleRate.load())); numElems.store(getOptimalElementCount(sampleRate.load(), 60)); From 884f74003086a8048d91c4a793a52062872cc0de Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 22 Jul 2016 19:43:22 -0400 Subject: [PATCH 2/5] fix driver key case --- src/sdr/SoapySDRThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index b7e71b3..1ec5c7c 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -91,7 +91,7 @@ void SDRThread::init() { device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); // TODO: explore bandwidth setting option to see if this is necessary for others - if (device->getDriverKey() == "bladerf") { + if (device->getDriverKey() == "bladeRF") { device->setBandwidth(SOAPY_SDR_RX, 0, sampleRate.load()); } @@ -287,7 +287,7 @@ void SDRThread::updateSettings() { if (rate_changed.load()) { device->setSampleRate(SOAPY_SDR_RX,0,sampleRate.load()); // TODO: explore bandwidth setting option to see if this is necessary for others - if (device->getDriverKey() == "bladerf") { + if (device->getDriverKey() == "bladeRF") { device->setBandwidth(SOAPY_SDR_RX, 0, sampleRate.load()); } sampleRate.store(device->getSampleRate(SOAPY_SDR_RX,0)); From 8f1b68d20f57a1e67dd4856806f1669f6d434eb0 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 24 Jul 2016 11:59:59 -0400 Subject: [PATCH 3/5] Handle stream init errors --- src/sdr/SoapySDRThread.cpp | 28 +++++++++++++++++++++++++--- src/sdr/SoapySDRThread.h | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/sdr/SoapySDRThread.cpp b/src/sdr/SoapySDRThread.cpp index 1ec5c7c..7a6b645 100644 --- a/src/sdr/SoapySDRThread.cpp +++ b/src/sdr/SoapySDRThread.cpp @@ -55,7 +55,7 @@ SoapySDR::Kwargs SDRThread::combineArgs(SoapySDR::Kwargs a, SoapySDR::Kwargs b) return c; } -void SDRThread::init() { +bool SDRThread::init() { //#warning Debug On // SoapySDR_setLogLevel(SOAPY_SDR_DEBUG); @@ -77,7 +77,20 @@ void SDRThread::init() { device = devInfo->getSoapyDevice(); SoapySDR::Kwargs currentStreamArgs = combineArgs(devInfo->getStreamArgs(),streamArgs); - stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector(), currentStreamArgs); + + std::string streamExceptionStr(""); + + try { + stream = device->setupStream(SOAPY_SDR_RX,"CF32", std::vector(), currentStreamArgs); + } catch(exception e) { + streamExceptionStr = e.what(); + } + + if (!stream) { + wxGetApp().sdrThreadNotify(SDRThread::SDR_THREAD_FAILED, std::string("Stream setup failed, stream is null. ") + streamExceptionStr); + std::cout << "Stream setup failed, stream is null. " << streamExceptionStr << std::endl; + return false; + } int streamMTU = device->getStreamMTU(stream); mtuElems.store(streamMTU); @@ -152,6 +165,8 @@ void SDRThread::init() { updateSettings(); wxGetApp().sdrThreadNotify(SDRThread::SDR_THREAD_INITIALIZED, std::string("Device Initialized.")); + + return true; } void SDRThread::deinit() { @@ -276,6 +291,10 @@ void SDRThread::updateGains() { void SDRThread::updateSettings() { bool doUpdate = false; + if (!stream) { + return; + } + if (offset_changed.load()) { if (!freq_changed.load()) { frequency.store(frequency.load()); @@ -394,7 +413,10 @@ void SDRThread::run() { if (activeDev != NULL) { std::cout << "device init()" << std::endl; - init(); + if (!init()) { + std::cout << "SDR Thread stream init error." << std::endl; + return; + } std::cout << "starting readLoop()" << std::endl; activeDev->setActive(true); readLoop(); diff --git a/src/sdr/SoapySDRThread.h b/src/sdr/SoapySDRThread.h index 21d6b37..1c79103 100644 --- a/src/sdr/SoapySDRThread.h +++ b/src/sdr/SoapySDRThread.h @@ -40,7 +40,7 @@ typedef ThreadQueue SDRThreadIQDataQueue; class SDRThread : public IOThread { private: - void init(); + bool init(); void deinit(); void readStream(SDRThreadIQDataQueue* iqDataOutQueue); void readLoop(); From 00908380700f71500a6b0c9ae6e0dfbfa4277e09 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 24 Jul 2016 15:25:17 -0400 Subject: [PATCH 4/5] Make modemFactories function ref vs. instances which carry other dsp kit stuff --- src/CubicSDR.cpp | 40 +++++++++++----------- src/demod/DemodulatorInstance.cpp | 22 ++++++++---- src/demod/DemodulatorThread.cpp | 3 +- src/modules/modem/Modem.cpp | 12 ++++--- src/modules/modem/Modem.h | 18 ++++++---- src/modules/modem/analog/ModemAM.cpp | 2 +- src/modules/modem/analog/ModemAM.h | 2 +- src/modules/modem/analog/ModemDSB.cpp | 2 +- src/modules/modem/analog/ModemDSB.h | 2 +- src/modules/modem/analog/ModemFM.cpp | 2 +- src/modules/modem/analog/ModemFM.h | 2 +- src/modules/modem/analog/ModemFMStereo.cpp | 2 +- src/modules/modem/analog/ModemFMStereo.h | 2 +- src/modules/modem/analog/ModemIQ.cpp | 2 +- src/modules/modem/analog/ModemIQ.h | 2 +- src/modules/modem/analog/ModemLSB.cpp | 2 +- src/modules/modem/analog/ModemLSB.h | 2 +- src/modules/modem/analog/ModemNBFM.cpp | 2 +- src/modules/modem/analog/ModemNBFM.h | 2 +- src/modules/modem/analog/ModemUSB.cpp | 2 +- src/modules/modem/analog/ModemUSB.h | 2 +- src/modules/modem/digital/ModemAPSK.cpp | 2 +- src/modules/modem/digital/ModemAPSK.h | 2 +- src/modules/modem/digital/ModemASK.cpp | 2 +- src/modules/modem/digital/ModemASK.h | 2 +- src/modules/modem/digital/ModemBPSK.cpp | 2 +- src/modules/modem/digital/ModemBPSK.h | 2 +- src/modules/modem/digital/ModemDPSK.cpp | 2 +- src/modules/modem/digital/ModemDPSK.h | 2 +- src/modules/modem/digital/ModemFSK.cpp | 2 +- src/modules/modem/digital/ModemFSK.h | 2 +- src/modules/modem/digital/ModemGMSK.cpp | 2 +- src/modules/modem/digital/ModemGMSK.h | 2 +- src/modules/modem/digital/ModemOOK.cpp | 2 +- src/modules/modem/digital/ModemOOK.h | 2 +- src/modules/modem/digital/ModemPSK.cpp | 2 +- src/modules/modem/digital/ModemPSK.h | 2 +- src/modules/modem/digital/ModemQAM.cpp | 2 +- src/modules/modem/digital/ModemQAM.h | 2 +- src/modules/modem/digital/ModemQPSK.cpp | 2 +- src/modules/modem/digital/ModemQPSK.h | 2 +- src/modules/modem/digital/ModemSQAM.cpp | 2 +- src/modules/modem/digital/ModemSQAM.h | 2 +- src/modules/modem/digital/ModemST.cpp | 2 +- src/modules/modem/digital/ModemST.h | 2 +- 45 files changed, 96 insertions(+), 79 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index a87d927..bff648b 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -190,30 +190,30 @@ bool CubicSDR::OnInit() { RigThread::enumerate(); #endif - Modem::addModemFactory(new ModemFM); - Modem::addModemFactory(new ModemNBFM); - Modem::addModemFactory(new ModemFMStereo); - Modem::addModemFactory(new ModemAM); - Modem::addModemFactory(new ModemLSB); - Modem::addModemFactory(new ModemUSB); - Modem::addModemFactory(new ModemDSB); - Modem::addModemFactory(new ModemIQ); + Modem::addModemFactory(ModemFM::factory, "FM", 200000); + Modem::addModemFactory(ModemNBFM::factory, "NBFM", 12500); + Modem::addModemFactory(ModemFMStereo::factory, "FMS", 200000); + Modem::addModemFactory(ModemAM::factory, "AM", 6000); + Modem::addModemFactory(ModemLSB::factory, "LSB", 5400); + Modem::addModemFactory(ModemUSB::factory, "USB", 5400); + Modem::addModemFactory(ModemDSB::factory, "DSB", 5400); + Modem::addModemFactory(ModemIQ::factory, "I/Q", 48000); #ifdef ENABLE_DIGITAL_LAB - Modem::addModemFactory(new ModemAPSK); - Modem::addModemFactory(new ModemASK); - Modem::addModemFactory(new ModemBPSK); - Modem::addModemFactory(new ModemDPSK); + Modem::addModemFactory(ModemAPSK::factory, "APSK", 200000); + Modem::addModemFactory(ModemASK::factory, "ASK", 200000); + Modem::addModemFactory(ModemBPSK::factory, "BPSK", 200000); + Modem::addModemFactory(ModemDPSK::factory, "DPSK", 200000); #if ENABLE_LIQUID_EXPERIMENTAL - Modem::addModemFactory(new ModemFSK); + Modem::addModemFactory(ModemFSK::factory, "FSK", 19200); #endif - Modem::addModemFactory(new ModemGMSK); - Modem::addModemFactory(new ModemOOK); - Modem::addModemFactory(new ModemPSK); - Modem::addModemFactory(new ModemQAM); - Modem::addModemFactory(new ModemQPSK); - Modem::addModemFactory(new ModemSQAM); - Modem::addModemFactory(new ModemST); + Modem::addModemFactory(ModemGMSK::factory, "GMSK", 19200); + Modem::addModemFactory(ModemOOK::factory, "OOK", 200000); + Modem::addModemFactory(ModemPSK::factory, "PSK", 200000); + Modem::addModemFactory(ModemQAM::factory, "QAM", 200000); + Modem::addModemFactory(ModemQPSK::factory, "QPSK", 200000); + Modem::addModemFactory(ModemSQAM::factory, "SQAM", 200000); + Modem::addModemFactory(ModemST::factory, "ST", 200000); #endif frequency = wxGetApp().getConfig()->getCenterFreq(); diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 5b6c37f..407255e 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -128,6 +128,13 @@ void DemodulatorInstance::updateLabel(long long freq) { } void DemodulatorInstance::terminate() { + +#if ENABLE_DIGITAL_LAB + if (activeOutput) { + closeOutput(); + } +#endif + // std::cout << "Terminating demodulator audio thread.." << std::endl; audioThread->terminate(); // std::cout << "Terminating demodulator thread.." << std::endl; @@ -156,7 +163,6 @@ bool DemodulatorInstance::isTerminated() { if (audioTerminated) { if (t_Audio) { - t_Audio->join(); delete t_Audio; @@ -175,11 +181,6 @@ bool DemodulatorInstance::isTerminated() { #endif t_Demod = nullptr; } -#if ENABLE_DIGITAL_LAB - if (activeOutput) { - closeOutput(); - } -#endif } if (preDemodTerminated) { @@ -314,7 +315,14 @@ void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { if (lastbw) { setBandwidth(lastbw); } - } + +#if ENABLE_DIGITAL_LAB + if (isModemInitialized() && getModemType() == "digital") { + ModemDigitalOutputConsole *outp = (ModemDigitalOutputConsole *)getOutput(); + outp->setTitle(getDemodulatorType() + ": " + frequencyToStr(getFrequency())); + } +#endif +} } std::string DemodulatorInstance::getDemodulatorType() { diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index e2853a7..2911f69 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -136,6 +136,7 @@ void DemodulatorThread::run() { ati->sampleRate = cModemKit->sampleRate; ati->inputRate = inp->sampleRate; + ati->data.resize(0); } cModem->demodulate(cModemKit, &modemData, ati); @@ -160,7 +161,7 @@ void DemodulatorThread::run() { } } - if (audioOutputQueue != nullptr && ati && !squelched) { + if (audioOutputQueue != nullptr && ati && ati->data.size() && !squelched) { std::vector::iterator data_i; ati->peak = 0; for (data_i = ati->data.begin(); data_i != ati->data.end(); data_i++) { diff --git a/src/modules/modem/Modem.cpp b/src/modules/modem/Modem.cpp index 775c2b4..3cbfd84 100644 --- a/src/modules/modem/Modem.cpp +++ b/src/modules/modem/Modem.cpp @@ -3,6 +3,7 @@ ModemFactoryList Modem::modemFactories; +DefaultRatesList Modem::modemDefaultRates; //! Create an empty range (0.0, 0.0) ModemRange::ModemRange(void) { @@ -38,8 +39,9 @@ Modem::~Modem() { } -void Modem::addModemFactory(Modem *factorySingle) { - modemFactories[factorySingle->getName()] = factorySingle; +void Modem::addModemFactory(ModemFactoryFn factoryFunc, std::string modemName, int defaultRate) { + modemFactories[modemName] = factoryFunc; + modemDefaultRates[modemName] = defaultRate; } ModemFactoryList Modem::getFactories() { @@ -48,15 +50,15 @@ ModemFactoryList Modem::getFactories() { Modem *Modem::makeModem(std::string modemName) { if (modemFactories.find(modemName) != modemFactories.end()) { - return modemFactories[modemName]->factory(); + return (Modem *)modemFactories[modemName](); } return nullptr; } int Modem::getModemDefaultSampleRate(std::string modemName) { - if (modemFactories.find(modemName) != modemFactories.end()) { - return modemFactories[modemName]->getDefaultSampleRate(); + if (modemDefaultRates.find(modemName) != modemDefaultRates.end()) { + return modemDefaultRates[modemName]; } return 0; diff --git a/src/modules/modem/Modem.h b/src/modules/modem/Modem.h index 5a1c74e..7ea996c 100644 --- a/src/modules/modem/Modem.h +++ b/src/modules/modem/Modem.h @@ -108,14 +108,21 @@ public: typedef std::vector ModemArgInfoList; -class Modem; -typedef std::map ModemFactoryList; +class ModemBase { + +}; + +typedef ModemBase *(*ModemFactoryFn)(); + + +typedef std::map ModemFactoryList; +typedef std::map DefaultRatesList; typedef std::map ModemSettings; -class Modem { +class Modem : public ModemBase { public: - static void addModemFactory(Modem *factorySingle); + static void addModemFactory(ModemFactoryFn, std::string modemName, int defaultRate); static ModemFactoryList getFactories(); static Modem *makeModem(std::string modemName); @@ -124,8 +131,6 @@ public: virtual std::string getType() = 0; virtual std::string getName() = 0; - virtual Modem *factory() = 0; - Modem(); virtual ~Modem(); @@ -149,5 +154,6 @@ public: private: static ModemFactoryList modemFactories; + static DefaultRatesList modemDefaultRates; std::atomic_bool refreshKit; }; diff --git a/src/modules/modem/analog/ModemAM.cpp b/src/modules/modem/analog/ModemAM.cpp index 6a5eb3c..ded9749 100644 --- a/src/modules/modem/analog/ModemAM.cpp +++ b/src/modules/modem/analog/ModemAM.cpp @@ -8,7 +8,7 @@ ModemAM::~ModemAM() { ampmodem_destroy(demodAM); } -Modem *ModemAM::factory() { +ModemBase *ModemAM::factory() { return new ModemAM; } diff --git a/src/modules/modem/analog/ModemAM.h b/src/modules/modem/analog/ModemAM.h index 5adf75f..9da1ca2 100644 --- a/src/modules/modem/analog/ModemAM.h +++ b/src/modules/modem/analog/ModemAM.h @@ -9,7 +9,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemDSB.cpp b/src/modules/modem/analog/ModemDSB.cpp index 34c0aed..25c79fa 100644 --- a/src/modules/modem/analog/ModemDSB.cpp +++ b/src/modules/modem/analog/ModemDSB.cpp @@ -8,7 +8,7 @@ ModemDSB::~ModemDSB() { ampmodem_destroy(demodAM_DSB); } -Modem *ModemDSB::factory() { +ModemBase *ModemDSB::factory() { return new ModemDSB; } diff --git a/src/modules/modem/analog/ModemDSB.h b/src/modules/modem/analog/ModemDSB.h index 8c99332..4a80784 100644 --- a/src/modules/modem/analog/ModemDSB.h +++ b/src/modules/modem/analog/ModemDSB.h @@ -9,7 +9,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemFM.cpp b/src/modules/modem/analog/ModemFM.cpp index 931eef6..933e6cf 100644 --- a/src/modules/modem/analog/ModemFM.cpp +++ b/src/modules/modem/analog/ModemFM.cpp @@ -8,7 +8,7 @@ ModemFM::~ModemFM() { freqdem_destroy(demodFM); } -Modem *ModemFM::factory() { +ModemBase *ModemFM::factory() { return new ModemFM; } diff --git a/src/modules/modem/analog/ModemFM.h b/src/modules/modem/analog/ModemFM.h index 267114d..a62e729 100644 --- a/src/modules/modem/analog/ModemFM.h +++ b/src/modules/modem/analog/ModemFM.h @@ -9,7 +9,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemFMStereo.cpp b/src/modules/modem/analog/ModemFMStereo.cpp index d1f5958..acc7078 100644 --- a/src/modules/modem/analog/ModemFMStereo.cpp +++ b/src/modules/modem/analog/ModemFMStereo.cpp @@ -16,7 +16,7 @@ std::string ModemFMStereo::getName() { return "FMS"; } -Modem *ModemFMStereo::factory() { +ModemBase *ModemFMStereo::factory() { return new ModemFMStereo; } diff --git a/src/modules/modem/analog/ModemFMStereo.h b/src/modules/modem/analog/ModemFMStereo.h index d8ebf4c..6cf9768 100644 --- a/src/modules/modem/analog/ModemFMStereo.h +++ b/src/modules/modem/analog/ModemFMStereo.h @@ -29,7 +29,7 @@ public: std::string getType(); std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemIQ.cpp b/src/modules/modem/analog/ModemIQ.cpp index 1f88c61..78bfddd 100644 --- a/src/modules/modem/analog/ModemIQ.cpp +++ b/src/modules/modem/analog/ModemIQ.cpp @@ -12,7 +12,7 @@ std::string ModemIQ::getName() { return "I/Q"; } -Modem *ModemIQ::factory() { +ModemBase *ModemIQ::factory() { return new ModemIQ; } diff --git a/src/modules/modem/analog/ModemIQ.h b/src/modules/modem/analog/ModemIQ.h index ca9e5fa..e3d8901 100644 --- a/src/modules/modem/analog/ModemIQ.h +++ b/src/modules/modem/analog/ModemIQ.h @@ -8,7 +8,7 @@ public: std::string getType(); std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemLSB.cpp b/src/modules/modem/analog/ModemLSB.cpp index 69887c9..ddad7c4 100644 --- a/src/modules/modem/analog/ModemLSB.cpp +++ b/src/modules/modem/analog/ModemLSB.cpp @@ -13,7 +13,7 @@ ModemLSB::ModemLSB() : ModemAnalog() { c2rFilt = firhilbf_create(5, 90.0); } -Modem *ModemLSB::factory() { +ModemBase *ModemLSB::factory() { return new ModemLSB; } diff --git a/src/modules/modem/analog/ModemLSB.h b/src/modules/modem/analog/ModemLSB.h index 2a88899..e787dda 100644 --- a/src/modules/modem/analog/ModemLSB.h +++ b/src/modules/modem/analog/ModemLSB.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemNBFM.cpp b/src/modules/modem/analog/ModemNBFM.cpp index 8a00869..5dc77a6 100644 --- a/src/modules/modem/analog/ModemNBFM.cpp +++ b/src/modules/modem/analog/ModemNBFM.cpp @@ -8,7 +8,7 @@ ModemNBFM::~ModemNBFM() { freqdem_destroy(demodFM); } -Modem *ModemNBFM::factory() { +ModemBase *ModemNBFM::factory() { return new ModemNBFM; } diff --git a/src/modules/modem/analog/ModemNBFM.h b/src/modules/modem/analog/ModemNBFM.h index b9d752b..7d15cdb 100644 --- a/src/modules/modem/analog/ModemNBFM.h +++ b/src/modules/modem/analog/ModemNBFM.h @@ -9,7 +9,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int getDefaultSampleRate(); diff --git a/src/modules/modem/analog/ModemUSB.cpp b/src/modules/modem/analog/ModemUSB.cpp index e143337..c35bcfc 100644 --- a/src/modules/modem/analog/ModemUSB.cpp +++ b/src/modules/modem/analog/ModemUSB.cpp @@ -13,7 +13,7 @@ ModemUSB::ModemUSB() : ModemAnalog() { c2rFilt = firhilbf_create(5, 90.0); } -Modem *ModemUSB::factory() { +ModemBase *ModemUSB::factory() { return new ModemUSB; } diff --git a/src/modules/modem/analog/ModemUSB.h b/src/modules/modem/analog/ModemUSB.h index 9657fb3..f9dec65 100644 --- a/src/modules/modem/analog/ModemUSB.h +++ b/src/modules/modem/analog/ModemUSB.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/digital/ModemAPSK.cpp b/src/modules/modem/digital/ModemAPSK.cpp index 4030521..d67bd3a 100644 --- a/src/modules/modem/digital/ModemAPSK.cpp +++ b/src/modules/modem/digital/ModemAPSK.cpp @@ -12,7 +12,7 @@ ModemAPSK::ModemAPSK() : ModemDigital() { cons = 4; } -Modem *ModemAPSK::factory() { +ModemBase *ModemAPSK::factory() { return new ModemAPSK; } diff --git a/src/modules/modem/digital/ModemAPSK.h b/src/modules/modem/digital/ModemAPSK.h index dc9a4c6..e3dabb5 100644 --- a/src/modules/modem/digital/ModemAPSK.h +++ b/src/modules/modem/digital/ModemAPSK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemASK.cpp b/src/modules/modem/digital/ModemASK.cpp index 08eb8d4..b1e87c6 100644 --- a/src/modules/modem/digital/ModemASK.cpp +++ b/src/modules/modem/digital/ModemASK.cpp @@ -13,7 +13,7 @@ ModemASK::ModemASK() : ModemDigital() { cons = 2; } -Modem *ModemASK::factory() { +ModemBase *ModemASK::factory() { return new ModemASK; } diff --git a/src/modules/modem/digital/ModemASK.h b/src/modules/modem/digital/ModemASK.h index e102b96..a672d14 100644 --- a/src/modules/modem/digital/ModemASK.h +++ b/src/modules/modem/digital/ModemASK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemBPSK.cpp b/src/modules/modem/digital/ModemBPSK.cpp index ba06f98..59cb4f1 100644 --- a/src/modules/modem/digital/ModemBPSK.cpp +++ b/src/modules/modem/digital/ModemBPSK.cpp @@ -4,7 +4,7 @@ ModemBPSK::ModemBPSK() : ModemDigital() { demodBPSK = modem_create(LIQUID_MODEM_BPSK); } -Modem *ModemBPSK::factory() { +ModemBase *ModemBPSK::factory() { return new ModemBPSK; } diff --git a/src/modules/modem/digital/ModemBPSK.h b/src/modules/modem/digital/ModemBPSK.h index e571478..f986ca4 100644 --- a/src/modules/modem/digital/ModemBPSK.h +++ b/src/modules/modem/digital/ModemBPSK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemDPSK.cpp b/src/modules/modem/digital/ModemDPSK.cpp index 1427ea4..4927183 100644 --- a/src/modules/modem/digital/ModemDPSK.cpp +++ b/src/modules/modem/digital/ModemDPSK.cpp @@ -13,7 +13,7 @@ ModemDPSK::ModemDPSK() : ModemDigital() { cons = 2; } -Modem *ModemDPSK::factory() { +ModemBase *ModemDPSK::factory() { return new ModemDPSK; } diff --git a/src/modules/modem/digital/ModemDPSK.h b/src/modules/modem/digital/ModemDPSK.h index 3b76e00..ffeb5e3 100644 --- a/src/modules/modem/digital/ModemDPSK.h +++ b/src/modules/modem/digital/ModemDPSK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemFSK.cpp b/src/modules/modem/digital/ModemFSK.cpp index 9aef453..8db47f8 100644 --- a/src/modules/modem/digital/ModemFSK.cpp +++ b/src/modules/modem/digital/ModemFSK.cpp @@ -9,7 +9,7 @@ ModemFSK::ModemFSK() : ModemDigital() { outStream << std::hex; } -Modem *ModemFSK::factory() { +ModemBase *ModemFSK::factory() { return new ModemFSK; } diff --git a/src/modules/modem/digital/ModemFSK.h b/src/modules/modem/digital/ModemFSK.h index 332681f..e8cbcce 100644 --- a/src/modules/modem/digital/ModemFSK.h +++ b/src/modules/modem/digital/ModemFSK.h @@ -19,7 +19,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/digital/ModemGMSK.cpp b/src/modules/modem/digital/ModemGMSK.cpp index d6ca152..e7ec132 100644 --- a/src/modules/modem/digital/ModemGMSK.cpp +++ b/src/modules/modem/digital/ModemGMSK.cpp @@ -16,7 +16,7 @@ std::string ModemGMSK::getName() { return "GMSK"; } -Modem *ModemGMSK::factory() { +ModemBase *ModemGMSK::factory() { return new ModemGMSK; } diff --git a/src/modules/modem/digital/ModemGMSK.h b/src/modules/modem/digital/ModemGMSK.h index e2e0635..714670b 100644 --- a/src/modules/modem/digital/ModemGMSK.h +++ b/src/modules/modem/digital/ModemGMSK.h @@ -19,7 +19,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); int getDefaultSampleRate(); diff --git a/src/modules/modem/digital/ModemOOK.cpp b/src/modules/modem/digital/ModemOOK.cpp index 8236015..36f90ed 100644 --- a/src/modules/modem/digital/ModemOOK.cpp +++ b/src/modules/modem/digital/ModemOOK.cpp @@ -12,7 +12,7 @@ std::string ModemOOK::getName() { return "OOK"; } -Modem *ModemOOK::factory() { +ModemBase *ModemOOK::factory() { return new ModemOOK; } diff --git a/src/modules/modem/digital/ModemOOK.h b/src/modules/modem/digital/ModemOOK.h index 0c25001..d4396e3 100644 --- a/src/modules/modem/digital/ModemOOK.h +++ b/src/modules/modem/digital/ModemOOK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); int checkSampleRate(long long sampleRate, int audioSampleRate); diff --git a/src/modules/modem/digital/ModemPSK.cpp b/src/modules/modem/digital/ModemPSK.cpp index 179c965..c1e66bc 100644 --- a/src/modules/modem/digital/ModemPSK.cpp +++ b/src/modules/modem/digital/ModemPSK.cpp @@ -13,7 +13,7 @@ ModemPSK::ModemPSK() : ModemDigital() { cons = 2; } -Modem *ModemPSK::factory() { +ModemBase *ModemPSK::factory() { return new ModemPSK; } diff --git a/src/modules/modem/digital/ModemPSK.h b/src/modules/modem/digital/ModemPSK.h index 6f51a58..7732342 100644 --- a/src/modules/modem/digital/ModemPSK.h +++ b/src/modules/modem/digital/ModemPSK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemQAM.cpp b/src/modules/modem/digital/ModemQAM.cpp index b079479..84bd203 100644 --- a/src/modules/modem/digital/ModemQAM.cpp +++ b/src/modules/modem/digital/ModemQAM.cpp @@ -12,7 +12,7 @@ ModemQAM::ModemQAM() : ModemDigital() { cons = 4; } -Modem *ModemQAM::factory() { +ModemBase *ModemQAM::factory() { return new ModemQAM; } diff --git a/src/modules/modem/digital/ModemQAM.h b/src/modules/modem/digital/ModemQAM.h index 3be6936..21da247 100644 --- a/src/modules/modem/digital/ModemQAM.h +++ b/src/modules/modem/digital/ModemQAM.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemQPSK.cpp b/src/modules/modem/digital/ModemQPSK.cpp index bfe6d73..6164af5 100644 --- a/src/modules/modem/digital/ModemQPSK.cpp +++ b/src/modules/modem/digital/ModemQPSK.cpp @@ -4,7 +4,7 @@ ModemQPSK::ModemQPSK() : ModemDigital() { demodQPSK = modem_create(LIQUID_MODEM_QPSK); } -Modem *ModemQPSK::factory() { +ModemBase *ModemQPSK::factory() { return new ModemQPSK; } diff --git a/src/modules/modem/digital/ModemQPSK.h b/src/modules/modem/digital/ModemQPSK.h index 9de5d4e..b532e38 100644 --- a/src/modules/modem/digital/ModemQPSK.h +++ b/src/modules/modem/digital/ModemQPSK.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); diff --git a/src/modules/modem/digital/ModemSQAM.cpp b/src/modules/modem/digital/ModemSQAM.cpp index cb8ee39..fee4b2f 100644 --- a/src/modules/modem/digital/ModemSQAM.cpp +++ b/src/modules/modem/digital/ModemSQAM.cpp @@ -7,7 +7,7 @@ ModemSQAM::ModemSQAM() : ModemDigital() { cons = 32; } -Modem *ModemSQAM::factory() { +ModemBase *ModemSQAM::factory() { return new ModemSQAM; } diff --git a/src/modules/modem/digital/ModemSQAM.h b/src/modules/modem/digital/ModemSQAM.h index cb5b3af..46db613 100644 --- a/src/modules/modem/digital/ModemSQAM.h +++ b/src/modules/modem/digital/ModemSQAM.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); ModemArgInfoList getSettings(); void writeSetting(std::string setting, std::string value); diff --git a/src/modules/modem/digital/ModemST.cpp b/src/modules/modem/digital/ModemST.cpp index 2d58e29..993cd03 100644 --- a/src/modules/modem/digital/ModemST.cpp +++ b/src/modules/modem/digital/ModemST.cpp @@ -4,7 +4,7 @@ ModemST::ModemST() : ModemDigital() { demodST = modem_create(LIQUID_MODEM_V29); } -Modem *ModemST::factory() { +ModemBase *ModemST::factory() { return new ModemST; } diff --git a/src/modules/modem/digital/ModemST.h b/src/modules/modem/digital/ModemST.h index 2e92ae2..76b62ea 100644 --- a/src/modules/modem/digital/ModemST.h +++ b/src/modules/modem/digital/ModemST.h @@ -8,7 +8,7 @@ public: std::string getName(); - Modem *factory(); + static ModemBase *factory(); void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); From 0f5b891b20a74d50200ba52adba3631d798e57dc Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 24 Jul 2016 17:24:29 -0400 Subject: [PATCH 5/5] Fix Digital scope --- src/demod/DemodulatorInstance.cpp | 2 +- src/demod/DemodulatorThread.cpp | 6 +++++- src/visual/ScopeCanvas.cpp | 19 ++++++++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 407255e..c3a22ee 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -209,7 +209,7 @@ bool DemodulatorInstance::isActive() { void DemodulatorInstance::setActive(bool state) { if (active && !state) { #if ENABLE_DIGITAL_LAB - if (activeOutput && !isTerminated()) { + if (activeOutput) { activeOutput->Hide(); } #endif diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 2911f69..fcde477 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -183,7 +183,7 @@ void DemodulatorThread::run() { localAudioVisOutputQueue = audioVisOutputQueue; } - if (ati && localAudioVisOutputQueue != nullptr && localAudioVisOutputQueue->empty()) { + if ((ati || modemDigital) && localAudioVisOutputQueue != nullptr && localAudioVisOutputQueue->empty()) { AudioThreadInput *ati_vis = new AudioThreadInput; ati_vis->sampleRate = inp->sampleRate; @@ -191,6 +191,10 @@ void DemodulatorThread::run() { size_t num_vis = DEMOD_VIS_SIZE; if (modemDigital) { + if (ati) { // TODO: handle digital modems with audio output + ati->setRefCount(0); + ati = nullptr; + } ati_vis->data.resize(inputData->size()); ati_vis->channels = 2; for (int i = 0, iMax = inputData->size() / 2; i < iMax; i++) { diff --git a/src/visual/ScopeCanvas.cpp b/src/visual/ScopeCanvas.cpp index b289703..83e04e7 100644 --- a/src/visual/ScopeCanvas.cpp +++ b/src/visual/ScopeCanvas.cpp @@ -128,17 +128,18 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { glViewport(0, 0, ClientSize.x, ClientSize.y); - if (scopePanel.getMode() == ScopePanel::SCOPE_MODE_XY && !spectrumVisible()) { - glDrawBuffer(GL_FRONT); - glContext->DrawBegin(false); - } else { - glDrawBuffer(GL_BACK); + // TODO: find out why frontbuffer drawing has stopped working in wx 3.1.0? +// if (scopePanel.getMode() == ScopePanel::SCOPE_MODE_XY && !spectrumVisible()) { +// glDrawBuffer(GL_FRONT); +// glContext->DrawBegin(false); +// } else { +// glDrawBuffer(GL_BACK); glContext->DrawBegin(); - + bgPanel.setFillColor(ThemeMgr::mgr.currentTheme->scopeBackground * 3.0, RGBA4f(0,0,0,1)); bgPanel.calcTransform(CubicVR::mat4::identity()); bgPanel.draw(); - } +// } glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -216,9 +217,9 @@ void ScopeCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { glContext->DrawTunerTitles(ppmMode); glContext->DrawEnd(); - if (scopePanel.getMode() != ScopePanel::SCOPE_MODE_XY || spectrumVisible()) { +// if (scopePanel.getMode() != ScopePanel::SCOPE_MODE_XY || spectrumVisible()) { SwapBuffers(); - } +// } }