mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-24 03:02:29 -04:00
GLScope: added markers. Implements #497
This commit is contained in:
parent
5504a89184
commit
c534766ea2
@ -77,6 +77,10 @@ GLScope::GLScope(QWidget *parent) : QGLWidget(parent),
|
|||||||
m_channelOverlayFont.setBold(true);
|
m_channelOverlayFont.setBold(true);
|
||||||
m_channelOverlayFont.setPointSize(font().pointSize() + 1);
|
m_channelOverlayFont.setPointSize(font().pointSize() + 1);
|
||||||
|
|
||||||
|
m_textOverlayFont = font(); // QFontDatabase::systemFont(QFontDatabase::FixedFont);
|
||||||
|
m_textOverlayFont.setBold(true);
|
||||||
|
// m_textOverlayFont.setPointSize(font().pointSize() - 1);
|
||||||
|
|
||||||
m_q3Radii.allocate(4*8);
|
m_q3Radii.allocate(4*8);
|
||||||
std::copy(m_q3RadiiConst, m_q3RadiiConst + 4*8, m_q3Radii.m_array);
|
std::copy(m_q3RadiiConst, m_q3RadiiConst + 4*8, m_q3Radii.m_array);
|
||||||
m_q3Circle.allocate(4*96); // 96 segments = 4*24 with 1/24 being 15 degrees
|
m_q3Circle.allocate(4*96); // 96 segments = 4*24 with 1/24 being 15 degrees
|
||||||
@ -199,6 +203,7 @@ void GLScope::initializeGL()
|
|||||||
m_glShaderLeft2Scale.initializeGL();
|
m_glShaderLeft2Scale.initializeGL();
|
||||||
m_glShaderBottom2Scale.initializeGL();
|
m_glShaderBottom2Scale.initializeGL();
|
||||||
m_glShaderPowerOverlay.initializeGL();
|
m_glShaderPowerOverlay.initializeGL();
|
||||||
|
m_glShaderTextOverlay.initializeGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLScope::resizeGL(int width, int height)
|
void GLScope::resizeGL(int width, int height)
|
||||||
@ -827,11 +832,149 @@ void GLScope::paintGL()
|
|||||||
} // trace length > 0
|
} // trace length > 0
|
||||||
} // XY mixed + polar display
|
} // XY mixed + polar display
|
||||||
|
|
||||||
|
drawMarkers();
|
||||||
|
|
||||||
m_dataChanged.store(0);
|
m_dataChanged.store(0);
|
||||||
m_processingTraceIndex.store(-1);
|
m_processingTraceIndex.store(-1);
|
||||||
m_mutex.unlock();
|
m_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLScope::drawMarkers()
|
||||||
|
{
|
||||||
|
QVector4D markerColor(1.0f, 1.0f, 1.0f, 0.3f);
|
||||||
|
QVector4D markerTextColor(1.0f, 1.0f, 1.0f, 0.8f);
|
||||||
|
|
||||||
|
if ((m_markers1.size() > 0) && ((m_displayMode == DisplayX) || (m_displayMode == DisplayXYH) || (m_displayMode == DisplayXYV))) // Draw markers1
|
||||||
|
{
|
||||||
|
// crosshairs
|
||||||
|
for (int i = 0; i < m_markers1.size(); i++)
|
||||||
|
{
|
||||||
|
GLfloat h[] {
|
||||||
|
(float) m_markers1.at(i).m_point.x(), 0,
|
||||||
|
(float) m_markers1.at(i).m_point.x(), 1
|
||||||
|
};
|
||||||
|
m_glShaderSimple.drawSegments(m_glScopeMatrix1, markerColor, h, 2);
|
||||||
|
GLfloat v[] {
|
||||||
|
0, (float) m_markers1.at(i).m_point.y(),
|
||||||
|
1, (float) m_markers1.at(i).m_point.y()
|
||||||
|
};
|
||||||
|
m_glShaderSimple.drawSegments(m_glScopeMatrix1, markerColor, v, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// text
|
||||||
|
for (int i = 0; i < m_markers1.size(); i++)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers1.at(i).m_timeStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_markers1.at(i).m_point.x() * m_glScopeRect1.width(),
|
||||||
|
m_glScopeRect1.height(),
|
||||||
|
m_markers1.at(i).m_point.x() < 0.5f,
|
||||||
|
false,
|
||||||
|
m_glScopeRect1);
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers1.at(i).m_valueStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
0,
|
||||||
|
m_markers1.at(i).m_point.y() * m_glScopeRect1.height(),
|
||||||
|
true,
|
||||||
|
m_markers1.at(i).m_point.y() < 0.5f,
|
||||||
|
m_glScopeRect1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers1.at(i).m_timeDeltaStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_markers1.at(i).m_point.x() * m_glScopeRect1.width(),
|
||||||
|
0,
|
||||||
|
m_markers1.at(i).m_point.x() < 0.5f,
|
||||||
|
true,
|
||||||
|
m_glScopeRect1);
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers1.at(i).m_valueDeltaStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_glScopeRect1.width(),
|
||||||
|
m_markers1.at(i).m_point.y() * m_glScopeRect1.height(),
|
||||||
|
false,
|
||||||
|
m_markers1.at(i).m_point.y() < 0.5f,
|
||||||
|
m_glScopeRect1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((m_markers2.size() > 0) && ((m_displayMode == DisplayY) || (m_displayMode == DisplayXYH) || (m_displayMode == DisplayXYV))) // Draw markers2
|
||||||
|
{
|
||||||
|
// crosshairs
|
||||||
|
for (int i = 0; i < m_markers2.size(); i++)
|
||||||
|
{
|
||||||
|
GLfloat h[] {
|
||||||
|
(float) m_markers2.at(i).m_point.x(), 0,
|
||||||
|
(float) m_markers2.at(i).m_point.x(), 1
|
||||||
|
};
|
||||||
|
m_glShaderSimple.drawSegments(m_glScopeMatrix2, markerColor, h, 2);
|
||||||
|
GLfloat v[] {
|
||||||
|
0, (float) m_markers2.at(i).m_point.y(),
|
||||||
|
1, (float) m_markers2.at(i).m_point.y()
|
||||||
|
};
|
||||||
|
m_glShaderSimple.drawSegments(m_glScopeMatrix2, markerColor, v, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// text
|
||||||
|
for (int i = 0; i < m_markers2.size(); i++)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers2.at(i).m_timeStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_markers2.at(i).m_point.x() * m_glScopeRect2.width(),
|
||||||
|
m_glScopeRect2.height(),
|
||||||
|
m_markers2.at(i).m_point.x() < 0.5f,
|
||||||
|
false,
|
||||||
|
m_glScopeRect2);
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers2.at(i).m_valueStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
0,
|
||||||
|
m_markers2.at(i).m_point.y() * m_glScopeRect2.height(),
|
||||||
|
true,
|
||||||
|
m_markers2.at(i).m_point.y() < 0.5f,
|
||||||
|
m_glScopeRect2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers2.at(i).m_timeDeltaStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_markers2.at(i).m_point.x() * m_glScopeRect2.width(),
|
||||||
|
0,
|
||||||
|
m_markers2.at(i).m_point.x() < 0.5f,
|
||||||
|
true,
|
||||||
|
m_glScopeRect2);
|
||||||
|
drawTextOverlay(
|
||||||
|
m_markers2.at(i).m_valueDeltaStr,
|
||||||
|
QColor(255, 255, 255, 192),
|
||||||
|
m_textOverlayFont,
|
||||||
|
m_glScopeRect2.width(),
|
||||||
|
m_markers2.at(i).m_point.y() * m_glScopeRect2.height(),
|
||||||
|
false,
|
||||||
|
m_markers2.at(i).m_point.y() < 0.5f,
|
||||||
|
m_glScopeRect2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GLScope::setSampleRate(int sampleRate)
|
void GLScope::setSampleRate(int sampleRate)
|
||||||
{
|
{
|
||||||
m_mutex.lock();
|
m_mutex.lock();
|
||||||
@ -1809,6 +1952,64 @@ void GLScope::drawChannelOverlay(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLScope::drawTextOverlay(
|
||||||
|
const QString &text,
|
||||||
|
const QColor &color,
|
||||||
|
const QFont& font,
|
||||||
|
float shiftX,
|
||||||
|
float shiftY,
|
||||||
|
bool leftHalf,
|
||||||
|
bool topHalf,
|
||||||
|
const QRectF &glRect)
|
||||||
|
{
|
||||||
|
if (text.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFontMetricsF metrics(font);
|
||||||
|
QRectF textRect = metrics.boundingRect(text);
|
||||||
|
QRectF overlayRect(0, 0, textRect.width() * 1.05f + 4.0f, textRect.height());
|
||||||
|
QPixmap channelOverlayPixmap = QPixmap(overlayRect.width(), overlayRect.height());
|
||||||
|
channelOverlayPixmap.fill(Qt::transparent);
|
||||||
|
QPainter painter(&channelOverlayPixmap);
|
||||||
|
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, false);
|
||||||
|
painter.fillRect(overlayRect, QColor(0, 0, 0, 0x80));
|
||||||
|
QColor textColor(color);
|
||||||
|
textColor.setAlpha(0xC0);
|
||||||
|
painter.setPen(textColor);
|
||||||
|
painter.setFont(font);
|
||||||
|
painter.drawText(QPointF(2.0f, overlayRect.height() - 4.0f), text);
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
m_glShaderTextOverlay.initTexture(channelOverlayPixmap.toImage());
|
||||||
|
|
||||||
|
{
|
||||||
|
GLfloat vtx1[] = {
|
||||||
|
0, 1,
|
||||||
|
1, 1,
|
||||||
|
1, 0,
|
||||||
|
0, 0};
|
||||||
|
GLfloat tex1[] = {
|
||||||
|
0, 1,
|
||||||
|
1, 1,
|
||||||
|
1, 0,
|
||||||
|
0, 0};
|
||||||
|
|
||||||
|
// float shiftX = glRect.width() - ((overlayRect.width() + 4.0f) / width());
|
||||||
|
// float shiftY = 4.0f / height();
|
||||||
|
float rectX = glRect.x() + shiftX - (leftHalf ? 0 : (overlayRect.width()+1)/width());
|
||||||
|
float rectY = glRect.y() + shiftY + (4.0f / height()) - (topHalf ? 0 : (overlayRect.height()+5)/height());
|
||||||
|
float rectW = overlayRect.width() / (float) width();
|
||||||
|
float rectH = overlayRect.height() / (float) height();
|
||||||
|
|
||||||
|
QMatrix4x4 mat;
|
||||||
|
mat.setToIdentity();
|
||||||
|
mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
|
||||||
|
mat.scale(2.0f * rectW, -2.0f * rectH);
|
||||||
|
m_glShaderTextOverlay.drawSurface(mat, tex1, vtx1, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GLScope::tick()
|
void GLScope::tick()
|
||||||
{
|
{
|
||||||
if (m_dataChanged.load()) {
|
if (m_dataChanged.load()) {
|
||||||
@ -1832,6 +2033,7 @@ void GLScope::cleanup()
|
|||||||
m_glShaderBottom2Scale.cleanup();
|
m_glShaderBottom2Scale.cleanup();
|
||||||
m_glShaderLeft1Scale.cleanup();
|
m_glShaderLeft1Scale.cleanup();
|
||||||
m_glShaderPowerOverlay.cleanup();
|
m_glShaderPowerOverlay.cleanup();
|
||||||
|
m_glShaderTextOverlay.cleanup();
|
||||||
//doneCurrent();
|
//doneCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1992,3 +2194,152 @@ void GLScope::setColorPalette(int nbVertices, int modulo, GLfloat *colors)
|
|||||||
colors[3*v+2] = c.blueF();
|
colors[3*v+2] = c.blueF();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLScope::mousePressEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (m_displayMode == DisplayPol) { // Ignore mouse press on Polar displays
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QPointF& ep = event->localPos(); // x, y pixel position in whole scope window
|
||||||
|
bool doUpdate = false;
|
||||||
|
|
||||||
|
if (event->button() == Qt::RightButton)
|
||||||
|
{
|
||||||
|
QPointF p1 = ep; // relative position in graph #1
|
||||||
|
p1.rx() = (ep.x()/width() - m_glScopeRect1.left()) / m_glScopeRect1.width();
|
||||||
|
p1.ry() = (ep.y()/height() - m_glScopeRect1.top()) / m_glScopeRect1.height();
|
||||||
|
|
||||||
|
QPointF p2 = ep; // relative position in graph #2
|
||||||
|
p2.rx() = (ep.x()/width() - m_glScopeRect2.left()) / m_glScopeRect2.width();
|
||||||
|
p2.ry() = (ep.y()/height() - m_glScopeRect2.top()) / m_glScopeRect2.height();
|
||||||
|
|
||||||
|
if (event->modifiers() & Qt::ShiftModifier)
|
||||||
|
{
|
||||||
|
if ((p1.x() >= 0) && (p1.y() >= 0) && (p1.x() <= 1) && (p1.y() <= 1))
|
||||||
|
{
|
||||||
|
m_markers1.clear();
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
if ((p2.x() >= 0) && (p2.y() >= 0) && (p2.x() <= 1) && (p2.y() <= 1))
|
||||||
|
{
|
||||||
|
m_markers2.clear();
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((m_markers1.size() > 0) && (p1.x() >= 0) && (p1.y() >= 0) && (p1.x() <= 1) && (p1.y() <= 1))
|
||||||
|
{
|
||||||
|
m_markers1.pop_back();
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
if ((m_markers2.size() > 0) && (p2.x() >= 0) && (p2.y() >= 0) && (p2.x() <= 1) && (p2.y() <= 1))
|
||||||
|
{
|
||||||
|
m_markers2.pop_back();
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (event->button() == Qt::LeftButton)
|
||||||
|
{
|
||||||
|
if (event->modifiers() & Qt::ShiftModifier)
|
||||||
|
{
|
||||||
|
QPointF p1 = ep; // relative position in graph #1
|
||||||
|
p1.rx() = (ep.x()/width() - m_glScopeRect1.left()) / m_glScopeRect1.width();
|
||||||
|
p1.ry() = (ep.y()/height() - m_glScopeRect1.top()) / m_glScopeRect1.height();
|
||||||
|
|
||||||
|
QPointF p2 = ep; // relative position in graph #2
|
||||||
|
p2.rx() = (ep.x()/width() - m_glScopeRect2.left()) / m_glScopeRect2.width();
|
||||||
|
p2.ry() = (ep.y()/height() - m_glScopeRect2.top()) / m_glScopeRect2.height();
|
||||||
|
|
||||||
|
if ((p1.x() >= 0) && (p1.y() >= 0) && (p1.x() <= 1) && (p1.y() <= 1) &&
|
||||||
|
((m_displayMode == DisplayX) || (m_displayMode == DisplayXYV) || (m_displayMode == DisplayXYH)))
|
||||||
|
{
|
||||||
|
if (m_markers1.size() < 2)
|
||||||
|
{
|
||||||
|
m_markers1.push_back(ScopeMarker());
|
||||||
|
m_markers1.back().m_point = p1;
|
||||||
|
m_markers1.back().m_time = p1.x() * m_x1Scale.getRange() + m_x1Scale.getRangeMin();
|
||||||
|
m_markers1.back().m_value = (1.0f - p1.y()) * m_y1Scale.getRange() + m_y1Scale.getRangeMin();
|
||||||
|
m_markers1.back().m_timeStr = displayScaled(m_markers1.back().m_time, 'f', 1);
|
||||||
|
m_markers1.back().m_valueStr = displayScaled(m_markers1.back().m_value, 'f', 1);
|
||||||
|
|
||||||
|
if (m_markers1.size() > 1)
|
||||||
|
{
|
||||||
|
float deltaTime = m_markers1.back().m_time - m_markers1.at(0).m_time;
|
||||||
|
float deltaValue = m_markers1.back().m_value - m_markers1.at(0).m_value;
|
||||||
|
m_markers1.back().m_timeDeltaStr = displayScaled(deltaTime, 'f', 1);
|
||||||
|
m_markers1.back().m_valueDeltaStr = displayScaled(deltaValue, 'f', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("GLScope::mousePressEvent: M1: t: %f v: %f", m_markers1.back().m_time, m_markers1.back().m_value);
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((p2.x() >= 0) && (p2.y() >= 0) && (p2.x() <= 1) && (p2.y() <= 1) &&
|
||||||
|
((m_displayMode == DisplayY) || (m_displayMode == DisplayXYV) || (m_displayMode == DisplayXYH)))
|
||||||
|
{
|
||||||
|
if (m_markers2.size() < 2)
|
||||||
|
{
|
||||||
|
m_markers2.push_back(ScopeMarker());
|
||||||
|
m_markers2.back().m_point = p2;
|
||||||
|
m_markers2.back().m_time = p2.x() * m_x2Scale.getRange() + m_x2Scale.getRangeMin();
|
||||||
|
m_markers2.back().m_value = (1.0f - p2.y()) * m_y2Scale.getRange() + m_y2Scale.getRangeMin();
|
||||||
|
m_markers2.back().m_timeStr = displayScaled(m_markers2.back().m_time, 'f', 1);
|
||||||
|
m_markers2.back().m_valueStr = displayScaled(m_markers2.back().m_value, 'f', 1);
|
||||||
|
|
||||||
|
if (m_markers2.size() > 1)
|
||||||
|
{
|
||||||
|
float deltaTime = m_markers2.back().m_time - m_markers2.at(0).m_time;
|
||||||
|
float deltaValue = m_markers2.back().m_value - m_markers2.at(0).m_value;
|
||||||
|
m_markers2.back().m_timeDeltaStr = displayScaled(deltaTime, 'f', 1);
|
||||||
|
m_markers2.back().m_valueDeltaStr = displayScaled(deltaValue, 'f', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("GLScope::mousePressEvent: M2: t: %f v: %f", m_markers2.back().m_time, m_markers2.back().m_value);
|
||||||
|
doUpdate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doUpdate) {
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString GLScope::displayScaled(float value, char type, int precision)
|
||||||
|
{
|
||||||
|
float posValue = (value < 0) ? -value : value;
|
||||||
|
|
||||||
|
if (posValue < 1)
|
||||||
|
{
|
||||||
|
if (posValue > 0.001) {
|
||||||
|
return tr("%1m").arg(QString::number(value * 1000.0, type, precision));
|
||||||
|
} else if (posValue > 0.000001) {
|
||||||
|
return tr("%1u").arg(QString::number(value * 1000000.0, type, precision));
|
||||||
|
} else if (posValue > 1e-9) {
|
||||||
|
return tr("%1n").arg(QString::number(value * 1e9, type, precision));
|
||||||
|
} else if (posValue > 1e-12) {
|
||||||
|
return tr("%1p").arg(QString::number(value * 1e12, type, precision));
|
||||||
|
} else {
|
||||||
|
return tr("%1").arg(QString::number(value, 'e', precision));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (posValue < 1000) {
|
||||||
|
return tr("%1").arg(QString::number(value, type, precision));
|
||||||
|
} else if (posValue < 1000000) {
|
||||||
|
return tr("%1k").arg(QString::number(value / 1000.0, type, precision));
|
||||||
|
} else if (posValue < 1000000000) {
|
||||||
|
return tr("%1M").arg(QString::number(value / 1000000.0, type, precision));
|
||||||
|
} else if (posValue < 1000000000000) {
|
||||||
|
return tr("%1G").arg(QString::number(value / 1000000000.0, type, precision));
|
||||||
|
} else {
|
||||||
|
return tr("%1").arg(QString::number(value, 'e', precision));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -89,6 +89,55 @@ signals:
|
|||||||
void preTriggerChanged(uint32_t); //!< number of samples
|
void preTriggerChanged(uint32_t); //!< number of samples
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct ScopeMarker {
|
||||||
|
QPointF m_point;
|
||||||
|
float m_time;
|
||||||
|
float m_value;
|
||||||
|
QString m_timeStr;
|
||||||
|
QString m_valueStr;
|
||||||
|
QString m_timeDeltaStr;
|
||||||
|
QString m_valueDeltaStr;
|
||||||
|
ScopeMarker() :
|
||||||
|
m_point(0, 0),
|
||||||
|
m_time(0),
|
||||||
|
m_value(0),
|
||||||
|
m_timeStr(),
|
||||||
|
m_valueStr(),
|
||||||
|
m_timeDeltaStr(),
|
||||||
|
m_valueDeltaStr()
|
||||||
|
{}
|
||||||
|
ScopeMarker(
|
||||||
|
const QPointF& point,
|
||||||
|
float time,
|
||||||
|
float value,
|
||||||
|
const QString timeStr,
|
||||||
|
const QString& valueStr,
|
||||||
|
const QString& timeDeltaStr,
|
||||||
|
const QString& valueDeltaStr
|
||||||
|
) :
|
||||||
|
m_point(point),
|
||||||
|
m_time(time),
|
||||||
|
m_value(value),
|
||||||
|
m_timeStr(timeStr),
|
||||||
|
m_valueStr(valueStr),
|
||||||
|
m_timeDeltaStr(timeDeltaStr),
|
||||||
|
m_valueDeltaStr(valueDeltaStr)
|
||||||
|
{}
|
||||||
|
ScopeMarker(const ScopeMarker& other) :
|
||||||
|
m_point(other.m_point),
|
||||||
|
m_time(other.m_time),
|
||||||
|
m_timeStr(other.m_timeStr),
|
||||||
|
m_valueStr(other.m_valueStr),
|
||||||
|
m_timeDeltaStr(other.m_timeDeltaStr),
|
||||||
|
m_valueDeltaStr(other.m_valueDeltaStr)
|
||||||
|
{}
|
||||||
|
explicit operator ScopeMarker() const {
|
||||||
|
return ScopeMarker{static_cast<ScopeMarker>(*this)};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
QList<ScopeMarker> m_markers1;
|
||||||
|
QList<ScopeMarker> m_markers2;
|
||||||
|
|
||||||
std::vector<ScopeVis::TraceData> *m_tracesData;
|
std::vector<ScopeVis::TraceData> *m_tracesData;
|
||||||
std::vector<float *> *m_traces;
|
std::vector<float *> *m_traces;
|
||||||
std::vector<Projector::ProjectionType> *m_projectionTypes;
|
std::vector<Projector::ProjectionType> *m_projectionTypes;
|
||||||
@ -139,6 +188,7 @@ private:
|
|||||||
ScaleEngine m_y2Scale; //!< Display #2 Y scale. Connected to highlighted Y trace (#1..n)
|
ScaleEngine m_y2Scale; //!< Display #2 Y scale. Connected to highlighted Y trace (#1..n)
|
||||||
|
|
||||||
QFont m_channelOverlayFont;
|
QFont m_channelOverlayFont;
|
||||||
|
QFont m_textOverlayFont;
|
||||||
|
|
||||||
GLShaderSimple m_glShaderSimple;
|
GLShaderSimple m_glShaderSimple;
|
||||||
GLShaderColors m_glShaderColors;
|
GLShaderColors m_glShaderColors;
|
||||||
@ -147,6 +197,7 @@ private:
|
|||||||
GLShaderTextured m_glShaderLeft2Scale;
|
GLShaderTextured m_glShaderLeft2Scale;
|
||||||
GLShaderTextured m_glShaderBottom2Scale;
|
GLShaderTextured m_glShaderBottom2Scale;
|
||||||
GLShaderTextured m_glShaderPowerOverlay;
|
GLShaderTextured m_glShaderPowerOverlay;
|
||||||
|
GLShaderTextured m_glShaderTextOverlay;
|
||||||
|
|
||||||
IncrementalArray<GLfloat> m_q3Polar;
|
IncrementalArray<GLfloat> m_q3Polar;
|
||||||
IncrementalArray<GLfloat> m_q3TickY1;
|
IncrementalArray<GLfloat> m_q3TickY1;
|
||||||
@ -167,6 +218,7 @@ private:
|
|||||||
void initializeGL();
|
void initializeGL();
|
||||||
void resizeGL(int width, int height);
|
void resizeGL(int width, int height);
|
||||||
void paintGL();
|
void paintGL();
|
||||||
|
void drawMarkers();
|
||||||
|
|
||||||
void applyConfig();
|
void applyConfig();
|
||||||
void setYScale(ScaleEngine& scale, uint32_t highlightedTraceIndex);
|
void setYScale(ScaleEngine& scale, uint32_t highlightedTraceIndex);
|
||||||
@ -175,11 +227,22 @@ private:
|
|||||||
void setHorizontalDisplays(); //!< Arrange displays when X and Y are stacked horizontally
|
void setHorizontalDisplays(); //!< Arrange displays when X and Y are stacked horizontally
|
||||||
void setPolarDisplays(); //!< Arrange displays when X and Y are stacked over on the left and polar display is on the right
|
void setPolarDisplays(); //!< Arrange displays when X and Y are stacked over on the left and polar display is on the right
|
||||||
|
|
||||||
|
void mousePressEvent(QMouseEvent* event);
|
||||||
|
|
||||||
void drawChannelOverlay( //!< Draws a text overlay
|
void drawChannelOverlay( //!< Draws a text overlay
|
||||||
const QString& text,
|
const QString& text,
|
||||||
const QColor& color,
|
const QColor& color,
|
||||||
QPixmap& channelOverlayPixmap,
|
QPixmap& channelOverlayPixmap,
|
||||||
const QRectF& glScopeRect);
|
const QRectF& glScopeRect);
|
||||||
|
void drawTextOverlay( //!< Draws a text overlay
|
||||||
|
const QString& text,
|
||||||
|
const QColor& color,
|
||||||
|
const QFont& font,
|
||||||
|
float shiftX,
|
||||||
|
float shiftY,
|
||||||
|
bool leftHalf,
|
||||||
|
bool topHalf,
|
||||||
|
const QRectF& glRect);
|
||||||
|
|
||||||
static bool isPositiveProjection(Projector::ProjectionType& projectionType)
|
static bool isPositiveProjection(Projector::ProjectionType& projectionType)
|
||||||
{
|
{
|
||||||
@ -190,6 +253,8 @@ private:
|
|||||||
|
|
||||||
void drawRectGrid2();
|
void drawRectGrid2();
|
||||||
void drawPolarGrid2();
|
void drawPolarGrid2();
|
||||||
|
QString displayScaled(float value, char type, int precision);
|
||||||
|
|
||||||
static void drawCircle(float cx, float cy, float r, int num_segments, bool dotted, GLfloat *vertices);
|
static void drawCircle(float cx, float cy, float r, int num_segments, bool dotted, GLfloat *vertices);
|
||||||
static void setColorPalette(int nbVertices, int modulo, GLfloat *colors);
|
static void setColorPalette(int nbVertices, int modulo, GLfloat *colors);
|
||||||
|
|
||||||
|
@ -44,6 +44,8 @@ public:
|
|||||||
float getSize() { return m_size; }
|
float getSize() { return m_size; }
|
||||||
void setRange(Unit::Physical physicalUnit, float rangeMin, float rangeMax);
|
void setRange(Unit::Physical physicalUnit, float rangeMin, float rangeMax);
|
||||||
float getRange() const { return m_rangeMax - m_rangeMin; }
|
float getRange() const { return m_rangeMax - m_rangeMin; }
|
||||||
|
float getRangeMin() const { return m_rangeMin; }
|
||||||
|
float getRangeMax() const { return m_rangeMax; }
|
||||||
void setMakeOpposite(bool makeOpposite) { m_makeOpposite = makeOpposite; }
|
void setMakeOpposite(bool makeOpposite) { m_makeOpposite = makeOpposite; }
|
||||||
void setFixedDecimalPlaces(int decimalPlaces) { m_fixedDecimalPlaces =decimalPlaces; }
|
void setFixedDecimalPlaces(int decimalPlaces) { m_fixedDecimalPlaces =decimalPlaces; }
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user