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:
parent
d69c6cc417
commit
cce5b29aa6
@ -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;
|
||||||
|
@ -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 TraceData
|
||||||
|
{
|
||||||
|
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_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
|
struct DisplayTrace
|
||||||
{
|
{
|
||||||
|
TraceData m_traceData; //!< Trace data
|
||||||
float *m_trace; //!< Displayable trace (interleaved x,y of GLfloat)
|
float *m_trace; //!< Displayable trace (interleaved x,y of GLfloat)
|
||||||
ProjectionType m_projectionType; //!< Complex to real projection type
|
};
|
||||||
float m_amp; //!< Amplification factor
|
|
||||||
float m_ofs; //!< Offset factor
|
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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user