From fa47e7064f9526bc91d47d049e077d3fcc1a5a14 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 10 Feb 2017 18:28:19 +0100 Subject: [PATCH] New scope: Trigger line display interim state (1) --- sdrbase/dsp/scopevisng.cpp | 55 +++++++++++++++++++++++++++++++------- sdrbase/dsp/scopevisng.h | 35 ++++++++++++++++++++---- sdrbase/gui/glscopeng.cpp | 21 +++++++++++++++ 3 files changed, 96 insertions(+), 15 deletions(-) diff --git a/sdrbase/dsp/scopevisng.cpp b/sdrbase/dsp/scopevisng.cpp index d8c38bf15..fa9c7dd80 100644 --- a/sdrbase/dsp/scopevisng.cpp +++ b/sdrbase/dsp/scopevisng.cpp @@ -31,10 +31,12 @@ MESSAGE_CLASS_DEFINITION(ScopeVisNG::MsgScopeVisNGRemoveTrace, Message) const uint ScopeVisNG::m_traceChunkSize = 4800; const Real ScopeVisNG::ProjectorMagDB::mult = (10.0f / log2f(10.0f)); + ScopeVisNG::ScopeVisNG(GLScopeNG* glScope) : m_glScope(glScope), m_preTriggerDelay(0), m_currentTriggerIndex(0), + m_focusedTriggerIndex(0), m_triggerState(TriggerUntriggered), m_traceSize(m_traceChunkSize), m_nbSamples(0), @@ -101,13 +103,6 @@ void ScopeVisNG::addTrigger(const TriggerData& triggerData) void ScopeVisNG::changeTrigger(const TriggerData& triggerData, uint32_t triggerIndex) { - qDebug() << "ScopeVisNG::changeTrigger:" - << " trigger: " << triggerIndex - << " m_projectionType: " << triggerData.m_projectionType - << " m_triggerRepeat: " << triggerData.m_triggerRepeat - << " m_triggerPositiveEdge: " << triggerData.m_triggerPositiveEdge - << " m_triggerBothEdges: " << triggerData.m_triggerBothEdges; -; Message* cmd = MsgScopeVisNGChangeTrigger::create(triggerData, triggerIndex); getInputMessageQueue()->push(cmd); } @@ -493,8 +488,13 @@ bool ScopeVisNG::handleMessage(const Message& message) MsgScopeVisNGChangeTrigger& conf = (MsgScopeVisNGChangeTrigger&) message; int triggerIndex = conf.getTriggerIndex(); - if (triggerIndex < m_triggerConditions.size()) { + if (triggerIndex < m_triggerConditions.size()) + { m_triggerConditions[triggerIndex].setData(conf.getTriggerData()); + + if (triggerIndex == m_focusedTriggerIndex) { + computeTriggerLevelsOnDisplay(); + } } return true; @@ -505,7 +505,6 @@ bool ScopeVisNG::handleMessage(const Message& message) int triggerIndex = conf.getTriggerIndex(); if (triggerIndex < m_triggerConditions.size()) { - m_triggerConditions[triggerIndex].releaseProjector(); m_triggerConditions.erase(m_triggerConditions.begin() + triggerIndex); } @@ -517,15 +516,18 @@ bool ScopeVisNG::handleMessage(const Message& message) m_traces.addTrace(conf.getTraceData(), m_traceSize); initTraceBuffers(); updateMaxTraceDelay(); + computeTriggerLevelsOnDisplay(); + m_glScope->updateDisplay(); return true; } else if (MsgScopeVisNGChangeTrace::match(message)) { MsgScopeVisNGChangeTrace& conf = (MsgScopeVisNGChangeTrace&) message; + bool doComputeTriggerLevelsOnDisplay = m_traces.isVerticalDisplayChange(conf.getTraceData(), conf.getTraceIndex()); m_traces.changeTrace(conf.getTraceData(), conf.getTraceIndex()); updateMaxTraceDelay(); + if (doComputeTriggerLevelsOnDisplay) computeTriggerLevelsOnDisplay(); m_glScope->updateDisplay(); - return true; } else if (MsgScopeVisNGRemoveTrace::match(message)) @@ -533,6 +535,8 @@ bool ScopeVisNG::handleMessage(const Message& message) MsgScopeVisNGRemoveTrace& conf = (MsgScopeVisNGRemoveTrace&) message; m_traces.removeTrace(conf.getTraceIndex()); updateMaxTraceDelay(); + computeTriggerLevelsOnDisplay(); + m_glScope->updateDisplay(); return true; } else @@ -576,3 +580,34 @@ void ScopeVisNG::initTraceBuffers() } } +void ScopeVisNG::computeTriggerLevelsOnDisplay() +{ + const TriggerCondition& focusedTriggerCondition = m_triggerConditions[m_focusedTriggerIndex]; + std::vector::const_iterator itData = m_traces.m_tracesData.begin(); + float v; + + for (; itData != m_traces.m_tracesData.end(); ++itData) + { + if (focusedTriggerCondition.m_projector->getProjectionType() == itData->m_projectionType) + { + if (itData->m_projectionType == ProjectionMagLin) { + v = (focusedTriggerCondition.m_triggerData.m_triggerLevel - itData->m_ofs)*itData->m_amp - 1.0f; + } else if (itData->m_projectionType == ProjectionMagDB) { + float p = focusedTriggerCondition.m_triggerData.m_triggerLevel - (100.0f * itData->m_ofs); + v = ((p/50.0f) + 2.0f)*itData->m_amp - 1.0f; + } else { + v = (focusedTriggerCondition.m_triggerData.m_triggerLevel - itData->m_ofs) * itData->m_amp; + } + + if(v > 1.0f) { + v = 1.0f; + } else if (v < -1.0f) { + v = -1.0f; + } + } + else + { + v = 2.0f; // clamp high + } + } +} diff --git a/sdrbase/dsp/scopevisng.h b/sdrbase/dsp/scopevisng.h index 21a422097..50e858a9f 100644 --- a/sdrbase/dsp/scopevisng.h +++ b/sdrbase/dsp/scopevisng.h @@ -51,13 +51,15 @@ public: float m_amp; //!< Amplification factor float m_ofs; //!< Offset factor int m_traceDelay; //!< Trace delay in number of samples + float m_triggerDisplayLevel; //!< Displayable trigger display level in -1:+1 scale. Off scale if not displayable. TraceData() : m_projectionType(ProjectionReal), m_inputIndex(0), m_amp(1.0f), m_ofs(0.0f), - m_traceDelay(0) + m_traceDelay(0), + m_triggerDisplayLevel(2.0) // OVer scale by default (2.0) {} }; @@ -590,12 +592,16 @@ private: if (m_projector) delete m_projector; } - void init(ProjectionType projectionType) + void initProjector(ProjectionType projectionType) { - if (m_projector) delete m_projector; m_projector = createProjector(projectionType); } + void releaseProjector() + { + delete m_projector; + } + void reset() { m_traceCount[0] = 0; @@ -626,13 +632,20 @@ private: } } + bool isVerticalDisplayChange(const TraceData& traceData, uint32_t traceIndex) + { + return (m_tracesData[traceIndex].m_projectionType != traceData.m_projectionType) + || (m_tracesData[traceIndex].m_amp != traceData.m_amp) + || (m_tracesData[traceIndex].m_ofs != traceData.m_ofs); + } + void addTrace(const TraceData& traceData, int traceSize) { resize(traceSize); m_tracesData.push_back(traceData); m_tracesControl.push_back(TraceControl()); - m_tracesControl.back().init(traceData.m_projectionType); + m_tracesControl.back().initProjector(traceData.m_projectionType); float *x0 = new float[2*m_traceSize]; float *x1 = new float[2*m_traceSize]; m_traces[0].push_back(x0); @@ -642,7 +655,8 @@ private: void changeTrace(const TraceData& traceData, uint32_t traceIndex) { if (traceIndex < m_tracesControl.size()) { - m_tracesControl[traceIndex].init(traceData.m_projectionType); + m_tracesControl[traceIndex].releaseProjector(); + m_tracesControl[traceIndex].initProjector(traceData.m_projectionType); m_tracesData[traceIndex] = traceData; } } @@ -651,6 +665,7 @@ private: { if (traceIndex < m_tracesControl.size()) { + m_tracesControl[traceIndex].releaseProjector(); m_tracesControl.erase(m_tracesControl.begin() + traceIndex); m_tracesData.erase(m_tracesData.begin() + traceIndex); delete[] (m_traces[0])[traceIndex]; @@ -770,6 +785,7 @@ private: uint32_t m_preTriggerDelay; //!< Pre-trigger delay in number of samples std::vector m_triggerConditions; //!< Chain of triggers int m_currentTriggerIndex; //!< Index of current index in the chain + int m_focusedTriggerIndex; //!< Index of the trigger that has focus TriggerState m_triggerState; //!< Current trigger state Traces m_traces; //!< Displayable traces int m_traceSize; //!< Size of traces in number of samples @@ -813,6 +829,15 @@ private: * Initialize trace buffers */ void initTraceBuffers(); + + /** + * Calculate trigger levels on display + * - every time a trigger condition focus changes TBD + * - every time the focused trigger condition changes its projection type or level + * - every time a trace data changes: projection type, amp, offset + * - every time a trace data is added or removed + */ + void computeTriggerLevelsOnDisplay(); }; diff --git a/sdrbase/gui/glscopeng.cpp b/sdrbase/gui/glscopeng.cpp index 7a1fa20b1..70080d9dc 100644 --- a/sdrbase/gui/glscopeng.cpp +++ b/sdrbase/gui/glscopeng.cpp @@ -314,6 +314,27 @@ void GLScopeNG::paintGL() mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY); mat.scale(2.0f * rectW, -2.0f * rectH); m_glShaderSimple.drawPolyline(mat, color, (GLfloat *) &trace[2*start], end - start); + + // Paint trigger level if any + if ((traceData.m_triggerDisplayLevel > -1.0f) && (traceData.m_triggerDisplayLevel < 1.0f)) + { + GLfloat q3[] { + 0, traceData.m_triggerDisplayLevel, + 1, traceData.m_triggerDisplayLevel + }; + + float rectX = m_glScopeRect1.x(); + float rectY = m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0f; + float rectW = m_glScopeRect1.width(); + float rectH = -m_glScopeRect1.height() / 2.0f; + + QVector4D color(0.0f, 1.0f, 0.0f, 0.4f); + QMatrix4x4 mat; + mat.setToIdentity(); + mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY); + mat.scale(2.0f * rectW, -2.0f * rectH); + m_glShaderSimple.drawSegments(mat, color, q3, 2); + } } }