diff --git a/doc/img/MainWindow_spectrum_gui.png b/doc/img/MainWindow_spectrum_gui.png
index 18b4da1b7..aa2e13d74 100644
Binary files a/doc/img/MainWindow_spectrum_gui.png and b/doc/img/MainWindow_spectrum_gui.png differ
diff --git a/doc/img/MainWindow_spectrum_gui.xcf b/doc/img/MainWindow_spectrum_gui.xcf
index c0a8f49f1..8eb84edae 100644
Binary files a/doc/img/MainWindow_spectrum_gui.xcf and b/doc/img/MainWindow_spectrum_gui.xcf differ
diff --git a/sdrbase/dsp/spectrumvis.cpp b/sdrbase/dsp/spectrumvis.cpp
index b2292775c..07cb9c531 100644
--- a/sdrbase/dsp/spectrumvis.cpp
+++ b/sdrbase/dsp/spectrumvis.cpp
@@ -43,11 +43,13 @@ MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgConfigureSpectrumVis, Message)
MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgConfigureScalingFactor, Message)
MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgConfigureWSpectrumOpenClose, Message)
MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgConfigureWSpectrum, Message)
+MESSAGE_CLASS_DEFINITION(SpectrumVis::MsgStartStop, Message)
const Real SpectrumVis::m_mult = (10.0f / log2f(10.0f));
SpectrumVis::SpectrumVis(Real scalef) :
BasebandSampleSink(),
+ m_running(true),
m_fft(nullptr),
m_fftEngineSequence(0),
m_fftBuffer(MAX_FFT_SIZE),
@@ -285,8 +287,11 @@ void SpectrumVis::feed(const Complex *begin, unsigned int length)
void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleVector::const_iterator& end, bool positiveOnly)
{
- // if no visualisation is set, send the samples to /dev/null
+ if (!m_running) {
+ return;
+ }
+ // if no visualisation is set, send the samples to /dev/null
if (!m_glSpectrum && !m_wsSpectrum.socketOpened()) {
return;
}
@@ -587,10 +592,12 @@ void SpectrumVis::feed(const SampleVector::const_iterator& cbegin, const SampleV
void SpectrumVis::start()
{
+ m_running = true;
}
void SpectrumVis::stop()
{
+ m_running = false;
}
bool SpectrumVis::handleMessage(const Message& message)
@@ -629,6 +636,17 @@ bool SpectrumVis::handleMessage(const Message& message)
handleConfigureWSSpectrum(conf.getAddress(), conf.getPort());
return true;
}
+ else if (MsgStartStop::match(message)) {
+ MsgStartStop& cmd = (MsgStartStop&) message;
+
+ if (cmd.getStartStop()) {
+ start();
+ } else {
+ stop();
+ }
+
+ return true;
+ }
else
{
return false;
diff --git a/sdrbase/dsp/spectrumvis.h b/sdrbase/dsp/spectrumvis.h
index 78ee22108..fdaa56d9a 100644
--- a/sdrbase/dsp/spectrumvis.h
+++ b/sdrbase/dsp/spectrumvis.h
@@ -88,6 +88,25 @@ public:
{}
};
+ class MsgStartStop : public Message {
+ MESSAGE_CLASS_DECLARATION
+
+ public:
+ bool getStartStop() const { return m_startStop; }
+
+ static MsgStartStop* create(bool startStop) {
+ return new MsgStartStop(startStop);
+ }
+
+ protected:
+ bool m_startStop;
+
+ MsgStartStop(bool startStop) :
+ Message(),
+ m_startStop(startStop)
+ { }
+ };
+
enum AvgMode
{
AvgModeNone,
@@ -157,6 +176,7 @@ private:
uint16_t m_port;
};
+ bool m_running;
FFTEngine* m_fft;
FFTWindow m_window;
unsigned int m_fftEngineSequence;
diff --git a/sdrgui/gui/glspectrum.cpp b/sdrgui/gui/glspectrum.cpp
index b6ca5cdce..e106a3522 100644
--- a/sdrgui/gui/glspectrum.cpp
+++ b/sdrgui/gui/glspectrum.cpp
@@ -1988,6 +1988,8 @@ void GLSpectrum::mousePressEvent(QMouseEvent* event)
if ((m_waterfallMarkers.size() > 0) && (pWat.x() >= 0) && (pWat.x() <= 1) && (pWat.y() >= 0) && (pWat.y() <= 1)) {
m_waterfallMarkers.pop_back();
}
+
+ update();
}
else if (event->button() == Qt::LeftButton)
{
@@ -2076,6 +2078,8 @@ void GLSpectrum::mousePressEvent(QMouseEvent* event)
}
}
}
+
+ update();
}
if (m_cursorState == CSSplitter)
diff --git a/sdrgui/gui/glspectrumgui.cpp b/sdrgui/gui/glspectrumgui.cpp
index 3997c29c3..8ae138c30 100644
--- a/sdrgui/gui/glspectrumgui.cpp
+++ b/sdrgui/gui/glspectrumgui.cpp
@@ -350,6 +350,12 @@ void GLSpectrumGUI::on_clearSpectrum_clicked(bool checked)
}
}
+void GLSpectrumGUI::on_freeze_toggled(bool checked)
+{
+ SpectrumVis::MsgStartStop *msg = SpectrumVis::MsgStartStop::create(!checked);
+ m_spectrumVis->getInputMessageQueue()->push(msg);
+}
+
int GLSpectrumGUI::getAveragingMaxScale(GLSpectrumSettings::AveragingMode averagingMode)
{
if (averagingMode == GLSpectrumSettings::AvgModeMoving) {
diff --git a/sdrgui/gui/glspectrumgui.h b/sdrgui/gui/glspectrumgui.h
index 9d324b287..41309ef89 100644
--- a/sdrgui/gui/glspectrumgui.h
+++ b/sdrgui/gui/glspectrumgui.h
@@ -103,6 +103,7 @@ private slots:
void on_invertWaterfall_toggled(bool checked);
void on_grid_toggled(bool checked);
void on_clearSpectrum_clicked(bool checked);
+ void on_freeze_toggled(bool checked);
void handleInputMessages();
void openWebsocketSpectrumSettingsDialog(const QPoint& p);
diff --git a/sdrgui/gui/glspectrumgui.ui b/sdrgui/gui/glspectrumgui.ui
index 08b5b9857..52e042188 100644
--- a/sdrgui/gui/glspectrumgui.ui
+++ b/sdrgui/gui/glspectrumgui.ui
@@ -312,24 +312,26 @@
-
-
-
- Qt::Horizontal
+
+
+ Play/Pause spectrum display
-
-
- 40
- 20
-
+
+
+ :/pause.png
+ :/play.png:/pause.png
-
+
+ true
+
+
-
- 2
+ 3
-
diff --git a/sdrgui/readme.md b/sdrgui/readme.md
index 5db2489d1..2f1e07d7c 100644
--- a/sdrgui/readme.md
+++ b/sdrgui/readme.md
@@ -453,7 +453,11 @@ Use this toggle button to switch between spectrum logarithmic and linear scale d
When in linear mode the range control (4.4) has no effect because the actual range is between 0 and the reference level. The reference level in dB (4.3) still applies but is translated to a linear value e.g -40 dB is 1e-4. In linear mode the scale numbers are formatted using scientific notation so that they always occupy the same space.
-
4.K. Spectrum server control
+4.K. Spectrum live display pause/resume (freeze)
+
+Use this control to pause or resume spectrum live display. You can use this control to freeze the spectrum display. This may be useful to make measurements using the markers (see section 7).
+
+4.L. Spectrum server control
A websockets based server can be used to send spectrum data to clients. An example of such client can be found in the [SDRangelSpectrum](https://github.com/f4exb/sdrangelspectrum) project.