diff --git a/plugins/channeltx/modnfm/nfmmodplugin.cpp b/plugins/channeltx/modnfm/nfmmodplugin.cpp
index a1a787825..4d9aa9cc2 100644
--- a/plugins/channeltx/modnfm/nfmmodplugin.cpp
+++ b/plugins/channeltx/modnfm/nfmmodplugin.cpp
@@ -23,7 +23,7 @@
const PluginDescriptor NFMModPlugin::m_pluginDescriptor = {
QString("NFM Modulator"),
- QString("3.5.4"),
+ QString("3.7.4"),
QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"),
true,
diff --git a/plugins/channeltx/modwfm/CMakeLists.txt b/plugins/channeltx/modwfm/CMakeLists.txt
index 35c64acb0..8c69d91bb 100644
--- a/plugins/channeltx/modwfm/CMakeLists.txt
+++ b/plugins/channeltx/modwfm/CMakeLists.txt
@@ -4,12 +4,14 @@ set(modwfm_SOURCES
wfmmod.cpp
wfmmodgui.cpp
wfmmodplugin.cpp
+ wfmmodsettings.cpp
)
set(modwfm_HEADERS
wfmmod.h
wfmmodgui.h
wfmmodplugin.h
+ wfmmodsettings.h
)
set(modwfm_FORMS
diff --git a/plugins/channeltx/modwfm/modwfm.pro b/plugins/channeltx/modwfm/modwfm.pro
index c7baadeaa..5f495adc8 100644
--- a/plugins/channeltx/modwfm/modwfm.pro
+++ b/plugins/channeltx/modwfm/modwfm.pro
@@ -25,11 +25,13 @@ CONFIG(Debug):build_subdir = debug
SOURCES += wfmmod.cpp\
wfmmodgui.cpp\
- wfmmodplugin.cpp
+ wfmmodplugin.cpp\
+ wfmmodsettings.cpp
HEADERS += wfmmod.h\
wfmmodgui.h\
- wfmmodplugin.h
+ wfmmodplugin.h\
+ wfmmodsettings.h
FORMS += wfmmodgui.ui
diff --git a/plugins/channeltx/modwfm/wfmmodplugin.cpp b/plugins/channeltx/modwfm/wfmmodplugin.cpp
index e18c82a4d..6788a774f 100644
--- a/plugins/channeltx/modwfm/wfmmodplugin.cpp
+++ b/plugins/channeltx/modwfm/wfmmodplugin.cpp
@@ -23,7 +23,7 @@
const PluginDescriptor WFMModPlugin::m_pluginDescriptor = {
QString("WFM Modulator"),
- QString("3.5.4"),
+ QString("3.7.4"),
QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"),
true,
diff --git a/plugins/channeltx/modwfm/wfmmodsettings.cpp b/plugins/channeltx/modwfm/wfmmodsettings.cpp
new file mode 100644
index 000000000..15f1c8b78
--- /dev/null
+++ b/plugins/channeltx/modwfm/wfmmodsettings.cpp
@@ -0,0 +1,143 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2017 Edouard Griffiths, F4EXB //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include
+#include
+
+#include "dsp/dspengine.h"
+#include "util/simpleserializer.h"
+#include "settings/serializable.h"
+
+#include "wfmmodsettings.h"
+
+const int WFMModSettings::m_rfBW[] = {
+ 12500, 25000, 40000, 60000, 75000, 80000, 100000, 125000, 140000, 160000, 180000, 200000, 220000, 250000
+};
+const int WFMModSettings::m_nbRfBW = 14;
+
+WFMModSettings::WFMModSettings() :
+ m_channelMarker(0),
+ m_cwKeyerGUI(0)
+{
+ resetToDefaults();
+}
+
+void WFMModSettings::resetToDefaults()
+{
+ m_basebandSampleRate = 384000;
+ m_outputSampleRate = 384000;
+ m_inputFrequencyOffset = 0;
+ m_rfBandwidth = 125000.0f;
+ m_afBandwidth = 15000.0f;
+ m_fmDeviation = 50000.0f;
+ m_toneFrequency = 1000.0f;
+ m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
+ m_volumeFactor = 1.0f;
+ m_channelMute = false;
+ m_playLoop = false;
+ m_rgbColor = QColor(0, 0, 255).rgb();
+}
+
+QByteArray WFMModSettings::serialize() const
+{
+ SimpleSerializer s(1);
+
+ s.writeS32(1, m_inputFrequencyOffset);
+ s.writeReal(2, m_rfBandwidth);
+ s.writeReal(3, m_afBandwidth);
+ s.writeReal(4, m_fmDeviation);
+ s.writeU32(5, m_rgbColor);
+ s.writeReal(6, m_toneFrequency);
+ s.writeReal(7, m_volumeFactor);
+
+ if (m_cwKeyerGUI) {
+ s.writeBlob(8, m_cwKeyerGUI->serialize());
+ }
+
+ if (m_channelMarker) {
+ s.writeBlob(9, m_channelMarker->serialize());
+ }
+
+ return s.final();
+}
+
+bool WFMModSettings::deserialize(const QByteArray& data)
+{
+ SimpleDeserializer d(data);
+
+ if(!d.isValid())
+ {
+ resetToDefaults();
+ return false;
+ }
+
+ if(d.getVersion() == 1)
+ {
+ QByteArray bytetmp;
+ qint32 tmp;
+
+ d.readS32(1, &tmp, 0);
+ m_inputFrequencyOffset = tmp;
+ d.readReal(2, &m_rfBandwidth, 125000.0);
+ d.readReal(3, &m_afBandwidth, 15000.0);
+ d.readReal(4, &m_fmDeviation, 50000.0);
+ d.readU32(5, &m_rgbColor);
+ d.readReal(6, &m_toneFrequency, 1000.0);
+ d.readReal(7, &m_volumeFactor, 1.0);
+
+ if (m_cwKeyerGUI) {
+ d.readBlob(8, &bytetmp);
+ m_cwKeyerGUI->deserialize(bytetmp);
+ }
+
+ if (m_channelMarker) {
+ d.readBlob(9, &bytetmp);
+ m_channelMarker->deserialize(bytetmp);
+ }
+
+ return true;
+ }
+ else
+ {
+ qDebug() << "WFMModSettings::deserialize: ERROR";
+ resetToDefaults();
+ return false;
+ }
+}
+
+int WFMModSettings::getRFBW(int index)
+{
+ if (index < 0) {
+ return m_rfBW[0];
+ } else if (index < m_nbRfBW) {
+ return m_rfBW[index];
+ } else {
+ return m_rfBW[m_nbRfBW-1];
+ }
+}
+
+int WFMModSettings::getRFBWIndex(int rfbw)
+{
+ for (int i = 0; i < m_nbRfBW; i++)
+ {
+ if (rfbw <= m_rfBW[i])
+ {
+ return i;
+ }
+ }
+
+ return m_nbRfBW-1;
+}
diff --git a/plugins/channeltx/modwfm/wfmmodsettings.h b/plugins/channeltx/modwfm/wfmmodsettings.h
new file mode 100644
index 000000000..382b2abc6
--- /dev/null
+++ b/plugins/channeltx/modwfm/wfmmodsettings.h
@@ -0,0 +1,58 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2017 Edouard Griffiths, F4EXB //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef PLUGINS_CHANNELTX_MODWFM_WFMMODSETTINGS_H_
+#define PLUGINS_CHANNELTX_MODWFM_WFMMODSETTINGS_H_
+
+#include
+
+class Serializable;
+
+struct WFMModSettings
+{
+ static const int m_nbRfBW;
+ static const int m_rfBW[];
+
+ int m_basebandSampleRate;
+ int m_outputSampleRate;
+ qint64 m_inputFrequencyOffset;
+ Real m_rfBandwidth;
+ Real m_afBandwidth;
+ float m_fmDeviation;
+ float m_toneFrequency;
+ float m_volumeFactor;
+ quint32 m_audioSampleRate;
+ bool m_channelMute;
+ bool m_playLoop;
+ quint32 m_rgbColor;
+
+ Serializable *m_channelMarker;
+ Serializable *m_cwKeyerGUI;
+
+ WFMModSettings();
+ void resetToDefaults();
+ void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
+ void setCWKeyerGUI(Serializable *cwKeyerGUI) { m_cwKeyerGUI = cwKeyerGUI; }
+ QByteArray serialize() const;
+ bool deserialize(const QByteArray& data);
+
+ static int getRFBW(int index);
+ static int getRFBWIndex(int rfbw);
+};
+
+
+
+#endif /* PLUGINS_CHANNELTX_MODWFM_WFMMODSETTINGS_H_ */