diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index a44e0a09a..7642227b6 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -75,11 +75,8 @@ AMMod::AMMod(DeviceAPI *deviceAPI) : DSPEngine::instance()->getAudioDeviceManager()->addAudioSource(&m_audioFifo, getInputMessageQueue()); m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate(); m_toneNco.setFreq(1000.0, m_audioSampleRate); - - // CW keyer - m_cwKeyer.setSampleRate(m_audioSampleRate); - m_cwKeyer.setWPM(13); - m_cwKeyer.setMode(CWKeyerSettings::CWNone); + m_cwKeyer.setSampleRate(m_audioSampleRate); + m_cwKeyer.reset(); applyChannelSettings(m_basebandSampleRate, m_outputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -668,16 +665,13 @@ int AMMod::webapiSettingsPutPatch( cwKeyerSettings.m_wpm = apiCwKeyerSettings->getWpm(); } - m_cwKeyer.setLoop(cwKeyerSettings.m_loop); - m_cwKeyer.setMode(cwKeyerSettings.m_mode); - m_cwKeyer.setSampleRate(cwKeyerSettings.m_sampleRate); - m_cwKeyer.setText(cwKeyerSettings.m_text); - m_cwKeyer.setWPM(cwKeyerSettings.m_wpm); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_cwKeyer.getInputMessageQueue()->push(msgCwKeyer); if (m_guiMessageQueue) // forward to GUI if any { - CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); - m_guiMessageQueue->push(msgCwKeyer); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyerToGUI = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_guiMessageQueue->push(msgCwKeyerToGUI); } } diff --git a/plugins/channeltx/modam/ammodgui.cpp b/plugins/channeltx/modam/ammodgui.cpp index 999c988b2..b08a3c10d 100644 --- a/plugins/channeltx/modam/ammodgui.cpp +++ b/plugins/channeltx/modam/ammodgui.cpp @@ -119,7 +119,8 @@ bool AMModGUI::handleMessage(const Message& message) else if (CWKeyer::MsgConfigureCWKeyer::match(message)) { const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message; - ui->cwKeyerGUI->displaySettings(cfg.getSettings()); + ui->cwKeyerGUI->setSettings(cfg.getSettings()); + ui->cwKeyerGUI->displaySettings(); return true; } else @@ -361,7 +362,7 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl ui->morseKeyer->setChecked(false); ui->mic->setChecked(false); - ui->cwKeyerGUI->setBuddies(m_amMod->getInputMessageQueue(), m_amMod->getCWKeyer()); + ui->cwKeyerGUI->setCWKeyer(m_amMod->getCWKeyer()); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(m_amMod, SIGNAL(levelChanged(qreal, qreal, int)), ui->volumeMeter, SLOT(levelChanged(qreal, qreal, int))); @@ -384,7 +385,6 @@ void AMModGUI::blockApplySettings(bool block) void AMModGUI::applySettings(bool force) { - (void) force; if (m_doApplySettings) { setTitleColor(m_channelMarker.getColor()); diff --git a/plugins/channeltx/modam/ammodplugin.cpp b/plugins/channeltx/modam/ammodplugin.cpp index 5d2cbc413..9606e337c 100644 --- a/plugins/channeltx/modam/ammodplugin.cpp +++ b/plugins/channeltx/modam/ammodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor AMModPlugin::m_pluginDescriptor = { QString("AM Modulator"), - QString("4.5.2"), + QString("4.11.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modfreedv/freedvmod.cpp b/plugins/channeltx/modfreedv/freedvmod.cpp index eb56634a0..4e5f86e36 100644 --- a/plugins/channeltx/modfreedv/freedvmod.cpp +++ b/plugins/channeltx/modfreedv/freedvmod.cpp @@ -104,11 +104,8 @@ FreeDVMod::FreeDVMod(DeviceAPI *deviceAPI) : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_inputSampleRate); - - // CW keyer - m_cwKeyer.setSampleRate(m_inputSampleRate); - m_cwKeyer.setWPM(13); - m_cwKeyer.setMode(CWKeyerSettings::CWNone); + m_cwKeyer.setSampleRate(m_inputSampleRate); + m_cwKeyer.reset(); m_channelizer = new UpChannelizer(this); m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this); @@ -933,16 +930,13 @@ int FreeDVMod::webapiSettingsPutPatch( cwKeyerSettings.m_wpm = apiCwKeyerSettings->getWpm(); } - m_cwKeyer.setLoop(cwKeyerSettings.m_loop); - m_cwKeyer.setMode(cwKeyerSettings.m_mode); - //m_cwKeyer.setSampleRate(cwKeyerSettings.m_sampleRate); - m_cwKeyer.setText(cwKeyerSettings.m_text); - m_cwKeyer.setWPM(cwKeyerSettings.m_wpm); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_cwKeyer.getInputMessageQueue()->push(msgCwKeyer); if (m_guiMessageQueue) // forward to GUI if any { - CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); - m_guiMessageQueue->push(msgCwKeyer); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyerToGUI = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_guiMessageQueue->push(msgCwKeyerToGUI); } } diff --git a/plugins/channeltx/modfreedv/freedvmodgui.cpp b/plugins/channeltx/modfreedv/freedvmodgui.cpp index e35326859..4129837e4 100644 --- a/plugins/channeltx/modfreedv/freedvmodgui.cpp +++ b/plugins/channeltx/modfreedv/freedvmodgui.cpp @@ -130,7 +130,8 @@ bool FreeDVModGUI::handleMessage(const Message& message) else if (CWKeyer::MsgConfigureCWKeyer::match(message)) { const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message; - ui->cwKeyerGUI->displaySettings(cfg.getSettings()); + ui->cwKeyerGUI->setSettings(cfg.getSettings()); + ui->cwKeyerGUI->displaySettings(); return true; } else @@ -384,7 +385,7 @@ FreeDVModGUI::FreeDVModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor())); - ui->cwKeyerGUI->setBuddies(m_freeDVMod->getInputMessageQueue(), m_freeDVMod->getCWKeyer()); + ui->cwKeyerGUI->setCWKeyer(m_freeDVMod->getCWKeyer()); ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum); m_settings.setChannelMarker(&m_channelMarker); diff --git a/plugins/channeltx/modfreedv/freedvmodplugin.cpp b/plugins/channeltx/modfreedv/freedvmodplugin.cpp index c015d2190..89516bd98 100644 --- a/plugins/channeltx/modfreedv/freedvmodplugin.cpp +++ b/plugins/channeltx/modfreedv/freedvmodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor FreeDVModPlugin::m_pluginDescriptor = { QString("FreeDV Modulator"), - QString("4.5.5"), + QString("4.11.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 99ae22255..0de76052b 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -81,11 +81,8 @@ NFMMod::NFMMod(DeviceAPI *deviceAPI) : m_lowpass.create(301, m_audioSampleRate, 250.0); m_toneNco.setFreq(1000.0, m_audioSampleRate); m_ctcssNco.setFreq(88.5, m_audioSampleRate); - - // CW keyer m_cwKeyer.setSampleRate(m_audioSampleRate); - m_cwKeyer.setWPM(13); - m_cwKeyer.setMode(CWKeyerSettings::CWNone); + m_cwKeyer.reset(); applyChannelSettings(m_basebandSampleRate, m_outputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -724,16 +721,13 @@ int NFMMod::webapiSettingsPutPatch( cwKeyerSettings.m_wpm = apiCwKeyerSettings->getWpm(); } - m_cwKeyer.setLoop(cwKeyerSettings.m_loop); - m_cwKeyer.setMode(cwKeyerSettings.m_mode); - m_cwKeyer.setSampleRate(cwKeyerSettings.m_sampleRate); - m_cwKeyer.setText(cwKeyerSettings.m_text); - m_cwKeyer.setWPM(cwKeyerSettings.m_wpm); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_cwKeyer.getInputMessageQueue()->push(msgCwKeyer); if (m_guiMessageQueue) // forward to GUI if any { - CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); - m_guiMessageQueue->push(msgCwKeyer); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyerToGUI = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_guiMessageQueue->push(msgCwKeyerToGUI); } } diff --git a/plugins/channeltx/modnfm/nfmmodgui.cpp b/plugins/channeltx/modnfm/nfmmodgui.cpp index 9187414ad..9bf5c65ba 100644 --- a/plugins/channeltx/modnfm/nfmmodgui.cpp +++ b/plugins/channeltx/modnfm/nfmmodgui.cpp @@ -118,7 +118,8 @@ bool NFMModGUI::handleMessage(const Message& message) else if (CWKeyer::MsgConfigureCWKeyer::match(message)) { const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message; - ui->cwKeyerGUI->displaySettings(cfg.getSettings()); + ui->cwKeyerGUI->setSettings(cfg.getSettings()); + ui->cwKeyerGUI->displaySettings(); return true; } else @@ -390,7 +391,7 @@ NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam ui->ctcss->addItem(QString("%1").arg((double) NFMModSettings::getCTCSSFreq(i), 0, 'f', 1)); } - ui->cwKeyerGUI->setBuddies(m_nfmMod->getInputMessageQueue(), m_nfmMod->getCWKeyer()); + ui->cwKeyerGUI->setCWKeyer(m_nfmMod->getCWKeyer()); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); connect(m_nfmMod, SIGNAL(levelChanged(qreal, qreal, int)), ui->volumeMeter, SLOT(levelChanged(qreal, qreal, int))); diff --git a/plugins/channeltx/modnfm/nfmmodplugin.cpp b/plugins/channeltx/modnfm/nfmmodplugin.cpp index 28bc64fe4..b1af69ec0 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.cpp +++ b/plugins/channeltx/modnfm/nfmmodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor NFMModPlugin::m_pluginDescriptor = { QString("NFM Modulator"), - QString("4.5.2"), + QString("4.11.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index ab0b1fb84..919d8fcb3 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -100,12 +100,8 @@ SSBMod::SSBMod(DeviceAPI *deviceAPI) : m_magsq = 0.0; m_toneNco.setFreq(1000.0, m_audioSampleRate); - - // CW keyer m_cwKeyer.setSampleRate(48000); - m_cwKeyer.setWPM(13); - m_cwKeyer.setMode(CWKeyerSettings::CWNone); - + m_cwKeyer.reset(); m_audioCompressor.initSimple( m_audioSampleRate, @@ -1021,16 +1017,13 @@ int SSBMod::webapiSettingsPutPatch( cwKeyerSettings.m_wpm = apiCwKeyerSettings->getWpm(); } - m_cwKeyer.setLoop(cwKeyerSettings.m_loop); - m_cwKeyer.setMode(cwKeyerSettings.m_mode); - m_cwKeyer.setSampleRate(cwKeyerSettings.m_sampleRate); - m_cwKeyer.setText(cwKeyerSettings.m_text); - m_cwKeyer.setWPM(cwKeyerSettings.m_wpm); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_cwKeyer.getInputMessageQueue()->push(msgCwKeyer); if (m_guiMessageQueue) // forward to GUI if any { - CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); - m_guiMessageQueue->push(msgCwKeyer); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyerToGUI = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_guiMessageQueue->push(msgCwKeyerToGUI); } } diff --git a/plugins/channeltx/modssb/ssbmodgui.cpp b/plugins/channeltx/modssb/ssbmodgui.cpp index 47f21e8aa..0ae758919 100644 --- a/plugins/channeltx/modssb/ssbmodgui.cpp +++ b/plugins/channeltx/modssb/ssbmodgui.cpp @@ -136,7 +136,8 @@ bool SSBModGUI::handleMessage(const Message& message) else if (CWKeyer::MsgConfigureCWKeyer::match(message)) { const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message; - ui->cwKeyerGUI->displaySettings(cfg.getSettings()); + ui->cwKeyerGUI->setSettings(cfg.getSettings()); + ui->cwKeyerGUI->displaySettings(); return true; } else @@ -430,7 +431,7 @@ SSBModGUI::SSBModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor())); - ui->cwKeyerGUI->setBuddies(m_ssbMod->getInputMessageQueue(), m_ssbMod->getCWKeyer()); + ui->cwKeyerGUI->setCWKeyer(m_ssbMod->getCWKeyer()); ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum); m_settings.setChannelMarker(&m_channelMarker); diff --git a/plugins/channeltx/modssb/ssbmodplugin.cpp b/plugins/channeltx/modssb/ssbmodplugin.cpp index 951ab7952..6aa35f0ca 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.cpp +++ b/plugins/channeltx/modssb/ssbmodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor SSBModPlugin::m_pluginDescriptor = { QString("SSB Modulator"), - QString("4.11.1"), + QString("4.11.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index f1408bbb2..76c9c9d78 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -85,11 +85,7 @@ WFMMod::WFMMod(DeviceAPI *deviceAPI) : m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getInputSampleRate(); m_toneNcoRF.setFreq(1000.0, m_outputSampleRate); - - // CW keyer m_cwKeyer.setSampleRate(m_outputSampleRate); - m_cwKeyer.setWPM(13); - m_cwKeyer.setMode(CWKeyerSettings::CWNone); m_cwKeyer.reset(); applyChannelSettings(m_basebandSampleRate, m_outputSampleRate, m_inputFrequencyOffset, true); @@ -698,16 +694,13 @@ int WFMMod::webapiSettingsPutPatch( cwKeyerSettings.m_wpm = apiCwKeyerSettings->getWpm(); } - m_cwKeyer.setLoop(cwKeyerSettings.m_loop); - m_cwKeyer.setMode(cwKeyerSettings.m_mode); - m_cwKeyer.setSampleRate(cwKeyerSettings.m_sampleRate); - m_cwKeyer.setText(cwKeyerSettings.m_text); - m_cwKeyer.setWPM(cwKeyerSettings.m_wpm); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_cwKeyer.getInputMessageQueue()->push(msgCwKeyer); if (m_guiMessageQueue) // forward to GUI if any { - CWKeyer::MsgConfigureCWKeyer *msgCwKeyer = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); - m_guiMessageQueue->push(msgCwKeyer); + CWKeyer::MsgConfigureCWKeyer *msgCwKeyerToGUI = CWKeyer::MsgConfigureCWKeyer::create(cwKeyerSettings, force); + m_guiMessageQueue->push(msgCwKeyerToGUI); } } diff --git a/plugins/channeltx/modwfm/wfmmodgui.cpp b/plugins/channeltx/modwfm/wfmmodgui.cpp index 65e3e0466..c3ae5d565 100644 --- a/plugins/channeltx/modwfm/wfmmodgui.cpp +++ b/plugins/channeltx/modwfm/wfmmodgui.cpp @@ -119,7 +119,8 @@ bool WFMModGUI::handleMessage(const Message& message) else if (CWKeyer::MsgConfigureCWKeyer::match(message)) { const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message; - ui->cwKeyerGUI->displaySettings(cfg.getSettings()); + ui->cwKeyerGUI->setSettings(cfg.getSettings()); + ui->cwKeyerGUI->displaySettings(); return true; } else @@ -375,7 +376,7 @@ WFMModGUI::WFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam ui->tone->setChecked(false); ui->mic->setChecked(false); - ui->cwKeyerGUI->setBuddies(m_wfmMod->getInputMessageQueue(), m_wfmMod->getCWKeyer()); + ui->cwKeyerGUI->setCWKeyer(m_wfmMod->getCWKeyer()); m_settings.setChannelMarker(&m_channelMarker); m_settings.setCWKeyerGUI(ui->cwKeyerGUI); diff --git a/plugins/channeltx/modwfm/wfmmodplugin.cpp b/plugins/channeltx/modwfm/wfmmodplugin.cpp index 863947233..7fe4cc422 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.cpp +++ b/plugins/channeltx/modwfm/wfmmodplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor WFMModPlugin::m_pluginDescriptor = { QString("WFM Modulator"), - QString("4.5.2"), + QString("4.11.5"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/sdrbase/dsp/cwkeyer.cpp b/sdrbase/dsp/cwkeyer.cpp index 16a6f1a1d..bae4bf6d7 100644 --- a/sdrbase/dsp/cwkeyer.cpp +++ b/sdrbase/dsp/cwkeyer.cpp @@ -175,7 +175,8 @@ CWKeyer::CWKeyer() : m_keyIambicState(KeySilent), m_textState(TextStart) { - setWPM(13); + connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + applySettings(m_settings, true); } CWKeyer::~CWKeyer() @@ -184,55 +185,10 @@ CWKeyer::~CWKeyer() void CWKeyer::setSampleRate(int sampleRate) { - m_mutex.lock(); - m_settings.m_sampleRate = sampleRate; - m_mutex.unlock(); - setWPM(m_settings.m_wpm); -} - -void CWKeyer::setWPM(int wpm) -{ - if ((wpm > 0) && (wpm < 27)) - { - QMutexLocker mutexLocker(&m_mutex); - m_dotLength = (int) (0.24f * m_settings.m_sampleRate * (5.0f / wpm)); - m_settings.m_wpm = wpm; - m_cwSmoother.setNbFadeSamples(m_dotLength/5); // 20% the dot time - } -} - -void CWKeyer::setText(const QString& text) -{ - QMutexLocker mutexLocker(&m_mutex); - m_settings.m_text = text; - m_textState = TextStart; -} - -void CWKeyer::setMode(CWKeyerSettings::CWMode mode) -{ - if (mode != m_settings.m_mode) - { - QMutexLocker mutexLocker(&m_mutex); - - if (mode == CWKeyerSettings::CWText) - { - m_textState = TextStart; - } - else if (mode == CWKeyerSettings::CWDots) - { - m_dot = true; - m_dash = false; - m_keyIambicState = KeySilent; - } - else if (mode == CWKeyerSettings::CWDashes) - { - m_dot = false; - m_dash = true; - m_keyIambicState = KeySilent; - } - - m_settings.m_mode = mode; - } + CWKeyerSettings settings = m_settings; + settings.m_sampleRate = sampleRate; + MsgConfigureCWKeyer *msg = MsgConfigureCWKeyer::create(settings, false); + m_inputMessageQueue.push(msg); } int CWKeyer::getSample() @@ -533,3 +489,71 @@ bool CWSmoother::getFadeSample(bool on, float& sample) } } } + +bool CWKeyer::handleMessage(const Message& cmd) +{ + if (MsgConfigureCWKeyer::match(cmd)) + { + MsgConfigureCWKeyer& cfg = (MsgConfigureCWKeyer&) cmd; + qDebug() << "CWKeyer::handleMessage: MsgConfigureCWKeyer"; + + applySettings(cfg.getSettings(), cfg.getForce()); + + return true; + } + + return true; +} + +void CWKeyer::handleInputMessages() +{ + Message* message; + + while ((message = m_inputMessageQueue.pop()) != 0) + { + if (handleMessage(*message)) { + delete message; + } + } +} + +void CWKeyer::applySettings(const CWKeyerSettings& settings, bool force) +{ + if ((m_settings.m_wpm != settings.m_wpm) + || (m_settings.m_sampleRate != settings.m_sampleRate) || force) + { + QMutexLocker mutexLocker(&m_mutex); + m_dotLength = (int) (0.24f * settings.m_sampleRate * (5.0f / settings.m_wpm)); + m_cwSmoother.setNbFadeSamples(m_dotLength/5); // 20% the dot time + } + + if ((m_settings.m_mode != settings.m_mode) || force) + { + QMutexLocker mutexLocker(&m_mutex); + + if (settings.m_mode == CWKeyerSettings::CWText) + { + m_textState = TextStart; + } + else if (settings.m_mode == CWKeyerSettings::CWDots) + { + m_dot = true; + m_dash = false; + m_keyIambicState = KeySilent; + } + else if (settings.m_mode == CWKeyerSettings::CWDashes) + { + m_dot = false; + m_dash = true; + m_keyIambicState = KeySilent; + } + } + + if ((m_settings.m_text != settings.m_text) || force) + { + QMutexLocker mutexLocker(&m_mutex); + m_textState = TextStart; + } + + m_settings = settings; +} \ No newline at end of file diff --git a/sdrbase/dsp/cwkeyer.h b/sdrbase/dsp/cwkeyer.h index 76b7f42c7..9e48e3dc9 100644 --- a/sdrbase/dsp/cwkeyer.h +++ b/sdrbase/dsp/cwkeyer.h @@ -24,6 +24,7 @@ #include "export.h" #include "util/message.h" +#include "util/messagequeue.h" #include "cwkeyersettings.h" /** @@ -74,14 +75,14 @@ public: { } }; - typedef enum + enum CWKeyIambicState { KeySilent, KeyDot, KeyDash - } CWKeyIambicState; + }; - typedef enum + enum CWTextState { TextStart, TextStartChar, @@ -91,7 +92,7 @@ public: TextWordSpace, TextEnd, TextStop - } CWTextState; + }; CWKeyer(); ~CWKeyer(); @@ -99,17 +100,10 @@ public: void resetToDefaults(); QByteArray serialize() const; bool deserialize(const QByteArray& data); + MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication void setSampleRate(int sampleRate); - void setWPM(int wpm); - void setText(const QString& text); - void setMode(CWKeyerSettings::CWMode mode); - void setLoop(bool loop) { m_settings.m_loop = loop; } const CWKeyerSettings& getSettings() const { return m_settings; } - void setDotKey(Qt::Key key) { m_settings.m_dotKey = key; } - void setDotKeyModifiers(Qt::KeyboardModifiers keyboardModifiers) { m_settings.m_dotKeyModifiers = keyboardModifiers; } - void setDashKey(Qt::Key key) { m_settings.m_dashKey = key; } - void setDashKeyModifiers(Qt::KeyboardModifiers keyboardModifiers) { m_settings.m_dashKeyModifiers = keyboardModifiers; } void reset() { m_keyIambicState = KeySilent; } @@ -122,6 +116,7 @@ public: private: QMutex m_mutex; CWKeyerSettings m_settings; + MessageQueue m_inputMessageQueue; int m_dotLength; //!< dot length in samples int m_textPointer; int m_elementPointer; @@ -139,8 +134,13 @@ private: static const signed char m_asciiToMorse[128][7]; + void applySettings(const CWKeyerSettings& settings, bool force = false); + bool handleMessage(const Message& cmd); void nextStateIambic(); void nextStateText(); + +private slots: + void handleInputMessages(); }; #endif /* SDRBASE_DSP_CWKEYER_H_ */ diff --git a/sdrgui/gui/cwkeyergui.cpp b/sdrgui/gui/cwkeyergui.cpp index 9ea397ac6..3e7e7dd81 100644 --- a/sdrgui/gui/cwkeyergui.cpp +++ b/sdrgui/gui/cwkeyergui.cpp @@ -30,7 +30,6 @@ CWKeyerGUI::CWKeyerGUI(QWidget* parent) : QWidget(parent), ui(new Ui::CWKeyerGUI), - m_messageQueue(nullptr), m_cwKeyer(nullptr), m_doApplySettings(true), m_keyScope(NoKeyScope) @@ -48,58 +47,36 @@ CWKeyerGUI::~CWKeyerGUI() delete ui; } -void CWKeyerGUI::setBuddies(MessageQueue* messageQueue, CWKeyer* cwKeyer) +void CWKeyerGUI::setCWKeyer(CWKeyer* cwKeyer) { - m_messageQueue = messageQueue; m_cwKeyer = cwKeyer; - applySettings(); - sendSettings(); - displaySettings(m_cwKeyer->getSettings()); + setSettings(cwKeyer->getSettings()); + displaySettings(); } void CWKeyerGUI::resetToDefaults() { - ui->cwTextEdit->setText(""); - ui->cwSpeed->setValue(13); + m_settings.resetToDefaults(); + displaySettings(); + applySettings(true); } QByteArray CWKeyerGUI::serialize() const { - SimpleSerializer s(1); - - s.writeString(1, ui->cwTextEdit->text()); - s.writeS32(2, ui->cwSpeed->value()); - - return s.final(); + return m_settings.serialize(); } bool CWKeyerGUI::deserialize(const QByteArray& data) { - SimpleDeserializer d(data); - - if(!d.isValid()) + if (m_settings.deserialize(data)) { - resetToDefaults(); - return false; - } - - if(d.getVersion() == 1) - { - QString aString; - int aValue; - - d.readString(1, &aString, ""); - ui->cwTextEdit->setText(aString); - d.readS32(2, &aValue, 13); - ui->cwSpeed->setValue(aValue); - - applySettings(); - sendSettings(); - + displaySettings(); + applySettings(true); return true; } else { + resetToDefaults(); return false; } } @@ -110,27 +87,21 @@ void CWKeyerGUI::on_cwTextClear_clicked(bool checked) { (void) checked; ui->cwTextEdit->clear(); - m_cwKeyer->setText(""); + m_settings.m_text = ""; + applySettings(); } void CWKeyerGUI::on_cwTextEdit_editingFinished() { - if (m_doApplySettings) - { - m_cwKeyer->setText(ui->cwTextEdit->text()); - sendSettings(); - } + m_settings.m_text = ui->cwTextEdit->text(); + applySettings(); } void CWKeyerGUI::on_cwSpeed_valueChanged(int value) { ui->cwSpeedText->setText(QString("%1").arg(value)); - - if (m_doApplySettings) - { - m_cwKeyer->setWPM(value); - sendSettings(); - } + m_settings.m_wpm = value; + applySettings(); } void CWKeyerGUI::on_playDots_toggled(bool checked) @@ -139,12 +110,8 @@ void CWKeyerGUI::on_playDots_toggled(bool checked) ui->playDashes->setEnabled(!checked); ui->playText->setEnabled(!checked); ui->keyboardKeyer->setEnabled(!checked); - - if (m_doApplySettings) - { - m_cwKeyer->setMode(checked ? CWKeyerSettings::CWDots : CWKeyerSettings::CWNone); - sendSettings(); - } + m_settings.m_mode = checked ? CWKeyerSettings::CWDots : CWKeyerSettings::CWNone; + applySettings(); } void CWKeyerGUI::on_playDashes_toggled(bool checked) @@ -153,12 +120,8 @@ void CWKeyerGUI::on_playDashes_toggled(bool checked) //ui->playDashes->setEnabled(!checked); ui->playText->setEnabled(!checked); ui->keyboardKeyer->setEnabled(!checked); - - if (m_doApplySettings) - { - m_cwKeyer->setMode(checked ? CWKeyerSettings::CWDashes : CWKeyerSettings::CWNone); - sendSettings(); - } + m_settings.m_mode = checked ? CWKeyerSettings::CWDashes : CWKeyerSettings::CWNone; + applySettings(); } void CWKeyerGUI::on_playText_toggled(bool checked) @@ -168,26 +131,20 @@ void CWKeyerGUI::on_playText_toggled(bool checked) //ui->playText->setEnabled(!checked); ui->keyboardKeyer->setEnabled(!checked); - if (m_doApplySettings) - { - m_cwKeyer->setMode(checked ? CWKeyerSettings::CWText : CWKeyerSettings::CWNone); - sendSettings(); - } - if (checked) { ui->playStop->setChecked(true); } else { ui->playStop->setChecked(false); } + + m_settings.m_mode = checked ? CWKeyerSettings::CWText : CWKeyerSettings::CWNone; + applySettings(); } void CWKeyerGUI::on_playLoopCW_toggled(bool checked) { - if (m_doApplySettings) - { - m_cwKeyer->setLoop(checked); - sendSettings(); - } + m_settings.m_loop = checked; + applySettings(); } void CWKeyerGUI::on_playStop_toggled(bool checked) @@ -258,36 +215,25 @@ void CWKeyerGUI::on_keyDashCapture_toggled(bool checked) void CWKeyerGUI::commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifiers, bool release) { (void) release; -// qDebug("CWKeyerGUI::commandKeyPressed: key: %x", m_key); -// qDebug("CWKeyerGUI::commandKeyPressed: has modifiers: %x", QFlags::Int(keyModifiers)); + // qDebug("CWKeyerGUI::commandKeyPressed: key scope: %d", (int) m_keyScope); + // qDebug("CWKeyerGUI::commandKeyPressed: key: %x", key); + // qDebug("CWKeyerGUI::commandKeyPressed: has modifiers: %x", QFlags::Int(keyModifiers)); if (m_keyScope == DotKeyScope) { - m_dotKey = key; - m_dotKeyModifiers = keyModifiers; setKeyLabel(ui->keyDotLabel, key, keyModifiers); ui->keyDotCapture->setChecked(false); - - if (m_doApplySettings) - { - m_cwKeyer->setDotKey(key); - m_cwKeyer->setDotKeyModifiers(keyModifiers); - sendSettings(); - } + m_settings.m_dotKey = key; + m_settings.m_dotKeyModifiers = keyModifiers; + applySettings(); } else if (m_keyScope == DashKeyScope) { - m_dashKey = key; - m_dashKeyModifiers = keyModifiers; setKeyLabel(ui->keyDashLabel, key, keyModifiers); ui->keyDashCapture->setChecked(false); - - if (m_doApplySettings) - { - m_cwKeyer->setDashKey(key); - m_cwKeyer->setDashKeyModifiers(keyModifiers); - sendSettings(); - } + m_settings.m_dashKey = key; + m_settings.m_dashKeyModifiers = keyModifiers; + applySettings(); } m_commandKeyReceiver->setRelease(true); @@ -299,12 +245,8 @@ void CWKeyerGUI::on_keyboardKeyer_toggled(bool checked) ui->playDots->setEnabled(!checked); // block or release other source inputs ui->playDashes->setEnabled(!checked); ui->playText->setEnabled(!checked); - - if (m_doApplySettings) - { - m_cwKeyer->setMode(checked ? CWKeyerSettings::CWKeyboard : CWKeyerSettings::CWNone); - sendSettings(); - } + m_settings.m_mode = checked ? CWKeyerSettings::CWKeyboard : CWKeyerSettings::CWNone; + applySettings(); if (checked) { MainWindow::getInstance()->commandKeysConnect(this, SLOT(keyboardKeyPressed(Qt::Key, Qt::KeyboardModifiers, bool))); @@ -329,43 +271,39 @@ void CWKeyerGUI::keyboardKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifi // === End SLOTS ============================================================== -void CWKeyerGUI::applySettings() +void CWKeyerGUI::applySettings(bool force) { - int value; - - m_cwKeyer->setText(ui->cwTextEdit->text()); - - value = ui->cwSpeed->value(); - ui->cwSpeedText->setText(QString("%1").arg(value)); - m_cwKeyer->setWPM(value); - - m_cwKeyer->setDotKey(m_dotKey); - m_cwKeyer->setDotKeyModifiers(m_dotKeyModifiers); - m_cwKeyer->setDashKey(m_dashKey); - m_cwKeyer->setDashKeyModifiers(m_dashKeyModifiers); + if (m_doApplySettings && m_cwKeyer) + { + CWKeyer::MsgConfigureCWKeyer* message = CWKeyer::MsgConfigureCWKeyer::create(m_settings, force); + m_cwKeyer->getInputMessageQueue()->push(message); + } } -void CWKeyerGUI::displaySettings(const CWKeyerSettings& settings) +void CWKeyerGUI::displaySettings() { blockApplySettings(true); - ui->playLoopCW->setChecked(settings.m_loop); + ui->playLoopCW->setChecked(m_settings.m_loop); - ui->playDots->setEnabled((settings.m_mode == CWKeyerSettings::CWDots) || (settings.m_mode == CWKeyerSettings::CWNone)); - ui->playDots->setChecked(settings.m_mode == CWKeyerSettings::CWDots); + ui->playDots->setEnabled((m_settings.m_mode == CWKeyerSettings::CWDots) || (m_settings.m_mode == CWKeyerSettings::CWNone)); + ui->playDots->setChecked(m_settings.m_mode == CWKeyerSettings::CWDots); - ui->playDashes->setEnabled((settings.m_mode == CWKeyerSettings::CWDashes) || (settings.m_mode == CWKeyerSettings::CWNone)); - ui->playDashes->setChecked(settings.m_mode == CWKeyerSettings::CWDashes); + ui->playDashes->setEnabled((m_settings.m_mode == CWKeyerSettings::CWDashes) || (m_settings.m_mode == CWKeyerSettings::CWNone)); + ui->playDashes->setChecked(m_settings.m_mode == CWKeyerSettings::CWDashes); - ui->playText->setEnabled((settings.m_mode == CWKeyerSettings::CWText) || (settings.m_mode == CWKeyerSettings::CWNone)); - ui->playText->setChecked(settings.m_mode == CWKeyerSettings::CWText); + ui->playText->setEnabled((m_settings.m_mode == CWKeyerSettings::CWText) || (m_settings.m_mode == CWKeyerSettings::CWNone)); + ui->playText->setChecked(m_settings.m_mode == CWKeyerSettings::CWText); - ui->cwTextEdit->setText(settings.m_text); - ui->cwSpeed->setValue(settings.m_wpm); - ui->cwSpeedText->setText(QString("%1").arg(settings.m_wpm)); + ui->keyboardKeyer->setEnabled((m_settings.m_mode == CWKeyerSettings::CWKeyboard) || (m_settings.m_mode == CWKeyerSettings::CWNone)); + ui->keyboardKeyer->setChecked(m_settings.m_mode == CWKeyerSettings::CWKeyboard); - setKeyLabel(ui->keyDotLabel, settings.m_dotKey, settings.m_dotKeyModifiers); - setKeyLabel(ui->keyDashLabel, settings.m_dashKey, settings.m_dashKeyModifiers); + ui->cwTextEdit->setText(m_settings.m_text); + ui->cwSpeed->setValue(m_settings.m_wpm); + ui->cwSpeedText->setText(QString("%1").arg(m_settings.m_wpm)); + + setKeyLabel(ui->keyDotLabel, m_settings.m_dotKey, m_settings.m_dotKeyModifiers); + setKeyLabel(ui->keyDashLabel, m_settings.m_dashKey, m_settings.m_dashKeyModifiers); blockApplySettings(false); } @@ -392,12 +330,3 @@ void CWKeyerGUI::blockApplySettings(bool block) { m_doApplySettings = !block; } - -void CWKeyerGUI::sendSettings() -{ - if (m_cwKeyer && m_messageQueue) - { - CWKeyer::MsgConfigureCWKeyer *msg = CWKeyer::MsgConfigureCWKeyer::create(m_cwKeyer->getSettings(), false); - m_messageQueue->push(msg); - } -} diff --git a/sdrgui/gui/cwkeyergui.h b/sdrgui/gui/cwkeyergui.h index 07f234a0b..cb0dada35 100644 --- a/sdrgui/gui/cwkeyergui.h +++ b/sdrgui/gui/cwkeyergui.h @@ -23,6 +23,7 @@ #include "dsp/dsptypes.h" #include "export.h" #include "settings/serializable.h" +#include "dsp/cwkeyersettings.h" namespace Ui { class CWKeyerGUI; @@ -41,13 +42,14 @@ public: explicit CWKeyerGUI(QWidget* parent = nullptr); ~CWKeyerGUI(); - void setBuddies(MessageQueue* messageQueue, CWKeyer* cwKeyer); + void setCWKeyer(CWKeyer* cwKeyer); void resetToDefaults(); QByteArray serialize() const; bool deserialize(const QByteArray& data); - void displaySettings(const CWKeyerSettings& settings); + void setSettings(const CWKeyerSettings& settings) { m_settings = settings; } + void displaySettings(); private: enum KeyScope @@ -59,18 +61,13 @@ private: Ui::CWKeyerGUI* ui; - MessageQueue* m_messageQueue; CWKeyer* m_cwKeyer; + CWKeyerSettings m_settings; bool m_doApplySettings; CommandKeyReceiver *m_commandKeyReceiver; KeyScope m_keyScope; - Qt::Key m_dotKey; - Qt::KeyboardModifiers m_dotKeyModifiers; - Qt::Key m_dashKey; - Qt::KeyboardModifiers m_dashKeyModifiers; - void applySettings(); - void sendSettings(); + void applySettings(bool force = false); void blockApplySettings(bool block); void setKeyLabel(QLabel *label, Qt::Key key, Qt::KeyboardModifiers keyModifiers);