Additional work on "Value Table" signals while graphing. Now supports

realtime addition of value table labeling as well as bracketing
This commit is contained in:
Collin Kidder
2021-05-02 18:55:06 -04:00
parent 35c1ef5387
commit e4da6237ae
2 changed files with 166 additions and 34 deletions
+158 -34
View File
@@ -552,25 +552,36 @@ void GraphingWindow::zoomOut()
void GraphingWindow::removeSelectedGraph() void GraphingWindow::removeSelectedGraph()
{ {
if (ui->graphingView->selectedGraphs().size() > 0) if (ui->graphingView->selectedGraphs().size() > 0)
{
int idx = -1;
for (int i = 0; i < graphParams.count(); i++)
{ {
if (graphParams[i].ref == ui->graphingView->selectedGraphs().first()) int idx = -1;
for (int i = 0; i < graphParams.count(); i++)
{ {
idx = i; if (graphParams[i].ref == ui->graphingView->selectedGraphs().first())
break; {
idx = i;
break;
}
} }
foreach (QCPItemBracket* brk, graphParams[idx].brackets)
{
ui->graphingView->removeItem(brk);
}
foreach (QCPItemText* txt, graphParams[idx].bracketTexts)
{
ui->graphingView->removeItem(txt);
}
graphParams.removeAt(idx);
ui->graphingView->removeGraph(ui->graphingView->selectedGraphs().first());
if (graphParams.count() == 0) needScaleSetup = true;
ui->graphingView->replot();
} }
graphParams.removeAt(idx);
ui->graphingView->removeGraph(ui->graphingView->selectedGraphs().first());
if (graphParams.count() == 0) needScaleSetup = true;
ui->graphingView->replot();
}
} }
void GraphingWindow::editSelectedGraph() void GraphingWindow::editSelectedGraph()
@@ -602,6 +613,7 @@ void GraphingWindow::removeAllGraphs()
QMessageBox::Yes|QMessageBox::No); QMessageBox::Yes|QMessageBox::No);
if (confirmDialog == QMessageBox::Yes) { if (confirmDialog == QMessageBox::Yes) {
ui->graphingView->clearGraphs(); ui->graphingView->clearGraphs();
ui->graphingView->clearItems();
graphParams.clear(); graphParams.clear();
needScaleSetup = true; needScaleSetup = true;
ui->graphingView->replot(); ui->graphingView->replot();
@@ -1178,6 +1190,54 @@ void GraphingWindow::appendToGraph(GraphParams &params, CANFrame &frame, QVector
params.y.append(yVal); params.y.append(yVal);
x.append(xVal); x.append(xVal);
y.append(yVal); y.append(yVal);
//now see if we've got to do anything with the brackets and labels for value table stuff
QString tempStr;
if (params.associatedSignal)
{
bool isValid = params.associatedSignal->getValueString(tempVal, tempStr);
if (isValid)
{
//we have a graph with associated signal and we could interpret it. So, see what we need to do
if (tempStr == params.prevValStr) //still same value, update bracket only
{
params.lastBracket->right->setCoords(xVal, params.prevValLocation.y());
}
else //changed. See if this is the first value or if we're merely starting another one
{
//a quick check for whether this is the first value or not.
if (params.prevValLocation == QPointF(0,0))
{
params.prevValLocation = QPointF(xVal, yVal);
//params.prevValStr = tempStr;
//params.prevValTable = tempVal;
}
else //wasn't the same so complete the previous span and start a new one.
{
params.prevValTable = tempVal;
params.prevValLocation = QPointF(xVal, yVal);
params.prevValStr = tempStr;
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
bracket->left->setCoords(params.prevValLocation);
bracket->right->setCoords(params.prevValLocation);
bracket->setLength(12);
params.lastBracket = bracket;
params.brackets.append(bracket);
// add text label for this value table entry
QCPItemText *valueText = new QCPItemText(ui->graphingView);
valueText->position->setParentAnchor(bracket->center);
valueText->position->setCoords(0, -10.0); // move 10 pixels to the top from bracket center anchor
valueText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter);
valueText->setText(tempStr);
qDebug() << "JiggaWatts: " << tempStr;
valueText->setFont(QFont(font().family(), 10));
params.bracketTexts.append(valueText);
}
}
}
}
} }
} }
@@ -1189,7 +1249,7 @@ void GraphingWindow::createGraph(GraphParams &params, bool createGraphParam)
GraphParams *refParam = &params; GraphParams *refParam = &params;
int sBit, bits; int sBit, bits;
bool intelFormat, isSigned; bool intelFormat, isSigned;
int64_t prevValu = 9999999999; QString tempStr;
qDebug() << "New Graph ID: " << params.ID; qDebug() << "New Graph ID: " << params.ID;
qDebug() << "Start bit: " << params.startBit; qDebug() << "Start bit: " << params.startBit;
@@ -1247,30 +1307,46 @@ void GraphingWindow::createGraph(GraphParams &params, bool createGraphParam)
params.x[j] = frameCache[k].timeStamp().microSeconds(); params.x[j] = frameCache[k].timeStamp().microSeconds();
} }
if (params.associatedSignal) if (params.associatedSignal && numEntries > 1)
{ {
QString tempStr;
bool isValid = params.associatedSignal->getValueString(tempVal, tempStr); bool isValid = params.associatedSignal->getValueString(tempVal, tempStr);
if (isValid) if (isValid)
{ {
if (tempVal != prevValu) if (params.prevValLocation == QPointF(0,0)) {
params.prevValLocation = QPointF(params.x[j], params.y[j]);
params.prevValStr = tempStr;
params.prevValTable = 0;
}
if (tempVal != params.prevValTable)
{ {
qDebug() << "New Value: " << tempStr; qDebug() << "New Value: " << tempStr;
// add the bracket at the top:
//QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
//bracket->left->setCoords(-8, 1.1);
//bracket->right->setCoords(8, 1.1);
//bracket->setLength(13);
// add the text label at the top: //Adding a bracket is a neat idea but you can't do that unless:
QCPItemText *wavePacketText = new QCPItemText(ui->graphingView); //1. you wait until the value changes again so you can put the bracket where it belongs or
//wavePacketText->position->setParentAnchor(bracket->center); //2. you constantly update the bracket in size then relocate the text too to match.
wavePacketText->position->setCoords(params.x[j], params.y[j]); // move 10 pixels to the top from bracket center anchor //since this code runs at the beginning of a graph operation it could center the bracket
wavePacketText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter); //but supporting this all in realtime updating code is a bit more complicated.
wavePacketText->setText(tempStr); // add the bracket at the top:
wavePacketText->setFont(QFont(font().family(), 10)); QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
bracket->left->setCoords(params.prevValLocation);
bracket->right->setCoords(params.x[j], params.prevValLocation.y());
bracket->setLength(12);
params.brackets.append(bracket);
// add text label for this value table entry
QCPItemText *valueText = new QCPItemText(ui->graphingView);
valueText->position->setParentAnchor(bracket->center);
valueText->position->setCoords(0, -10.0); // move 10 pixels to the top from bracket center anchor
valueText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter);
valueText->setText(params.prevValStr);
valueText->setFont(QFont(font().family(), 10));
params.bracketTexts.append(valueText);
params.prevValLocation = QPointF(params.x[j], params.y[j]);
params.prevValStr = tempStr;
params.lastBracket = bracket;
} }
prevValu = tempVal; params.prevValTable = tempVal;
} }
} }
@@ -1280,6 +1356,27 @@ void GraphingWindow::createGraph(GraphParams &params, bool createGraphParam)
if (params.x[j] > xmaxval) xmaxval = params.x[j]; if (params.x[j] > xmaxval) xmaxval = params.x[j];
} }
if (params.prevValLocation != QPointF(0,0))
{
int j = numEntries - 1;
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
bracket->left->setCoords(params.prevValLocation);
bracket->right->setCoords(params.x[j], params.prevValLocation.y());
bracket->setLength(12);
// add text label for this value table entry
QCPItemText *valueText = new QCPItemText(ui->graphingView);
valueText->position->setParentAnchor(bracket->center);
valueText->position->setCoords(0, -10.0); // move 10 pixels to the top from bracket center anchor
valueText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter);
valueText->setText(params.prevValStr);
valueText->setFont(QFont(font().family(), 10));
params.prevValLocation = QPointF(params.x[j], params.y[j]);
params.prevValStr = tempStr;
params.prevValTable = tempVal;
params.lastBracket = bracket;
}
if (numEntries == 0) if (numEntries == 0)
{ {
yminval = -128.0; yminval = -128.0;
@@ -1342,8 +1439,8 @@ void GraphingWindow::createGraph(GraphParams &params, bool createGraphParam)
//creates a slightly larger view than the actual boundary values to give some padding //creates a slightly larger view than the actual boundary values to give some padding
xminval = xMid - (xRange / 1.95); xminval = xMid - (xRange / 1.95);
xmaxval = xMid + (xRange / 1.95); xmaxval = xMid + (xRange / 1.95);
yminval = yMid - (yRange / 1.85); yminval = yMid - (yRange / 1.8);
ymaxval = yMid + (yRange / 1.85); ymaxval = yMid + (yRange / 1.80);
qDebug() << "xmin: " << xminval; qDebug() << "xmin: " << xminval;
qDebug() << "xmax: " << xmaxval; qDebug() << "xmax: " << xmaxval;
@@ -1376,3 +1473,30 @@ void GraphingWindow::moveLegend()
} }
} }
} }
GraphParams::GraphParams()
{
ID = 0;
startBit = 1;
numBits = 1;
intelFormat = false;
isSigned = false;
mask = 0xFFFFFFFFFFFFFFFFULL;
bias = 0;
scale = 1;
stride = 1;
strideSoFar = 1;
lineColor = QColor(0,0,0);
fillColor = QColor(255,255,255,0);
lineWidth = 1;
drawOnlyPoints = false;
pointType = 0;
ref = nullptr;
associatedSignal = nullptr;
graphName = "default";
xbias = 0;
prevValTable = 9999999999;
prevValLocation = QPointF(0,0);
prevValStr = "";
lastBracket = nullptr;
}
+8
View File
@@ -14,6 +14,8 @@ class GraphingWindow;
class GraphParams class GraphParams
{ {
public: public:
GraphParams();
uint32_t ID; uint32_t ID;
int startBit, numBits; int startBit, numBits;
bool intelFormat; bool intelFormat;
@@ -34,6 +36,12 @@ public:
//the below stuff is used for internal purposes only - code should be refactored so these can be private //the below stuff is used for internal purposes only - code should be refactored so these can be private
QVector<double> x, y; QVector<double> x, y;
double xbias; double xbias;
int64_t prevValTable;
QPointF prevValLocation;
QString prevValStr;
QCPItemBracket *lastBracket;
QList<QCPItemBracket *> brackets;
QList<QCPItemText *> bracketTexts;
}; };
class GraphingWindow : public QDialog class GraphingWindow : public QDialog