mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-08-22 07:22:27 -04:00
GLScope: trace memory implementation. GLScopeGUI: widgets placement reorganization
This commit is contained in:
parent
754a34c4b2
commit
490bccc5a1
20
Readme.md
20
Readme.md
@ -13,6 +13,14 @@ Although it keeps the same look and feel as its parent application **SDRangelove
|
|||||||
- fix: production fixes that can't wait
|
- fix: production fixes that can't wait
|
||||||
- legacy: the modified code from the parent application [hexameron rtl-sdrangelove](https://github.com/hexameron/rtl-sdrangelove) before a major redeisign of the code was carried out and sync was lost.
|
- legacy: the modified code from the parent application [hexameron rtl-sdrangelove](https://github.com/hexameron/rtl-sdrangelove) before a major redeisign of the code was carried out and sync was lost.
|
||||||
|
|
||||||
|
<h2>Untested plugins</h2>
|
||||||
|
|
||||||
|
These plugins come from the parent code base and have been maintained so that they compile but they are not being actively tested:
|
||||||
|
|
||||||
|
- Channels:
|
||||||
|
- lora
|
||||||
|
- tcpsrc
|
||||||
|
|
||||||
<h2>Unsupported plugins</h2>
|
<h2>Unsupported plugins</h2>
|
||||||
|
|
||||||
These plugins come from the parent code base and are still present in the source tree but are not part of the build:
|
These plugins come from the parent code base and are still present in the source tree but are not part of the build:
|
||||||
@ -25,14 +33,6 @@ These plugins come from the parent code base and are still present in the source
|
|||||||
- v4l-msi
|
- v4l-msi
|
||||||
- v4l-rtl
|
- v4l-rtl
|
||||||
|
|
||||||
<h2>Untested plugins</h2>
|
|
||||||
|
|
||||||
These plugins come from the parent code base and have been maintained so that they compile but they are not being actively tested:
|
|
||||||
|
|
||||||
- Channels:
|
|
||||||
- lora
|
|
||||||
- tcpsrc
|
|
||||||
|
|
||||||
<h3>Gnuradio</h3>
|
<h3>Gnuradio</h3>
|
||||||
|
|
||||||
The Gnuradio plugin source needs extra packages, including `liblog4cpp-dev libboost-system-dev gnuradio-dev libosmosdr-dev`
|
The Gnuradio plugin source needs extra packages, including `liblog4cpp-dev libboost-system-dev gnuradio-dev libosmosdr-dev`
|
||||||
@ -176,6 +176,7 @@ For Debian Jessie or Stretch:
|
|||||||
- Coarse and fine trigger level sliders
|
- Coarse and fine trigger level sliders
|
||||||
- Minimalist recording (no file choice)
|
- Minimalist recording (no file choice)
|
||||||
- File sample source plugin (recording reader)
|
- File sample source plugin (recording reader)
|
||||||
|
- Trace history in the Channel Analyzer
|
||||||
|
|
||||||
<h2>Major redesign</h2>
|
<h2>Major redesign</h2>
|
||||||
|
|
||||||
@ -198,8 +199,9 @@ For Debian Jessie or Stretch:
|
|||||||
- Tx channels
|
- Tx channels
|
||||||
- Possibility to connect channels for example Rx to Tx or single Rx channel to dual Rx channel supporting MI(MO) features like 360 degree polarization detection.
|
- Possibility to connect channels for example Rx to Tx or single Rx channel to dual Rx channel supporting MI(MO) features like 360 degree polarization detection.
|
||||||
- Specialize plugins into channel and sample source plugins since both have almost complete different requirements and only little in common
|
- Specialize plugins into channel and sample source plugins since both have almost complete different requirements and only little in common
|
||||||
|
- Scope: trigger countdown
|
||||||
|
- Scope: multiple trigger chaining
|
||||||
- 32 bit samples for the Channel Analyzer
|
- 32 bit samples for the Channel Analyzer
|
||||||
- Trace history in the Channel Analyzer
|
|
||||||
- Enhance presets management (Edit, Move, Import/Export from/to human readable format like JSON).
|
- Enhance presets management (Edit, Move, Import/Export from/to human readable format like JSON).
|
||||||
- Headless mode based on a saved configuration in above human readable form
|
- Headless mode based on a saved configuration in above human readable form
|
||||||
- Allow arbitrary sample rate for channelizers and demodulators (not multiple of 48 kHz). Prerequisite for polyphase channelizer
|
- Allow arbitrary sample rate for channelizers and demodulators (not multiple of 48 kHz). Prerequisite for polyphase channelizer
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "dsp/scopevis.h"
|
#include "dsp/scopevis.h"
|
||||||
#include "gui/scaleengine.h"
|
#include "gui/scaleengine.h"
|
||||||
#include "util/export.h"
|
#include "util/export.h"
|
||||||
|
#include "util/bitfieldindex.h"
|
||||||
|
|
||||||
class DSPEngine;
|
class DSPEngine;
|
||||||
class ScopeVis;
|
class ScopeVis;
|
||||||
@ -70,15 +71,18 @@ public:
|
|||||||
void setTriggerChannel(ScopeVis::TriggerChannel triggerChannel);
|
void setTriggerChannel(ScopeVis::TriggerChannel triggerChannel);
|
||||||
void setTriggerLevel(Real triggerLevel);
|
void setTriggerLevel(Real triggerLevel);
|
||||||
void setTriggerPre(Real triggerPre);
|
void setTriggerPre(Real triggerPre);
|
||||||
|
void setMemHistoryShift(int value);
|
||||||
|
|
||||||
void newTrace(const std::vector<Complex>& trace, int sampleRate);
|
void newTrace(const std::vector<Complex>& trace, int sampleRate);
|
||||||
int getTraceSize() const { return m_rawTrace.size(); }
|
int getTraceSize() const { return m_rawTrace[m_memTraceIndex - m_memTraceHistory].size(); }
|
||||||
|
|
||||||
void setSampleRate(int sampleRate);
|
void setSampleRate(int sampleRate);
|
||||||
int getSampleRate() const { return m_sampleRate; }
|
int getSampleRate() const { return m_sampleRate; }
|
||||||
Mode getDataMode() const { return m_mode; }
|
Mode getDataMode() const { return m_mode; }
|
||||||
void connectTimer(const QTimer& timer);
|
void connectTimer(const QTimer& timer);
|
||||||
|
|
||||||
|
static const int m_memHistorySizeLog2 = 4;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void traceSizeChanged(int);
|
void traceSizeChanged(int);
|
||||||
void sampleRateChanged(int);
|
void sampleRateChanged(int);
|
||||||
@ -94,7 +98,11 @@ private:
|
|||||||
Qt::Orientation m_orientation;
|
Qt::Orientation m_orientation;
|
||||||
|
|
||||||
// traces
|
// traces
|
||||||
std::vector<Complex> m_rawTrace;
|
std::vector<Complex> m_rawTrace[1<<m_memHistorySizeLog2];
|
||||||
|
int m_sampleRates[16];
|
||||||
|
BitfieldIndex<m_memHistorySizeLog2> m_memTraceIndex; //!< current index of trace being written
|
||||||
|
BitfieldIndex<m_memHistorySizeLog2> m_memTraceHistory; //!< trace index shift into history
|
||||||
|
bool m_memTraceRecall;
|
||||||
std::vector<Complex> m_mathTrace;
|
std::vector<Complex> m_mathTrace;
|
||||||
std::vector<Complex>* m_displayTrace;
|
std::vector<Complex>* m_displayTrace;
|
||||||
std::vector<Real> m_powTrace;
|
std::vector<Real> m_powTrace;
|
||||||
|
@ -93,6 +93,7 @@ private slots:
|
|||||||
void on_traceIntensity_valueChanged(int index);
|
void on_traceIntensity_valueChanged(int index);
|
||||||
void on_trigPre_valueChanged(int value);
|
void on_trigPre_valueChanged(int value);
|
||||||
void on_trigDelay_valueChanged(int value);
|
void on_trigDelay_valueChanged(int value);
|
||||||
|
void on_memHistory_valueChanged(int value);
|
||||||
|
|
||||||
void on_horizView_clicked();
|
void on_horizView_clicked();
|
||||||
void on_vertView_clicked();
|
void on_vertView_clicked();
|
||||||
|
@ -21,7 +21,10 @@ GLScope::GLScope(QWidget* parent) :
|
|||||||
m_mode(ModeIQ),
|
m_mode(ModeIQ),
|
||||||
m_displays(DisplayBoth),
|
m_displays(DisplayBoth),
|
||||||
m_orientation(Qt::Horizontal),
|
m_orientation(Qt::Horizontal),
|
||||||
m_displayTrace(&m_rawTrace),
|
m_memTraceIndex(0),
|
||||||
|
m_memTraceHistory(0),
|
||||||
|
m_memTraceRecall(false),
|
||||||
|
m_displayTrace(&m_rawTrace[0]),
|
||||||
m_oldTraceSize(-1),
|
m_oldTraceSize(-1),
|
||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
m_amp1(1.0),
|
m_amp1(1.0),
|
||||||
@ -82,10 +85,10 @@ void GLScope::setDSPEngine(DSPEngine* dspEngine)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GLScope::setSampleRate(int sampleRate) {
|
void GLScope::setSampleRate(int sampleRate) {
|
||||||
m_sampleRate = sampleRate;
|
m_sampleRates[m_memTraceIndex-m_memTraceHistory] = sampleRate;
|
||||||
m_configChanged = true;
|
m_configChanged = true;
|
||||||
update();
|
update();
|
||||||
emit sampleRateChanged(m_sampleRate);
|
emit sampleRateChanged(m_sampleRates[m_memTraceIndex-m_memTraceHistory]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLScope::setAmp1(Real amp)
|
void GLScope::setAmp1(Real amp)
|
||||||
@ -181,19 +184,24 @@ void GLScope::setDisplayTraceIntensity(int intensity)
|
|||||||
|
|
||||||
void GLScope::newTrace(const std::vector<Complex>& trace, int sampleRate)
|
void GLScope::newTrace(const std::vector<Complex>& trace, int sampleRate)
|
||||||
{
|
{
|
||||||
if(!m_mutex.tryLock(2))
|
if (!m_memTraceRecall)
|
||||||
return;
|
{
|
||||||
if(m_dataChanged) {
|
if(!m_mutex.tryLock(2))
|
||||||
|
return;
|
||||||
|
if(m_dataChanged) {
|
||||||
|
m_mutex.unlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_memTraceIndex++;
|
||||||
|
m_rawTrace[m_memTraceIndex] = trace;
|
||||||
|
m_sampleRates[m_memTraceIndex] = sampleRate;
|
||||||
|
|
||||||
|
//m_sampleRate = sampleRate; // sampleRate comes from scopeVis
|
||||||
|
m_dataChanged = true;
|
||||||
|
|
||||||
m_mutex.unlock();
|
m_mutex.unlock();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_rawTrace = trace;
|
|
||||||
|
|
||||||
m_sampleRate = sampleRate; // sampleRate comes from scopeVis
|
|
||||||
m_dataChanged = true;
|
|
||||||
|
|
||||||
m_mutex.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLScope::initializeGL()
|
void GLScope::initializeGL()
|
||||||
@ -345,7 +353,7 @@ void GLScope::paintGL()
|
|||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
//glEnable(GL_LINE_SMOOTH);
|
//glEnable(GL_LINE_SMOOTH);
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
|
glColor4f(0, 1, 0, 0.4);
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
|
|
||||||
float posLimit = 1.0 / m_amp1;
|
float posLimit = 1.0 / m_amp1;
|
||||||
@ -547,7 +555,7 @@ void GLScope::paintGL()
|
|||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
//glEnable(GL_LINE_SMOOTH);
|
//glEnable(GL_LINE_SMOOTH);
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
glColor4f(0, 1, 0, m_displayTraceIntensity / 100.0);
|
glColor4f(0, 1, 0, 0.4);
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
|
|
||||||
float posLimit = 1.0 / m_amp2;
|
float posLimit = 1.0 / m_amp2;
|
||||||
@ -658,14 +666,16 @@ void GLScope::mousePressEvent(QMouseEvent* event)
|
|||||||
|
|
||||||
void GLScope::handleMode()
|
void GLScope::handleMode()
|
||||||
{
|
{
|
||||||
|
BitfieldIndex<m_memHistorySizeLog2> memIndex = m_memTraceIndex - m_memTraceHistory;
|
||||||
|
|
||||||
switch(m_mode) {
|
switch(m_mode) {
|
||||||
case ModeIQ:
|
case ModeIQ:
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size());
|
m_mathTrace.resize(m_rawTrace[memIndex].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[memIndex];
|
||||||
|
|
||||||
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src) {
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src) {
|
||||||
*dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs2);
|
*dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -678,10 +688,10 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeMagLinPha:
|
case ModeMagLinPha:
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size());
|
m_mathTrace.resize(m_rawTrace[memIndex].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[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src)
|
||||||
{
|
{
|
||||||
*dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (arg(*src) / M_PI) - m_ofs2);
|
*dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (arg(*src) / M_PI) - m_ofs2);
|
||||||
}
|
}
|
||||||
@ -695,12 +705,12 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeMagdBPha:
|
case ModeMagdBPha:
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size());
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
||||||
m_powTrace.resize(m_rawTrace.size());
|
m_powTrace.resize(m_rawTrace[memIndex].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[memIndex].begin(); src != m_rawTrace[memIndex].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 = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
|
v = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
|
||||||
@ -717,11 +727,11 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeMagLinDPha:
|
case ModeMagLinDPha:
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size());
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
||||||
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
||||||
Real curArg;
|
Real curArg;
|
||||||
|
|
||||||
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src)
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src)
|
||||||
{
|
{
|
||||||
curArg = arg(*src) - m_prevArg;
|
curArg = arg(*src) - m_prevArg;
|
||||||
|
|
||||||
@ -744,13 +754,13 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeMagdBDPha:
|
case ModeMagdBDPha:
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size());
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
||||||
m_powTrace.resize(m_rawTrace.size());
|
m_powTrace.resize(m_rawTrace[memIndex].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();
|
||||||
Real curArg;
|
Real curArg;
|
||||||
|
|
||||||
for(std::vector<Complex>::const_iterator src = m_rawTrace.begin(); src != m_rawTrace.end(); ++src)
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].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;
|
||||||
@ -777,16 +787,16 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeDerived12:
|
case ModeDerived12:
|
||||||
{
|
{
|
||||||
if(m_rawTrace.size() > 3)
|
if(m_rawTrace[memIndex].size() > 3)
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size() - 3);
|
m_mathTrace.resize(m_rawTrace[memIndex].size() - 3);
|
||||||
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
||||||
|
|
||||||
for(uint i = 3; i < m_rawTrace.size() ; i++)
|
for(uint i = 3; i < m_rawTrace[memIndex].size() ; i++)
|
||||||
{
|
{
|
||||||
*dst++ = Complex(
|
*dst++ = Complex(
|
||||||
abs(m_rawTrace[i] - m_rawTrace[i - 1]),
|
abs(m_rawTrace[memIndex][i] - m_rawTrace[memIndex][i - 1]),
|
||||||
abs(m_rawTrace[i] - m_rawTrace[i - 1]) - abs(m_rawTrace[i - 2] - m_rawTrace[i - 3]));
|
abs(m_rawTrace[memIndex][i] - m_rawTrace[memIndex][i - 1]) - abs(m_rawTrace[memIndex][i - 2] - m_rawTrace[0][i - 3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_displayTrace = &m_mathTrace;
|
m_displayTrace = &m_mathTrace;
|
||||||
@ -796,13 +806,13 @@ void GLScope::handleMode()
|
|||||||
}
|
}
|
||||||
case ModeCyclostationary:
|
case ModeCyclostationary:
|
||||||
{
|
{
|
||||||
if(m_rawTrace.size() > 2)
|
if(m_rawTrace[0].size() > 2)
|
||||||
{
|
{
|
||||||
m_mathTrace.resize(m_rawTrace.size() - 2);
|
m_mathTrace.resize(m_rawTrace[memIndex].size() - 2);
|
||||||
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
||||||
|
|
||||||
for(uint i = 2; i < m_rawTrace.size() ; i++)
|
for(uint i = 2; i < m_rawTrace[memIndex].size() ; i++)
|
||||||
*dst++ = Complex(abs(m_rawTrace[i] - conj(m_rawTrace[i - 1])), 0);
|
*dst++ = Complex(abs(m_rawTrace[memIndex][i] - conj(m_rawTrace[memIndex][i - 1])), 0);
|
||||||
|
|
||||||
m_displayTrace = &m_mathTrace;
|
m_displayTrace = &m_mathTrace;
|
||||||
}
|
}
|
||||||
@ -889,8 +899,8 @@ void GLScope::applyConfig()
|
|||||||
float amp1_ofs = m_ofs1;
|
float amp1_ofs = m_ofs1;
|
||||||
float amp2_range = 2.0 / m_amp2;
|
float amp2_range = 2.0 / m_amp2;
|
||||||
float amp2_ofs = m_ofs2;
|
float amp2_ofs = m_ofs2;
|
||||||
float t_start = ((m_timeOfsProMill / 1000.0) - m_triggerPre) * ((float) m_displayTrace->size() / m_sampleRate);
|
float t_start = ((m_timeOfsProMill / 1000.0) - m_triggerPre) * ((float) m_displayTrace->size() / m_sampleRates[m_memTraceIndex-m_memTraceHistory]);
|
||||||
float t_len = ((float) m_displayTrace->size() / m_sampleRate) / (float) m_timeBase;
|
float t_len = ((float) m_displayTrace->size() / m_sampleRates[m_memTraceIndex-m_memTraceHistory]) / (float) m_timeBase;
|
||||||
|
|
||||||
m_x1Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
m_x1Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
||||||
m_x2Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
m_x2Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
||||||
@ -1549,6 +1559,13 @@ void GLScope::setTriggerPre(Real triggerPre)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLScope::setMemHistoryShift(int value)
|
||||||
|
{
|
||||||
|
m_memTraceHistory = value;
|
||||||
|
m_configChanged = true;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
void GLScope::connectTimer(const QTimer& timer)
|
void GLScope::connectTimer(const QTimer& timer)
|
||||||
{
|
{
|
||||||
qDebug() << "GLScope::connectTimer";
|
qDebug() << "GLScope::connectTimer";
|
||||||
|
@ -51,6 +51,7 @@ void GLScopeGUI::setBuddies(MessageQueue* messageQueue, ScopeVis* scopeVis, GLSc
|
|||||||
m_messageQueue = messageQueue;
|
m_messageQueue = messageQueue;
|
||||||
m_scopeVis = scopeVis;
|
m_scopeVis = scopeVis;
|
||||||
m_glScope = glScope;
|
m_glScope = glScope;
|
||||||
|
ui->memHistory->setMaximum((1<<GLScope::m_memHistorySizeLog2)-1);
|
||||||
connect(m_glScope, SIGNAL(traceSizeChanged(int)), this, SLOT(on_scope_traceSizeChanged(int)));
|
connect(m_glScope, SIGNAL(traceSizeChanged(int)), this, SLOT(on_scope_traceSizeChanged(int)));
|
||||||
connect(m_glScope, SIGNAL(sampleRateChanged(int)), this, SLOT(on_scope_sampleRateChanged(int)));
|
connect(m_glScope, SIGNAL(sampleRateChanged(int)), this, SLOT(on_scope_sampleRateChanged(int)));
|
||||||
applySettings();
|
applySettings();
|
||||||
@ -734,6 +735,18 @@ void GLScopeGUI::on_trigLevelFine_valueChanged(int value)
|
|||||||
applyTriggerSettings();
|
applyTriggerSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLScopeGUI::on_memHistory_valueChanged(int value)
|
||||||
|
{
|
||||||
|
QString text;
|
||||||
|
text.sprintf("%02d", value % (1<<GLScope::m_memHistorySizeLog2));
|
||||||
|
ui->memIndexText->setText(text);
|
||||||
|
|
||||||
|
if(m_glScope != NULL)
|
||||||
|
{
|
||||||
|
m_glScope->setMemHistoryShift(value % (1<<GLScope::m_memHistorySizeLog2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GLScopeGUI::on_slopePos_clicked()
|
void GLScopeGUI::on_slopePos_clicked()
|
||||||
{
|
{
|
||||||
m_triggerPositiveEdge = true;
|
m_triggerPositiveEdge = true;
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>811</width>
|
<width>616</width>
|
||||||
<height>126</height>
|
<height>112</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -354,6 +354,132 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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="ampLine">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDial" name="gridIntensity">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>24</width>
|
||||||
|
<height>24</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Grid intensity</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="rowSep1">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="row3Layout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="memText">
|
||||||
|
<property name="text">
|
||||||
|
<string>Mem</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QDial" name="memHistory">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>24</width>
|
||||||
|
<height>24</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Move in trace history</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="memIndexText">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Trace history index</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>00</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="traceLenLine">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="amp1Label">
|
<widget class="QLabel" name="amp1Label">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -484,185 +610,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="Line" name="ampLine">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDial" name="gridIntensity">
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>24</width>
|
|
||||||
<height>24</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Grid intensity</string>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>100</number>
|
|
||||||
</property>
|
|
||||||
<property name="pageStep">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="Line" name="rowSep1">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="row3Layout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="memText">
|
|
||||||
<property name="text">
|
|
||||||
<string>Mem</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="ButtonSwitch" name="memButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Trace memory</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/res.qrc">
|
|
||||||
<normaloff>:/mem.png</normaloff>:/mem.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="autoRaise">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="memPlayButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Replay memorized trace</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/res.qrc">
|
|
||||||
<normaloff>:/play.png</normaloff>:/play.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="memMinusButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Go back one trace in history (newer)</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/res.qrc">
|
|
||||||
<normaloff>:/minusw.png</normaloff>:/minusw.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="memIndexText">
|
|
||||||
<property name="text">
|
|
||||||
<string>00</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="memPlusButton">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Go one more trace in history (older)</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="../resources/res.qrc">
|
|
||||||
<normaloff>:/plusw.png</normaloff>:/plusw.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</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="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>
|
<item>
|
||||||
<widget class="Line" name="amp2Line">
|
<widget class="Line" name="amp2Line">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user