GLScope: individual settings for channels 1 and 2. Fine and Coarse sliders for Y offsets. Interim state #1: channel 1 working

This commit is contained in:
f4exb 2015-10-31 12:33:59 +01:00
parent 2b2fb4abb2
commit 1a7610a7e4
5 changed files with 383 additions and 322 deletions

View File

@ -56,8 +56,8 @@ public:
~GLScope(); ~GLScope();
void setDSPEngine(DSPEngine* dspEngine); void setDSPEngine(DSPEngine* dspEngine);
void setAmp(Real amp); void setAmp1(Real amp);
void setAmpOfs(Real ampOfs); void setAmp1Ofs(Real ampOfs);
void setTimeBase(int timeBase); void setTimeBase(int timeBase);
void setTimeOfsProMill(int timeOfsProMill); void setTimeOfsProMill(int timeOfsProMill);
void setMode(Mode mode); void setMode(Mode mode);
@ -117,6 +117,8 @@ private:
ScopeVis::TriggerChannel m_triggerChannel; ScopeVis::TriggerChannel m_triggerChannel;
Real m_triggerLevel; Real m_triggerLevel;
Real m_triggerPre; Real m_triggerPre;
Real m_triggerLevelDis1;
Real m_triggerLevelDis2;
int m_nbPow; int m_nbPow;
Real m_prevArg; Real m_prevArg;

View File

@ -44,8 +44,9 @@ private:
qint32 m_displays; qint32 m_displays;
qint32 m_timeBase; qint32 m_timeBase;
qint32 m_timeOffset; qint32 m_timeOffset;
qint32 m_amplification; qint32 m_amplification1;
qint32 m_ampOffset; qint32 m_amp1OffsetCoarse;
qint32 m_amp1OffsetFine;
int m_displayGridIntensity; int m_displayGridIntensity;
int m_displayTraceIntensity; int m_displayTraceIntensity;
qint32 m_triggerChannel; qint32 m_triggerChannel;
@ -64,15 +65,16 @@ private:
void setTimeScaleDisplay(); void setTimeScaleDisplay();
void setTraceLenDisplay(); void setTraceLenDisplay();
void setTimeOfsDisplay(); void setTimeOfsDisplay();
void setAmpScaleDisplay(); void setAmp1ScaleDisplay();
void setAmpOfsDisplay(); void setAmp1OfsDisplay();
void setTrigLevelDisplay(); void setTrigLevelDisplay();
void setTrigPreDisplay(); void setTrigPreDisplay();
void setTrigDelayDisplay(); void setTrigDelayDisplay();
private slots: private slots:
void on_amp_valueChanged(int value); void on_amp1_valueChanged(int value);
void on_ampOfs_valueChanged(int value); void on_amp1OfsCoarse_valueChanged(int value);
void on_amp1OfsFine_valueChanged(int value);
void on_scope_traceSizeChanged(int value); void on_scope_traceSizeChanged(int value);
void on_scope_sampleRateChanged(int value); void on_scope_sampleRateChanged(int value);
void on_time_valueChanged(int value); void on_time_valueChanged(int value);

View File

@ -37,6 +37,8 @@ GLScope::GLScope(QWidget* parent) :
m_triggerChannel(ScopeVis::TriggerFreeRun), m_triggerChannel(ScopeVis::TriggerFreeRun),
m_triggerLevel(0.0), m_triggerLevel(0.0),
m_triggerPre(0.0), m_triggerPre(0.0),
m_triggerLevelDis1(0.0),
m_triggerLevelDis2(0.0),
m_prevArg(0), m_prevArg(0),
m_displayGridIntensity(5), m_displayGridIntensity(5),
m_displayTraceIntensity(50), m_displayTraceIntensity(50),
@ -86,16 +88,20 @@ void GLScope::setSampleRate(int sampleRate) {
emit sampleRateChanged(m_sampleRate); emit sampleRateChanged(m_sampleRate);
} }
void GLScope::setAmp(Real amp) void GLScope::setAmp1(Real amp)
{ {
qDebug("GLScope::setAmp1: %f", amp);
m_amp = amp; m_amp = amp;
m_amp1 = amp;
m_configChanged = true; m_configChanged = true;
update(); update();
} }
void GLScope::setAmpOfs(Real ampOfs) void GLScope::setAmp1Ofs(Real ampOfs)
{ {
qDebug("GLScope::setAmp1Ofs: %f", ampOfs);
m_ofs = ampOfs; m_ofs = ampOfs;
m_ofs1 = ampOfs;
m_configChanged = true; m_configChanged = true;
update(); update();
} }
@ -250,13 +256,6 @@ void GLScope::paintGL()
} }
} }
} }
/*
for(int i = 1; i < 10; i++) {
glBegin(GL_LINE_LOOP);
glVertex2f(0, i * 0.1);
glVertex2f(1, i * 0.1);
glEnd();
}*/
// Vertical X1 // Vertical X1
tickList = &m_x1Scale.getTickList(); tickList = &m_x1Scale.getTickList();
for(int i= 0; i < tickList->count(); i++) { for(int i= 0; i < tickList->count(); i++) {
@ -271,13 +270,6 @@ void GLScope::paintGL()
} }
} }
} }
/*
for(int i = 1; i < 10; i++) {
glBegin(GL_LINE_LOOP);
glVertex2f(i * 0.1, 0);
glVertex2f(i * 0.1, 1);
glEnd();
}*/
glPopMatrix(); glPopMatrix();
// paint left #1 scale // paint left #1 scale
@ -326,7 +318,7 @@ void GLScope::paintGL()
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glPopMatrix(); glPopMatrix();
// paint trigger level // paint trigger level #1
if ((m_triggerChannel == ScopeVis::TriggerChannelI) if ((m_triggerChannel == ScopeVis::TriggerChannelI)
|| (m_triggerChannel == ScopeVis::TriggerMagLin) || (m_triggerChannel == ScopeVis::TriggerMagLin)
|| (m_triggerChannel == ScopeVis::TriggerMagDb) || (m_triggerChannel == ScopeVis::TriggerMagDb)
@ -342,22 +334,18 @@ void GLScope::paintGL()
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0); glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
glBegin(GL_LINE_LOOP); glBegin(GL_LINE_LOOP);
if (m_triggerChannel == ScopeVis::TriggerChannelI) float posLimit = 1.0 / m_amp1;
float negLimit = -1.0 / m_amp1;
if ((m_triggerChannel == ScopeVis::TriggerChannelI)
|| (m_triggerChannel == ScopeVis::TriggerMagLin)
|| (m_triggerChannel == ScopeVis::TriggerMagDb))
{ {
glVertex2f(0, m_triggerLevel); if ((m_triggerLevelDis1 > negLimit) && (m_triggerLevelDis1 < posLimit))
glVertex2f(1, m_triggerLevel); {
glVertex2f(0, m_triggerLevelDis1);
glVertex2f(1, m_triggerLevelDis1);
} }
else if (m_triggerChannel == ScopeVis::TriggerMagLin)
{
Real y = (m_triggerLevel + 1.0 - (m_ofs / 2.0)) * m_amp1;
glVertex2f(0, (y - 1.0)/m_amp1);
glVertex2f(1, (y - 1.0)/m_amp1);
}
else if (m_triggerChannel == ScopeVis::TriggerMagDb)
{
Real y = (m_triggerLevel - m_ofs) * m_amp1;
glVertex2f(0, (y - 1.0)/m_amp1);
glVertex2f(1, (y - 1.0)/m_amp1);
} }
glEnd(); glEnd();
@ -365,7 +353,7 @@ void GLScope::paintGL()
glPopMatrix(); glPopMatrix();
} }
// paint trace // paint trace #1
if(m_displayTrace->size() > 0) if(m_displayTrace->size() > 0)
{ {
glPushMatrix(); glPushMatrix();
@ -387,7 +375,7 @@ void GLScope::paintGL()
for(int i = start; i < end; i++) for(int i = start; i < end; i++)
{ {
float v = (*m_displayTrace)[i].real() + m_ofs1; float v = (*m_displayTrace)[i].real();
if(v > posLimit) if(v > posLimit)
v = posLimit; v = posLimit;
else if(v < negLimit) else if(v < negLimit)
@ -430,39 +418,6 @@ void GLScope::paintGL()
drawPowerOverlay(); drawPowerOverlay();
} }
} }
// paint trigger time line if pretriggered
/*
if ((m_triggerPre > 0.0) &&
((m_triggerChannel == ScopeVis::TriggerChannelI)
|| (m_triggerChannel == ScopeVis::TriggerMagLin)
|| (m_triggerChannel == ScopeVis::TriggerMagDb)))
{
float x = (m_triggerPre - (m_timeOfsProMill/1000.0)) * m_displayTrace->size();
if ((x >= 0.0) && (x <= (float) m_displayTrace->size() / (float) m_timeBase))
{
glPushMatrix();
glTranslatef(m_glScopeRect1.x(), m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0, 0);
glScalef(m_glScopeRect1.width() * (float)m_timeBase / (float)(m_displayTrace->size() - 1), -(m_glScopeRect1.height() / 2) * m_amp1, 1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glEnable(GL_LINE_SMOOTH);
glLineWidth(1.0f);
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
glBegin(GL_LINE_LOOP);
float posLimit = 1.0 / m_amp1;
float negLimit = -1.0 / m_amp1;
glVertex2f(x, posLimit);
glVertex2f(x, negLimit);
glEnd();
//glDisable(GL_LINE_SMOOTH);
glPopMatrix();
}
}*/
} // Both displays or primary only } // Both displays or primary only
// Q - secondary display // Q - secondary display
@ -506,13 +461,6 @@ void GLScope::paintGL()
} }
} }
} }
/*
for(int i = 1; i < 10; i++) {
glBegin(GL_LINE_LOOP);
glVertex2f(0, i * 0.1);
glVertex2f(1, i * 0.1);
glEnd();
}*/
// Vertical X2 // Vertical X2
tickList = &m_x2Scale.getTickList(); tickList = &m_x2Scale.getTickList();
for(int i= 0; i < tickList->count(); i++) { for(int i= 0; i < tickList->count(); i++) {
@ -527,13 +475,6 @@ void GLScope::paintGL()
} }
} }
} }
/*
for(int i = 1; i < 10; i++) {
glBegin(GL_LINE_LOOP);
glVertex2f(i * 0.1, 0);
glVertex2f(i * 0.1, 1);
glEnd();
}*/
glPopMatrix(); glPopMatrix();
// paint left #2 scale // paint left #2 scale
@ -582,7 +523,7 @@ void GLScope::paintGL()
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glPopMatrix(); glPopMatrix();
// paint trigger level // paint trigger level #2
if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ)) if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ))
{ {
glPushMatrix(); glPushMatrix();
@ -597,17 +538,11 @@ void GLScope::paintGL()
glVertex2f(0, m_triggerLevel); glVertex2f(0, m_triggerLevel);
glVertex2f(1, m_triggerLevel); glVertex2f(1, m_triggerLevel);
glEnd(); glEnd();
/*
glColor4f(0, 0.8f, 0.0, 0.3f);
glBegin(GL_LINE_LOOP);
glVertex2f(0, m_triggerLevelLow);
glVertex2f(1, m_triggerLevelLow);
glEnd();*/
//glDisable(GL_LINE_SMOOTH); //glDisable(GL_LINE_SMOOTH);
glPopMatrix(); glPopMatrix();
} }
// paint trace // paint trace #2
if(m_displayTrace->size() > 0) { if(m_displayTrace->size() > 0) {
glPushMatrix(); glPushMatrix();
glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0); glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0);
@ -636,38 +571,6 @@ void GLScope::paintGL()
//glDisable(GL_LINE_SMOOTH); //glDisable(GL_LINE_SMOOTH);
glPopMatrix(); glPopMatrix();
} }
// paint trigger time line if pretriggered
/*
if ((m_triggerPre > 0.0) &&
((m_triggerChannel == ScopeVis::TriggerPhase)
|| (m_triggerChannel == ScopeVis::TriggerChannelQ)))
{
float x = (m_triggerPre - (m_timeOfsProMill/1000.0)) * m_displayTrace->size();
if ((x >= 0.0) && (x <= (float) m_displayTrace->size() / (float) m_timeBase))
{
glPushMatrix();
glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0);
glScalef(m_glScopeRect2.width() * (float)m_timeBase / (float)(m_displayTrace->size() - 1), -(m_glScopeRect2.height() / 2) * m_amp2, 1);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glEnable(GL_LINE_SMOOTH);
glLineWidth(1.0f);
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
glBegin(GL_LINE_LOOP);
float posLimit = 1.0 / m_amp2;
float negLimit = -1.0 / m_amp2;
glVertex2f(x, posLimit);
glVertex2f(x, negLimit);
glEnd();
//glDisable(GL_LINE_SMOOTH);
glPopMatrix();
}
}*/
} // Both displays or secondary display only } // Both displays or secondary display only
glPopMatrix(); glPopMatrix();
@ -730,51 +633,70 @@ void GLScope::mousePressEvent(QMouseEvent* event)
void GLScope::handleMode() void GLScope::handleMode()
{ {
switch(m_mode) { switch(m_mode) {
case ModeIQ: { case ModeIQ:
{
m_mathTrace.resize(m_rawTrace.size()); m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin(); std::vector<Complex>::iterator dst = m_mathTrace.begin();
m_displayTrace = &m_rawTrace; m_displayTrace = &m_rawTrace;
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) { for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) {
*dst++ = Complex(src->real() - 2*m_ofs, src->imag() - m_ofs); *dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs1);
} }
m_triggerLevelDis1 = m_triggerLevel - m_ofs1;
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = m_amp; //m_amp1 = m_amp;
m_amp2 = m_amp; //m_amp2 = m_amp;
m_ofs1 = m_ofs; //m_ofs1 = m_ofs;
m_ofs2 = m_ofs; //m_ofs2 = m_ofs;
break; break;
} }
case ModeMagLinPha: { case ModeMagLinPha:
{
m_mathTrace.resize(m_rawTrace.size()); m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin(); std::vector<Complex>::iterator dst = m_mathTrace.begin();
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src)
*dst++ = Complex(abs(*src) - m_ofs/2.0, arg(*src) / M_PI); {
*dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, arg(*src) / M_PI);
}
m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1;
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = m_amp; //m_amp1 = m_amp;
m_amp2 = 1.0; m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
break; break;
} }
case ModeMagdBPha: { case ModeMagdBPha:
{
m_mathTrace.resize(m_rawTrace.size()); m_mathTrace.resize(m_rawTrace.size());
m_powTrace.resize(m_rawTrace.size()); m_powTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin(); std::vector<Complex>::iterator dst = m_mathTrace.begin();
std::vector<Real>::iterator powDst = m_powTrace.begin(); std::vector<Real>::iterator powDst = m_powTrace.begin();
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) { for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) {
Real v = src->real() * src->real() + src->imag() * src->imag(); Real v = src->real() * src->real() + src->imag() * src->imag();
*powDst++ = v; *powDst++ = v;
v = (100.0f - m_ofs*100.0f + (10.0f * log10f(v))) / 100.0f; // TODO: first term is the offset v = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
*dst++ = Complex(v, arg(*src) / M_PI); *dst++ = Complex(v, arg(*src) / M_PI);
} }
Real tdB = (m_triggerLevel - 1) * 100.0f;
m_triggerLevelDis1 = 1.0f + 2.0f*(((tdB)/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = 2.0 * m_amp; //m_amp1 = 2.0 * m_amp;
m_amp2 = 1.0; m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
break; break;
} }
case ModeMagLinDPha: { case ModeMagLinDPha:
{
m_mathTrace.resize(m_rawTrace.size()); m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin(); std::vector<Complex>::iterator dst = m_mathTrace.begin();
Real curArg; Real curArg;
@ -783,27 +705,27 @@ void GLScope::handleMode()
{ {
curArg = arg(*src) - m_prevArg; curArg = arg(*src) - m_prevArg;
if (curArg < -M_PI) if (curArg < -M_PI) {
{
curArg += 2.0 * M_PI; curArg += 2.0 * M_PI;
} } else if (curArg > M_PI) {
else if (curArg > M_PI)
{
curArg -= 2.0 * M_PI; curArg -= 2.0 * M_PI;
} }
*dst++ = Complex(abs(*src) - m_ofs/2.0, curArg / M_PI); *dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, curArg / M_PI);
m_prevArg = arg(*src); m_prevArg = arg(*src);
} }
m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1;
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = m_amp; //m_amp1 = m_amp;
m_amp2 = 1.0; m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
break; break;
} }
case ModeMagdBDPha: { case ModeMagdBDPha:
{
m_mathTrace.resize(m_rawTrace.size()); m_mathTrace.resize(m_rawTrace.size());
m_powTrace.resize(m_rawTrace.size()); m_powTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin(); std::vector<Complex>::iterator dst = m_mathTrace.begin();
@ -814,15 +736,12 @@ void GLScope::handleMode()
{ {
Real v = src->real() * src->real() + src->imag() * src->imag(); Real v = src->real() * src->real() + src->imag() * src->imag();
*powDst++ = v; *powDst++ = v;
v = (100.0f - m_ofs*100.0f + (10.0f * log10f(v))) / 100.0f; v = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
curArg = arg(*src) - m_prevArg; curArg = arg(*src) - m_prevArg;
if (curArg < -M_PI) if (curArg < -M_PI) {
{
curArg += 2.0 * M_PI; curArg += 2.0 * M_PI;
} } else if (curArg > M_PI) {
else if (curArg > M_PI)
{
curArg -= 2.0 * M_PI; curArg -= 2.0 * M_PI;
} }
@ -831,9 +750,9 @@ void GLScope::handleMode()
} }
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = 2.0 * m_amp; //m_amp1 = 2.0 * m_amp;
m_amp2 = 1.0; m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
break; break;
} }
@ -847,9 +766,9 @@ void GLScope::handleMode()
abs(m_rawTrace[i] - m_rawTrace[i - 1]) - abs(m_rawTrace[i - 2] - m_rawTrace[i - 3])); abs(m_rawTrace[i] - m_rawTrace[i - 1]) - abs(m_rawTrace[i - 2] - m_rawTrace[i - 3]));
} }
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = m_amp; //m_amp1 = m_amp;
m_amp2 = m_amp; m_amp2 = m_amp;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
} }
break; break;
@ -861,9 +780,9 @@ void GLScope::handleMode()
for(uint i = 2; i < m_rawTrace.size() ; i++) for(uint i = 2; i < m_rawTrace.size() ; i++)
*dst++ = Complex(abs(m_rawTrace[i] - conj(m_rawTrace[i - 1])), 0); *dst++ = Complex(abs(m_rawTrace[i] - conj(m_rawTrace[i - 1])), 0);
m_displayTrace = &m_mathTrace; m_displayTrace = &m_mathTrace;
m_amp1 = m_amp; //m_amp1 = m_amp;
m_amp2 = m_amp; m_amp2 = m_amp;
m_ofs1 = -1.0 / m_amp1; //m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0; m_ofs2 = 0.0;
} }
break; break;
@ -1582,6 +1501,7 @@ void GLScope::setTriggerChannel(ScopeVis::TriggerChannel triggerChannel)
void GLScope::setTriggerLevel(Real triggerLevel) void GLScope::setTriggerLevel(Real triggerLevel)
{ {
qDebug("GLScope::setTriggerLevel: %f", triggerLevel);
m_triggerLevel = triggerLevel; m_triggerLevel = triggerLevel;
} }

View File

@ -21,9 +21,11 @@ GLScopeGUI::GLScopeGUI(QWidget* parent) :
m_displays(GLScope::DisplayBoth), m_displays(GLScope::DisplayBoth),
m_timeBase(1), m_timeBase(1),
m_timeOffset(0), m_timeOffset(0),
m_amplification(0), m_amplification1(0),
m_ampOffset(0), m_amp1OffsetCoarse(0),
m_amp1OffsetFine(0),
m_displayGridIntensity(1), m_displayGridIntensity(1),
m_displayTraceIntensity(50),
m_triggerChannel(ScopeVis::TriggerFreeRun), m_triggerChannel(ScopeVis::TriggerFreeRun),
m_triggerLevelCoarse(0), m_triggerLevelCoarse(0),
m_triggerLevelFine(0), m_triggerLevelFine(0),
@ -62,7 +64,7 @@ void GLScopeGUI::resetToDefaults()
m_displayOrientation = Qt::Horizontal; m_displayOrientation = Qt::Horizontal;
m_timeBase = 1; m_timeBase = 1;
m_timeOffset = 0; m_timeOffset = 0;
m_amplification = 0; m_amplification1 = 0;
m_displayGridIntensity = 5; m_displayGridIntensity = 5;
m_triggerChannel = ScopeVis::TriggerFreeRun; m_triggerChannel = ScopeVis::TriggerFreeRun;
m_triggerLevelCoarse = 0; m_triggerLevelCoarse = 0;
@ -82,9 +84,9 @@ QByteArray GLScopeGUI::serialize() const
s.writeS32(2, m_displayOrientation); s.writeS32(2, m_displayOrientation);
s.writeS32(3, m_timeBase); s.writeS32(3, m_timeBase);
s.writeS32(4, m_timeOffset); s.writeS32(4, m_timeOffset);
s.writeS32(5, m_amplification); s.writeS32(5, m_amplification1);
s.writeS32(6, m_displayGridIntensity); s.writeS32(6, m_displayGridIntensity);
s.writeS32(7, m_ampOffset); s.writeS32(7, m_amp1OffsetCoarse);
s.writeS32(8, m_displays); s.writeS32(8, m_displays);
s.writeS32(9, m_triggerChannel); s.writeS32(9, m_triggerChannel);
s.writeS32(10, m_triggerLevelCoarse); s.writeS32(10, m_triggerLevelCoarse);
@ -95,6 +97,7 @@ QByteArray GLScopeGUI::serialize() const
s.writeS32(15, m_triggerDelay); s.writeS32(15, m_triggerDelay);
s.writeBool(16, m_triggerBothEdges); s.writeBool(16, m_triggerBothEdges);
s.writeS32(17, m_triggerLevelFine); s.writeS32(17, m_triggerLevelFine);
s.writeS32(18, m_amp1OffsetFine);
return s.final(); return s.final();
} }
@ -113,11 +116,11 @@ bool GLScopeGUI::deserialize(const QByteArray& data)
d.readS32(2, &m_displayOrientation, Qt::Horizontal); d.readS32(2, &m_displayOrientation, Qt::Horizontal);
d.readS32(3, &m_timeBase, 1); d.readS32(3, &m_timeBase, 1);
d.readS32(4, &m_timeOffset, 0); d.readS32(4, &m_timeOffset, 0);
d.readS32(5, &m_amplification, 0); d.readS32(5, &m_amplification1, 0);
d.readS32(6, &m_displayGridIntensity, 5); d.readS32(6, &m_displayGridIntensity, 5);
if(m_timeBase < 0) if(m_timeBase < 0)
m_timeBase = 1; m_timeBase = 1;
d.readS32(7, &m_ampOffset, 0); d.readS32(7, &m_amp1OffsetCoarse, 0);
d.readS32(8, &m_displays, GLScope::DisplayBoth); d.readS32(8, &m_displays, GLScope::DisplayBoth);
d.readS32(9, &m_triggerChannel, ScopeVis::TriggerFreeRun); d.readS32(9, &m_triggerChannel, ScopeVis::TriggerFreeRun);
ui->trigMode->setCurrentIndex(m_triggerChannel); ui->trigMode->setCurrentIndex(m_triggerChannel);
@ -146,6 +149,7 @@ bool GLScopeGUI::deserialize(const QByteArray& data)
} }
d.readS32(17, &m_triggerLevelFine, 0); d.readS32(17, &m_triggerLevelFine, 0);
ui->trigLevelFine->setValue(m_triggerLevelFine); ui->trigLevelFine->setValue(m_triggerLevelFine);
d.readS32(18, &m_amp1OffsetFine, 0);
setTrigLevelDisplay(); setTrigLevelDisplay();
applySettings(); applySettings();
applyTriggerSettings(); applyTriggerSettings();
@ -193,8 +197,9 @@ void GLScopeGUI::applySettings()
} }
ui->time->setValue(m_timeBase); ui->time->setValue(m_timeBase);
ui->timeOfs->setValue(m_timeOffset); ui->timeOfs->setValue(m_timeOffset);
ui->amp->setValue(m_amplification); ui->amp1->setValue(m_amplification1);
ui->ampOfs->setValue(m_ampOffset); ui->amp1OfsCoarse->setValue(m_amp1OffsetCoarse);
ui->amp1OfsFine->setValue(m_amp1OffsetFine);
ui->gridIntensity->setSliderPosition(m_displayGridIntensity); ui->gridIntensity->setSliderPosition(m_displayGridIntensity);
ui->traceIntensity->setSliderPosition(m_displayTraceIntensity); ui->traceIntensity->setSliderPosition(m_displayTraceIntensity);
} }
@ -260,32 +265,34 @@ void GLScopeGUI::setTrigLevelDisplay()
} }
} }
void GLScopeGUI::setAmpScaleDisplay() void GLScopeGUI::setAmp1ScaleDisplay()
{ {
if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha)) if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha))
{ {
ui->ampText->setText(tr("%1\ndB").arg(amps[m_amplification]*500.0, 0, 'f', 1)); ui->amp1Text->setText(tr("%1\ndB").arg(amps[m_amplification1]*500.0, 0, 'f', 1));
} }
else else
{ {
qreal a = amps[m_amplification]*10.0; qreal a = amps[m_amplification1]*10.0;
if(a < 0.000001) if(a < 0.000001)
ui->ampText->setText(tr("%1\nn").arg(a * 1000000000.0)); ui->amp1Text->setText(tr("%1\nn").arg(a * 1000000000.0));
else if(a < 0.001) else if(a < 0.001)
ui->ampText->setText(tr("%1\nµ").arg(a * 1000000.0)); ui->amp1Text->setText(tr("%1\nµ").arg(a * 1000000.0));
else if(a < 1.0) else if(a < 1.0)
ui->ampText->setText(tr("%1\nm").arg(a * 1000.0)); ui->amp1Text->setText(tr("%1\nm").arg(a * 1000.0));
else else
ui->ampText->setText(tr("%1").arg(a * 1.0)); ui->amp1Text->setText(tr("%1").arg(a * 1.0));
} }
} }
void GLScopeGUI::setAmpOfsDisplay() void GLScopeGUI::setAmp1OfsDisplay()
{ {
qreal o = (m_amp1OffsetCoarse * 10.0) + (m_amp1OffsetFine / 20.0);
if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha)) if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha))
{ {
ui->ampOfsText->setText(tr("%1\ndB").arg(m_ampOffset/10.0 - 100.0, 0, 'f', 1)); ui->amp1OfsText->setText(tr("%1\ndB").arg(o/10.0 - 100.0, 0, 'f', 1));
} }
else else
{ {
@ -293,36 +300,45 @@ void GLScopeGUI::setAmpOfsDisplay()
if ((m_glScope->getDataMode() == GLScope::ModeMagLinPha) || (m_glScope->getDataMode() == GLScope::ModeMagLinDPha)) if ((m_glScope->getDataMode() == GLScope::ModeMagLinPha) || (m_glScope->getDataMode() == GLScope::ModeMagLinDPha))
{ {
a = m_ampOffset/2000.0; a = o/2000.0;
} }
else else
{ {
a = m_ampOffset/1000.0; a = o/1000.0;
} }
if(fabs(a) < 0.000001) if(fabs(a) < 0.000001)
ui->ampOfsText->setText(tr("%1\nn").arg(a * 1000000000.0)); ui->amp1OfsText->setText(tr("%1\nn").arg(a * 1000000000.0));
else if(fabs(a) < 0.001) else if(fabs(a) < 0.001)
ui->ampOfsText->setText(tr("%1\nµ").arg(a * 1000000.0)); ui->amp1OfsText->setText(tr("%1\nµ").arg(a * 1000000.0));
else if(fabs(a) < 1.0) else if(fabs(a) < 1.0)
ui->ampOfsText->setText(tr("%1\nm").arg(a * 1000.0)); ui->amp1OfsText->setText(tr("%1\nm").arg(a * 1000.0));
else else
ui->ampOfsText->setText(tr("%1").arg(a * 1.0)); ui->amp1OfsText->setText(tr("%1").arg(a * 1.0));
} }
} }
void GLScopeGUI::on_amp_valueChanged(int value) void GLScopeGUI::on_amp1_valueChanged(int value)
{ {
m_amplification = value; m_amplification1 = value;
setAmpScaleDisplay(); setAmp1ScaleDisplay();
m_glScope->setAmp(0.2 / amps[m_amplification]); m_glScope->setAmp1(0.2 / amps[m_amplification1]);
} }
void GLScopeGUI::on_ampOfs_valueChanged(int value) void GLScopeGUI::on_amp1OfsCoarse_valueChanged(int value)
{ {
m_ampOffset = value; m_amp1OffsetCoarse = value;
setAmpOfsDisplay(); setAmp1OfsDisplay();
m_glScope->setAmpOfs(value/1000.0); // scale to [-1.0,1.0] qreal o = (m_amp1OffsetCoarse * 10.0) + (m_amp1OffsetFine / 20.0);
m_glScope->setAmp1Ofs(o/1000.0); // scale to [-1.0,1.0]
}
void GLScopeGUI::on_amp1OfsFine_valueChanged(int value)
{
m_amp1OffsetFine = value;
setAmp1OfsDisplay();
qreal o = (m_amp1OffsetCoarse * 10.0) + (m_amp1OffsetFine / 20.0);
m_glScope->setAmp1Ofs(o/1000.0); // scale to [-1.0,1.0]
} }
void GLScopeGUI::on_scope_traceSizeChanged(int) void GLScopeGUI::on_scope_traceSizeChanged(int)
@ -522,8 +538,8 @@ void GLScopeGUI::on_dataMode_currentIndexChanged(int index)
break; break;
} }
setAmpScaleDisplay(); setAmp1ScaleDisplay();
setAmpOfsDisplay(); setAmp1OfsDisplay();
} }
void GLScopeGUI::on_horizView_clicked() void GLScopeGUI::on_horizView_clicked()

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>809</width> <width>811</width>
<height>65</height> <height>120</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -297,8 +297,7 @@
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>0.1000 <string>0</string>
/div</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
@ -356,19 +355,19 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="ampLabel"> <widget class="QLabel" name="amp1Label">
<property name="font"> <property name="font">
<font> <font>
<pointsize>8</pointsize> <pointsize>8</pointsize>
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>A</string> <string>A1</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QSlider" name="amp"> <widget class="QSlider" name="amp1">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -376,7 +375,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Y range</string> <string>Y range for display 1</string>
</property> </property>
<property name="minimum"> <property name="minimum">
<number>0</number> <number>0</number>
@ -402,7 +401,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="ampText"> <widget class="QLabel" name="amp1Text">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>40</width> <width>40</width>
@ -415,8 +414,7 @@
</font> </font>
</property> </property>
<property name="text"> <property name="text">
<string>0.2000 <string>0</string>
/div</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
@ -424,7 +422,9 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QSlider" name="ampOfs"> <layout class="QVBoxLayout" name="amp1OfsLayout">
<item>
<widget class="QSlider" name="amp1OfsCoarse">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -432,13 +432,13 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Y offset</string> <string>Y coarse offset for display 1</string>
</property> </property>
<property name="minimum"> <property name="minimum">
<number>-1000</number> <number>-100</number>
</property> </property>
<property name="maximum"> <property name="maximum">
<number>1000</number> <number>99</number>
</property> </property>
<property name="pageStep"> <property name="pageStep">
<number>1</number> <number>1</number>
@ -455,7 +455,25 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="ampOfsText"> <widget class="QSlider" name="amp1OfsFine">
<property name="toolTip">
<string>Y fine offset for display 1</string>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="amp1OfsText">
<property name="font"> <property name="font">
<font> <font>
<pointsize>8</pointsize> <pointsize>8</pointsize>
@ -494,6 +512,191 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="row3Layout">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="traceLenLabel">
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>Len</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="traceLen">
<property name="toolTip">
<string>Trace length</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>20</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="traceLenText">
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="traceLenLine">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="amp2Label">
<property name="text">
<string>A2</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="amp2">
<property name="toolTip">
<string>Y range for display 2</string>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="amp2Text">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="amp2OfsLayout">
<item>
<widget class="QSlider" name="amp2OfsCoarse">
<property name="toolTip">
<string>Y coarse offset for display 2</string>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="amp2OfsFine">
<property name="toolTip">
<string>Y fine offset for display 2</string>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="amp2OfsText">
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="traceIntensityLine">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QDial" name="traceIntensity">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Trace intensity</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>50</number>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<widget class="Line" name="rowSep1"> <widget class="Line" name="rowSep1">
<property name="orientation"> <property name="orientation">
@ -854,88 +1057,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="Line" name="traceLenLine">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="traceLenLabel">
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>Len</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="traceLen">
<property name="toolTip">
<string>Trace length</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>20</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="traceLenText">
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="traceIntensityLine">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QDial" name="traceIntensity">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Trace intensity</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>50</number>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>