1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-26 17:58:43 -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];
// 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)
{
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;
if (triggerCondition.m_triggerBothEdges) {
if (triggerCondition.m_triggerData.m_triggerBothEdges) {
trigger = triggerCondition.m_prevCondition ^ condition;
} else {
trigger = condition ^ !triggerCondition.m_triggerPositiveEdge;
trigger = condition ^ !triggerCondition.m_triggerData.m_triggerPositiveEdge;
}
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;
}
else
{
if (triggerCondition.m_triggerCounts > 0)
if (triggerCondition.m_triggerCounter > 0)
{
triggerCondition.m_triggerCounts--;
triggerCondition.m_triggerCounter--;
m_triggerState = TriggerUntriggered;
}
else
@ -146,6 +146,7 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
m_currentTriggerIndex = 0;
m_triggerState = TriggerTriggered;
m_triggerPoint = begin;
triggerCondition.m_triggerCounter = triggerCondition.m_triggerData.m_triggerCounts;
m_traceStart = true;
break;
}
@ -175,6 +176,7 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
m_currentTriggerIndex = 0;
m_triggerState = TriggerTriggered;
m_triggerPoint = begin;
triggerCondition.m_triggerCounter = triggerCondition.m_triggerData.m_triggerCounts;
m_traceStart = true;
break;
}
@ -210,10 +212,10 @@ void ScopeVisNG::feed(const SampleVector::const_iterator& cbegin, const SampleVe
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 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);
}
}
@ -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)
{
if (itTrace->m_inputIndex == feedIndex)
if (itTrace->m_traceData.m_inputIndex == feedIndex)
{
float posLimit = 1.0 / itTrace->m_amp;
float negLimit = -1.0 / itTrace->m_amp;
float posLimit = 1.0 / itTrace->m_traceData.m_amp;
float negLimit = -1.0 / itTrace->m_traceData.m_amp;
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) {
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)
{
int shift = (m_timeOfsProMill / 1000.0) * m_traceSize;
float posLimit = 1.0 / trace->m_amp;
float negLimit = -1.0 / trace->m_amp;
float posLimit = 1.0 / trace->m_traceData.m_amp;
float negLimit = -1.0 / trace->m_traceData.m_amp;
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) {
v = posLimit;

View File

@ -42,12 +42,48 @@ public:
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
{
TraceData m_traceData; //!< Trace data
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;
@ -231,46 +267,29 @@ private:
{
public:
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
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)
TriggerData m_triggerData; //!< Trigger data
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_triggerCounts; //!< Number of trigger conditions before the final decisive trigger
uint32_t m_triggerCounter; //!< Counter of trigger occurences
TriggerCondition(Projector *projector) :
m_projector(projector),
m_inputIndex(0),
m_triggerLevel(0.0f),
m_triggerPositiveEdge(true),
m_triggerBothEdges(false),
m_prevCondition(false),
m_triggerDelay(0),
m_triggerDelayCount(0),
m_triggerCounts(0)
m_triggerCounter(0)
{}
};
struct Trace : public DisplayTrace
{
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
float m_amp; //!< Linear trace amplifier factor
float m_shift; //!< Linear trace shift
Trace(Projector *projector, Real *displayTraceBuffer) :
m_projector(projector),
m_inputIndex(0),
m_traceDelay(0),
m_traceCount(0),
m_amp(1.0f),
m_shift(0.0f)
m_traceCount(0)
{
m_projectionType = m_projector->getProjectionType();
m_traceData.m_projectionType = m_projector->getProjectionType();
m_trace = displayTraceBuffer;
}
};

View File

@ -270,7 +270,7 @@ void GLScopeNG::paintGL()
float rectX = m_glScopeRect1.x();
float rectY = m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0f;
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);
QMatrix4x4 mat;
@ -943,19 +943,19 @@ void GLScopeNG::applyConfig()
void GLScopeNG::setYScale(ScaleEngine& scale, uint32_t highlightedTraceIndex)
{
ScopeVisNG::DisplayTrace trace = (*m_traces)[highlightedTraceIndex];
float amp_range = 2.0 / trace.m_amp;
float amp_ofs = trace.m_ofs;
float pow_floor = -100.0 + trace.m_ofs * 100.0;
float pow_range = 100.0 / trace.m_amp;
float amp_range = 2.0 / trace.m_traceData.m_amp;
float amp_ofs = trace.m_traceData.m_ofs;
float pow_floor = -100.0 + trace.m_traceData.m_ofs * 100.0;
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
scale.setRange(Unit::Decibel, pow_floor, pow_floor + pow_range);
break;
case ScopeVisNG::ProjectionPhase: // Phase or frequency
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;
case ScopeVisNG::ProjectionReal: // Linear generic
case ScopeVisNG::ProjectionImag: