2014-05-18 11:52:39 -04:00
|
|
|
#include <QPainter>
|
|
|
|
#include <QMouseEvent>
|
|
|
|
#include "gui/glscope.h"
|
|
|
|
#include "dsp/dspengine.h"
|
|
|
|
|
2015-07-14 05:47:03 -04:00
|
|
|
#include <algorithm>
|
2015-08-09 04:33:04 -04:00
|
|
|
#include <QDebug>
|
2015-07-06 03:17:51 -04:00
|
|
|
|
2015-10-26 23:56:52 -04:00
|
|
|
/*
|
2014-05-18 11:52:39 -04:00
|
|
|
#ifdef _WIN32
|
|
|
|
static double log2f(double n)
|
|
|
|
{
|
|
|
|
return log(n) / log(2.0);
|
|
|
|
}
|
2015-10-26 23:56:52 -04:00
|
|
|
#endif*/
|
2014-05-18 11:52:39 -04:00
|
|
|
|
|
|
|
GLScope::GLScope(QWidget* parent) :
|
|
|
|
QGLWidget(parent),
|
|
|
|
m_dataChanged(false),
|
|
|
|
m_configChanged(true),
|
|
|
|
m_mode(ModeIQ),
|
2015-07-12 16:22:04 -04:00
|
|
|
m_displays(DisplayBoth),
|
2014-05-18 11:52:39 -04:00
|
|
|
m_orientation(Qt::Horizontal),
|
2015-11-02 21:08:48 -05:00
|
|
|
m_memTraceIndex(0),
|
|
|
|
m_memTraceHistory(0),
|
|
|
|
m_memTraceRecall(false),
|
|
|
|
m_displayTrace(&m_rawTrace[0]),
|
2014-05-18 11:52:39 -04:00
|
|
|
m_oldTraceSize(-1),
|
|
|
|
m_sampleRate(0),
|
2015-07-14 04:39:41 -04:00
|
|
|
m_amp1(1.0),
|
|
|
|
m_amp2(1.0),
|
|
|
|
m_ofs1(0.0),
|
|
|
|
m_ofs2(0.0),
|
2014-05-18 11:52:39 -04:00
|
|
|
m_dspEngine(NULL),
|
|
|
|
m_scopeVis(NULL),
|
2015-11-01 01:27:39 -04:00
|
|
|
//m_amp(1.0),
|
|
|
|
//m_ofs(0.0),
|
2014-05-18 11:52:39 -04:00
|
|
|
m_timeBase(1),
|
|
|
|
m_timeOfsProMill(0),
|
2015-06-23 16:52:27 -04:00
|
|
|
m_triggerChannel(ScopeVis::TriggerFreeRun),
|
2015-07-14 04:39:41 -04:00
|
|
|
m_triggerLevel(0.0),
|
2015-07-26 20:12:37 -04:00
|
|
|
m_triggerPre(0.0),
|
2015-10-31 07:33:59 -04:00
|
|
|
m_triggerLevelDis1(0.0),
|
|
|
|
m_triggerLevelDis2(0.0),
|
2015-10-29 04:24:08 -04:00
|
|
|
m_prevArg(0),
|
2015-07-14 04:39:41 -04:00
|
|
|
m_displayGridIntensity(5),
|
2015-07-18 05:27:09 -04:00
|
|
|
m_displayTraceIntensity(50),
|
2015-07-14 04:39:41 -04:00
|
|
|
m_left1ScaleTextureAllocated(false),
|
|
|
|
m_left2ScaleTextureAllocated(false),
|
|
|
|
m_bot1ScaleTextureAllocated(false),
|
2015-10-28 21:35:20 -04:00
|
|
|
m_bot2ScaleTextureAllocated(false),
|
|
|
|
m_powerOverlayTextureAllocated1(false),
|
|
|
|
m_powerOverlayFont(font())
|
2014-05-18 11:52:39 -04:00
|
|
|
{
|
|
|
|
setAttribute(Qt::WA_OpaquePaintEvent);
|
|
|
|
connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
|
|
|
|
m_timer.start(50);
|
2015-07-07 20:05:32 -04:00
|
|
|
m_y1Scale.setFont(font());
|
|
|
|
m_y1Scale.setOrientation(Qt::Vertical);
|
|
|
|
m_y2Scale.setFont(font());
|
|
|
|
m_y2Scale.setOrientation(Qt::Vertical);
|
|
|
|
m_x1Scale.setFont(font());
|
|
|
|
m_x1Scale.setOrientation(Qt::Horizontal);
|
|
|
|
m_x2Scale.setFont(font());
|
|
|
|
m_x2Scale.setOrientation(Qt::Horizontal);
|
2015-10-28 21:35:20 -04:00
|
|
|
m_powerOverlayFont.setBold(true);
|
|
|
|
m_powerOverlayFont.setPointSize(font().pointSize()+1);
|
2014-05-18 11:52:39 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
GLScope::~GLScope()
|
|
|
|
{
|
|
|
|
if(m_dspEngine != NULL) {
|
|
|
|
m_dspEngine->removeSink(m_scopeVis);
|
|
|
|
delete m_scopeVis;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::setDSPEngine(DSPEngine* dspEngine)
|
|
|
|
{
|
|
|
|
if((m_dspEngine == NULL) && (dspEngine != NULL)) {
|
|
|
|
m_dspEngine = dspEngine;
|
|
|
|
m_scopeVis = new ScopeVis(this);
|
|
|
|
m_dspEngine->addSink(m_scopeVis);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-06 19:17:16 -04:00
|
|
|
void GLScope::setSampleRate(int sampleRate) {
|
2015-11-02 21:08:48 -05:00
|
|
|
m_sampleRates[m_memTraceIndex-m_memTraceHistory] = sampleRate;
|
2015-07-12 03:32:54 -04:00
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
2015-11-02 21:08:48 -05:00
|
|
|
emit sampleRateChanged(m_sampleRates[m_memTraceIndex-m_memTraceHistory]);
|
2015-07-06 19:17:16 -04:00
|
|
|
}
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
void GLScope::setAmp1(Real amp)
|
2014-05-18 11:52:39 -04:00
|
|
|
{
|
2015-10-31 07:33:59 -04:00
|
|
|
qDebug("GLScope::setAmp1: %f", amp);
|
|
|
|
m_amp1 = amp;
|
2015-07-06 03:17:51 -04:00
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
void GLScope::setAmp1Ofs(Real ampOfs)
|
2015-07-06 03:17:51 -04:00
|
|
|
{
|
2015-10-31 07:33:59 -04:00
|
|
|
qDebug("GLScope::setAmp1Ofs: %f", ampOfs);
|
|
|
|
m_ofs1 = ampOfs;
|
2015-07-06 03:17:51 -04:00
|
|
|
m_configChanged = true;
|
2014-05-18 11:52:39 -04:00
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2015-11-01 01:27:39 -04:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
void GLScope::setTimeBase(int timeBase)
|
|
|
|
{
|
|
|
|
m_timeBase = timeBase;
|
2015-07-07 20:05:32 -04:00
|
|
|
m_configChanged = true;
|
2014-05-18 11:52:39 -04:00
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::setTimeOfsProMill(int timeOfsProMill)
|
|
|
|
{
|
|
|
|
m_timeOfsProMill = timeOfsProMill;
|
2015-07-07 20:05:32 -04:00
|
|
|
m_configChanged = true;
|
2014-05-18 11:52:39 -04:00
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::setMode(Mode mode)
|
|
|
|
{
|
|
|
|
m_mode = mode;
|
|
|
|
m_dataChanged = true;
|
2015-07-08 20:21:54 -04:00
|
|
|
m_configChanged = true;
|
2014-05-18 11:52:39 -04:00
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
void GLScope::setDisplays(Displays displays)
|
|
|
|
{
|
|
|
|
m_displays = displays;
|
|
|
|
m_dataChanged = true;
|
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
void GLScope::setOrientation(Qt::Orientation orientation)
|
|
|
|
{
|
|
|
|
m_orientation = orientation;
|
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2015-06-23 16:52:27 -04:00
|
|
|
void GLScope::setDisplayGridIntensity(int intensity)
|
|
|
|
{
|
|
|
|
m_displayGridIntensity = intensity;
|
|
|
|
if (m_displayGridIntensity > 100) {
|
|
|
|
m_displayGridIntensity = 100;
|
2015-07-18 05:27:09 -04:00
|
|
|
} else if (m_displayGridIntensity < 0) {
|
|
|
|
m_displayGridIntensity = 0;
|
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::setDisplayTraceIntensity(int intensity)
|
|
|
|
{
|
|
|
|
m_displayTraceIntensity = intensity;
|
|
|
|
if (m_displayTraceIntensity > 100) {
|
|
|
|
m_displayTraceIntensity = 100;
|
|
|
|
} else if (m_displayTraceIntensity < 0) {
|
|
|
|
m_displayTraceIntensity = 0;
|
2015-06-23 16:52:27 -04:00
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
void GLScope::newTrace(const std::vector<Complex>& trace, int sampleRate)
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
if (!m_memTraceRecall)
|
|
|
|
{
|
|
|
|
if(!m_mutex.tryLock(2))
|
|
|
|
return;
|
|
|
|
if(m_dataChanged) {
|
|
|
|
m_mutex.unlock();
|
|
|
|
return;
|
|
|
|
}
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
m_memTraceIndex++;
|
|
|
|
m_rawTrace[m_memTraceIndex] = trace;
|
|
|
|
m_sampleRates[m_memTraceIndex] = sampleRate;
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
//m_sampleRate = sampleRate; // sampleRate comes from scopeVis
|
|
|
|
m_dataChanged = true;
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mutex.unlock();
|
|
|
|
}
|
2014-05-18 11:52:39 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::initializeGL()
|
|
|
|
{
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::resizeGL(int width, int height)
|
|
|
|
{
|
|
|
|
glViewport(0, 0, width, height);
|
|
|
|
m_configChanged = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::paintGL()
|
|
|
|
{
|
|
|
|
if(!m_mutex.tryLock(2))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if(m_configChanged)
|
|
|
|
applyConfig();
|
|
|
|
|
|
|
|
handleMode();
|
|
|
|
|
2014-11-21 10:41:58 -05:00
|
|
|
if(m_displayTrace->size() - m_oldTraceSize != 0) {
|
2014-05-18 11:52:39 -04:00
|
|
|
m_oldTraceSize = m_displayTrace->size();
|
|
|
|
emit traceSizeChanged(m_displayTrace->size());
|
|
|
|
}
|
|
|
|
|
|
|
|
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
glScalef(2.0, -2.0, 1.0);
|
|
|
|
glTranslatef(-0.50, -0.5, 0);
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
// I - primary display
|
2015-07-06 03:17:51 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if ((m_displays == DisplayBoth) || (m_displays == DisplayFirstOnly))
|
|
|
|
{
|
|
|
|
// draw rect around
|
2014-05-18 11:52:39 -04:00
|
|
|
glPushMatrix();
|
2015-07-12 16:22:04 -04:00
|
|
|
glTranslatef(m_glScopeRect1.x(), m_glScopeRect1.y(), 0);
|
|
|
|
glScalef(m_glScopeRect1.width(), m_glScopeRect1.height(), 1);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glLineWidth(1.0f);
|
2015-07-12 16:22:04 -04:00
|
|
|
glColor4f(1, 1, 1, 0.5);
|
2014-05-18 11:52:39 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
2015-07-12 16:22:04 -04:00
|
|
|
glVertex2f(1, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glVertex2f(0, 0);
|
|
|
|
glVertex2f(1, 0);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnd();
|
2015-07-12 16:22:04 -04:00
|
|
|
glDisable(GL_BLEND);
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
// paint grid
|
2015-07-14 04:39:41 -04:00
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glLineWidth(1.0f);
|
2015-07-12 16:22:04 -04:00
|
|
|
glColor4f(1, 1, 1, m_displayGridIntensity / 100.0);
|
2015-07-14 04:39:41 -04:00
|
|
|
// Horizontal Y1
|
|
|
|
tickList = &m_y1Scale.getTickList();
|
|
|
|
for(int i= 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
2015-07-14 06:10:59 -04:00
|
|
|
float y = 1 - (tick->pos / m_y1Scale.getSize());
|
2015-07-14 04:39:41 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
glVertex2f(0, y);
|
|
|
|
glVertex2f(1, y);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Vertical X1
|
|
|
|
tickList = &m_x1Scale.getTickList();
|
|
|
|
for(int i= 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
float x = tick->pos / m_x1Scale.getSize();
|
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
glVertex2f(x, 0);
|
|
|
|
glVertex2f(x, 1);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
}
|
2015-07-12 16:22:04 -04:00
|
|
|
}
|
2014-05-18 11:52:39 -04:00
|
|
|
glPopMatrix();
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
// paint left #1 scale
|
|
|
|
glBindTexture(GL_TEXTURE_2D, m_left1ScaleTexture);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glLeft1ScaleRect.x(), m_glLeft1ScaleRect.y(), 0);
|
|
|
|
glScalef(m_glLeft1ScaleRect.width(), m_glLeft1ScaleRect.height(), 1);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2f(0, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glTexCoord2f(1, 1);
|
|
|
|
glVertex2f(1, 1);
|
|
|
|
glTexCoord2f(1, 0);
|
|
|
|
glVertex2f(1, 0);
|
|
|
|
glTexCoord2f(0, 0);
|
|
|
|
glVertex2f(0, 0);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnd();
|
2015-07-12 16:22:04 -04:00
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
// paint bottom #1 scale
|
|
|
|
glBindTexture(GL_TEXTURE_2D, m_bot1ScaleTexture);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glBot1ScaleRect.x(), m_glBot1ScaleRect.y(), 0);
|
|
|
|
glScalef(m_glBot1ScaleRect.width(), m_glBot1ScaleRect.height(), 1);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2f(0, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glTexCoord2f(1, 1);
|
|
|
|
glVertex2f(1, 1);
|
|
|
|
glTexCoord2f(1, 0);
|
|
|
|
glVertex2f(1, 0);
|
|
|
|
glTexCoord2f(0, 0);
|
|
|
|
glVertex2f(0, 0);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnd();
|
2015-07-12 16:22:04 -04:00
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glPopMatrix();
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
// paint trigger level #1
|
2015-07-26 07:06:15 -04:00
|
|
|
if ((m_triggerChannel == ScopeVis::TriggerChannelI)
|
|
|
|
|| (m_triggerChannel == ScopeVis::TriggerMagLin)
|
|
|
|
|| (m_triggerChannel == ScopeVis::TriggerMagDb)
|
|
|
|
)
|
|
|
|
{
|
2015-07-12 16:22:04 -04:00
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glScopeRect1.x(), m_glScopeRect1.y() + m_glScopeRect1.height() / 2.0, 0);
|
|
|
|
glScalef(m_glScopeRect1.width(), -(m_glScopeRect1.height() / 2) * m_amp1, 1);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
2015-10-19 17:40:17 -04:00
|
|
|
//glEnable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glLineWidth(1.0f);
|
2015-11-02 21:08:48 -05:00
|
|
|
glColor4f(0, 1, 0, 0.4);
|
2015-07-12 16:22:04 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
2015-07-26 07:06:15 -04:00
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
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))
|
2015-07-26 11:33:30 -04:00
|
|
|
{
|
2015-10-31 07:33:59 -04:00
|
|
|
if ((m_triggerLevelDis1 > negLimit) && (m_triggerLevelDis1 < posLimit))
|
|
|
|
{
|
|
|
|
glVertex2f(0, m_triggerLevelDis1);
|
|
|
|
glVertex2f(1, m_triggerLevelDis1);
|
|
|
|
}
|
2015-07-26 11:33:30 -04:00
|
|
|
}
|
2015-07-26 07:06:15 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
glEnd();
|
2015-10-19 17:40:17 -04:00
|
|
|
//glDisable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
// paint trace #1
|
2015-10-26 23:56:52 -04:00
|
|
|
if(m_displayTrace->size() > 0)
|
|
|
|
{
|
2015-07-12 16:22:04 -04:00
|
|
|
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);
|
2015-10-19 17:40:17 -04:00
|
|
|
//glEnable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glLineWidth(1.0f);
|
2015-07-18 05:27:09 -04:00
|
|
|
glColor4f(1, 1, 0.25f, m_displayTraceIntensity / 100.0);
|
2015-07-14 05:47:03 -04:00
|
|
|
int start = (m_timeOfsProMill/1000.0) * m_displayTrace->size();
|
|
|
|
int end = std::min(start + m_displayTrace->size()/m_timeBase, m_displayTrace->size());
|
2015-07-12 16:22:04 -04:00
|
|
|
if(end - start < 2)
|
|
|
|
start--;
|
|
|
|
float posLimit = 1.0 / m_amp1;
|
|
|
|
float negLimit = -1.0 / m_amp1;
|
2015-10-26 23:56:52 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
glBegin(GL_LINE_STRIP);
|
2015-10-26 23:56:52 -04:00
|
|
|
|
|
|
|
for(int i = start; i < end; i++)
|
|
|
|
{
|
2015-10-31 07:33:59 -04:00
|
|
|
float v = (*m_displayTrace)[i].real();
|
2015-07-12 16:22:04 -04:00
|
|
|
if(v > posLimit)
|
|
|
|
v = posLimit;
|
|
|
|
else if(v < negLimit)
|
|
|
|
v = negLimit;
|
|
|
|
glVertex2f(i - start, v);
|
2015-10-26 23:56:52 -04:00
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
if ((m_mode == ModeMagdBPha) || (m_mode == ModeMagdBDPha))
|
2015-10-26 23:56:52 -04:00
|
|
|
{
|
|
|
|
if (i == start)
|
|
|
|
{
|
|
|
|
m_maxPow = m_powTrace[i];
|
|
|
|
m_sumPow = m_powTrace[i];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (m_powTrace[i] > m_maxPow)
|
|
|
|
{
|
|
|
|
m_maxPow = m_powTrace[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
m_sumPow += m_powTrace[i];
|
|
|
|
}
|
|
|
|
}
|
2015-07-12 16:22:04 -04:00
|
|
|
}
|
2015-10-26 23:56:52 -04:00
|
|
|
|
|
|
|
m_nbPow = end - start;
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
glEnd();
|
2015-10-26 23:56:52 -04:00
|
|
|
|
2015-10-19 17:40:17 -04:00
|
|
|
//glDisable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glPopMatrix();
|
|
|
|
}
|
2015-07-26 20:12:37 -04:00
|
|
|
|
2015-10-26 23:56:52 -04:00
|
|
|
// Paint powers overlays
|
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
if ((m_mode == ModeMagdBPha) || (m_mode == ModeMagdBDPha))
|
2015-10-26 23:56:52 -04:00
|
|
|
{
|
|
|
|
if (m_nbPow > 0)
|
|
|
|
{
|
2015-10-28 21:35:20 -04:00
|
|
|
drawPowerOverlay();
|
2015-10-26 23:56:52 -04:00
|
|
|
}
|
|
|
|
}
|
2015-07-12 16:22:04 -04:00
|
|
|
} // Both displays or primary only
|
|
|
|
|
|
|
|
// Q - secondary display
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if ((m_displays == DisplayBoth) || (m_displays == DisplaySecondOnly))
|
|
|
|
{
|
|
|
|
// draw rect around
|
2014-05-18 11:52:39 -04:00
|
|
|
glPushMatrix();
|
2015-07-12 16:22:04 -04:00
|
|
|
glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y(), 0);
|
|
|
|
glScalef(m_glScopeRect2.width(), m_glScopeRect2.height(), 1);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glLineWidth(1.0f);
|
2015-07-12 16:22:04 -04:00
|
|
|
glColor4f(1, 1, 1, 0.5);
|
2014-05-18 11:52:39 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
2015-07-12 16:22:04 -04:00
|
|
|
glVertex2f(1, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glVertex2f(0, 0);
|
|
|
|
glVertex2f(1, 0);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnd();
|
2015-07-12 16:22:04 -04:00
|
|
|
glDisable(GL_BLEND);
|
2014-05-18 11:52:39 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
// paint grid
|
2015-07-14 04:39:41 -04:00
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glLineWidth(1.0f);
|
2015-07-12 16:22:04 -04:00
|
|
|
glColor4f(1, 1, 1, m_displayGridIntensity / 100.0);
|
2015-07-14 04:39:41 -04:00
|
|
|
// Horizontal Y2
|
|
|
|
tickList = &m_y2Scale.getTickList();
|
|
|
|
for(int i= 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
2015-07-14 06:10:59 -04:00
|
|
|
float y = 1 - (tick->pos / m_y2Scale.getSize());
|
2015-07-14 04:39:41 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
glVertex2f(0, y);
|
|
|
|
glVertex2f(1, y);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Vertical X2
|
|
|
|
tickList = &m_x2Scale.getTickList();
|
|
|
|
for(int i= 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
float x = tick->pos / m_x2Scale.getSize();
|
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
glVertex2f(x, 0);
|
|
|
|
glVertex2f(x, 1);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
}
|
2015-07-12 16:22:04 -04:00
|
|
|
}
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
// paint left #2 scale
|
|
|
|
glBindTexture(GL_TEXTURE_2D, m_left2ScaleTexture);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glLeft2ScaleRect.x(), m_glLeft2ScaleRect.y(), 0);
|
|
|
|
glScalef(m_glLeft2ScaleRect.width(), m_glLeft2ScaleRect.height(), 1);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2f(0, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glTexCoord2f(1, 1);
|
|
|
|
glVertex2f(1, 1);
|
|
|
|
glTexCoord2f(1, 0);
|
|
|
|
glVertex2f(1, 0);
|
|
|
|
glTexCoord2f(0, 0);
|
|
|
|
glVertex2f(0, 0);
|
2014-05-18 11:52:39 -04:00
|
|
|
glEnd();
|
2015-07-12 16:22:04 -04:00
|
|
|
glDisable(GL_TEXTURE_2D);
|
2014-05-18 11:52:39 -04:00
|
|
|
glPopMatrix();
|
2015-07-12 16:22:04 -04:00
|
|
|
|
|
|
|
// paint bottom #2 scale
|
|
|
|
glBindTexture(GL_TEXTURE_2D, m_bot2ScaleTexture);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glBot2ScaleRect.x(), m_glBot2ScaleRect.y(), 0);
|
|
|
|
glScalef(m_glBot2ScaleRect.width(), m_glBot2ScaleRect.height(), 1);
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2f(0, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glTexCoord2f(1, 1);
|
|
|
|
glVertex2f(1, 1);
|
|
|
|
glTexCoord2f(1, 0);
|
|
|
|
glVertex2f(1, 0);
|
|
|
|
glTexCoord2f(0, 0);
|
|
|
|
glVertex2f(0, 0);
|
|
|
|
glEnd();
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
glPopMatrix();
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
// paint trigger level #2
|
2015-07-26 20:12:37 -04:00
|
|
|
if ((m_triggerChannel == ScopeVis::TriggerPhase) || (m_triggerChannel == ScopeVis::TriggerChannelQ))
|
2015-07-26 07:06:15 -04:00
|
|
|
{
|
2015-07-12 16:22:04 -04:00
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef(m_glScopeRect2.x(), m_glScopeRect2.y() + m_glScopeRect2.height() / 2.0, 0);
|
|
|
|
glScalef(m_glScopeRect2.width(), -(m_glScopeRect2.height() / 2) * m_amp2, 1);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
2015-10-19 17:40:17 -04:00
|
|
|
//glEnable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glLineWidth(1.0f);
|
2015-11-02 21:08:48 -05:00
|
|
|
glColor4f(0, 1, 0, 0.4);
|
2015-07-12 16:22:04 -04:00
|
|
|
glBegin(GL_LINE_LOOP);
|
2015-11-01 01:27:39 -04:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
glEnd();
|
2015-10-19 17:40:17 -04:00
|
|
|
//glDisable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
// paint trace #2
|
2015-07-12 16:22:04 -04:00
|
|
|
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);
|
2015-10-19 17:40:17 -04:00
|
|
|
//glEnable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glLineWidth(1.0f);
|
2015-07-18 05:27:09 -04:00
|
|
|
glColor4f(1, 1, 0.25f, m_displayTraceIntensity / 100.0);
|
2015-07-14 05:47:03 -04:00
|
|
|
int start = (m_timeOfsProMill/1000.0) * m_displayTrace->size();
|
|
|
|
int end = std::min(start + m_displayTrace->size()/m_timeBase, m_displayTrace->size());
|
2015-07-12 16:22:04 -04:00
|
|
|
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();
|
2015-10-19 17:40:17 -04:00
|
|
|
//glDisable(GL_LINE_SMOOTH);
|
2015-07-12 16:22:04 -04:00
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
} // Both displays or secondary display only
|
2014-05-18 11:52:39 -04:00
|
|
|
|
|
|
|
glPopMatrix();
|
|
|
|
m_dataChanged = false;
|
|
|
|
m_mutex.unlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::mousePressEvent(QMouseEvent* event)
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
int x = event->x() - 10;
|
|
|
|
int y = event->y() - 10;
|
|
|
|
Real time;
|
|
|
|
Real amplitude;
|
|
|
|
ScopeVis::TriggerChannel channel;
|
|
|
|
if((x < 0) || (x >= width() - 20))
|
|
|
|
return;
|
|
|
|
if((y < 0) || (y >= height() - 20))
|
|
|
|
return;
|
|
|
|
|
|
|
|
if((m_sampleRate != 0) && (m_timeBase != 0) && (width() > 20))
|
|
|
|
time = ((Real)x * (Real)m_displayTrace->size()) / ((Real)m_sampleRate * (Real)m_timeBase * (Real)(width() - 20));
|
|
|
|
else time = -1.0;
|
|
|
|
|
|
|
|
if(y < (height() - 30) / 2) {
|
|
|
|
channel = ScopeVis::TriggerChannelI;
|
|
|
|
if((m_amp != 0) && (height() > 30))
|
|
|
|
amplitude = 2.0 * ((height() - 30) * 0.25 - (Real)y) / (m_amp * (height() - 30) / 2.0);
|
|
|
|
else amplitude = -1;
|
|
|
|
} else if(y > (height() - 30) / 2 + 10) {
|
|
|
|
y -= 10 + (height() - 30) / 2;
|
|
|
|
channel = ScopeVis::TriggerChannelQ;
|
|
|
|
if((m_amp != 0) && (height() > 30))
|
|
|
|
amplitude = 2.0 * ((height() - 30) * 0.25 - (Real)y) / (m_amp * (height() - 30) / 2.0);
|
|
|
|
else amplitude = -1;
|
|
|
|
} else {
|
|
|
|
channel = ScopeVis::TriggerFreeRun;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_dspEngine != NULL) {
|
|
|
|
qDebug("amp %f", amplitude);
|
2015-07-13 19:24:59 -04:00
|
|
|
m_triggerLevel = amplitude + 0.01 / m_amp;
|
2014-05-18 11:52:39 -04:00
|
|
|
m_triggerLevelLow = amplitude - 0.01 / m_amp;
|
2015-07-13 19:24:59 -04:00
|
|
|
if(m_triggerLevel > 1.0)
|
|
|
|
m_triggerLevel = 1.0;
|
|
|
|
else if(m_triggerLevel < -1.0)
|
|
|
|
m_triggerLevel = -1.0;
|
2014-05-18 11:52:39 -04:00
|
|
|
if(m_triggerLevelLow > 1.0)
|
|
|
|
m_triggerLevelLow = 1.0;
|
|
|
|
else if(m_triggerLevelLow < -1.0)
|
|
|
|
m_triggerLevelLow = -1.0;
|
2015-07-13 19:24:59 -04:00
|
|
|
m_scopeVis->configure(m_dspEngine->getMessageQueue(), channel, m_triggerLevel, m_triggerLevelLow);
|
2014-05-18 11:52:39 -04:00
|
|
|
m_triggerChannel = channel;
|
|
|
|
m_changed = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::handleMode()
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
BitfieldIndex<m_memHistorySizeLog2> memIndex = m_memTraceIndex - m_memTraceHistory;
|
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
switch(m_mode) {
|
2015-10-31 07:33:59 -04:00
|
|
|
case ModeIQ:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
2015-07-08 20:21:54 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
2015-11-02 21:08:48 -05:00
|
|
|
m_displayTrace = &m_rawTrace[memIndex];
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src) {
|
2015-11-01 01:27:39 -04:00
|
|
|
*dst++ = Complex(src->real() - m_ofs1, src->imag() - m_ofs2);
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
|
|
|
|
m_triggerLevelDis1 = m_triggerLevel - m_ofs1;
|
2015-11-01 01:27:39 -04:00
|
|
|
m_triggerLevelDis2 = m_triggerLevel - m_ofs2;
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2015-07-08 20:21:54 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
break;
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
case ModeMagLinPha:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
2014-05-18 11:52:39 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src)
|
2015-10-31 07:33:59 -04:00
|
|
|
{
|
2015-11-01 01:27:39 -04:00
|
|
|
*dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (arg(*src) / M_PI) - m_ofs2);
|
2015-10-31 07:33:59 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1;
|
2015-11-01 01:27:39 -04:00
|
|
|
m_triggerLevelDis2 = m_triggerLevel - m_ofs2;
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
case ModeMagdBPha:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
|
|
|
m_powTrace.resize(m_rawTrace[memIndex].size());
|
2014-05-18 11:52:39 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
2015-10-26 23:56:52 -04:00
|
|
|
std::vector<Real>::iterator powDst = m_powTrace.begin();
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src) {
|
2014-05-18 11:52:39 -04:00
|
|
|
Real v = src->real() * src->real() + src->imag() * src->imag();
|
2015-10-26 23:56:52 -04:00
|
|
|
*powDst++ = v;
|
2015-10-31 07:33:59 -04:00
|
|
|
v = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
|
2015-11-01 01:27:39 -04:00
|
|
|
*dst++ = Complex(v, (arg(*src) / M_PI) - m_ofs2);
|
2014-05-18 11:52:39 -04:00
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
|
|
|
|
Real tdB = (m_triggerLevel - 1) * 100.0f;
|
|
|
|
m_triggerLevelDis1 = 1.0f + 2.0f*(((tdB)/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
|
2015-11-01 01:27:39 -04:00
|
|
|
m_triggerLevelDis2 = m_triggerLevel - m_ofs2;
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
case ModeMagLinDPha:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
2015-10-29 04:24:08 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
|
|
|
Real curArg;
|
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src)
|
2015-10-29 04:24:08 -04:00
|
|
|
{
|
|
|
|
curArg = arg(*src) - m_prevArg;
|
2015-10-29 15:46:52 -04:00
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
if (curArg < -M_PI) {
|
2015-10-29 15:46:52 -04:00
|
|
|
curArg += 2.0 * M_PI;
|
2015-10-31 07:33:59 -04:00
|
|
|
} else if (curArg > M_PI) {
|
2015-10-29 15:46:52 -04:00
|
|
|
curArg -= 2.0 * M_PI;
|
|
|
|
}
|
|
|
|
|
2015-11-01 01:27:39 -04:00
|
|
|
*dst++ = Complex(abs(*src) - m_ofs1/2.0 - 1.0/m_amp1, (curArg / M_PI) - m_ofs2);
|
2015-10-29 04:24:08 -04:00
|
|
|
m_prevArg = arg(*src);
|
|
|
|
}
|
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
m_triggerLevelDis1 = (m_triggerLevel + 1) - m_ofs1/2.0 - 1.0/m_amp1;
|
2015-11-01 01:27:39 -04:00
|
|
|
m_triggerLevelDis2 = m_triggerLevel - m_ofs2;
|
2015-10-31 07:33:59 -04:00
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-10-31 07:33:59 -04:00
|
|
|
case ModeMagdBDPha:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size());
|
|
|
|
m_powTrace.resize(m_rawTrace[memIndex].size());
|
2015-10-29 04:24:08 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
|
|
|
std::vector<Real>::iterator powDst = m_powTrace.begin();
|
|
|
|
Real curArg;
|
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(std::vector<Complex>::const_iterator src = m_rawTrace[memIndex].begin(); src != m_rawTrace[memIndex].end(); ++src)
|
2015-10-29 04:24:08 -04:00
|
|
|
{
|
|
|
|
Real v = src->real() * src->real() + src->imag() * src->imag();
|
|
|
|
*powDst++ = v;
|
2015-10-31 07:33:59 -04:00
|
|
|
v = 1.0f + 2.0f*(((10.0f*log10f(v))/100.0f) - m_ofs1) + 1.0f - 1.0f/m_amp1;
|
2015-10-29 04:24:08 -04:00
|
|
|
curArg = arg(*src) - m_prevArg;
|
2015-10-29 15:46:52 -04:00
|
|
|
|
2015-10-31 07:33:59 -04:00
|
|
|
if (curArg < -M_PI) {
|
2015-10-29 15:46:52 -04:00
|
|
|
curArg += 2.0 * M_PI;
|
2015-10-31 07:33:59 -04:00
|
|
|
} else if (curArg > M_PI) {
|
2015-10-29 15:46:52 -04:00
|
|
|
curArg -= 2.0 * M_PI;
|
|
|
|
}
|
|
|
|
|
2015-11-01 01:27:39 -04:00
|
|
|
*dst++ = Complex(v, (curArg / M_PI) - m_ofs2);
|
2015-10-29 04:24:08 -04:00
|
|
|
m_prevArg = arg(*src);
|
|
|
|
}
|
|
|
|
|
2015-11-01 01:27:39 -04:00
|
|
|
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;
|
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2015-10-29 04:24:08 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
case ModeDerived12:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
if(m_rawTrace[memIndex].size() > 3)
|
2015-11-01 01:27:39 -04:00
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size() - 3);
|
2014-05-18 11:52:39 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(uint i = 3; i < m_rawTrace[memIndex].size() ; i++)
|
2015-11-01 01:27:39 -04:00
|
|
|
{
|
2014-05-18 11:52:39 -04:00
|
|
|
*dst++ = Complex(
|
2015-11-02 21:08:48 -05:00
|
|
|
abs(m_rawTrace[memIndex][i] - m_rawTrace[memIndex][i - 1]),
|
|
|
|
abs(m_rawTrace[memIndex][i] - m_rawTrace[memIndex][i - 1]) - abs(m_rawTrace[memIndex][i - 2] - m_rawTrace[0][i - 3]));
|
2014-05-18 11:52:39 -04:00
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
case ModeCyclostationary:
|
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
if(m_rawTrace[0].size() > 2)
|
2015-11-01 01:27:39 -04:00
|
|
|
{
|
2015-11-02 21:08:48 -05:00
|
|
|
m_mathTrace.resize(m_rawTrace[memIndex].size() - 2);
|
2014-05-18 11:52:39 -04:00
|
|
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
for(uint i = 2; i < m_rawTrace[memIndex].size() ; i++)
|
|
|
|
*dst++ = Complex(abs(m_rawTrace[memIndex][i] - conj(m_rawTrace[memIndex][i - 1])), 0);
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_displayTrace = &m_mathTrace;
|
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-28 21:35:20 -04:00
|
|
|
void GLScope::drawPowerOverlay()
|
2015-10-26 23:56:52 -04:00
|
|
|
{
|
2015-10-28 04:27:51 -04:00
|
|
|
double maxPow = 10.0f * log10f(m_maxPow);
|
|
|
|
double avgPow = 10.0f * log10f(m_sumPow / m_nbPow);
|
|
|
|
double peakToAvgPow = maxPow - avgPow;
|
|
|
|
|
2015-10-28 21:35:20 -04:00
|
|
|
QString text = QString("%1 %2 %3").arg(maxPow, 0, 'f', 1).arg(avgPow, 0, 'f', 1).arg(peakToAvgPow, 0, 'f', 1);
|
|
|
|
|
|
|
|
QFontMetricsF metrics(m_powerOverlayFont);
|
|
|
|
QRectF rect = metrics.boundingRect(text);
|
|
|
|
m_powerOverlayPixmap1 = QPixmap(rect.width() + 4.0f, rect.height());
|
|
|
|
m_powerOverlayPixmap1.fill(Qt::transparent);
|
|
|
|
QPainter painter(&m_powerOverlayPixmap1);
|
|
|
|
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing, false);
|
|
|
|
painter.fillRect(rect, QColor(0, 0, 0, 0x80));
|
2015-11-01 16:49:08 -05:00
|
|
|
painter.setPen(QColor(0xff, 0xff, 0xff, 0x80));
|
2015-10-28 21:35:20 -04:00
|
|
|
painter.setFont(m_powerOverlayFont);
|
|
|
|
painter.drawText(QPointF(0, rect.height() - 2.0f), text);
|
|
|
|
painter.end();
|
|
|
|
|
|
|
|
if (m_powerOverlayTextureAllocated1)
|
|
|
|
deleteTexture(m_powerOverlayTexture1);
|
|
|
|
m_powerOverlayTexture1 = bindTexture(m_powerOverlayPixmap1,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_powerOverlayTextureAllocated1 = true;
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, m_powerOverlayTexture1);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
|
|
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
|
|
|
|
|
|
float shiftX = m_glScopeRect1.width() - ((rect.width() + 4.0f) / width());
|
|
|
|
float shiftY = 6.0f / height();
|
2015-10-28 04:27:51 -04:00
|
|
|
|
2015-10-28 21:35:20 -04:00
|
|
|
glPushMatrix();
|
|
|
|
|
|
|
|
glTranslatef(m_glScopeRect1.x() + shiftX, m_glScopeRect1.y(), 0);
|
|
|
|
glScalef(rect.width() / (float) width(), rect.height() / (float) height(), 1);
|
|
|
|
|
|
|
|
glEnable(GL_TEXTURE_2D);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
glTexCoord2f(0, 1);
|
|
|
|
glVertex2f(0, 1);
|
|
|
|
glTexCoord2f(1, 1);
|
|
|
|
glVertex2f(1, 1);
|
|
|
|
glTexCoord2f(1, 0);
|
|
|
|
glVertex2f(1, 0);
|
|
|
|
glTexCoord2f(0, 0);
|
|
|
|
glVertex2f(0, 0);
|
|
|
|
glEnd();
|
|
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
|
|
|
|
glPopMatrix();
|
2015-10-26 23:56:52 -04:00
|
|
|
}
|
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
void GLScope::applyConfig()
|
|
|
|
{
|
|
|
|
m_configChanged = false;
|
|
|
|
|
2015-07-06 03:17:51 -04:00
|
|
|
QFontMetrics fm(font());
|
|
|
|
int M = fm.width("-");
|
|
|
|
|
2015-06-23 18:01:33 -04:00
|
|
|
int topMargin = 5;
|
|
|
|
int botMargin = 20;
|
2015-07-06 03:17:51 -04:00
|
|
|
int leftMargin = 35;
|
2015-06-23 18:01:33 -04:00
|
|
|
int rightMargin = 5;
|
|
|
|
|
2015-11-01 01:27:39 -04:00
|
|
|
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;
|
2015-11-02 21:08:48 -05:00
|
|
|
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_sampleRates[m_memTraceIndex-m_memTraceHistory]) / (float) m_timeBase;
|
2015-07-07 20:05:32 -04:00
|
|
|
|
2015-07-08 02:53:27 -04:00
|
|
|
m_x1Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
|
|
|
m_x2Scale.setRange(Unit::Time, t_start, t_start + t_len);
|
|
|
|
|
2015-07-08 20:21:54 -04:00
|
|
|
switch(m_mode) {
|
2015-11-01 01:27:39 -04:00
|
|
|
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);
|
2015-07-08 20:21:54 -04:00
|
|
|
} else {
|
2015-11-01 01:27:39 -04:00
|
|
|
m_y1Scale.setRange(Unit::None, - amp1_range * 0.5 + amp1_ofs, amp1_range * 0.5 + amp1_ofs);
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2015-07-08 20:21:54 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-10-29 04:24:08 -04:00
|
|
|
case ModeMagLinPha:
|
|
|
|
case ModeMagLinDPha:
|
|
|
|
{
|
2015-11-01 01:27:39 -04:00
|
|
|
if (amp1_range < 2.0) {
|
|
|
|
m_y1Scale.setRange(Unit::None, amp1_ofs * 500.0, amp1_range * 1000.0 + amp1_ofs * 500.0);
|
2015-07-08 20:21:54 -04:00
|
|
|
} else {
|
2015-11-01 01:27:39 -04:00
|
|
|
m_y1Scale.setRange(Unit::None, amp1_ofs/2.0, amp1_range + amp1_ofs/2.0);
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
2015-11-01 01:27:39 -04:00
|
|
|
|
|
|
|
m_y2Scale.setRange(Unit::None, -1.0/m_amp2 + amp2_ofs, 1.0/m_amp2 + amp2_ofs); // Scale to Pi*A2
|
|
|
|
|
2015-07-08 20:21:54 -04:00
|
|
|
break;
|
|
|
|
}
|
2015-10-29 04:24:08 -04:00
|
|
|
case ModeMagdBPha:
|
|
|
|
case ModeMagdBDPha:
|
|
|
|
{
|
2015-07-08 20:21:54 -04:00
|
|
|
m_y1Scale.setRange(Unit::Decibel, pow_floor, pow_floor + pow_range);
|
2015-11-01 01:27:39 -04:00
|
|
|
m_y2Scale.setRange(Unit::None, -1.0/m_amp2 + amp2_ofs, 1.0/m_amp2 + amp2_ofs); // Scale to Pi*A2
|
2015-07-08 20:21:54 -04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case ModeDerived12: {
|
2015-11-01 01:27:39 -04:00
|
|
|
if (amp1_range < 2.0) {
|
|
|
|
m_y1Scale.setRange(Unit::None, 0.0, amp1_range * 1000.0);
|
|
|
|
} else {
|
|
|
|
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);
|
2015-07-08 20:21:54 -04:00
|
|
|
} else {
|
2015-11-01 01:27:39 -04:00
|
|
|
m_y2Scale.setRange(Unit::None, - amp2_range * 0.5, amp2_range * 0.5);
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case ModeCyclostationary: {
|
2015-11-01 01:27:39 -04:00
|
|
|
if (amp1_range < 2.0) {
|
|
|
|
m_y1Scale.setRange(Unit::None, 0.0, amp1_range * 1000.0);
|
|
|
|
} else {
|
|
|
|
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);
|
2015-07-08 20:21:54 -04:00
|
|
|
} else {
|
2015-11-01 01:27:39 -04:00
|
|
|
m_y2Scale.setRange(Unit::None, - amp2_range * 0.5, amp2_range * 0.5);
|
2015-07-08 20:21:54 -04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-08 02:53:27 -04:00
|
|
|
// QRectF(x, y, w, h); (x, y) = top left corner
|
2015-06-23 18:01:33 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_displays == DisplayBoth)
|
|
|
|
{
|
|
|
|
if(m_orientation == Qt::Vertical) {
|
|
|
|
int scopeHeight = (height() - topMargin) / 2 - botMargin;
|
|
|
|
int scopeWidth = width() - leftMargin - rightMargin;
|
|
|
|
|
|
|
|
m_glScopeRect1 = QRectF(
|
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glLeft1ScaleRect = QRectF(
|
|
|
|
0,
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glBot1ScaleRect = QRectF(
|
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
2015-07-06 03:17:51 -04:00
|
|
|
);
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
{ // Y1 scale
|
|
|
|
m_y1Scale.setSize(scopeHeight);
|
|
|
|
|
|
|
|
m_left1ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_left1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_y1Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
2015-07-06 03:17:51 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_left1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_left1ScaleTexture);
|
|
|
|
m_left1ScaleTexture = bindTexture(m_left1ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left1ScaleTextureAllocated = true;
|
|
|
|
} // Y1 scale
|
|
|
|
{ // X1 scale
|
|
|
|
m_x1Scale.setSize(scopeWidth);
|
|
|
|
|
|
|
|
m_bot1ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_x1Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-07 20:05:32 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_bot1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot1ScaleTexture);
|
|
|
|
m_bot1ScaleTexture = bindTexture(m_bot1ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot1ScaleTextureAllocated = true;
|
|
|
|
} // X1 scale
|
|
|
|
|
|
|
|
m_glScopeRect2 = QRectF(
|
|
|
|
(float) leftMargin / (float)width(),
|
|
|
|
(float) (botMargin + topMargin + scopeHeight) / (float)height(),
|
|
|
|
(float) scopeWidth / (float)width(),
|
|
|
|
(float) scopeHeight / (float)height()
|
|
|
|
);
|
|
|
|
m_glLeft2ScaleRect = QRectF(
|
|
|
|
0,
|
|
|
|
(float) (topMargin + scopeHeight + botMargin) / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glBot2ScaleRect = QRectF(
|
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + scopeHeight + botMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
|
|
|
);
|
|
|
|
{ // Y2 scale
|
|
|
|
m_y2Scale.setSize(scopeHeight);
|
|
|
|
|
|
|
|
m_left2ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_left2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_y2Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
2015-07-07 20:05:32 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_left2ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_left2ScaleTexture);
|
|
|
|
m_left2ScaleTexture = bindTexture(m_left2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left2ScaleTextureAllocated = true;
|
|
|
|
} // Y2 scale
|
|
|
|
{ // X2 scale
|
|
|
|
m_x2Scale.setSize(scopeWidth);
|
|
|
|
|
|
|
|
m_bot2ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_x2Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-06 03:17:51 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_bot2ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot2ScaleTexture);
|
|
|
|
m_bot2ScaleTexture = bindTexture(m_bot2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot2ScaleTextureAllocated = true;
|
|
|
|
} // X2 scale
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
}
|
|
|
|
else // Horizontal
|
|
|
|
{
|
|
|
|
int scopeHeight = height() - topMargin - botMargin;
|
|
|
|
int scopeWidth = (width() - rightMargin)/2 - leftMargin;
|
|
|
|
|
|
|
|
m_glScopeRect1 = QRectF(
|
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glLeft1ScaleRect = QRectF(
|
|
|
|
0,
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glBot1ScaleRect = QRectF(
|
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
2015-07-08 02:53:27 -04:00
|
|
|
);
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
{ // Y1 scale
|
|
|
|
m_y1Scale.setSize(scopeHeight);
|
|
|
|
|
|
|
|
m_left1ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_left1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_y1Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
2015-07-08 02:53:27 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_left1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_left1ScaleTextureAllocated);
|
|
|
|
m_left1ScaleTexture = bindTexture(m_left1ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left1ScaleTextureAllocated = true;
|
|
|
|
} // Y1 scale
|
|
|
|
{ // X1 scale
|
|
|
|
m_x1Scale.setSize(scopeWidth);
|
|
|
|
|
|
|
|
m_bot1ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_x1Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_bot1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot1ScaleTexture);
|
|
|
|
m_bot1ScaleTexture = bindTexture(m_bot1ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot1ScaleTextureAllocated = true;
|
|
|
|
} // X1 scale
|
|
|
|
|
|
|
|
m_glScopeRect2 = QRectF(
|
|
|
|
(float)(leftMargin + leftMargin + ((width() - leftMargin - leftMargin - rightMargin) / 2)) / (float)width(),
|
|
|
|
(float)topMargin / (float)height(),
|
|
|
|
(float)((width() - leftMargin - leftMargin - rightMargin) / 2) / (float)width(),
|
|
|
|
(float)(height() - topMargin - botMargin) / (float)height()
|
|
|
|
);
|
|
|
|
m_glLeft2ScaleRect = QRectF(
|
|
|
|
(float) (leftMargin + scopeWidth) / (float) width(),
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glBot2ScaleRect = QRectF(
|
|
|
|
(float) (leftMargin + leftMargin + scopeWidth) / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
|
|
|
);
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
{ // Y2 scale
|
|
|
|
m_y2Scale.setSize(scopeHeight);
|
|
|
|
|
|
|
|
m_left2ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_left2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_y2Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
2015-07-08 02:53:27 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_left2ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_left2ScaleTexture);
|
|
|
|
m_left2ScaleTexture = bindTexture(m_left2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left2ScaleTextureAllocated = true;
|
|
|
|
} // Y2 scale
|
|
|
|
{ // X2 scale
|
|
|
|
m_x2Scale.setSize(scopeWidth);
|
|
|
|
|
|
|
|
m_bot2ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
|
|
|
tickList = &m_x2Scale.getTickList();
|
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
if (m_bot2ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot2ScaleTexture);
|
|
|
|
m_bot2ScaleTexture = bindTexture(m_bot2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot2ScaleTextureAllocated = true;
|
|
|
|
} // X2 scale
|
|
|
|
}
|
|
|
|
} // Both displays
|
|
|
|
else if (m_displays == DisplayFirstOnly)
|
2015-07-06 03:17:51 -04:00
|
|
|
{
|
|
|
|
int scopeHeight = height() - topMargin - botMargin;
|
2015-07-12 16:22:04 -04:00
|
|
|
int scopeWidth = width() - leftMargin - rightMargin;
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_glScopeRect1 = QRectF(
|
2015-07-07 20:05:32 -04:00
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
2015-07-06 03:17:51 -04:00
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glLeft1ScaleRect = QRectF(
|
|
|
|
0,
|
2015-07-07 20:05:32 -04:00
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
2015-07-06 03:17:51 -04:00
|
|
|
(float) scopeHeight / (float) height()
|
2014-05-18 11:52:39 -04:00
|
|
|
);
|
2015-07-07 20:05:32 -04:00
|
|
|
m_glBot1ScaleRect = QRectF(
|
2015-07-12 16:22:04 -04:00
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
|
|
|
);
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-07 20:05:32 -04:00
|
|
|
{ // Y1 scale
|
|
|
|
m_y1Scale.setSize(scopeHeight);
|
2015-07-06 03:17:51 -04:00
|
|
|
|
|
|
|
m_left1ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
2015-07-07 20:05:32 -04:00
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
2015-07-06 03:17:51 -04:00
|
|
|
m_left1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
2015-07-06 20:50:26 -04:00
|
|
|
painter.setFont(font());
|
2015-07-07 20:05:32 -04:00
|
|
|
tickList = &m_y1Scale.getTickList();
|
2015-07-06 03:17:51 -04:00
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_left1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_left1ScaleTextureAllocated);
|
2015-07-07 20:05:32 -04:00
|
|
|
m_left1ScaleTexture = bindTexture(m_left1ScalePixmap,
|
2015-07-06 03:17:51 -04:00
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left1ScaleTextureAllocated = true;
|
2015-07-07 20:05:32 -04:00
|
|
|
} // Y1 scale
|
|
|
|
{ // X1 scale
|
2015-07-12 16:22:04 -04:00
|
|
|
m_x1Scale.setSize(scopeWidth);
|
2015-07-07 20:05:32 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
m_bot1ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
2015-07-07 20:05:32 -04:00
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot1ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot1ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
2015-07-12 16:22:04 -04:00
|
|
|
tickList = &m_x1Scale.getTickList();
|
2015-07-07 20:05:32 -04:00
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_bot1ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot1ScaleTexture);
|
|
|
|
m_bot1ScaleTexture = bindTexture(m_bot1ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot1ScaleTextureAllocated = true;
|
|
|
|
} // X1 scale
|
2015-07-12 16:22:04 -04:00
|
|
|
} // Primary display only
|
|
|
|
else if (m_displays == DisplaySecondOnly)
|
|
|
|
{
|
|
|
|
int scopeHeight = height() - topMargin - botMargin;
|
|
|
|
int scopeWidth = width() - leftMargin - rightMargin;
|
2015-07-06 03:17:51 -04:00
|
|
|
|
2014-05-18 11:52:39 -04:00
|
|
|
m_glScopeRect2 = QRectF(
|
2015-07-12 16:22:04 -04:00
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
2014-05-18 11:52:39 -04:00
|
|
|
);
|
2015-07-08 02:53:27 -04:00
|
|
|
m_glLeft2ScaleRect = QRectF(
|
2015-07-12 16:22:04 -04:00
|
|
|
0,
|
2015-07-08 02:53:27 -04:00
|
|
|
(float) topMargin / (float) height(),
|
|
|
|
(float) (leftMargin-1) / (float) width(),
|
|
|
|
(float) scopeHeight / (float) height()
|
|
|
|
);
|
|
|
|
m_glBot2ScaleRect = QRectF(
|
2015-07-12 16:22:04 -04:00
|
|
|
(float) leftMargin / (float) width(),
|
|
|
|
(float) (scopeHeight + topMargin + 1) / (float) height(),
|
|
|
|
(float) scopeWidth / (float) width(),
|
|
|
|
(float) (botMargin - 1) / (float) height()
|
|
|
|
);
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
{ // Y2 scale
|
2015-07-08 02:53:27 -04:00
|
|
|
m_y2Scale.setSize(scopeHeight);
|
|
|
|
|
|
|
|
m_left2ScalePixmap = QPixmap(
|
|
|
|
leftMargin - 1,
|
|
|
|
scopeHeight
|
|
|
|
);
|
|
|
|
|
|
|
|
const ScaleEngine::TickList* tickList;
|
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_left2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_left2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
2015-07-12 16:22:04 -04:00
|
|
|
tickList = &m_y2Scale.getTickList();
|
2015-07-08 02:53:27 -04:00
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(leftMargin - M - tick->textSize, topMargin + scopeHeight - tick->textPos - fm.ascent()/2), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_left2ScaleTextureAllocated)
|
2015-07-12 16:22:04 -04:00
|
|
|
deleteTexture(m_left2ScaleTextureAllocated);
|
2015-07-08 02:53:27 -04:00
|
|
|
m_left2ScaleTexture = bindTexture(m_left2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_left2ScaleTextureAllocated = true;
|
2015-07-12 16:22:04 -04:00
|
|
|
} // Y2 scale
|
|
|
|
{ // X2 scale
|
|
|
|
m_x2Scale.setSize(scopeWidth);
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
m_bot2ScalePixmap = QPixmap(
|
|
|
|
scopeWidth,
|
|
|
|
botMargin - 1
|
|
|
|
);
|
2015-07-08 02:53:27 -04:00
|
|
|
|
2015-07-12 16:22:04 -04:00
|
|
|
const ScaleEngine::TickList* tickList;
|
2015-07-08 02:53:27 -04:00
|
|
|
const ScaleEngine::Tick* tick;
|
|
|
|
|
|
|
|
m_bot2ScalePixmap.fill(Qt::black);
|
|
|
|
QPainter painter(&m_bot2ScalePixmap);
|
|
|
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
|
|
|
painter.setFont(font());
|
2015-07-12 16:22:04 -04:00
|
|
|
tickList = &m_x2Scale.getTickList();
|
2015-07-08 02:53:27 -04:00
|
|
|
|
|
|
|
for(int i = 0; i < tickList->count(); i++) {
|
|
|
|
tick = &(*tickList)[i];
|
|
|
|
if(tick->major) {
|
|
|
|
if(tick->textSize > 0) {
|
|
|
|
painter.drawText(QPointF(tick->textPos, fm.height() - 1), tick->text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_bot2ScaleTextureAllocated)
|
|
|
|
deleteTexture(m_bot2ScaleTexture);
|
|
|
|
m_bot2ScaleTexture = bindTexture(m_bot2ScalePixmap,
|
|
|
|
GL_TEXTURE_2D,
|
|
|
|
GL_RGBA,
|
|
|
|
QGLContext::LinearFilteringBindOption |
|
|
|
|
QGLContext::MipmapBindOption);
|
|
|
|
m_bot2ScaleTextureAllocated = true;
|
2015-07-12 16:22:04 -04:00
|
|
|
} // X2 scale
|
|
|
|
} // Secondary display only
|
2014-05-18 11:52:39 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::tick()
|
|
|
|
{
|
|
|
|
if(m_dataChanged)
|
|
|
|
update();
|
|
|
|
}
|
2015-07-13 19:45:16 -04:00
|
|
|
|
|
|
|
void GLScope::setTriggerChannel(ScopeVis::TriggerChannel triggerChannel)
|
|
|
|
{
|
|
|
|
m_triggerChannel = triggerChannel;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GLScope::setTriggerLevel(Real triggerLevel)
|
|
|
|
{
|
2015-10-31 07:33:59 -04:00
|
|
|
qDebug("GLScope::setTriggerLevel: %f", triggerLevel);
|
2015-07-13 19:45:16 -04:00
|
|
|
m_triggerLevel = triggerLevel;
|
|
|
|
}
|
2015-07-26 20:12:37 -04:00
|
|
|
|
|
|
|
void GLScope::setTriggerPre(Real triggerPre)
|
|
|
|
{
|
|
|
|
m_triggerPre = triggerPre;
|
2015-10-10 23:11:38 -04:00
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
2015-07-26 20:12:37 -04:00
|
|
|
}
|
2015-07-31 22:07:09 -04:00
|
|
|
|
2015-11-02 21:08:48 -05:00
|
|
|
void GLScope::setMemHistoryShift(int value)
|
|
|
|
{
|
|
|
|
m_memTraceHistory = value;
|
|
|
|
m_configChanged = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2015-07-31 22:07:09 -04:00
|
|
|
void GLScope::connectTimer(const QTimer& timer)
|
|
|
|
{
|
2015-08-09 04:33:04 -04:00
|
|
|
qDebug() << "GLScope::connectTimer";
|
2015-07-31 22:07:09 -04:00
|
|
|
disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(tick()));
|
|
|
|
connect(&timer, SIGNAL(timeout()), this, SLOT(tick()));
|
|
|
|
m_timer.stop();
|
|
|
|
}
|