diff --git a/plugins/channeltx/modssb/CMakeLists.txt b/plugins/channeltx/modssb/CMakeLists.txt
index ed5e4f80c..74df7ef54 100644
--- a/plugins/channeltx/modssb/CMakeLists.txt
+++ b/plugins/channeltx/modssb/CMakeLists.txt
@@ -4,12 +4,14 @@ set(modssb_SOURCES
ssbmod.cpp
ssbmodgui.cpp
ssbmodplugin.cpp
+ ssbmodsettings.cpp
)
set(modssb_HEADERS
ssbmod.h
ssbmodgui.h
ssbmodplugin.h
+ ssbmodsettings.h
)
set(modssb_FORMS
diff --git a/plugins/channeltx/modssb/modssb.pro b/plugins/channeltx/modssb/modssb.pro
index dcb803594..6b928a460 100644
--- a/plugins/channeltx/modssb/modssb.pro
+++ b/plugins/channeltx/modssb/modssb.pro
@@ -25,11 +25,13 @@ CONFIG(Debug):build_subdir = debug
SOURCES += ssbmod.cpp\
ssbmodgui.cpp\
- ssbmodplugin.cpp
+ ssbmodplugin.cpp\
+ ssbmodsettings.cpp
HEADERS += ssbmod.h\
ssbmodgui.h\
- ssbmodplugin.h
+ ssbmodplugin.h\
+ ssbmodsettings.h
FORMS += ssbmodgui.ui
diff --git a/plugins/channeltx/modssb/ssbmodsettings.cpp b/plugins/channeltx/modssb/ssbmodsettings.cpp
new file mode 100644
index 000000000..bda61c263
--- /dev/null
+++ b/plugins/channeltx/modssb/ssbmodsettings.cpp
@@ -0,0 +1,198 @@
+///////////////////////////////////////////////////////////////////////////////////
+// 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 "dsp/dspengine.h"
+#include "util/simpleserializer.h"
+#include "settings/serializable.h"
+#include "ssbmodsettings.h"
+
+const int SSBModSettings::m_agcTimeConstant[] = {
+ 1,
+ 2,
+ 5,
+ 10,
+ 20,
+ 50,
+ 100,
+ 200,
+ 500,
+ 990};
+
+const int SSBModSettings::m_nbAGCTimeConstants = 10;
+
+SSBModSettings::SSBModSettings() :
+ m_channelMarker(0),
+ m_spectrumGUI(0),
+ m_cwKeyerGUI(0)
+{
+ resetToDefaults();
+}
+
+void SSBModSettings::resetToDefaults()
+{
+ m_basebandSampleRate = 48000;
+ m_outputSampleRate = 48000;
+ m_inputFrequencyOffset = 0;
+ m_bandwidth = 3000.0;
+ m_lowCutoff = 300.0;
+ m_usb = true;
+ m_toneFrequency = 1000.0;
+ m_volumeFactor = 1.0;
+ m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate();
+ m_spanLog2 = 3;
+ m_audioBinaural = false;
+ m_audioFlipChannels = false;
+ m_dsb = false;
+ m_audioMute = false;
+ m_playLoop = false;
+ m_agc = false;
+ m_agcOrder = 0.2;
+ m_agcTime = 9600;
+ m_agcThresholdEnable = true;
+ m_agcThreshold = -40; // dB
+ m_agcThresholdGate = 192;
+ m_agcThresholdDelay = 2400;
+ m_rgbColor = QColor(0, 255, 0).rgb();
+ m_udpAddress = "127.0.0.1";
+ m_udpPort = 9999;
+}
+
+QByteArray SSBModSettings::serialize() const
+{
+ SimpleSerializer s(1);
+
+ s.writeS32(1, m_inputFrequencyOffset);
+ s.writeS32(2, roundf(m_bandwidth / 100.0));
+ s.writeS32(3, roundf(m_toneFrequency / 10.0));
+
+ if (m_spectrumGUI) {
+ s.writeBlob(4, m_spectrumGUI->serialize());
+ }
+
+ s.writeU32(5, m_rgbColor);
+
+ if (m_cwKeyerGUI) {
+ s.writeBlob(6, m_cwKeyerGUI->serialize());
+ }
+
+ s.writeS32(7, roundf(m_lowCutoff / 100.0));
+ s.writeS32(8, m_spanLog2);
+ s.writeBool(9, m_audioBinaural);
+ s.writeBool(10, m_audioFlipChannels);
+ s.writeBool(11, m_dsb);
+ s.writeBool(12, m_agc);
+ s.writeS32(13, getAGCTimeConstantIndex(m_agcTime/48));
+ s.writeS32(14, m_agcThreshold); // dB
+ s.writeS32(15, m_agcThresholdGate / 48);
+ s.writeS32(16, m_agcThresholdDelay / 48);
+ s.writeS32(17, roundf(m_agcOrder * 100.0));
+
+ if (m_channelMarker) {
+ s.writeBlob(18, m_channelMarker->serialize());
+ }
+
+ return s.final();
+}
+
+bool SSBModSettings::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.readS32(2, &tmp, 30);
+ m_bandwidth = tmp * 100.0;
+
+ d.readS32(3, &tmp, 100);
+ m_toneFrequency = tmp * 10.0;
+
+ if (m_spectrumGUI)
+ {
+ d.readBlob(4, &bytetmp);
+ m_spectrumGUI->deserialize(bytetmp);
+ }
+
+ d.readU32(5, &m_rgbColor);
+
+ if (m_cwKeyerGUI) {
+ d.readBlob(6, &bytetmp);
+ m_cwKeyerGUI->deserialize(bytetmp);
+ }
+
+ d.readS32(7, &tmp, 3);
+ m_lowCutoff = tmp * 100.0;
+
+ d.readS32(8, &m_spanLog2, 3);
+ d.readBool(9, &m_audioBinaural, false);
+ d.readBool(10, &m_audioFlipChannels, false);
+ d.readBool(11, &m_dsb, false);
+ d.readBool(12, &m_agc, false);
+ d.readS32(13, &tmp, 7);
+ m_agcTime = getAGCTimeConstant(tmp) * 48;
+ d.readS32(14, &m_agcThreshold, -40);
+ d.readS32(15, &tmp, 4);
+ m_agcThresholdGate = tmp * 48;
+ d.readS32(16, &tmp, 5);
+ m_agcThresholdDelay = tmp * 48;
+ d.readS32(17, &tmp, 20);
+ m_agcOrder = tmp / 100.0;
+
+ return true;
+ }
+ else
+ {
+ resetToDefaults();
+ return false;
+ }
+}
+
+int SSBModSettings::getAGCTimeConstant(int index)
+{
+ if (index < 0) {
+ return m_agcTimeConstant[0];
+ } else if (index < m_nbAGCTimeConstants) {
+ return m_agcTimeConstant[index];
+ } else {
+ return m_agcTimeConstant[m_nbAGCTimeConstants-1];
+ }
+}
+
+int SSBModSettings::getAGCTimeConstantIndex(int agcTimeConstant)
+{
+ for (int i = 0; i < m_nbAGCTimeConstants; i++)
+ {
+ if (agcTimeConstant <= m_agcTimeConstant[i])
+ {
+ return i;
+ }
+ }
+
+ return m_nbAGCTimeConstants-1;
+}
diff --git a/plugins/channeltx/modssb/ssbmodsettings.h b/plugins/channeltx/modssb/ssbmodsettings.h
new file mode 100644
index 000000000..598669654
--- /dev/null
+++ b/plugins/channeltx/modssb/ssbmodsettings.h
@@ -0,0 +1,74 @@
+///////////////////////////////////////////////////////////////////////////////////
+// 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_MODSSB_SSBMODSETTINGS_H_
+#define PLUGINS_CHANNELTX_MODSSB_SSBMODSETTINGS_H_
+
+#include
+#include
+#include
+
+struct Serializable;
+
+struct SSBModSettings
+{
+ static const int m_nbAGCTimeConstants;
+ static const int m_agcTimeConstant[];
+
+ int m_basebandSampleRate;
+ int m_outputSampleRate;
+ qint64 m_inputFrequencyOffset;
+ Real m_bandwidth;
+ Real m_lowCutoff;
+ bool m_usb;
+ float m_toneFrequency;
+ float m_volumeFactor;
+ quint32 m_audioSampleRate;
+ int m_spanLog2;
+ bool m_audioBinaural;
+ bool m_audioFlipChannels;
+ bool m_dsb;
+ bool m_audioMute;
+ bool m_playLoop;
+ bool m_agc;
+ float m_agcOrder;
+ int m_agcTime;
+ bool m_agcThresholdEnable;
+ int m_agcThreshold;
+ int m_agcThresholdGate;
+ int m_agcThresholdDelay;
+ quint32 m_rgbColor;
+
+ QString m_udpAddress;
+ uint16_t m_udpPort;
+
+ Serializable *m_channelMarker;
+ Serializable *m_spectrumGUI;
+ Serializable *m_cwKeyerGUI;
+
+ SSBModSettings();
+ void resetToDefaults();
+ void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; }
+ void setSpectrumGUI(Serializable *spectrumGUI) { m_spectrumGUI = spectrumGUI; }
+ QByteArray serialize() const;
+ bool deserialize(const QByteArray& data);
+
+ static int getAGCTimeConstant(int index);
+ static int getAGCTimeConstantIndex(int agcTimeConstant);
+};
+
+
+#endif /* PLUGINS_CHANNELTX_MODSSB_SSBMODSETTINGS_H_ */