diff --git a/dbc/dbchandler.cpp b/dbc/dbchandler.cpp index b2cb654..f3afa53 100644 --- a/dbc/dbchandler.cpp +++ b/dbc/dbchandler.cpp @@ -1930,6 +1930,18 @@ DBC_MESSAGE* DBCHandler::findMessage(const CANFrame &frame) return nullptr; } +DBC_MESSAGE* DBCHandler::findMessage(uint32_t id) +{ + for(int i = 0; i < loadedFiles.count(); i++) + { + DBC_MESSAGE* msg = loadedFiles[i].messageHandler->findMsgByID(id); + if (msg != nullptr) + { + return msg; + } + } + return nullptr; +} // This function won't care which bus the DBC file is associated, but will return any message as long as ID matches and the file // has filter labeling enabled. diff --git a/dbc/dbchandler.h b/dbc/dbchandler.h index 53a9519..60b8ff9 100644 --- a/dbc/dbchandler.h +++ b/dbc/dbchandler.h @@ -118,6 +118,7 @@ public: void swapFiles(int pos1, int pos2); DBC_MESSAGE* findMessage(const CANFrame &frame); DBC_MESSAGE* findMessage(const QString msgName); + DBC_MESSAGE* findMessage(uint32_t id); DBC_MESSAGE* findMessageForFilter(uint32_t id, MatchingCriteria_t * matchingCriteria); int getFileCount(); DBCFile* getFileByIdx(int idx); diff --git a/re/filecomparatorwindow.cpp b/re/filecomparatorwindow.cpp index 4c93be7..11d9a57 100644 --- a/re/filecomparatorwindow.cpp +++ b/re/filecomparatorwindow.cpp @@ -20,6 +20,8 @@ FileComparatorWindow::FileComparatorWindow(QWidget *parent) : ui->lblFirstFile->setText(""); ui->lblRefFrames->setText("Loaded frames: 0"); + dbcHandler = DBCHandler::getReference(); + installEventFilter(this); } @@ -154,6 +156,7 @@ void FileComparatorWindow::calculateDetails() for (int x = 0; x < interestedFrames.count(); x++) { CANFrame frame = interestedFrames.at(x); + DBC_MESSAGE *msg = dbcHandler->findMessage(frame.frameId()); data = reinterpret_cast(frame.payload().constData()); dataLen = frame.payload().count(); @@ -166,6 +169,28 @@ void FileComparatorWindow::calculateDetails() tmp = tmp << (8 * y); interestedIDs[frame.frameId()].bitmap |= tmp; //qDebug() << "bitmap: " << QString::number(interestedIDs[frame.frameId()].bitmap, 16); + } + if (msg) + { + int numSignals = msg->sigHandler->getCount(); + for (int i = 0; i < numSignals; i++) + { + DBC_SIGNAL *sig = msg->sigHandler->findSignalByIdx(i); + if (sig) + { + if (sig->isSignalInMessage(frame)) + { + QString sigVal; + if (sig->processAsText(frame, sigVal, false)) + { + QList tempList = interestedIDs[frame.frameId()].signalInstances[sig->name]; + if (!tempList.contains(sigVal)) tempList.append(sigVal); + interestedIDs[frame.frameId()].signalInstances[sig->name] = tempList; + } + } + } + } + qApp->processEvents(); } } else //never seen this ID before so add one @@ -192,6 +217,28 @@ void FileComparatorWindow::calculateDetails() newData->bitmap |= tmp; //qDebug() << "bitmap: " << QString::number(newData->bitmap, 16); } + if (msg) + { + int numSignals = msg->sigHandler->getCount(); + for (int i = 0; i < numSignals; i++) + { + DBC_SIGNAL *sig = msg->sigHandler->findSignalByIdx(i); + if (sig) + { + if (sig->isSignalInMessage(frame)) + { + QString sigVal; + if (sig->processAsText(frame, sigVal, false)) + { + QList tempList; + tempList.append(sigVal); + newData->signalInstances[sig->name] = tempList; + } + } + } + } + } + interestedIDs.insert(frame.frameId(), *newData); } } @@ -201,6 +248,7 @@ void FileComparatorWindow::calculateDetails() for (int x = 0; x < referenceFrames.count(); x++) { CANFrame frame = referenceFrames.at(x); + DBC_MESSAGE *msg = dbcHandler->findMessage(frame.frameId()); data = reinterpret_cast(frame.payload().constData()); dataLen = frame.payload().count(); @@ -214,6 +262,27 @@ void FileComparatorWindow::calculateDetails() referenceIDs[frame.frameId()].bitmap |= tmp; //qDebug() << "bitmap: " << QString::number(referenceIDs[frame.frameId()].bitmap, 16); } + if (msg) + { + int numSignals = msg->sigHandler->getCount(); + for (int i = 0; i < numSignals; i++) + { + DBC_SIGNAL *sig = msg->sigHandler->findSignalByIdx(i); + if (sig) + { + if (sig->isSignalInMessage(frame)) + { + QString sigVal; + if (sig->processAsText(frame, sigVal, false)) + { + QList tempList = referenceIDs[frame.frameId()].signalInstances[sig->name]; + if (!tempList.contains(sigVal)) tempList.append(sigVal); + referenceIDs[frame.frameId()].signalInstances[sig->name] = tempList; + } + } + } + } + } } else //never seen this ID before so add one { @@ -237,6 +306,27 @@ void FileComparatorWindow::calculateDetails() newData->bitmap |= tmp; //qDebug() << "bitmap: " << QString::number(newData->bitmap, 16); } + if (msg) + { + int numSignals = msg->sigHandler->getCount(); + for (int i = 0; i < numSignals; i++) + { + DBC_SIGNAL *sig = msg->sigHandler->findSignalByIdx(i); + if (sig) + { + if (sig->isSignalInMessage(frame)) + { + QString sigVal; + if (sig->processAsText(frame, sigVal, false)) + { + QList tempList; + tempList.append(sigVal); + newData->signalInstances[sig->name] = tempList; + } + } + } + } + } referenceIDs.insert(frame.frameId(), *newData); } } @@ -251,7 +341,7 @@ void FileComparatorWindow::calculateDetails() for (i = interestedIDs.begin(); i != interestedIDs.end(); ++i) { framesCounter++; - if (framesCounter > 10000) + if (framesCounter > 50) { framesCounter = 0; qApp->processEvents(); @@ -261,14 +351,24 @@ void FileComparatorWindow::calculateDetails() if (!referenceIDs.contains(keyone)) { valuesBase = new QTreeWidgetItem(); - valuesBase->setText(0, Utility::formatHexNum(keyone)); + DBC_MESSAGE *msg = dbcHandler->findMessage(keyone); + if (msg) + { + valuesBase->setText(0, Utility::formatHexNum(keyone) + " (" + msg->name + ")"); + } + else valuesBase->setText(0, Utility::formatHexNum(keyone)); interestedOnlyBase->addChild(valuesBase); } else //ID was in both files { interestedHadUnique = false; sharedItem = new QTreeWidgetItem(); - sharedItem->setText(0, Utility::formatHexNum(keyone)); + DBC_MESSAGE *msg = dbcHandler->findMessage(keyone); + if (msg) + { + sharedItem->setText(0, Utility::formatHexNum(keyone) + " (" + msg->name + ")"); + } + else sharedItem->setText(0, Utility::formatHexNum(keyone)); //if the ID was in both files then we can use the data accumulated above in bitmap //and values to figure out what has changed between the two files @@ -336,6 +436,53 @@ void FileComparatorWindow::calculateDetails() } } } + + //presumably both include the same signals so for this first attempt just + //take all signals from the reference and then find that same signal in + //the interested frames and then see what unique values there were in either one + + QHash>::const_iterator it = reference.signalInstances.constBegin(); + while (it != reference.signalInstances.constEnd()) + { + valuesBase = new QTreeWidgetItem(); + valuesBase->setText(0, "Signal " + it.key()); + sharedItem->addChild(valuesBase); + valuesInterested = new QTreeWidgetItem(); + valuesInterested->setText(0, "Values found only in " + interestedFilename); + if (!uniqueInterested) + { + valuesReference = new QTreeWidgetItem(); + valuesReference->setText(0, "Values found only in Side 2 - Reference frames"); + } + valuesBase->addChild(valuesInterested); + if (!uniqueInterested) valuesBase->addChild(valuesReference); + + QList refVals = it.value(); + QList interestedVals = interested.signalInstances[it.key()]; + foreach (QString str, refVals) + { + if (!interestedVals.contains(str)) + { + qDebug() << "Interested frames didn't contain value: " << str << " in signal " << it.key(); + detail = new QTreeWidgetItem(); + detail->setText(0, str); + valuesReference->addChild(detail); + } + } + qApp->processEvents(); + foreach (QString str, interestedVals) + { + if (!refVals.contains(str)) + { + qDebug() << "Reference frames didn't contain value: " << str << " in signal " << it.key(); + detail = new QTreeWidgetItem(); + detail->setText(0, str); + valuesInterested->addChild(detail); + } + } + ++it; + } + if (interestedHadUnique || !uniqueInterested) sharedBase->addChild(sharedItem); } } @@ -351,7 +498,12 @@ void FileComparatorWindow::calculateDetails() if (!interestedIDs.contains(keytwo)) { valuesBase = new QTreeWidgetItem(); - valuesBase->setText(0, Utility::formatHexNum(keytwo)); + DBC_MESSAGE *msg = dbcHandler->findMessage(keytwo); + if (msg) + { + valuesBase->setText(0, Utility::formatHexNum(keytwo) + " (" + msg->name + ")" ); + } + else valuesBase->setText(0, Utility::formatHexNum(keytwo)); referenceOnlyBase->addChild(valuesBase); } } diff --git a/re/filecomparatorwindow.h b/re/filecomparatorwindow.h index 61cef8c..0bd1b50 100644 --- a/re/filecomparatorwindow.h +++ b/re/filecomparatorwindow.h @@ -7,6 +7,7 @@ #include "framefileio.h" #include "can_structs.h" #include "utility.h" +#include "dbc/dbchandler.h" namespace Ui { class FileComparatorWindow; @@ -18,6 +19,7 @@ struct FrameData int dataLen; uint64_t bitmap; int values[8][256]; //first index is the data byte, second is # of times we saw that value + QHash> signalInstances; }; class FileComparatorWindow : public QDialog @@ -39,6 +41,7 @@ private: QVector interestedFrames; QVector referenceFrames; QString interestedFilename; + DBCHandler *dbcHandler; void calculateDetails(); void showEvent(QShowEvent *); diff --git a/re/graphingwindow.cpp b/re/graphingwindow.cpp index d5e153a..9b94734 100644 --- a/re/graphingwindow.cpp +++ b/re/graphingwindow.cpp @@ -1007,7 +1007,7 @@ void GraphingWindow::loadDefinitions() } if (tokens.length() > 21) { - DBC_MESSAGE *msg = dbcHandler->findMessage(tokens[20]); + DBC_MESSAGE *msg = dbcHandler->findMessage(QString(tokens[20])); if (msg) { gp.associatedSignal = msg->sigHandler->findSignalByName(tokens[21]);