From c2544b528ef55c712a5e458f9cf53dec29f5eb14 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 13 Mar 2018 01:39:43 +0100 Subject: [PATCH] DSD demod: GUI scope simplification (6) --- plugins/channelrx/demoddsd/dsddemodgui.cpp | 23 +++ plugins/channelrx/demoddsd/dsddemodgui.h | 2 + plugins/channelrx/demoddsd/dsddemodgui.ui | 156 +++++++++++++----- .../channelrx/demoddsd/dsddemodsettings.cpp | 12 +- plugins/channelrx/demoddsd/dsddemodsettings.h | 2 + sdrgui/dsp/scopevisxy.cpp | 23 ++- sdrgui/dsp/scopevisxy.h | 11 +- sdrgui/gui/glshadertvarray.cpp | 25 ++- sdrgui/gui/glshadertvarray.h | 5 + sdrgui/gui/tvscreen.cpp | 5 + sdrgui/gui/tvscreen.h | 5 +- 11 files changed, 216 insertions(+), 53 deletions(-) diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index 166e039a9..7d658f146 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -169,6 +169,20 @@ void DSDDemodGUI::on_traceLength_valueChanged(int value) m_scopeVisXY->setPixelsPerFrame(m_settings.m_traceLengthMutliplier*960); // 48000 / 50. Chunks of 50 ms. } +void DSDDemodGUI::on_traceStroke_valueChanged(int value) +{ + m_settings.m_traceStroke = value; + ui->traceStrokeText->setText(QString("%1").arg(m_settings.m_traceStroke)); + m_scopeVisXY->setStroke(m_settings.m_traceStroke); +} + +void DSDDemodGUI::on_traceDecay_valueChanged(int value) +{ + m_settings.m_traceDecay = value; + ui->traceDecayText->setText(QString("%1").arg(m_settings.m_traceDecay)); + m_scopeVisXY->setDecay(m_settings.m_traceDecay); +} + void DSDDemodGUI::on_slot1On_toggled(bool checked) { m_settings.m_slot1On = checked; @@ -419,10 +433,19 @@ void DSDDemodGUI::displaySettings() } ui->baudRate->setCurrentIndex(DSDDemodBaudRates::getRateIndex(m_settings.m_baudRate)); + ui->traceLength->setValue(m_settings.m_traceLengthMutliplier); ui->traceLengthText->setText(QString("%1").arg(m_settings.m_traceLengthMutliplier*50)); m_scopeVisXY->setPixelsPerFrame(m_settings.m_traceLengthMutliplier*960); // 48000 / 50. Chunks of 50 ms. + ui->traceStroke->setValue(m_settings.m_traceStroke); + ui->traceStrokeText->setText(QString("%1").arg(m_settings.m_traceStroke)); + m_scopeVisXY->setStroke(m_settings.m_traceStroke); + + ui->traceDecay->setValue(m_settings.m_traceDecay); + ui->traceDecayText->setText(QString("%1").arg(m_settings.m_traceDecay)); + m_scopeVisXY->setDecay(m_settings.m_traceDecay); + blockApplySettings(false); } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index 4a739ec6f..93b4f2db2 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -120,6 +120,8 @@ private slots: void on_enableCosineFiltering_toggled(bool enable); void on_syncOrConstellation_toggled(bool checked); void on_traceLength_valueChanged(int value); + void on_traceStroke_valueChanged(int value); + void on_traceDecay_valueChanged(int value); void on_slot1On_toggled(bool checked); void on_slot2On_toggled(bool checked); void on_tdmaStereoSplit_toggled(bool checked); diff --git a/plugins/channelrx/demoddsd/dsddemodgui.ui b/plugins/channelrx/demoddsd/dsddemodgui.ui index aa0e91f2b..a37a7064a 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.ui +++ b/plugins/channelrx/demoddsd/dsddemodgui.ui @@ -62,16 +62,7 @@ 3 - - 2 - - - 2 - - - 2 - - + 2 @@ -566,16 +557,7 @@ Digital - - 2 - - - 2 - - - 2 - - + 2 @@ -692,7 +674,7 @@ - 200 + 230 10 23 22 @@ -769,8 +751,8 @@ - 80 - 40 + 200 + 10 23 22 @@ -789,7 +771,7 @@ - 110 + 80 40 25 28 @@ -814,7 +796,7 @@ - 150 + 110 40 25 28 @@ -865,7 +847,7 @@ 50 107 - 115 + 151 16 @@ -901,7 +883,7 @@ - 180 + 210 100 40 29 @@ -938,7 +920,7 @@ 50 137 - 115 + 151 16 @@ -970,8 +952,8 @@ - 140 - 70 + 170 + 40 23 22 @@ -994,8 +976,8 @@ - 170 - 70 + 200 + 40 23 22 @@ -1018,8 +1000,8 @@ - 200 - 70 + 230 + 40 23 22 @@ -1058,7 +1040,7 @@ Display trace length (ms) - 1 + 6 30 @@ -1067,7 +1049,7 @@ 1 - 5 + 6 @@ -1092,7 +1074,7 @@ - 180 + 210 130 40 29 @@ -1111,6 +1093,106 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + 110 + 70 + 24 + 24 + + + + + 24 + 24 + + + + Trace stroke [0..255] + + + 0 + + + 255 + + + 1 + + + 100 + + + + + + 130 + 73 + 31 + 16 + + + + Trace stroke value + + + 000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 170 + 70 + 24 + 24 + + + + + 24 + 24 + + + + Trace decay [0..255] + + + 0 + + + 255 + + + 1 + + + 200 + + + + + + 190 + 73 + 31 + 16 + + + + Trace decay value + + + 000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.cpp b/plugins/channelrx/demoddsd/dsddemodsettings.cpp index 335c38654..523626644 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsettings.cpp @@ -53,7 +53,9 @@ void DSDDemodSettings::resetToDefaults() m_rgbColor = QColor(0, 255, 255).rgb(); m_title = "DSD Demodulator"; m_highPassFilter = false; - m_traceLengthMutliplier = 5; // 250 ms + m_traceLengthMutliplier = 6; // 300 ms + m_traceStroke = 100; + m_traceDecay = 200; } QByteArray DSDDemodSettings::serialize() const @@ -87,6 +89,8 @@ QByteArray DSDDemodSettings::serialize() const s.writeBool(19, m_highPassFilter); s.writeBool(20, m_copyAudioUseRTP); s.writeS32(21, m_traceLengthMutliplier); + s.writeS32(22, m_traceStroke); + s.writeS32(23, m_traceDecay); return s.final(); } @@ -142,7 +146,11 @@ bool DSDDemodSettings::deserialize(const QByteArray& data) d.readBool(19, &m_highPassFilter, false); d.readBool(20, &m_copyAudioUseRTP, false); d.readS32(21, &tmp, 5); - m_traceLengthMutliplier = tmp < 1 ? 1 : tmp > 30 ? 30 : tmp; + m_traceLengthMutliplier = tmp < 2 ? 2 : tmp > 30 ? 30 : tmp; + d.readS32(22, &tmp, 100); + m_traceStroke = tmp < 0 ? 0 : tmp > 255 ? 255 : tmp; + d.readS32(23, &tmp, 200); + m_traceDecay = tmp < 0 ? 0 : tmp > 255 ? 255 : tmp; return true; } diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.h b/plugins/channelrx/demoddsd/dsddemodsettings.h index 26093c700..502858ce5 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.h +++ b/plugins/channelrx/demoddsd/dsddemodsettings.h @@ -47,6 +47,8 @@ struct DSDDemodSettings QString m_title; bool m_highPassFilter; int m_traceLengthMutliplier; // x 50ms + int m_traceStroke; // [0..255] + int m_traceDecay; // [0..255] Serializable *m_channelMarker; Serializable *m_scopeGUI; diff --git a/sdrgui/dsp/scopevisxy.cpp b/sdrgui/dsp/scopevisxy.cpp index e856f2608..1a237f32a 100644 --- a/sdrgui/dsp/scopevisxy.cpp +++ b/sdrgui/dsp/scopevisxy.cpp @@ -26,14 +26,26 @@ ScopeVisXY::ScopeVisXY(TVScreen *tvScreen) : m_rows(0), m_pixelsPerFrame(480), m_pixelCount(0), + m_alphaTrace(128), + m_alphaReset(128), m_plotRGB(qRgb(0, 255, 0)), m_gridRGB(qRgb(255, 255 ,255)) { setObjectName("ScopeVisXY"); + setPixelsPerFrame(m_pixelsPerFrame); + m_tvScreen->setAlphaBlend(true); } ScopeVisXY::~ScopeVisXY() -{} +{ +} + +void ScopeVisXY::setPixelsPerFrame(int pixelsPerFrame) +{ + m_pixelsPerFrame = pixelsPerFrame; + m_pixelCount = 0; + m_tvScreen->setAlphaReset(); +} void ScopeVisXY::feed(const SampleVector::const_iterator& cbegin, const SampleVector::const_iterator& end, bool positiveOnly __attribute__((unused))) @@ -52,20 +64,21 @@ void ScopeVisXY::feed(const SampleVector::const_iterator& cbegin, const SampleVe col = col < 0 ? 0 : col >= m_cols ? m_cols-1 : col; m_tvScreen->selectRow(row); - m_tvScreen->setDataColor(col, qRed(m_plotRGB), qGreen(m_plotRGB), qBlue(m_plotRGB), 128); // FIXME: alpha does not work + m_tvScreen->setDataColor(col, qRed(m_plotRGB), qGreen(m_plotRGB), qBlue(m_plotRGB), m_alphaTrace); + + ++begin; m_pixelCount++; if (m_pixelCount == m_pixelsPerFrame) { drawGraticule(); m_tvScreen->renderImage(0); - usleep(50000); + usleep(5000); m_tvScreen->getSize(m_cols, m_rows); - m_tvScreen->resetImage(); + m_tvScreen->resetImage(m_alphaReset); m_pixelCount = 0; } - ++begin; } } diff --git a/sdrgui/dsp/scopevisxy.h b/sdrgui/dsp/scopevisxy.h index e9b22f001..4eedf3860 100644 --- a/sdrgui/dsp/scopevisxy.h +++ b/sdrgui/dsp/scopevisxy.h @@ -39,11 +39,10 @@ public: virtual bool handleMessage(const Message& message); void setScale(float scale) { m_scale = scale; } - - void setPixelsPerFrame(int pixelsPerFrame) { - m_pixelsPerFrame = pixelsPerFrame; - m_pixelCount = 0; - } + void setStroke(int stroke) { m_alphaTrace = stroke; } + void setDecay(int decay) { m_alphaReset = 255 - decay; } + + void setPixelsPerFrame(int pixelsPerFrame); void setPlotRGB(const QRgb& plotRGB) { m_plotRGB = plotRGB; } void setGridRGB(const QRgb& gridRGB) { m_gridRGB = gridRGB; } @@ -59,6 +58,8 @@ private: int m_rows; int m_pixelsPerFrame; int m_pixelCount; + int m_alphaTrace; //!< this is the stroke value [0:255] + int m_alphaReset; //!< alpha channel of screen blanking (blackening) is 255 minus decay value [0:255] QRgb m_plotRGB; QRgb m_gridRGB; std::vector > m_graticule; diff --git a/sdrgui/gui/glshadertvarray.cpp b/sdrgui/gui/glshadertvarray.cpp index 22edc0ed5..0e8cd1a5b 100644 --- a/sdrgui/gui/glshadertvarray.cpp +++ b/sdrgui/gui/glshadertvarray.cpp @@ -36,6 +36,8 @@ const QString GLShaderTVArray::m_strFragmentShaderSourceColored = QString( GLShaderTVArray::GLShaderTVArray(bool blnColor) : m_blnColor(blnColor) { + m_blnAlphaBlend = false; + m_blnAlphaReset = false; m_objProgram = 0; m_objImage = 0; m_objTexture = 0; @@ -209,9 +211,18 @@ void GLShaderTVArray::RenderPixels(unsigned char *chrData) m_objProgram->setUniformValue(m_objMatrixLoc, objQMatrix); m_objProgram->setUniformValue(m_objTextureLoc, 0); - ptrF->glClear(GL_COLOR_BUFFER_BIT); - ptrF->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - ptrF->glEnable(GL_BLEND); + + if (m_blnAlphaReset) { + ptrF->glClear(GL_COLOR_BUFFER_BIT); + m_blnAlphaReset = false; + } + + if (m_blnAlphaBlend) { + ptrF->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + ptrF->glEnable(GL_BLEND); + } else { + ptrF->glDisable(GL_BLEND); + } m_objTexture->bind(); @@ -244,6 +255,14 @@ void GLShaderTVArray::ResetPixels() } } +void GLShaderTVArray::ResetPixels(int alpha) +{ + if (m_objImage != 0) + { + m_objImage->fill(qRgba(0, 0, 0, alpha)); + } +} + void GLShaderTVArray::Cleanup() { m_blnInitialized = false; diff --git a/sdrgui/gui/glshadertvarray.h b/sdrgui/gui/glshadertvarray.h index 706401b53..5c5044743 100644 --- a/sdrgui/gui/glshadertvarray.h +++ b/sdrgui/gui/glshadertvarray.h @@ -43,6 +43,8 @@ public: ~GLShaderTVArray(); void setColor(bool blnColor) { m_blnColor = blnColor; } + void setAlphaBlend(bool blnAlphaBlend) { m_blnAlphaBlend = blnAlphaBlend; } + void setAlphaReset() { m_blnAlphaReset = true; } void InitializeGL(int intCols, int intRows); void ResizeContainer(int intCols, int intRows); void getSize(int& intCols, int& intRows) const { intCols = m_intCols, intRows = m_intRows; } @@ -50,6 +52,7 @@ public: QRgb *GetRowBuffer(int intRow); void RenderPixels(unsigned char *chrData); void ResetPixels(); + void ResetPixels(int alpha); bool SelectRow(int intLine); bool SetDataColor(int intCol,QRgb objColor); @@ -74,6 +77,8 @@ protected: bool m_blnInitialized; bool m_blnColor; + bool m_blnAlphaBlend; + bool m_blnAlphaReset; }; #endif /* INCLUDE_GUI_GLTVSHADERARRAY_H_ */ diff --git a/sdrgui/gui/tvscreen.cpp b/sdrgui/gui/tvscreen.cpp index d00c17824..b41d471b0 100644 --- a/sdrgui/gui/tvscreen.cpp +++ b/sdrgui/gui/tvscreen.cpp @@ -81,6 +81,11 @@ void TVScreen::resetImage() m_objGLShaderArray.ResetPixels(); } +void TVScreen::resetImage(int alpha) +{ + m_objGLShaderArray.ResetPixels(alpha); +} + void TVScreen::resizeTVScreen(int intCols, int intRows) { m_intAskedCols = intCols; diff --git a/sdrgui/gui/tvscreen.h b/sdrgui/gui/tvscreen.h index 1a3926990..f100b9e66 100644 --- a/sdrgui/gui/tvscreen.h +++ b/sdrgui/gui/tvscreen.h @@ -42,7 +42,7 @@ class TVScreen: public QGLWidget public: TVScreen(bool blnColor, QWidget* parent = 0); - ~TVScreen(); + virtual ~TVScreen(); void setColor(bool blnColor); void resizeTVScreen(int intCols, int intRows); @@ -50,11 +50,14 @@ public: void renderImage(unsigned char * objData); QRgb* getRowBuffer(int intRow); void resetImage(); + void resetImage(int alpha); bool selectRow(int intLine); bool setDataColor(int intCol, int intRed, int intGreen, int intBlue); bool setDataColor(int intCol, int intRed, int intGreen, int intBlue, int intAlpha); void setRenderImmediate(bool blnRenderImmediate) { m_blnRenderImmediate = blnRenderImmediate; } + void setAlphaBlend(bool blnAlphaBlend) { m_objGLShaderArray.setAlphaBlend(blnAlphaBlend); } + void setAlphaReset() { m_objGLShaderArray.setAlphaReset(); } void connectTimer(const QTimer& timer);