1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-12-19 08:05:49 -05:00

New scope: Trigger line display interim state (1)

This commit is contained in:
f4exb 2017-02-10 18:28:19 +01:00
parent ec604c21c9
commit fa47e7064f
3 changed files with 96 additions and 15 deletions

View File

@ -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<TraceData>::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
}
}
}

View File

@ -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<TriggerCondition> 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();
};

View File

@ -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);
}
}
}