diff --git a/Readme.md b/Readme.md
index f05b758d6..887bf0772 100644
--- a/Readme.md
+++ b/Readme.md
@@ -179,6 +179,7 @@ For Debian Jessie or Stretch:
- Scope: trace history
- Scope: trigger countdown
- Scope: multiple trigger chaining
+ - Scope: new mode with linear IQ (two traces) on the primary display and polar IQ on the secondary display
Major redesign
diff --git a/sdrbase/gui/glscope.cpp b/sdrbase/gui/glscope.cpp
index f9f0b0b3b..fa643e546 100644
--- a/sdrbase/gui/glscope.cpp
+++ b/sdrbase/gui/glscope.cpp
@@ -670,32 +670,71 @@ void GLScope::paintGL()
// paint trace #2
if(m_displayTrace->size() > 0) {
- 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(1, 1, 0.25f, m_displayTraceIntensity / 100.0);
- int start = (m_timeOfsProMill/1000.0) * m_displayTrace->size();
- int end = std::min(start + m_displayTrace->size()/m_timeBase, m_displayTrace->size());
- if(end - start < 2)
- start--;
- float posLimit = 1.0 / m_amp2;
- float negLimit = -1.0 / m_amp2;
- glBegin(GL_LINE_STRIP);
- for(int i = start; i < end; i++) {
- float v = (*m_displayTrace)[i].imag();
- if(v > posLimit)
- v = posLimit;
- else if(v < negLimit)
- v = negLimit;
- glVertex2f(i - start, v);
+ if (m_mode == ModeIQPolar)
+ {
+ glPushMatrix();
+ glTranslatef(m_glScopeRect2.x() + m_glScopeRect2.width() / 2.0, m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0);
+ glScalef(m_glScopeRect2.width() / 2, -(m_glScopeRect2.height() / 2), 1);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glLineWidth(1.0f);
+ glColor4f(1, 1, 0.25f, m_displayTraceIntensity / 100.0);
+
+ int start = (m_timeOfsProMill/1000.0) * m_displayTrace->size();
+ int end = std::min(start + m_displayTrace->size()/m_timeBase, m_displayTrace->size());
+ if(end - start < 2)
+ start--;
+
+ glBegin(GL_LINE_STRIP);
+
+ for(int i = start; i < end; i++)
+ {
+ float x = (*m_displayTrace)[i].real() * m_amp1;
+ float y = (*m_displayTrace)[i].imag() * m_amp2;
+ if(x > 1.0f)
+ x = 1.0f;
+ else if(x < -1.0f)
+ x = -1.0f;
+ if(y > 1.0f)
+ y = 1.0f;
+ else if(y < -1.0f)
+ y = -1.0f;
+ glVertex2f(x, y);
+ }
+
+ glEnd();
+ glPopMatrix();
+ }
+ else
+ {
+ 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(1, 1, 0.25f, m_displayTraceIntensity / 100.0);
+ int start = (m_timeOfsProMill/1000.0) * m_displayTrace->size();
+ int end = std::min(start + m_displayTrace->size()/m_timeBase, m_displayTrace->size());
+ if(end - start < 2)
+ start--;
+ float posLimit = 1.0 / m_amp2;
+ float negLimit = -1.0 / m_amp2;
+ glBegin(GL_LINE_STRIP);
+ for(int i = start; i < end; i++) {
+ float v = (*m_displayTrace)[i].imag();
+ if(v > posLimit)
+ v = posLimit;
+ else if(v < negLimit)
+ v = negLimit;
+ glVertex2f(i - start, v);
+ }
+ glEnd();
+ //glDisable(GL_LINE_SMOOTH);
+ glPopMatrix();
}
- glEnd();
- //glDisable(GL_LINE_SMOOTH);
- glPopMatrix();
}
} // Both displays or secondary display only
diff --git a/sdrbase/gui/glscopegui.cpp b/sdrbase/gui/glscopegui.cpp
index 57a0eaeb6..4ca6adc71 100644
--- a/sdrbase/gui/glscopegui.cpp
+++ b/sdrbase/gui/glscopegui.cpp
@@ -110,15 +110,9 @@ QByteArray GLScopeGUI::serialize() const
s.writeS32(6, m_displayGridIntensity);
s.writeS32(7, m_amp1OffsetCoarse);
s.writeS32(8, m_displays);
- //s.writeS32(9, m_triggerChannel);
- //s.writeS32(10, m_triggerLevelCoarse);
- //s.writeBool(11, m_triggerPositiveEdge);
s.writeS32(12, m_displayTraceIntensity);
s.writeS32(13, m_triggerPre);
s.writeS32(14, m_traceLenMult);
- //s.writeS32(15, m_triggerDelay);
- //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);
@@ -158,11 +152,6 @@ bool GLScopeGUI::deserialize(const QByteArray& data)
m_timeBase = 1;
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);
- //d.readS32(10, &m_triggerLevelCoarse, 0);
- //ui->trigLevelCoarse->setValue(m_triggerLevelCoarse);
- //d.readBool(11, &m_triggerPositiveEdge, true);
d.readS32(12, &m_displayTraceIntensity, 50);
d.readS32(13, &m_triggerPre, 0);
ui->trigPre->setValue(m_triggerPre);
@@ -170,24 +159,7 @@ bool GLScopeGUI::deserialize(const QByteArray& data)
d.readS32(14, &m_traceLenMult, 20);
ui->traceLen->setValue(m_traceLenMult);
setTraceLenDisplay();
- //d.readS32(15, &m_triggerDelay, 0);
- //ui->trigDelay->setValue(m_triggerDelay);
setTrigDelayDisplay();
- //d.readBool(16, &m_triggerBothEdges, false);
-
- /*
- if (m_triggerBothEdges) {
- ui->slopePos->setChecked(false);
- ui->slopeNeg->setChecked(false);
- ui->slopeBoth->setChecked(true);
- } else {
- ui->slopeBoth->setChecked(false);
- 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);
@@ -673,26 +645,26 @@ void GLScopeGUI::on_dataMode_currentIndexChanged(int index)
case 0: // i+q
m_glScope->setMode(GLScope::ModeIQ);
break;
- case 1: // mag(lin)+pha
+ case 1: // clostationary
+ m_glScope->setMode(GLScope::ModeIQPolar);
+ break;
+ case 2: // mag(lin)+pha
m_glScope->setMode(GLScope::ModeMagLinPha);
break;
- case 2: // mag(dB)+pha
+ case 3: // mag(dB)+pha
m_glScope->setMode(GLScope::ModeMagdBPha);
break;
- case 3: // mag(lin)+dPha
+ case 4: // mag(lin)+dPha
m_glScope->setMode(GLScope::ModeMagLinDPha);
break;
- case 4: // mag(dB)+dPha
+ case 5: // mag(dB)+dPha
m_glScope->setMode(GLScope::ModeMagdBDPha);
break;
- case 5: // derived1+derived2
+ case 6: // derived1+derived2
m_glScope->setMode(GLScope::ModeDerived12);
break;
- case 6: // clostationary
- m_glScope->setMode(GLScope::ModeCyclostationary);
- break;
case 7: // clostationary
- m_glScope->setMode(GLScope::ModeIQPolar);
+ m_glScope->setMode(GLScope::ModeCyclostationary);
break;
default:
diff --git a/sdrbase/gui/glscopegui.ui b/sdrbase/gui/glscopegui.ui
index 074abb540..15d11c939 100644
--- a/sdrbase/gui/glscopegui.ui
+++ b/sdrbase/gui/glscopegui.ui
@@ -82,6 +82,11 @@
1:I 2:Q (lin)
+ -
+
+ 1:IQ (lin) 2:IQ (pol)
+
+
-
1:Mag (lin) 2:Phi
@@ -112,11 +117,6 @@
1,2:Cyclostationary
- -
-
- 1:IQ (lin) 2:IQ (pol)
-
-
-