1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-23 08:28:36 -05:00

New scope: make some trace and trigger data public

This commit is contained in:
f4exb 2017-01-30 00:07:20 +01:00
parent d69c6cc417
commit cce5b29aa6
3 changed files with 70 additions and 49 deletions

View File

@ -107,33 +107,33 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
TriggerCondition& triggerCondition = m_triggerConditions[m_currentTriggerIndex]; TriggerCondition& triggerCondition = m_triggerConditions[m_currentTriggerIndex];
// trigger process // trigger process
if ((m_triggerConditions.size() > 0) && (feedIndex == triggerCondition.m_inputIndex)) if ((m_triggerConditions.size() > 0) && (feedIndex == triggerCondition.m_triggerData.m_inputIndex))
{ {
while (begin < end) while (begin < end)
{ {
if (m_triggerState == TriggerUntriggered) if (m_triggerState == TriggerUntriggered)
{ {
bool condition = triggerCondition.m_projector->run(*begin) > triggerCondition.m_triggerLevel; bool condition = triggerCondition.m_projector->run(*begin) > triggerCondition.m_triggerData.m_triggerLevel;
bool trigger; bool trigger;
if (triggerCondition.m_triggerBothEdges) { if (triggerCondition.m_triggerData.m_triggerBothEdges) {
trigger = triggerCondition.m_prevCondition ^ condition; trigger = triggerCondition.m_prevCondition ^ condition;
} else { } else {
trigger = condition ^ !triggerCondition.m_triggerPositiveEdge; trigger = condition ^ !triggerCondition.m_triggerData.m_triggerPositiveEdge;
} }
if (trigger) if (trigger)
{ {
if (triggerCondition.m_triggerDelay > 0) if (triggerCondition.m_triggerData.m_triggerDelay > 0)
{ {
triggerCondition.m_triggerDelayCount = triggerCondition.m_triggerDelay; triggerCondition.m_triggerDelayCount = triggerCondition.m_triggerData.m_triggerDelay;
m_triggerState == TriggerDelay; m_triggerState == TriggerDelay;
} }
else else
{ {
if (triggerCondition.m_triggerCounts > 0) if (triggerCondition.m_triggerCounter > 0)
{ {
triggerCondition.m_triggerCounts--; triggerCondition.m_triggerCounter--;
m_triggerState = TriggerUntriggered; m_triggerState = TriggerUntriggered;
} }
else else
@ -146,6 +146,7 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
m_currentTriggerIndex = 0; m_currentTriggerIndex = 0;
m_triggerState = TriggerTriggered; m_triggerState = TriggerTriggered;
m_triggerPoint = begin; m_triggerPoint = begin;
triggerCondition.m_triggerCounter = triggerCondition.m_triggerData.m_triggerCounts;
m_traceStart = true; m_traceStart = true;
break; break;
} }
@ -175,6 +176,7 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
m_currentTriggerIndex = 0; m_currentTriggerIndex = 0;
m_triggerState = TriggerTriggered; m_triggerState = TriggerTriggered;
m_triggerPoint = begin; m_triggerPoint = begin;
triggerCondition.m_triggerCounter = triggerCondition.m_triggerData.m_triggerCounts;
m_traceStart = true; m_traceStart = true;
break; break;
} }
@ -210,10 +212,10 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
for (;itTrace != m_traces.end(); ++itTrace) for (;itTrace != m_traces.end(); ++itTrace)
{ {
if (itTrace->m_inputIndex == feedIndex) if (itTrace->m_traceData.m_inputIndex == feedIndex)
{ {
SampleVector::const_iterator startPoint = m_tracebackBuffers[feedIndex].getCurrent() - count; SampleVector::const_iterator startPoint = m_tracebackBuffers[feedIndex].getCurrent() - count;
SampleVector::const_iterator prevPoint = m_tracebackBuffers[feedIndex].getCurrent() - count - m_preTriggerDelay - itTrace->m_traceDelay; SampleVector::const_iterator prevPoint = m_tracebackBuffers[feedIndex].getCurrent() - count - m_preTriggerDelay - itTrace->m_traceData.m_traceDelay;
processPrevTrace(prevPoint, startPoint, itTrace); processPrevTrace(prevPoint, startPoint, itTrace);
} }
} }
@ -229,14 +231,14 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
{ {
for (std::vector<Trace>::iterator itTrace = m_traces.begin(); itTrace != m_traces.end(); ++itTrace) for (std::vector<Trace>::iterator itTrace = m_traces.begin(); itTrace != m_traces.end(); ++itTrace)
{ {
if (itTrace->m_inputIndex == feedIndex) if (itTrace->m_traceData.m_inputIndex == feedIndex)
{ {
float posLimit = 1.0 / itTrace->m_amp; float posLimit = 1.0 / itTrace->m_traceData.m_amp;
float negLimit = -1.0 / itTrace->m_amp; float negLimit = -1.0 / itTrace->m_traceData.m_amp;
if (itTrace->m_traceCount < m_traceSize) if (itTrace->m_traceCount < m_traceSize)
{ {
float v = itTrace->m_projector->run(*begin) * itTrace->m_amp + itTrace->m_shift; float v = itTrace->m_projector->run(*begin) * itTrace->m_traceData.m_amp + itTrace->m_traceData.m_ofs;
if(v > posLimit) { if(v > posLimit) {
v = posLimit; v = posLimit;
@ -274,12 +276,12 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
void ScopeVisNG::processPrevTrace(SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, std::vector<Trace>::iterator& trace) void ScopeVisNG::processPrevTrace(SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, std::vector<Trace>::iterator& trace)
{ {
int shift = (m_timeOfsProMill / 1000.0) * m_traceSize; int shift = (m_timeOfsProMill / 1000.0) * m_traceSize;
float posLimit = 1.0 / trace->m_amp; float posLimit = 1.0 / trace->m_traceData.m_amp;
float negLimit = -1.0 / trace->m_amp; float negLimit = -1.0 / trace->m_traceData.m_amp;
while (begin < end) while (begin < end)
{ {
float v = trace->m_projector->run(*begin) * trace->m_amp + trace->m_shift; float v = trace->m_projector->run(*begin) * trace->m_traceData.m_amp + trace->m_traceData.m_ofs;
if(v > posLimit) { if(v > posLimit) {
v = posLimit; v = posLimit;

View File

@ -42,12 +42,48 @@ public:
ProjectionDPhase //!< Calculate phase derivative i.e. instantaneous frequency scaled to sample rate ProjectionDPhase //!< Calculate phase derivative i.e. instantaneous frequency scaled to sample rate
}; };
struct DisplayTrace struct TraceData
{ {
float *m_trace; //!< Displayable trace (interleaved x,y of GLfloat)
ProjectionType m_projectionType; //!< Complex to real projection type ProjectionType m_projectionType; //!< Complex to real projection type
uint32_t m_inputIndex; //!< Input or feed index this trace is associated with
float m_amp; //!< Amplification factor float m_amp; //!< Amplification factor
float m_ofs; //!< Offset factor float m_ofs; //!< Offset factor
int m_traceDelay; //!< Trace delay in number of samples
TraceData() :
m_projectionType(ProjectionReal),
m_inputIndex(0),
m_amp(1.0f),
m_ofs(0.0f),
m_traceDelay(0)
{}
};
struct DisplayTrace
{
TraceData m_traceData; //!< Trace data
float *m_trace; //!< Displayable trace (interleaved x,y of GLfloat)
};
struct TriggerData
{
ProjectionType m_projectionType; //!< Complex to real projection type
uint32_t m_inputIndex; //!< Input or feed index this trigger is associated with
Real m_triggerLevel; //!< Level in real units
bool m_triggerPositiveEdge; //!< Trigger on the positive edge (else negative)
bool m_triggerBothEdges; //!< Trigger on both edges (else only one)
uint32_t m_triggerDelay; //!< Delay before the trigger is kicked off in number of samples
uint32_t m_triggerCounts; //!< Number of trigger conditions before the final decisive trigger
TriggerData() :
m_projectionType(ProjectionReal),
m_inputIndex(0),
m_triggerLevel(0.0f),
m_triggerPositiveEdge(true),
m_triggerBothEdges(false),
m_triggerDelay(0),
m_triggerCounts(0)
{}
}; };
typedef std::vector<DisplayTrace> DisplayTraces; typedef std::vector<DisplayTrace> DisplayTraces;
@ -231,46 +267,29 @@ private:
{ {
public: public:
Projector *m_projector; //!< Projector transform from complex trace to reaL trace usable for triggering Projector *m_projector; //!< Projector transform from complex trace to reaL trace usable for triggering
uint32_t m_inputIndex; //!< Input or feed index this trigger is associated with TriggerData m_triggerData; //!< Trigger data
Real m_triggerLevel; //!< Level in real units
bool m_triggerPositiveEdge; //!< Trigger on the positive edge (else negative)
bool m_triggerBothEdges; //!< Trigger on both edges (else only one)
bool m_prevCondition; //!< Condition (above threshold) at previous sample bool m_prevCondition; //!< Condition (above threshold) at previous sample
uint32_t m_triggerDelay; //!< Delay before the trigger is kicked off in number of samples
uint32_t m_triggerDelayCount; //!< Counter of samples for delay uint32_t m_triggerDelayCount; //!< Counter of samples for delay
uint32_t m_triggerCounts; //!< Number of trigger conditions before the final decisive trigger uint32_t m_triggerCounter; //!< Counter of trigger occurences
TriggerCondition(Projector *projector) : TriggerCondition(Projector *projector) :
m_projector(projector), m_projector(projector),
m_inputIndex(0),
m_triggerLevel(0.0f),
m_triggerPositiveEdge(true),
m_triggerBothEdges(false),
m_prevCondition(false), m_prevCondition(false),
m_triggerDelay(0),
m_triggerDelayCount(0), m_triggerDelayCount(0),
m_triggerCounts(0) m_triggerCounter(0)
{} {}
}; };
struct Trace : public DisplayTrace struct Trace : public DisplayTrace
{ {
Projector *m_projector; //!< Projector transform from complex trace to real (displayable) trace Projector *m_projector; //!< Projector transform from complex trace to real (displayable) trace
uint32_t m_inputIndex; //!< Input or feed index this trace is associated with
int m_traceDelay; //!< Trace delay in number of samples
int m_traceCount; //!< Count of samples processed int m_traceCount; //!< Count of samples processed
float m_amp; //!< Linear trace amplifier factor
float m_shift; //!< Linear trace shift
Trace(Projector *projector, Real *displayTraceBuffer) : Trace(Projector *projector, Real *displayTraceBuffer) :
m_projector(projector), m_projector(projector),
m_inputIndex(0), m_traceCount(0)
m_traceDelay(0),
m_traceCount(0),
m_amp(1.0f),
m_shift(0.0f)
{ {
m_projectionType = m_projector->getProjectionType(); m_traceData.m_projectionType = m_projector->getProjectionType();
m_trace = displayTraceBuffer; m_trace = displayTraceBuffer;
} }
}; };

View File

@ -270,7 +270,7 @@ void GLScopeNG::paintGL()
float rectX = m_glScopeRect1.x(); float rectX = m_glScopeRect1.x();
float rectY = m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0f; float rectY = m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0f;
float rectW = m_glScopeRect1.width() * (float)m_timeBase / (float)(m_traceSize - 1); float rectW = m_glScopeRect1.width() * (float)m_timeBase / (float)(m_traceSize - 1);
float rectH = -(m_glScopeRect1.height() / 2.0f) * trace.m_amp; float rectH = -(m_glScopeRect1.height() / 2.0f) * trace.m_traceData.m_amp;
QVector4D color(1.0f, 1.0f, 0.25f, m_displayTraceIntensity / 100.0f); QVector4D color(1.0f, 1.0f, 0.25f, m_displayTraceIntensity / 100.0f);
QMatrix4x4 mat; QMatrix4x4 mat;
@ -943,19 +943,19 @@ void GLScopeNG::applyConfig()
void GLScopeNG::setYScale(ScaleEngine& scale, uint32_t highlightedTraceIndex) void GLScopeNG::setYScale(ScaleEngine& scale, uint32_t highlightedTraceIndex)
{ {
ScopeVisNG::DisplayTrace trace = (*m_traces)[highlightedTraceIndex]; ScopeVisNG::DisplayTrace trace = (*m_traces)[highlightedTraceIndex];
float amp_range = 2.0 / trace.m_amp; float amp_range = 2.0 / trace.m_traceData.m_amp;
float amp_ofs = trace.m_ofs; float amp_ofs = trace.m_traceData.m_ofs;
float pow_floor = -100.0 + trace.m_ofs * 100.0; float pow_floor = -100.0 + trace.m_traceData.m_ofs * 100.0;
float pow_range = 100.0 / trace.m_amp; float pow_range = 100.0 / trace.m_traceData.m_amp;
switch (trace.m_projectionType) switch (trace.m_traceData.m_projectionType)
{ {
case ScopeVisNG::ProjectionMagDB: // dB scale case ScopeVisNG::ProjectionMagDB: // dB scale
scale.setRange(Unit::Decibel, pow_floor, pow_floor + pow_range); scale.setRange(Unit::Decibel, pow_floor, pow_floor + pow_range);
break; break;
case ScopeVisNG::ProjectionPhase: // Phase or frequency case ScopeVisNG::ProjectionPhase: // Phase or frequency
case ScopeVisNG::ProjectionDPhase: case ScopeVisNG::ProjectionDPhase:
scale.setRange(Unit::None, -1.0/trace.m_amp + amp_ofs, 1.0/trace.m_amp + amp_ofs); scale.setRange(Unit::None, -1.0/trace.m_traceData.m_amp + amp_ofs, 1.0/trace.m_traceData.m_amp + amp_ofs);
break; break;
case ScopeVisNG::ProjectionReal: // Linear generic case ScopeVisNG::ProjectionReal: // Linear generic
case ScopeVisNG::ProjectionImag: case ScopeVisNG::ProjectionImag: