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();
void setDSPEngine(DSPEngine* dspEngine);
void setAmp(Real amp);
void setAmpOfs(Real ampOfs);
void setAmp1(Real amp);
void setAmp1Ofs(Real ampOfs);
void setTimeBase(int timeBase);
void setTimeOfsProMill(int timeOfsProMill);
void setMode(Mode mode);
@ -117,6 +117,8 @@ private:
ScopeVis::TriggerChannel m_triggerChannel;
Real m_triggerLevel;
Real m_triggerPre;
Real m_triggerLevelDis1;
Real m_triggerLevelDis2;
int m_nbPow;
Real m_prevArg;

View File

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

View File

@ -37,6 +37,8 @@ GLScope::GLScope(QWidget* parent) :
m_triggerChannel(ScopeVis::TriggerFreeRun),
m_triggerLevel(0.0),
m_triggerPre(0.0),
m_triggerLevelDis1(0.0),
m_triggerLevelDis2(0.0),
m_prevArg(0),
m_displayGridIntensity(5),
m_displayTraceIntensity(50),
@ -86,16 +88,20 @@ void GLScope::setSampleRate(int sampleRate) {
emit sampleRateChanged(m_sampleRate);
}
void GLScope::setAmp(Real amp)
void GLScope::setAmp1(Real amp)
{
qDebug("GLScope::setAmp1: %f", amp);
m_amp = amp;
m_amp1 = amp;
m_configChanged = true;
update();
}
void GLScope::setAmpOfs(Real ampOfs)
void GLScope::setAmp1Ofs(Real ampOfs)
{
qDebug("GLScope::setAmp1Ofs: %f", ampOfs);
m_ofs = ampOfs;
m_ofs1 = ampOfs;
m_configChanged = true;
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
tickList = &m_x1Scale.getTickList();
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();
// paint left #1 scale
@ -326,7 +318,7 @@ void GLScope::paintGL()
glDisable(GL_TEXTURE_2D);
glPopMatrix();
// paint trigger level
// paint trigger level #1
if ((m_triggerChannel == ScopeVis::TriggerChannelI)
|| (m_triggerChannel == ScopeVis::TriggerMagLin)
|| (m_triggerChannel == ScopeVis::TriggerMagDb)
@ -342,22 +334,18 @@ void GLScope::paintGL()
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
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);
glVertex2f(1, m_triggerLevel);
}
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);
if ((m_triggerLevelDis1 > negLimit) && (m_triggerLevelDis1 < posLimit))
{
glVertex2f(0, m_triggerLevelDis1);
glVertex2f(1, m_triggerLevelDis1);
}
}
glEnd();
@ -365,7 +353,7 @@ void GLScope::paintGL()
glPopMatrix();
}
// paint trace
// paint trace #1
if(m_displayTrace->size() > 0)
{
glPushMatrix();
@ -387,7 +375,7 @@ void GLScope::paintGL()
for(int i = start; i < end; i++)
{
float v = (*m_displayTrace)[i].real() + m_ofs1;
float v = (*m_displayTrace)[i].real();
if(v > posLimit)
v = posLimit;
else if(v < negLimit)
@ -430,39 +418,6 @@ void GLScope::paintGL()
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
// 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
tickList = &m_x2Scale.getTickList();
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();
// paint left #2 scale
@ -582,7 +523,7 @@ void GLScope::paintGL()
glDisable(GL_TEXTURE_2D);
glPopMatrix();
// paint trigger level
// paint trigger level #2
if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ))
{
glPushMatrix();
@ -597,17 +538,11 @@ void GLScope::paintGL()
glVertex2f(0, m_triggerLevel);
glVertex2f(1, m_triggerLevel);
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);
glPopMatrix();
}
// paint trace
// paint trace #2
if(m_displayTrace->size() > 0) {
glPushMatrix();
glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0);
@ -636,38 +571,6 @@ void GLScope::paintGL()
//glDisable(GL_LINE_SMOOTH);
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
glPopMatrix();
@ -730,51 +633,70 @@ void GLScope::mousePressEvent(QMouseEvent* event)
void GLScope::handleMode()
{
switch(m_mode) {
case ModeIQ: {
case ModeIQ:
{
m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin();
m_displayTrace = &m_rawTrace;
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_amp1 = m_amp;
m_amp2 = m_amp;
m_ofs1 = m_ofs;
m_ofs2 = m_ofs;
//m_amp1 = m_amp;
//m_amp2 = m_amp;
//m_ofs1 = m_ofs;
//m_ofs2 = m_ofs;
break;
}
case ModeMagLinPha: {
case ModeMagLinPha:
{
m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin();
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_amp1 = m_amp;
//m_amp1 = m_amp;
m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
break;
}
case ModeMagdBPha: {
case ModeMagdBPha:
{
m_mathTrace.resize(m_rawTrace.size());
m_powTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin();
std::vector<Real>::iterator powDst = m_powTrace.begin();
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();
*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);
}
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_amp1 = 2.0 * m_amp;
//m_amp1 = 2.0 * m_amp;
m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
break;
}
case ModeMagLinDPha: {
case ModeMagLinDPha:
{
m_mathTrace.resize(m_rawTrace.size());
std::vector<Complex>::iterator dst = m_mathTrace.begin();
Real curArg;
@ -783,27 +705,27 @@ void GLScope::handleMode()
{
curArg = arg(*src) - m_prevArg;
if (curArg < -M_PI)
{
if (curArg < -M_PI) {
curArg += 2.0 * M_PI;
}
else if (curArg > M_PI)
{
} else if (curArg > 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_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1;
m_displayTrace = &m_mathTrace;
m_amp1 = m_amp;
//m_amp1 = m_amp;
m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
break;
}
case ModeMagdBDPha: {
case ModeMagdBDPha:
{
m_mathTrace.resize(m_rawTrace.size());
m_powTrace.resize(m_rawTrace.size());
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();
*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;
if (curArg < -M_PI)
{
if (curArg < -M_PI) {
curArg += 2.0 * M_PI;
}
else if (curArg > M_PI)
{
} else if (curArg > M_PI) {
curArg -= 2.0 * M_PI;
}
@ -831,9 +750,9 @@ void GLScope::handleMode()
}
m_displayTrace = &m_mathTrace;
m_amp1 = 2.0 * m_amp;
//m_amp1 = 2.0 * m_amp;
m_amp2 = 1.0;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
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]));
}
m_displayTrace = &m_mathTrace;
m_amp1 = m_amp;
//m_amp1 = m_amp;
m_amp2 = m_amp;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
}
break;
@ -861,9 +780,9 @@ void GLScope::handleMode()
for(uint i = 2; i < m_rawTrace.size() ; i++)
*dst++ = Complex(abs(m_rawTrace[i] - conj(m_rawTrace[i - 1])), 0);
m_displayTrace = &m_mathTrace;
m_amp1 = m_amp;
//m_amp1 = m_amp;
m_amp2 = m_amp;
m_ofs1 = -1.0 / m_amp1;
//m_ofs1 = -1.0 / m_amp1;
m_ofs2 = 0.0;
}
break;
@ -1582,6 +1501,7 @@ void GLScope::setTriggerChannel(ScopeVis::TriggerChannel triggerChannel)
void GLScope::setTriggerLevel(Real triggerLevel)
{
qDebug("GLScope::setTriggerLevel: %f", triggerLevel);
m_triggerLevel = triggerLevel;
}

View File

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

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>809</width>
<height>65</height>
<width>811</width>
<height>120</height>
</rect>
</property>
<property name="windowTitle">
@ -297,8 +297,7 @@
</font>
</property>
<property name="text">
<string>0.1000
/div</string>
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@ -356,19 +355,19 @@
</widget>
</item>
<item>
<widget class="QLabel" name="ampLabel">
<widget class="QLabel" name="amp1Label">
<property name="font">
<font>
<pointsize>8</pointsize>
</font>
</property>
<property name="text">
<string>A</string>
<string>A1</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="amp">
<widget class="QSlider" name="amp1">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -376,7 +375,7 @@
</sizepolicy>
</property>
<property name="toolTip">
<string>Y range</string>
<string>Y range for display 1</string>
</property>
<property name="minimum">
<number>0</number>
@ -402,7 +401,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="ampText">
<widget class="QLabel" name="amp1Text">
<property name="minimumSize">
<size>
<width>40</width>
@ -415,8 +414,7 @@
</font>
</property>
<property name="text">
<string>0.2000
/div</string>
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@ -424,38 +422,58 @@
</widget>
</item>
<item>
<widget class="QSlider" name="ampOfs">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Y offset</string>
</property>
<property name="minimum">
<number>-1000</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
<layout class="QVBoxLayout" name="amp1OfsLayout">
<item>
<widget class="QSlider" name="amp1OfsCoarse">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Y coarse offset for display 1</string>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>99</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::NoTicks</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<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="ampOfsText">
<widget class="QLabel" name="amp1OfsText">
<property name="font">
<font>
<pointsize>8</pointsize>
@ -494,6 +512,191 @@
</item>
</layout>
</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>
<widget class="Line" name="rowSep1">
<property name="orientation">
@ -854,88 +1057,6 @@
</property>
</widget>
</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>
</item>
</layout>