From dc5f1397b6f2ec40b5dfea640a790e78247e9584 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 12 Mar 2018 20:39:16 +0100 Subject: [PATCH] DSD demod: GUI scope simplification (5) --- plugins/channelrx/demoddsd/dsddemod.cpp | 2 +- plugins/channelrx/demoddsd/dsddemodgui.cpp | 10 ++ plugins/channelrx/demoddsd/dsddemodgui.h | 1 + plugins/channelrx/demoddsd/dsddemodgui.ui | 134 +++++++++++++----- .../channelrx/demoddsd/dsddemodsettings.cpp | 4 + plugins/channelrx/demoddsd/dsddemodsettings.h | 1 + sdrgui/dsp/scopevisxy.cpp | 4 +- sdrgui/dsp/scopevisxy.h | 6 +- sdrgui/gui/glshadertvarray.cpp | 6 +- sdrgui/gui/glshadertvarray.h | 2 +- sdrgui/gui/tvscreen.cpp | 12 ++ sdrgui/gui/tvscreen.h | 3 +- 12 files changed, 144 insertions(+), 41 deletions(-) diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index e3eecc3e9..cea17c719 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -206,7 +206,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if (m_settings.m_syncOrConstellation) { - Sample s(sample, m_dsdDecoder.getSymbolSyncSample() * m_scaleFromShort); + Sample s(sample, m_dsdDecoder.getSymbolSyncSample() * m_scaleFromShort * 0.84); m_scopeSampleBuffer.push_back(s); } else diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index a509e3201..166e039a9 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -162,6 +162,13 @@ void DSDDemodGUI::on_syncOrConstellation_toggled(bool checked) applySettings(); } +void DSDDemodGUI::on_traceLength_valueChanged(int value) +{ + m_settings.m_traceLengthMutliplier = value; + 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. +} + void DSDDemodGUI::on_slot1On_toggled(bool checked) { m_settings.m_slot1On = checked; @@ -412,6 +419,9 @@ 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. blockApplySettings(false); } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index ea2669e6f..4a739ec6f 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -119,6 +119,7 @@ private slots: void on_baudRate_currentIndexChanged(int index); void on_enableCosineFiltering_toggled(bool enable); void on_syncOrConstellation_toggled(bool checked); + void on_traceLength_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 3c8758fb0..aa0e91f2b 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.ui +++ b/plugins/channelrx/demoddsd/dsddemodgui.ui @@ -62,7 +62,16 @@ 3 - + + 2 + + + 2 + + + 2 + + 2 @@ -158,15 +167,15 @@ - + - 35 + 40 0 - 0.00 + 00.0k Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -554,10 +563,19 @@ - Discriminator Scope + Digital - + + 2 + + + 2 + + + 2 + + 2 @@ -846,7 +864,7 @@ 50 - 105 + 107 115 16 @@ -919,7 +937,7 @@ 50 - 135 + 137 115 16 @@ -949,32 +967,10 @@ Qt::Horizontal - - - - 180 - 130 - 40 - 30 - - - - - 40 - 0 - - - - 00.0k - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 40 + 140 70 23 22 @@ -998,7 +994,7 @@ - 70 + 170 70 23 22 @@ -1022,7 +1018,7 @@ - 100 + 200 70 23 22 @@ -1043,6 +1039,78 @@ true + + + + 40 + 68 + 24 + 24 + + + + + 24 + 24 + + + + Display trace length (ms) + + + 1 + + + 30 + + + 1 + + + 5 + + + + + + 70 + 73 + 31 + 16 + + + + Display trace length (ms) + + + 0000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 180 + 130 + 40 + 29 + + + + + 35 + 0 + + + + 0.00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.cpp b/plugins/channelrx/demoddsd/dsddemodsettings.cpp index bd0d23c91..335c38654 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsettings.cpp @@ -53,6 +53,7 @@ void DSDDemodSettings::resetToDefaults() m_rgbColor = QColor(0, 255, 255).rgb(); m_title = "DSD Demodulator"; m_highPassFilter = false; + m_traceLengthMutliplier = 5; // 250 ms } QByteArray DSDDemodSettings::serialize() const @@ -85,6 +86,7 @@ QByteArray DSDDemodSettings::serialize() const s.writeString(18, m_title); s.writeBool(19, m_highPassFilter); s.writeBool(20, m_copyAudioUseRTP); + s.writeS32(21, m_traceLengthMutliplier); return s.final(); } @@ -139,6 +141,8 @@ bool DSDDemodSettings::deserialize(const QByteArray& data) d.readString(18, &m_title, "DSD Demodulator"); 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; return true; } diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.h b/plugins/channelrx/demoddsd/dsddemodsettings.h index 58cb08c65..26093c700 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.h +++ b/plugins/channelrx/demoddsd/dsddemodsettings.h @@ -46,6 +46,7 @@ struct DSDDemodSettings quint32 m_rgbColor; QString m_title; bool m_highPassFilter; + int m_traceLengthMutliplier; // x 50ms Serializable *m_channelMarker; Serializable *m_scopeGUI; diff --git a/sdrgui/dsp/scopevisxy.cpp b/sdrgui/dsp/scopevisxy.cpp index 2758417e5..e856f2608 100644 --- a/sdrgui/dsp/scopevisxy.cpp +++ b/sdrgui/dsp/scopevisxy.cpp @@ -52,14 +52,14 @@ 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)); + m_tvScreen->setDataColor(col, qRed(m_plotRGB), qGreen(m_plotRGB), qBlue(m_plotRGB), 128); // FIXME: alpha does not work m_pixelCount++; if (m_pixelCount == m_pixelsPerFrame) { drawGraticule(); m_tvScreen->renderImage(0); - usleep(10000); + usleep(50000); m_tvScreen->getSize(m_cols, m_rows); m_tvScreen->resetImage(); m_pixelCount = 0; diff --git a/sdrgui/dsp/scopevisxy.h b/sdrgui/dsp/scopevisxy.h index bea51e3c5..e9b22f001 100644 --- a/sdrgui/dsp/scopevisxy.h +++ b/sdrgui/dsp/scopevisxy.h @@ -39,7 +39,11 @@ public: virtual bool handleMessage(const Message& message); void setScale(float scale) { m_scale = scale; } - void setPixelsPerFrame(int pixelsPerFrame) { m_pixelsPerFrame = pixelsPerFrame; } + + void setPixelsPerFrame(int pixelsPerFrame) { + m_pixelsPerFrame = pixelsPerFrame; + m_pixelCount = 0; + } void setPlotRGB(const QRgb& plotRGB) { m_plotRGB = plotRGB; } void setGridRGB(const QRgb& gridRGB) { m_gridRGB = gridRGB; } diff --git a/sdrgui/gui/glshadertvarray.cpp b/sdrgui/gui/glshadertvarray.cpp index b0a45c190..22edc0ed5 100644 --- a/sdrgui/gui/glshadertvarray.cpp +++ b/sdrgui/gui/glshadertvarray.cpp @@ -45,7 +45,6 @@ GLShaderTVArray::GLShaderTVArray(bool blnColor) : m_blnColor(blnColor) m_objCurrentRow = 0; m_objTextureLoc = 0; - m_objColorLoc = 0; m_objMatrixLoc = 0; } @@ -100,7 +99,6 @@ void GLShaderTVArray::InitializeGL(int intCols, int intRows) m_objMatrixLoc = m_objProgram->uniformLocation("uMatrix"); m_objTextureLoc = m_objProgram->uniformLocation("uTexture"); - m_objColorLoc = m_objProgram->uniformLocation("uColour"); if (m_objTexture != 0) { @@ -113,6 +111,7 @@ void GLShaderTVArray::InitializeGL(int intCols, int intRows) m_objImage->fill(QColor(0, 0, 0)); m_objTexture = new QOpenGLTexture(*m_objImage); + m_objTexture->setFormat(QOpenGLTexture::RGBA8_UNorm); m_objTexture->setMinificationFilter(QOpenGLTexture::Linear); m_objTexture->setMagnificationFilter(QOpenGLTexture::Linear); m_objTexture->setWrapMode(QOpenGLTexture::ClampToEdge); @@ -210,6 +209,9 @@ 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); m_objTexture->bind(); diff --git a/sdrgui/gui/glshadertvarray.h b/sdrgui/gui/glshadertvarray.h index 408a62ef4..706401b53 100644 --- a/sdrgui/gui/glshadertvarray.h +++ b/sdrgui/gui/glshadertvarray.h @@ -60,7 +60,7 @@ protected: QOpenGLShaderProgram *m_objProgram; int m_objMatrixLoc; int m_objTextureLoc; - int m_objColorLoc; + //int m_objColorLoc; static const QString m_strVertexShaderSourceArray; static const QString m_strFragmentShaderSourceColored; diff --git a/sdrgui/gui/tvscreen.cpp b/sdrgui/gui/tvscreen.cpp index 729421a06..d00c17824 100644 --- a/sdrgui/gui/tvscreen.cpp +++ b/sdrgui/gui/tvscreen.cpp @@ -225,3 +225,15 @@ bool TVScreen::setDataColor(int intCol, int intRed, int intGreen, int intBlue) return false; } } + +bool TVScreen::setDataColor(int intCol, int intRed, int intGreen, int intBlue, int intAlpha) +{ + if (m_blnGLContextInitialized) + { + return m_objGLShaderArray.SetDataColor(intCol, qRgba(intBlue, intGreen, intRed, intAlpha)); // FIXME: blue <> red inversion in shader + } + else + { + return false; + } +} diff --git a/sdrgui/gui/tvscreen.h b/sdrgui/gui/tvscreen.h index da19c653d..1a3926990 100644 --- a/sdrgui/gui/tvscreen.h +++ b/sdrgui/gui/tvscreen.h @@ -52,7 +52,8 @@ public: void resetImage(); bool selectRow(int intLine); - bool setDataColor(int intCol,int intRed, int intGreen, int intBlue); + 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 connectTimer(const QTimer& timer);