Fixes to make graphing of multiplexed signals work properly
This commit is contained in:
+10
-15
@@ -38,26 +38,21 @@ bool DBC_SIGNAL::isSignalInMessage(const CANFrame &frame)
|
|||||||
{
|
{
|
||||||
if (parentMessage->multiplexorSignal != nullptr)
|
if (parentMessage->multiplexorSignal != nullptr)
|
||||||
{
|
{
|
||||||
return _sigInMsgPriv(frame, parentMessage->multiplexorSignal);
|
if (multiplexParent->isSignalInMessage(frame)) //parent is in message so check if value is correct
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
if (!multiplexParent->processAsInt(frame, val)) return false;
|
||||||
|
if ((val >= multiplexLowValue) && (val <= multiplexHighValue))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
else return true;
|
else return false;
|
||||||
}
|
|
||||||
|
|
||||||
bool DBC_SIGNAL::_sigInMsgPriv(const CANFrame &frame, DBC_SIGNAL *multiplexor)
|
|
||||||
{
|
|
||||||
int val;
|
|
||||||
if (!multiplexor->processAsInt(frame, val)) return false;
|
|
||||||
foreach (DBC_SIGNAL *child, multiplexedChildren)
|
|
||||||
{
|
|
||||||
if ((val >= child->multiplexLowValue) && (val <= child->multiplexHighValue))
|
|
||||||
{
|
|
||||||
if (child->isMultiplexor) return _sigInMsgPriv(frame, child); //recurse down a level and keep searching
|
|
||||||
if (child == this) return true; //if we are that child then we matched!
|
|
||||||
}
|
}
|
||||||
|
else return false;
|
||||||
}
|
}
|
||||||
return false; //signal not found in this message
|
else return true; //if signal isn't multiplexed then it's definitely in the message
|
||||||
}
|
}
|
||||||
|
|
||||||
//Take all the children of this signal and see if they exist in the message. Can be called recursively to descend the dependency tree
|
//Take all the children of this signal and see if they exist in the message. Can be called recursively to descend the dependency tree
|
||||||
|
|||||||
+1
-3
@@ -120,14 +120,12 @@ public: //TODO: this is sloppy. It shouldn't all be public!
|
|||||||
QString processSignalTree(const CANFrame &frame);
|
QString processSignalTree(const CANFrame &frame);
|
||||||
DBC_ATTRIBUTE_VALUE *findAttrValByName(QString name);
|
DBC_ATTRIBUTE_VALUE *findAttrValByName(QString name);
|
||||||
DBC_ATTRIBUTE_VALUE *findAttrValByIdx(int idx);
|
DBC_ATTRIBUTE_VALUE *findAttrValByIdx(int idx);
|
||||||
|
bool isSignalInMessage(const CANFrame &frame);
|
||||||
|
|
||||||
friend bool operator<(const DBC_SIGNAL& l, const DBC_SIGNAL& r)
|
friend bool operator<(const DBC_SIGNAL& l, const DBC_SIGNAL& r)
|
||||||
{
|
{
|
||||||
return (l.name.toLower() < r.name.toLower());
|
return (l.name.toLower() < r.name.toLower());
|
||||||
}
|
}
|
||||||
private:
|
|
||||||
bool isSignalInMessage(const CANFrame &frame);
|
|
||||||
bool _sigInMsgPriv(const CANFrame &frame, DBC_SIGNAL *multiplexor);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DBCSignalHandler; //forward declaration to keep from having to include dbchandler.h in this file and thus create a loop
|
class DBCSignalHandler; //forward declaration to keep from having to include dbchandler.h in this file and thus create a loop
|
||||||
|
|||||||
+28
-14
@@ -1250,6 +1250,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
int sBit, bits;
|
int sBit, bits;
|
||||||
bool intelFormat, isSigned;
|
bool intelFormat, isSigned;
|
||||||
QString tempStr;
|
QString tempStr;
|
||||||
|
double x,y;
|
||||||
|
|
||||||
qDebug() << "New Graph ID: " << params.ID;
|
qDebug() << "New Graph ID: " << params.ID;
|
||||||
qDebug() << "Start bit: " << params.startBit;
|
qDebug() << "Start bit: " << params.startBit;
|
||||||
@@ -1283,8 +1284,8 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
|
|
||||||
params.x.reserve(numEntries);
|
params.x.reserve(numEntries);
|
||||||
params.y.reserve(numEntries);
|
params.y.reserve(numEntries);
|
||||||
params.x.fill(0, numEntries);
|
//params.x.fill(0, numEntries);
|
||||||
params.y.fill(0, numEntries);
|
//params.y.fill(0, numEntries);
|
||||||
|
|
||||||
sBit = params.startBit;
|
sBit = params.startBit;
|
||||||
bits = params.numBits;
|
bits = params.numBits;
|
||||||
@@ -1294,19 +1295,32 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
for (int j = 0; j < numEntries; j++)
|
for (int j = 0; j < numEntries; j++)
|
||||||
{
|
{
|
||||||
int k = j * params.stride;
|
int k = j * params.stride;
|
||||||
|
if (params.associatedSignal)
|
||||||
|
{
|
||||||
|
//skip all the rest of the stuff in this loop and don't add this to the graph if this signal isn't in this frame
|
||||||
|
if (!params.associatedSignal->isSignalInMessage(frameCache[k]))
|
||||||
|
{
|
||||||
|
qDebug() << "Signal was not in this frame";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else qDebug() << "Signal in the frame!";
|
||||||
|
}
|
||||||
tempVal = Utility::processIntegerSignal(frameCache[k].payload(), sBit, bits, intelFormat, isSigned); //& params.mask;
|
tempVal = Utility::processIntegerSignal(frameCache[k].payload(), sBit, bits, intelFormat, isSigned); //& params.mask;
|
||||||
//qDebug() << tempVal;
|
//qDebug() << tempVal;
|
||||||
params.y[j] = (tempVal * params.scale) + params.bias;
|
y = (tempVal * params.scale) + params.bias;
|
||||||
|
params.y.append( y );
|
||||||
|
|
||||||
if (secondsMode)
|
if (secondsMode)
|
||||||
{
|
{
|
||||||
params.x[j] = (frameCache[k].timeStamp().microSeconds()) / 1000000.0;
|
x = (frameCache[k].timeStamp().microSeconds()) / 1000000.0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
params.x[j] = frameCache[k].timeStamp().microSeconds();
|
x = frameCache[k].timeStamp().microSeconds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
params.x.append( x );
|
||||||
|
|
||||||
if (params.associatedSignal && numEntries > 1)
|
if (params.associatedSignal && numEntries > 1)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1314,7 +1328,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
if (isValid)
|
if (isValid)
|
||||||
{
|
{
|
||||||
if (params.prevValLocation == QPointF(0,0)) {
|
if (params.prevValLocation == QPointF(0,0)) {
|
||||||
params.prevValLocation = QPointF(params.x[j], params.y[j]);
|
params.prevValLocation = QPointF(x, y);
|
||||||
params.prevValStr = tempStr;
|
params.prevValStr = tempStr;
|
||||||
params.prevValTable = 0;
|
params.prevValTable = 0;
|
||||||
}
|
}
|
||||||
@@ -1330,7 +1344,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
// add the bracket at the top:
|
// add the bracket at the top:
|
||||||
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
|
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
|
||||||
bracket->left->setCoords(params.prevValLocation);
|
bracket->left->setCoords(params.prevValLocation);
|
||||||
bracket->right->setCoords(params.x[j], params.prevValLocation.y());
|
bracket->right->setCoords(x, params.prevValLocation.y());
|
||||||
bracket->setLength(12);
|
bracket->setLength(12);
|
||||||
params.brackets.append(bracket);
|
params.brackets.append(bracket);
|
||||||
|
|
||||||
@@ -1342,7 +1356,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
valueText->setText(params.prevValStr);
|
valueText->setText(params.prevValStr);
|
||||||
valueText->setFont(QFont(font().family(), 10));
|
valueText->setFont(QFont(font().family(), 10));
|
||||||
params.bracketTexts.append(valueText);
|
params.bracketTexts.append(valueText);
|
||||||
params.prevValLocation = QPointF(params.x[j], params.y[j]);
|
params.prevValLocation = QPointF(x, y);
|
||||||
params.prevValStr = tempStr;
|
params.prevValStr = tempStr;
|
||||||
params.lastBracket = bracket;
|
params.lastBracket = bracket;
|
||||||
}
|
}
|
||||||
@@ -1350,10 +1364,10 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.y[j] < yminval) yminval = params.y[j];
|
if (y < yminval) yminval = y;
|
||||||
if (params.y[j] > ymaxval) ymaxval = params.y[j];
|
if (y > ymaxval) ymaxval = y;
|
||||||
if (params.x[j] < xminval) xminval = params.x[j];
|
if (x < xminval) xminval = x;
|
||||||
if (params.x[j] > xmaxval) xmaxval = params.x[j];
|
if (x > xmaxval) xmaxval = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.prevValLocation != QPointF(0,0))
|
if (params.prevValLocation != QPointF(0,0))
|
||||||
@@ -1361,7 +1375,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
int j = numEntries - 1;
|
int j = numEntries - 1;
|
||||||
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
|
QCPItemBracket *bracket = new QCPItemBracket(ui->graphingView);
|
||||||
bracket->left->setCoords(params.prevValLocation);
|
bracket->left->setCoords(params.prevValLocation);
|
||||||
bracket->right->setCoords(params.x[j], params.prevValLocation.y());
|
bracket->right->setCoords(x, params.prevValLocation.y());
|
||||||
bracket->setLength(12);
|
bracket->setLength(12);
|
||||||
|
|
||||||
// add text label for this value table entry
|
// add text label for this value table entry
|
||||||
@@ -1371,7 +1385,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
valueText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter);
|
valueText->setPositionAlignment(Qt::AlignBottom|Qt::AlignHCenter);
|
||||||
valueText->setText(params.prevValStr);
|
valueText->setText(params.prevValStr);
|
||||||
valueText->setFont(QFont(font().family(), 10));
|
valueText->setFont(QFont(font().family(), 10));
|
||||||
params.prevValLocation = QPointF(params.x[j], params.y[j]);
|
params.prevValLocation = QPointF(x, y);
|
||||||
params.prevValStr = tempStr;
|
params.prevValStr = tempStr;
|
||||||
params.prevValTable = tempVal;
|
params.prevValTable = tempVal;
|
||||||
params.lastBracket = bracket;
|
params.lastBracket = bracket;
|
||||||
|
|||||||
Reference in New Issue
Block a user