diff --git a/plugins/samplesource/testsource/testsourcegui.ui b/plugins/samplesource/testsource/testsourcegui.ui
index 31f2bbd58..90fb1f795 100644
--- a/plugins/samplesource/testsource/testsourcegui.ui
+++ b/plugins/samplesource/testsource/testsourcegui.ui
@@ -480,6 +480,11 @@
FM
+ -
+
+ Pul
+
+
-
diff --git a/plugins/samplesource/testsource/testsourceplugin.cpp b/plugins/samplesource/testsource/testsourceplugin.cpp
index ac8dc459d..ad19169ad 100644
--- a/plugins/samplesource/testsource/testsourceplugin.cpp
+++ b/plugins/samplesource/testsource/testsourceplugin.cpp
@@ -29,7 +29,7 @@
const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = {
QString("Test Source input"),
- QString("4.1.0"),
+ QString("4.2.4"),
QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"),
true,
diff --git a/plugins/samplesource/testsource/testsourcesettings.h b/plugins/samplesource/testsource/testsourcesettings.h
index 6d39c22cf..37dd52797 100644
--- a/plugins/samplesource/testsource/testsourcesettings.h
+++ b/plugins/samplesource/testsource/testsourcesettings.h
@@ -37,6 +37,7 @@ struct TestSourceSettings {
ModulationNone,
ModulationAM,
ModulationFM,
+ ModulationPulse,
ModulationLast
} Modulation;
diff --git a/plugins/samplesource/testsource/testsourcethread.cpp b/plugins/samplesource/testsource/testsourcethread.cpp
index 361a9a04c..432a5aa12 100644
--- a/plugins/samplesource/testsource/testsourcethread.cpp
+++ b/plugins/samplesource/testsource/testsourcethread.cpp
@@ -38,6 +38,11 @@ TestSourceThread::TestSourceThread(SampleSinkFifo* sampleFifo, QObject* parent)
m_amModulation(0.5f),
m_fmDeviationUnit(0.0f),
m_fmPhasor(0.0f),
+ m_pulseWidth(150),
+ m_pulseSampleCount(0),
+ m_pulsePatternCount(0),
+ m_pulsePatternCycle(8),
+ m_pulsePatternPlaces(3),
m_samplerate(48000),
m_log2Decim(4),
m_fcPos(0),
@@ -262,6 +267,48 @@ void TestSourceThread::generate(quint32 chunksize)
m_buf[i++] = (int16_t) (im * (float) m_amplitudeBitsQ);
}
break;
+ case TestSourceSettings::ModulationPulse:
+ {
+ if (m_pulseSampleCount < m_pulseWidth) // sync pattern: 0
+ {
+ m_buf[i++] = m_amplitudeBitsDC;
+ m_buf[i++] = 0;
+ }
+ else if (m_pulseSampleCount < 2*m_pulseWidth) // sync pattern: 1
+ {
+ m_buf[i++] = (int16_t) (m_amplitudeBitsI + m_amplitudeBitsDC);
+ m_buf[i++] = (int16_t) (m_phaseImbalance * (float) m_amplitudeBitsQ);
+ }
+ else if (m_pulseSampleCount < 3*m_pulseWidth) // sync pattern: 0
+ {
+ m_buf[i++] = m_amplitudeBitsDC;
+ m_buf[i++] = 0;
+ }
+ else if (m_pulseSampleCount < (3+m_pulsePatternPlaces)*m_pulseWidth) // binary pattern
+ {
+ uint32_t patPulseSampleCount = m_pulseSampleCount - 3*m_pulseWidth;
+ uint32_t patPulseIndex = patPulseSampleCount / m_pulseWidth;
+ float patFigure = (m_pulsePatternCount & (1<