From 98125ce93a5fdacbd778c88e00e9e5b9efa389eb Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 1 Nov 2015 06:27:39 +0100 Subject: [PATCH] GLScope: individual settings for channels 1 and 2. Fine and Coarse sliders for Y offsets. --- include/gui/glscope.h | 6 +- include/gui/glscopegui.h | 8 ++ sdrbase/gui/glscope.cpp | 175 ++++++++++++++++++++++--------------- sdrbase/gui/glscopegui.cpp | 93 ++++++++++++++++++++ 4 files changed, 211 insertions(+), 71 deletions(-) diff --git a/include/gui/glscope.h b/include/gui/glscope.h index e7deced41..c2f1ff8e9 100644 --- a/include/gui/glscope.h +++ b/include/gui/glscope.h @@ -58,6 +58,8 @@ public: void setDSPEngine(DSPEngine* dspEngine); void setAmp1(Real amp); void setAmp1Ofs(Real ampOfs); + void setAmp2(Real amp); + void setAmp2Ofs(Real ampOfs); void setTimeBase(int timeBase); void setTimeOfsProMill(int timeOfsProMill); void setMode(Mode mode); @@ -110,8 +112,8 @@ private: ScopeVis* m_scopeVis; // config - Real m_amp; - Real m_ofs; + //Real m_amp; + //Real m_ofs; int m_timeBase; int m_timeOfsProMill; ScopeVis::TriggerChannel m_triggerChannel; diff --git a/include/gui/glscopegui.h b/include/gui/glscopegui.h index 5f75d95d9..04e957bdb 100644 --- a/include/gui/glscopegui.h +++ b/include/gui/glscopegui.h @@ -47,6 +47,9 @@ private: qint32 m_amplification1; qint32 m_amp1OffsetCoarse; qint32 m_amp1OffsetFine; + qint32 m_amplification2; + qint32 m_amp2OffsetCoarse; + qint32 m_amp2OffsetFine; int m_displayGridIntensity; int m_displayTraceIntensity; qint32 m_triggerChannel; @@ -67,6 +70,8 @@ private: void setTimeOfsDisplay(); void setAmp1ScaleDisplay(); void setAmp1OfsDisplay(); + void setAmp2ScaleDisplay(); + void setAmp2OfsDisplay(); void setTrigLevelDisplay(); void setTrigPreDisplay(); void setTrigDelayDisplay(); @@ -75,6 +80,9 @@ private slots: void on_amp1_valueChanged(int value); void on_amp1OfsCoarse_valueChanged(int value); void on_amp1OfsFine_valueChanged(int value); + void on_amp2_valueChanged(int value); + void on_amp2OfsCoarse_valueChanged(int value); + void on_amp2OfsFine_valueChanged(int value); void on_scope_traceSizeChanged(int value); void on_scope_sampleRateChanged(int value); void on_time_valueChanged(int value); diff --git a/sdrbase/gui/glscope.cpp b/sdrbase/gui/glscope.cpp index 64ba6a882..3797c7ddf 100644 --- a/sdrbase/gui/glscope.cpp +++ b/sdrbase/gui/glscope.cpp @@ -30,8 +30,8 @@ GLScope::GLScope(QWidget* parent) : m_ofs2(0.0), m_dspEngine(NULL), m_scopeVis(NULL), - m_amp(1.0), - m_ofs(0.0), + //m_amp(1.0), + //m_ofs(0.0), m_timeBase(1), m_timeOfsProMill(0), m_triggerChannel(ScopeVis::TriggerFreeRun), @@ -91,7 +91,6 @@ void GLScope::setSampleRate(int sampleRate) { void GLScope::setAmp1(Real amp) { qDebug("GLScope::setAmp1: %f", amp); - m_amp = amp; m_amp1 = amp; m_configChanged = true; update(); @@ -100,12 +99,27 @@ void GLScope::setAmp1(Real amp) void GLScope::setAmp1Ofs(Real ampOfs) { qDebug("GLScope::setAmp1Ofs: %f", ampOfs); - m_ofs = ampOfs; m_ofs1 = ampOfs; m_configChanged = true; update(); } +void GLScope::setAmp2(Real amp) +{ + qDebug("GLScope::setAmp2: %f", amp); + m_amp2 = amp; + m_configChanged = true; + update(); +} + +void GLScope::setAmp2Ofs(Real ampOfs) +{ + qDebug("GLScope::setAmp2Ofs: %f", ampOfs); + m_ofs2 = ampOfs; + m_configChanged = true; + update(); +} + void GLScope::setTimeBase(int timeBase) { m_timeBase = timeBase; @@ -535,8 +549,20 @@ void GLScope::paintGL() glLineWidth(1.0f); glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0); glBegin(GL_LINE_LOOP); - glVertex2f(0, m_triggerLevel); - glVertex2f(1, m_triggerLevel); + + float posLimit = 1.0 / m_amp2; + float negLimit = -1.0 / m_amp2; + + if ((m_triggerChannel == ScopeVis::TriggerChannelQ) + || (m_triggerChannel == ScopeVis::TriggerPhase)) + { + if ((m_triggerLevelDis2 > negLimit) && (m_triggerLevelDis2 < posLimit)) + { + glVertex2f(0, m_triggerLevelDis2); + glVertex2f(1, m_triggerLevelDis2); + } + } + glEnd(); //glDisable(GL_LINE_SMOOTH); glPopMatrix(); @@ -640,16 +666,14 @@ void GLScope::handleMode() m_displayTrace = &m_rawTrace; for(std::vector::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) { - *dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs1); + *dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs2); } m_triggerLevelDis1 = m_triggerLevel - m_ofs1; + m_triggerLevelDis2 = m_triggerLevel - m_ofs2; m_displayTrace = &m_mathTrace; - //m_amp1 = m_amp; - //m_amp2 = m_amp; - //m_ofs1 = m_ofs; - //m_ofs2 = m_ofs; + break; } case ModeMagLinPha: @@ -659,16 +683,14 @@ void GLScope::handleMode() for(std::vector::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) { - *dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, arg(*src) / M_PI); + *dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (arg(*src) / M_PI) - m_ofs2); } m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1; + m_triggerLevelDis2 = m_triggerLevel - m_ofs2; m_displayTrace = &m_mathTrace; - //m_amp1 = m_amp; - m_amp2 = 1.0; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; + break; } case ModeMagdBPha: @@ -682,17 +704,15 @@ void GLScope::handleMode() Real v = src->real() * src->real() + src->imag() * src->imag(); *powDst++ = v; 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) - m_ofs2); } 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_triggerLevelDis2 = m_triggerLevel - m_ofs2; m_displayTrace = &m_mathTrace; - //m_amp1 = 2.0 * m_amp; - m_amp2 = 1.0; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; + break; } case ModeMagLinDPha: @@ -711,17 +731,15 @@ void GLScope::handleMode() curArg -= 2.0 * M_PI; } - *dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, curArg / M_PI); + *dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (curArg / M_PI) - m_ofs2); m_prevArg = arg(*src); } m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1; + m_triggerLevelDis2 = m_triggerLevel - m_ofs2; m_displayTrace = &m_mathTrace; - //m_amp1 = m_amp; - m_amp2 = 1.0; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; + break; } case ModeMagdBDPha: @@ -745,46 +763,50 @@ void GLScope::handleMode() curArg -= 2.0 * M_PI; } - *dst++ = Complex(v, curArg / M_PI); + *dst++ = Complex(v, (curArg / M_PI) - m_ofs2); m_prevArg = arg(*src); } + 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_triggerLevelDis2 = m_triggerLevel - m_ofs2; + m_displayTrace = &m_mathTrace; - //m_amp1 = 2.0 * m_amp; - m_amp2 = 1.0; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; + break; } - case ModeDerived12: { - if(m_rawTrace.size() > 3) { + case ModeDerived12: + { + if(m_rawTrace.size() > 3) + { m_mathTrace.resize(m_rawTrace.size() - 3); std::vector::iterator dst = m_mathTrace.begin(); - for(uint i = 3; i < m_rawTrace.size() ; i++) { + + for(uint i = 3; i < m_rawTrace.size() ; i++) + { *dst++ = Complex( abs(m_rawTrace[i] - m_rawTrace[i - 1]), 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_amp2 = m_amp; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; } + break; } - case ModeCyclostationary: { - if(m_rawTrace.size() > 2) { + case ModeCyclostationary: + { + if(m_rawTrace.size() > 2) + { m_mathTrace.resize(m_rawTrace.size() - 2); std::vector::iterator dst = m_mathTrace.begin(); + 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_amp2 = m_amp; - //m_ofs1 = -1.0 / m_amp1; - m_ofs2 = 0.0; } + break; } } @@ -861,10 +883,12 @@ void GLScope::applyConfig() int leftMargin = 35; int rightMargin = 5; - float pow_floor = -100.0 + m_ofs * 100.0; - float pow_range = 100.0 / m_amp; - float amp_range = 2.0 / m_amp; - float amp_ofs = m_ofs; + float pow_floor = -100.0 + m_ofs1 * 100.0; + float pow_range = 100.0 / m_amp1; + float amp1_range = 2.0 / m_amp1; + float amp1_ofs = m_ofs1; + float amp2_range = 2.0 / m_amp2; + float amp2_ofs = m_ofs2; float t_start = ((m_timeOfsProMill / 1000.0) - m_triggerPre) * ((float) m_displayTrace->size() / m_sampleRate); float t_len = ((float) m_displayTrace->size() / m_sampleRate) / (float) m_timeBase; @@ -872,51 +896,64 @@ void GLScope::applyConfig() m_x2Scale.setRange(Unit::Time, t_start, t_start + t_len); switch(m_mode) { - case ModeIQ: { - if (amp_range < 2.0) { - m_y1Scale.setRange(Unit::None, - amp_range * 500.0 + amp_ofs * 1000.0, amp_range * 500.0 + amp_ofs * 1000.0); - m_y2Scale.setRange(Unit::None, - amp_range * 500.0 + amp_ofs * 1000.0, amp_range * 500.0 + amp_ofs * 1000.0); + case ModeIQ: + { + if (amp1_range < 2.0) { + m_y1Scale.setRange(Unit::None, - amp1_range * 500.0 + amp1_ofs * 1000.0, amp1_range * 500.0 + amp1_ofs * 1000.0); } else { - m_y1Scale.setRange(Unit::None, - amp_range * 0.5 + amp_ofs, amp_range * 0.5 + amp_ofs); - m_y2Scale.setRange(Unit::None, - amp_range * 0.5 + amp_ofs, amp_range * 0.5 + amp_ofs); + m_y1Scale.setRange(Unit::None, - amp1_range * 0.5 + amp1_ofs, amp1_range * 0.5 + amp1_ofs); } + if (amp1_range < 2.0) { + m_y2Scale.setRange(Unit::None, - amp2_range * 500.0 + amp2_ofs * 1000.0, amp2_range * 500.0 + amp2_ofs * 1000.0); + } else { + m_y2Scale.setRange(Unit::None, - amp2_range * 0.5 + amp2_ofs, amp2_range * 0.5 + amp2_ofs); + } + break; } case ModeMagLinPha: case ModeMagLinDPha: { - if (amp_range < 2.0) { - m_y1Scale.setRange(Unit::None, amp_ofs * 500.0, amp_range * 1000.0 + amp_ofs * 500.0); + if (amp1_range < 2.0) { + m_y1Scale.setRange(Unit::None, amp1_ofs * 500.0, amp1_range * 1000.0 + amp1_ofs * 500.0); } else { - m_y1Scale.setRange(Unit::None, amp_ofs/2.0, amp_range + amp_ofs/2.0); + m_y1Scale.setRange(Unit::None, amp1_ofs/2.0, amp1_range + amp1_ofs/2.0); } - m_y2Scale.setRange(Unit::None, -1.0, 1.0); // Scale to Pi + + m_y2Scale.setRange(Unit::None, -1.0/m_amp2 + amp2_ofs, 1.0/m_amp2 + amp2_ofs); // Scale to Pi*A2 + break; } case ModeMagdBPha: case ModeMagdBDPha: { m_y1Scale.setRange(Unit::Decibel, pow_floor, pow_floor + pow_range); - m_y2Scale.setRange(Unit::AngleDegrees, -1.0, 1.0); // Scale to Pi + m_y2Scale.setRange(Unit::None, -1.0/m_amp2 + amp2_ofs, 1.0/m_amp2 + amp2_ofs); // Scale to Pi*A2 break; } case ModeDerived12: { - if (amp_range < 2.0) { - m_y1Scale.setRange(Unit::None, 0.0, amp_range * 1000.0); - m_y2Scale.setRange(Unit::None, - amp_range * 500.0, amp_range * 500.0); + if (amp1_range < 2.0) { + m_y1Scale.setRange(Unit::None, 0.0, amp1_range * 1000.0); } else { - m_y1Scale.setRange(Unit::None, 0.0, amp_range); - m_y2Scale.setRange(Unit::None, - amp_range * 0.5, amp_range * 0.5); + m_y1Scale.setRange(Unit::None, 0.0, amp1_range); + } + if (amp2_range < 2.0) { + m_y2Scale.setRange(Unit::None, - amp2_range * 500.0, amp2_range * 500.0); + } else { + m_y2Scale.setRange(Unit::None, - amp2_range * 0.5, amp2_range * 0.5); } break; } case ModeCyclostationary: { - if (amp_range < 2.0) { - m_y1Scale.setRange(Unit::None, 0.0, amp_range * 1000.0); - m_y2Scale.setRange(Unit::None, - amp_range * 500.0, amp_range * 500.0); + if (amp1_range < 2.0) { + m_y1Scale.setRange(Unit::None, 0.0, amp1_range * 1000.0); } else { - m_y1Scale.setRange(Unit::None, 0.0, amp_range); - m_y2Scale.setRange(Unit::None, - amp_range * 0.5, amp_range * 0.5); + m_y1Scale.setRange(Unit::None, 0.0, amp1_range); + } + if (amp2_range < 2.0) { + m_y2Scale.setRange(Unit::None, - amp2_range * 500.0, amp2_range * 500.0); + } else { + m_y2Scale.setRange(Unit::None, - amp2_range * 0.5, amp2_range * 0.5); } break; } diff --git a/sdrbase/gui/glscopegui.cpp b/sdrbase/gui/glscopegui.cpp index 9a4459562..c411f4fa1 100644 --- a/sdrbase/gui/glscopegui.cpp +++ b/sdrbase/gui/glscopegui.cpp @@ -24,6 +24,9 @@ GLScopeGUI::GLScopeGUI(QWidget* parent) : m_amplification1(0), m_amp1OffsetCoarse(0), m_amp1OffsetFine(0), + m_amplification2(0), + m_amp2OffsetCoarse(0), + m_amp2OffsetFine(0), m_displayGridIntensity(1), m_displayTraceIntensity(50), m_triggerChannel(ScopeVis::TriggerFreeRun), @@ -65,6 +68,11 @@ void GLScopeGUI::resetToDefaults() m_timeBase = 1; m_timeOffset = 0; m_amplification1 = 0; + m_amp1OffsetCoarse = 0; + m_amp1OffsetFine = 0; + m_amplification2 = 0; + m_amp2OffsetCoarse = 0; + m_amp2OffsetFine = 0; m_displayGridIntensity = 5; m_triggerChannel = ScopeVis::TriggerFreeRun; m_triggerLevelCoarse = 0; @@ -98,6 +106,9 @@ QByteArray GLScopeGUI::serialize() const s.writeBool(16, m_triggerBothEdges); s.writeS32(17, m_triggerLevelFine); s.writeS32(18, m_amp1OffsetFine); + s.writeS32(19, m_amplification2); + s.writeS32(20, m_amp2OffsetCoarse); + s.writeS32(21, m_amp2OffsetFine); return s.final(); } @@ -138,6 +149,7 @@ bool GLScopeGUI::deserialize(const QByteArray& data) ui->trigDelay->setValue(m_triggerDelay); setTrigDelayDisplay(); d.readBool(16, &m_triggerBothEdges, false); + if (m_triggerBothEdges) { ui->slopePos->setChecked(false); ui->slopeNeg->setChecked(false); @@ -147,9 +159,14 @@ bool GLScopeGUI::deserialize(const QByteArray& data) ui->slopePos->setChecked(m_triggerPositiveEdge); ui->slopeNeg->setChecked(!m_triggerPositiveEdge); } + d.readS32(17, &m_triggerLevelFine, 0); ui->trigLevelFine->setValue(m_triggerLevelFine); d.readS32(18, &m_amp1OffsetFine, 0); + d.readS32(19, &m_amplification2, 0); + d.readS32(20, &m_amp2OffsetCoarse, 0); + d.readS32(21, &m_amp2OffsetFine, 0); + setTrigLevelDisplay(); applySettings(); applyTriggerSettings(); @@ -200,6 +217,9 @@ void GLScopeGUI::applySettings() ui->amp1->setValue(m_amplification1); ui->amp1OfsCoarse->setValue(m_amp1OffsetCoarse); ui->amp1OfsFine->setValue(m_amp1OffsetFine); + ui->amp2->setValue(m_amplification2); + ui->amp2OfsCoarse->setValue(m_amp2OffsetCoarse); + ui->amp2OfsFine->setValue(m_amp2OffsetFine); ui->gridIntensity->setSliderPosition(m_displayGridIntensity); ui->traceIntensity->setSliderPosition(m_displayTraceIntensity); } @@ -286,6 +306,30 @@ void GLScopeGUI::setAmp1ScaleDisplay() } } +void GLScopeGUI::setAmp2ScaleDisplay() +{ + if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) + || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha) + || (m_glScope->getDataMode() == GLScope::ModeMagLinPha) + || (m_glScope->getDataMode() == GLScope::ModeMagLinDPha)) + { + ui->amp2Text->setText(tr("%1").arg(amps[m_amplification2]*5.0, 0, 'f', 3)); + } + else + { + qreal a = amps[m_amplification2]*10.0; + + if(a < 0.000001) + ui->amp2Text->setText(tr("%1\nn").arg(a * 1000000000.0)); + else if(a < 0.001) + ui->amp2Text->setText(tr("%1\nµ").arg(a * 1000000.0)); + else if(a < 1.0) + ui->amp2Text->setText(tr("%1\nm").arg(a * 1000.0)); + else + ui->amp2Text->setText(tr("%1").arg(a * 1.0)); + } +} + void GLScopeGUI::setAmp1OfsDisplay() { qreal o = (m_amp1OffsetCoarse * 10.0) + (m_amp1OffsetFine / 20.0); @@ -318,6 +362,32 @@ void GLScopeGUI::setAmp1OfsDisplay() } } +void GLScopeGUI::setAmp2OfsDisplay() +{ + qreal o = (m_amp2OffsetCoarse * 10.0) + (m_amp2OffsetFine / 20.0); + + if ((m_glScope->getDataMode() == GLScope::ModeMagdBPha) + || (m_glScope->getDataMode() == GLScope::ModeMagdBDPha) + || (m_glScope->getDataMode() == GLScope::ModeMagLinPha) + || (m_glScope->getDataMode() == GLScope::ModeMagLinDPha)) + { + ui->amp2OfsText->setText(tr("%1").arg(o/1000.0, 0, 'f', 4)); + } + else + { + qreal a = o/1000.0; + + if(fabs(a) < 0.000001) + ui->amp2OfsText->setText(tr("%1\nn").arg(a * 1000000000.0)); + else if(fabs(a) < 0.001) + ui->amp2OfsText->setText(tr("%1\nµ").arg(a * 1000000.0)); + else if(fabs(a) < 1.0) + ui->amp2OfsText->setText(tr("%1\nm").arg(a * 1000.0)); + else + ui->amp2OfsText->setText(tr("%1").arg(a * 1.0)); + } +} + void GLScopeGUI::on_amp1_valueChanged(int value) { m_amplification1 = value; @@ -341,6 +411,29 @@ void GLScopeGUI::on_amp1OfsFine_valueChanged(int value) m_glScope->setAmp1Ofs(o/1000.0); // scale to [-1.0,1.0] } +void GLScopeGUI::on_amp2_valueChanged(int value) +{ + m_amplification2 = value; + setAmp2ScaleDisplay(); + m_glScope->setAmp2(0.2 / amps[m_amplification2]); +} + +void GLScopeGUI::on_amp2OfsCoarse_valueChanged(int value) +{ + m_amp2OffsetCoarse = value; + setAmp2OfsDisplay(); + qreal o = (m_amp2OffsetCoarse * 10.0) + (m_amp2OffsetFine / 20.0); + m_glScope->setAmp2Ofs(o/1000.0); // scale to [-1.0,1.0] +} + +void GLScopeGUI::on_amp2OfsFine_valueChanged(int value) +{ + m_amp2OffsetFine = value; + setAmp2OfsDisplay(); + qreal o = (m_amp2OffsetCoarse * 10.0) + (m_amp2OffsetFine / 20.0); + m_glScope->setAmp2Ofs(o/1000.0); // scale to [-1.0,1.0] +} + void GLScopeGUI::on_scope_traceSizeChanged(int) { setTimeScaleDisplay();