Converted more code to be easier to generalize to larger CAN payloads

for CAN-FD. Improved some code to be faster. Fixed up some compile
time warnings.
This commit is contained in:
Collin Kidder
2019-12-15 15:02:06 -05:00
parent ef24036d1c
commit 8beb0e31a0
28 changed files with 589 additions and 435 deletions
+22 -14
View File
@@ -123,6 +123,8 @@ void FileComparatorWindow::calculateDetails()
QTreeWidgetItem *interestedOnlyBase, *referenceOnlyBase = nullptr, *sharedBase, *bitmapBaseInterested, *bitmapBaseReference = nullptr;
QTreeWidgetItem *valuesBase, *detail, *sharedItem, *valuesInterested, *valuesReference = nullptr;
uint64_t tmp;
unsigned char *data;
int dataLen;
bool uniqueInterested = ui->ckUniqueToInterested->isChecked();
@@ -152,12 +154,15 @@ void FileComparatorWindow::calculateDetails()
for (int x = 0; x < interestedFrames.count(); x++)
{
CANFrame frame = interestedFrames.at(x);
data = reinterpret_cast<unsigned char *>(frame.payload().data());
dataLen = frame.payload().count();
if (interestedIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there
{
for (unsigned int y = 0; y < frame.payload().length(); y++)
for (unsigned int y = 0; y < dataLen; y++)
{
interestedIDs[frame.frameId()].values[y][frame.payload()[y]]++;
tmp = frame.payload()[y];
interestedIDs[frame.frameId()].values[y][data[y]]++;
tmp = data[y];
tmp = tmp << (8 * y);
interestedIDs[frame.frameId()].bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(interestedIDs[frame.frameId()].bitmap, 16);
@@ -167,7 +172,7 @@ void FileComparatorWindow::calculateDetails()
{
FrameData *newData = new FrameData();
newData->ID = frame.frameId();
newData->dataLen = frame.payload().length();
newData->dataLen = dataLen;
//it would be possible to implement a constructor for FrameData
//that sets the bitmap and values to zero. That would be cleaner and better.
newData->bitmap = 0;
@@ -179,10 +184,10 @@ void FileComparatorWindow::calculateDetails()
}
}
//memset(newData->values, 0, 256 * 8);
for (unsigned int y = 0; y < frame.payload().length(); y++)
for (unsigned int y = 0; y < dataLen; y++)
{
newData->values[y][frame.payload()[y]] = 1;
tmp = frame.payload()[y];
newData->values[y][data[y]] = 1;
tmp = data[y];
tmp = tmp << (8 * y);
newData->bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(newData->bitmap, 16);
@@ -196,12 +201,15 @@ void FileComparatorWindow::calculateDetails()
for (int x = 0; x < referenceFrames.count(); x++)
{
CANFrame frame = referenceFrames.at(x);
data = reinterpret_cast<unsigned char *>(frame.payload().data());
dataLen = frame.payload().count();
if (referenceIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there
{
for (unsigned int y = 0; y < frame.payload().length(); y++)
for (unsigned int y = 0; y < dataLen; y++)
{
referenceIDs[frame.frameId()].values[y][frame.payload()[y]]++;
tmp = frame.payload()[y];
referenceIDs[frame.frameId()].values[y][data[y]]++;
tmp = data[y];
tmp = tmp << (8 * y);
referenceIDs[frame.frameId()].bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(referenceIDs[frame.frameId()].bitmap, 16);
@@ -211,7 +219,7 @@ void FileComparatorWindow::calculateDetails()
{
FrameData *newData = new FrameData();
newData->ID = frame.frameId();
newData->dataLen = frame.payload().length();
newData->dataLen = dataLen;
newData->bitmap = 0;
for (int x = 0; x < 8; x++)
{
@@ -221,10 +229,10 @@ void FileComparatorWindow::calculateDetails()
}
}
//memset(newData->values, 0, 256 * 8);
for (unsigned int y = 0; y < frame.payload().length(); y++)
for (unsigned int y = 0; y < dataLen; y++)
{
newData->values[y][frame.payload()[y]] = 1;
tmp = frame.payload()[y];
newData->values[y][data[y]] = 1;
tmp = data[y];
tmp = tmp << (8 * y);
newData->bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(newData->bitmap, 16);
+29 -17
View File
@@ -257,7 +257,7 @@ void FlowViewWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, QMous
void FlowViewWindow::gotCenterTimeID(int32_t ID, double timestamp)
{
uint64_t t_stamp;
int64_t t_stamp;
t_stamp = timestamp * 1000000l;
@@ -397,8 +397,10 @@ void FlowViewWindow::updatedFrames(int numFrames)
{
QVector<double>newX[8];
QVector<double>newY[8];
unsigned char *data;
int dataLen = 0;
CANFrame thisFrame;
const CANFrame *thisFrame;
if (numFrames == -1) //all frames deleted. Kill the display
{
ui->listFrameID->clear();
@@ -433,35 +435,37 @@ void FlowViewWindow::updatedFrames(int numFrames)
bool needRefresh = false;
for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++)
{
thisFrame = modelFrames->at(i);
thisFrame = &modelFrames->at(i);
data = reinterpret_cast<unsigned char *>(thisFrame->payload().data());
dataLen = thisFrame->payload().length();
if (!foundID.contains(thisFrame.frameId()))
if (!foundID.contains(thisFrame->frameId()))
{
foundID.append(thisFrame.frameId());
FilterUtility::createFilterItem(thisFrame.frameId(), ui->listFrameID);
foundID.append(thisFrame->frameId());
FilterUtility::createFilterItem(thisFrame->frameId(), ui->listFrameID);
}
if (thisFrame.frameId() == refID)
if (thisFrame->frameId() == refID)
{
frameCache.append(thisFrame);
frameCache.append(*thisFrame);
for (int k = 0; k < 8; k++)
for (int k = 0; k < dataLen; k++)
{
if (ui->cbTimeGraph->isChecked())
{
if (secondsMode){
newX[k].append((double)(thisFrame.timeStamp().microSeconds()) / 1000000.0);
newX[k].append((double)(thisFrame->timeStamp().microSeconds()) / 1000000.0);
}
else
{
newX[k].append(thisFrame.timeStamp().microSeconds());
newX[k].append(thisFrame->timeStamp().microSeconds());
}
}
else
{
newX[k].append(x[k].count());
}
newY[k].append(thisFrame.payload()[k]);
newY[k].append(data[k]);
needRefresh = true;
}
}
@@ -475,7 +479,7 @@ void FlowViewWindow::updatedFrames(int numFrames)
}
if (needRefresh)
{
for (int k = 0; k < 8; k++)
for (int k = 0; k < dataLen; k++)
{
if (graphRef[k] && graphRef[k]->data())
graphRef[k]->addData(newX[k], newY[k]);
@@ -498,6 +502,9 @@ void FlowViewWindow::createGraph(int byteNum)
{
int tempVal;
float minval=1000000, maxval = -100000;
unsigned char *data;
int dataLen = 0;
const CANFrame *frame;
qDebug() << "Create Graph " << byteNum;
@@ -512,16 +519,20 @@ void FlowViewWindow::createGraph(int byteNum)
for (int j = 0; j < numEntries; j++)
{
tempVal = frameCache[j].payload()[byteNum];
frame = &frameCache[j];
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().length();
tempVal = data[byteNum];
if (graphByTime)
{
if (secondsMode){
x[byteNum][j] = (double)(frameCache[j].timeStamp().microSeconds()) / 1000000.0;
x[byteNum][j] = (double)(frame->timeStamp().microSeconds()) / 1000000.0;
}
else
{
x[byteNum][j] = frameCache[j].timeStamp().microSeconds();
x[byteNum][j] = frame->timeStamp().microSeconds();
}
}
else
@@ -758,7 +769,8 @@ void FlowViewWindow::updatePosition(bool forward)
uint8_t cngByte;
for (int i = 0; i < 8; i++)
{
cngByte = currBytes[i] ^ frameCache.at(currentPosition).payload()[i];
unsigned char thisByte = static_cast<unsigned char>(frameCache.at(currentPosition).payload().data()[i]);
cngByte = currBytes[i] ^ thisByte;
changedBits |= (uint64_t)cngByte << (8ull * i);
}
+1 -1
View File
@@ -44,7 +44,7 @@ signals:
private:
Ui::FlowViewWindow *ui;
QList<int> foundID;
QList<quint32> foundID;
QList<CANFrame> frameCache;
const QVector<CANFrame> *modelFrames;
unsigned char refBytes[8];
+18 -9
View File
@@ -138,7 +138,7 @@ FrameInfoWindow::~FrameInfoWindow()
void FrameInfoWindow::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event);
Q_UNUSED(event)
writeSettings();
}
@@ -260,10 +260,10 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
uint8_t referenceBits[8];
QTreeWidgetItem *baseNode, *dataBase, *histBase, *tempItem;
targettedID = static_cast<int>(Utility::ParseStringToNum(newID));
if (modelFrames->count() == 0) return;
targettedID = static_cast<int>(Utility::ParseStringToNum(newID));
qDebug() << "Started update details window with id " << targettedID;
avgInterval = 0;
@@ -278,6 +278,9 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
if (thisFrame.frameId() == static_cast<uint32_t>(targettedID)) frameCache.append(thisFrame);
}
unsigned char *data = reinterpret_cast<unsigned char *>(frameCache.at(0).payload().data());
int dataLen = frameCache.at(0).payload().length();
ui->treeDetails->clear();
if (frameCache.count() == 0) return;
@@ -364,10 +367,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
}
for (int j = 0; j < 64; j++) bitfieldHistogram[j] = 0;
for (int c = 0; c < 8; c++)
data = reinterpret_cast<unsigned char *>(frameCache.at(0).payload().data());
dataLen = frameCache.at(0).payload().length();
for (int c = 0; c < dataLen; c++)
{
changedBits[c] = 0;
referenceBits[c] = frameCache.at(0).payload()[c];
referenceBits[c] = data[c];
//qDebug() << referenceBits[c];
}
@@ -377,10 +383,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
//then find all data points
for (int j = 0; j < frameCache.count(); j++)
{
data = reinterpret_cast<unsigned char *>(frameCache.at(j).payload().data());
dataLen = frameCache.at(j).payload().length();
byteGraphX.append(j);
for (uint32_t bytcnt = 0; bytcnt < frameCache[j].payload().length(); bytcnt++)
for (uint32_t bytcnt = 0; bytcnt < dataLen; bytcnt++)
{
byteGraphY[bytcnt].append(frameCache[j].payload()[bytcnt]);
byteGraphY[bytcnt].append(data[bytcnt]);
}
if (j != 0)
@@ -398,12 +407,12 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
if (thisInterval < minInterval) minInterval = thisInterval;
avgInterval += thisInterval;
}
thisLen = frameCache.at(j).payload().length();
thisLen = dataLen;
if (thisLen > maxLen) maxLen = thisLen;
if (thisLen < minLen) minLen = thisLen;
for (int c = 0; c < thisLen; c++)
{
unsigned char dat = frameCache.at(j).payload()[c];
unsigned char dat = data[c];
if (minData[c] > dat) minData[c] = dat;
if (maxData[c] < dat) maxData[c] = dat;
dataHistogram[dat][c]++; //add one to count for this
+24 -18
View File
@@ -81,7 +81,7 @@ void ISOTP_InterpreterWindow::showEvent(QShowEvent* event)
void ISOTP_InterpreterWindow::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event);
Q_UNUSED(event)
removeEventFilter(this);
writeSettings();
}
@@ -194,7 +194,7 @@ void ISOTP_InterpreterWindow::updatedFrames(int numFrames)
void ISOTP_InterpreterWindow::headerClicked(int logicalIndex)
{
ui->tableIsoFrames->setSortingEnabled(false);
ui->tableIsoFrames->sortByColumn(logicalIndex);
ui->tableIsoFrames->sortByColumn(logicalIndex, Qt::SortOrder::AscendingOrder);
}
void ISOTP_InterpreterWindow::showDetailView()
@@ -208,17 +208,21 @@ void ISOTP_InterpreterWindow::showDetailView()
msg = &messages[rowNum];
if (msg->len != msg->data.length())
unsigned char *data = reinterpret_cast<unsigned char *>(msg->payload().data());
int dataLen = msg->payload().length();
if (msg->reportedLength != dataLen)
{
buildString.append("Message didn't have the correct number of bytes.\rExpected "
+ QString::number(msg->len) + " got "
+ QString::number(msg->data.length()) + "\r\r");
+ QString::number(msg->reportedLength) + " got "
+ QString::number(dataLen) + "\r\r");
}
buildString.append(tr("Raw Payload: "));
for (int i = 0; i < messages[rowNum].data.count(); i++)
for (int i = 0; i < dataLen; i++)
{
buildString.append(Utility::formatNumber((char)messages[rowNum].data[i]));
buildString.append(Utility::formatNumber(data[i]));
buildString.append(" ");
}
buildString.append("\r\r");
@@ -262,17 +266,20 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg)
int rowNum;
QString tempString;
if ((msg.len != msg.data.count()) && !ui->cbShowIncomplete->isChecked()) return;
unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
if (idFilters.find(msg.ID) == idFilters.end())
if ((msg.reportedLength != dataLen) && !ui->cbShowIncomplete->isChecked()) return;
if (idFilters.find(msg.frameId()) == idFilters.end())
{
idFilters.insert(msg.ID, true);
idFilters.insert(msg.frameId(), true);
QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.ID, msg.extended), ui->listFilter);
QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.frameId(), msg.hasExtendedFrameFormat()), ui->listFilter);
listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag
listItem->setCheckState(Qt::Checked);
}
if (!idFilters[msg.ID]) return;
if (!idFilters[msg.frameId()]) return;
messages.append(msg);
rowNum = ui->tableIsoFrames->rowCount();
@@ -280,22 +287,21 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg)
ui->tableIsoFrames->insertRow(rowNum);
QTableWidgetItem *item = new QTableWidgetItem;
item->setData(Qt::EditRole, Utility::formatTimestamp(msg.timestamp));
item->setData(Qt::EditRole, Utility::formatTimestamp(msg.timeStamp().microSeconds()));
//ui->tableIsoFrames->setItem(rowNum, 0, (double)msg.timestamp, Utility::formatTimestamp(msg.timestamp)));
ui->tableIsoFrames->setItem(rowNum, 0, item);
ui->tableIsoFrames->setItem(rowNum, 1, new QTableWidgetItem(QString::number(msg.ID, 16)));
ui->tableIsoFrames->setItem(rowNum, 1, new QTableWidgetItem(QString::number(msg.frameId(), 16)));
ui->tableIsoFrames->setItem(rowNum, 2, new QTableWidgetItem(QString::number(msg.bus)));
if (msg.isReceived) ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Rx"));
else ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Tx"));
ui->tableIsoFrames->setItem(rowNum, 4, new QTableWidgetItem(QString::number(msg.len)));
ui->tableIsoFrames->setItem(rowNum, 4, new QTableWidgetItem(QString::number(msg.payload().length())));
for (int i = 0; i < msg.data.count(); i++)
for (int i = 0; i < dataLen; i++)
{
tempString.append(Utility::formatNumber((char)msg.data[i]));
tempString.append(Utility::formatNumber(data[i]));
tempString.append(" ");
}
ui->tableIsoFrames->setItem(rowNum, 5, new QTableWidgetItem(tempString));
}
+17 -9
View File
@@ -6,18 +6,23 @@
SnifferItem::SnifferItem(const CANFrame& pFrame, quint32 seq):
mID(pFrame.frameId())
{
for (int i = 0; i < 8; i++) {
mNotch[i] =0;
unsigned char *data = reinterpret_cast<unsigned char *>(pFrame.payload().data());
int dataLen = pFrame.payload().length();
for (int i = 0; i < 0; i++) {
mNotch[i] = 0;
mMarker.data[i] = 0;
mMarker.dataTimestamp[i] = 0;
mCurrent.data[i] = pFrame.payload()[i];
if (i < dataLen) mCurrent.data[i] = data[i];
else mCurrent.data[i] = 0;
mCurrent.dataTimestamp[i] = seq;
}
mLastMarker = mMarker;
mCurrent.len = pFrame.payload().length();
mCurrent.len = dataLen;
/* that's dirty */
update(pFrame, seq, false);
update(pFrame, seq, false);
update(pFrame, seq, false); //anyone know why we're doing this twice?!
}
@@ -112,20 +117,23 @@ void SnifferItem::update(const CANFrame& pFrame, quint32 timeSeq, bool mute)
mLastTime = mCurrentTime;
mCurrSeqVal = timeSeq;
unsigned char *data = reinterpret_cast<unsigned char *>(pFrame.payload().data());
int dataLen = pFrame.payload().length();
/* copy new value */
for (int i = 0; i < 8; i++)
for (int i = 0; i < dataLen; i++)
{
maskedData = pFrame.payload()[i];
maskedData = data[i];
if (mute) maskedData &= ~mNotch[i];
maskedCurr = mCurrent.data[i];
if (mute) maskedCurr &= ~mNotch[i];
if (maskedCurr != maskedData)
{
mCurrent.data[i] = pFrame.payload()[i];
mCurrent.data[i] = data[i];
mCurrent.dataTimestamp[i] = timeSeq;
}
}
mCurrent.len = pFrame.payload().length();
mCurrent.len = dataLen;
mCurrentTime = pFrame.timeStamp().microSeconds();
/* update marker */
+13 -11
View File
@@ -237,8 +237,8 @@ void UDSScanWindow::scanUDS()
for (id = startID; id <= endID; id++)
{
test.ID = id;
test.data.clear();
test.setFrameId( id );
test.payload().clear();
if (ui->ckTester->isChecked())
{
@@ -354,17 +354,19 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
int offset = ui->spinReplyOffset->value();
UDS_MESSAGE sentFrame;
bool gotReply = false;
unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
int numSending = sendingFrames.length();
if (numSending == 0) return;
if (currIdx >= numSending) return;
sentFrame = sendingFrames[currIdx];
id = msg.ID;
id = msg.frameId();
qDebug() << "UDS message ID " << QString::number(msg.ID,16) << " service: " << QString::number(msg.service, 16) << " subfunc: " << QString::number(msg.subFunc, 16);
qDebug() << "UDS message ID " << QString::number(msg.frameId(),16) << " service: " << QString::number(msg.service, 16) << " subfunc: " << QString::number(msg.subFunc, 16);
if ((id == (uint32_t)(sentFrame.ID + offset)) || ui->cbAllowAdaptiveOffset->isChecked())
if ((id == (uint32_t)(sentFrame.frameId() + offset)) || ui->cbAllowAdaptiveOffset->isChecked())
{
serviceShortName = udsHandler->getServiceShortDesc(sentFrame.service);
if (serviceShortName.length() < 3) serviceShortName = QString::number(sentFrame.service, 16);
@@ -374,10 +376,10 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
QTreeWidgetItem *nodePositive = new QTreeWidgetItem();
QString reply = "POSITIVE ";
for (int i = 0; i < msg.data.length(); i++)
for (int i = 0; i < dataLen; i++)
{
reply.append(" ");
reply.append(Utility::formatHexNum(msg.data[i]));
reply.append(Utility::formatHexNum(data[i]));
}
nodePositive->setText(0, reply);
nodePositive->setForeground(0, QBrush(Qt::darkGreen));
@@ -387,12 +389,12 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
}
else if ( msg.isErrorReply && (msg.service == sendingFrames[currIdx].service) )
{
if (msg.data.length())
if (dataLen)
{
setupNodes(id);
QTreeWidgetItem *nodeNegative = new QTreeWidgetItem();
qDebug() << ui->spinNumBytes->value();
nodeNegative->setText(0, "NEGATIVE - " + udsHandler->getNegativeResponseShort(msg.data[0]));
nodeNegative->setText(0, "NEGATIVE - " + udsHandler->getNegativeResponseShort(data[0]));
nodeNegative->setForeground(0, QBrush(Qt::darkRed));
nodeSubFunc->addChild(nodeNegative);
nodeSubFunc->setForeground(0, QBrush(Qt::darkRed));
@@ -413,10 +415,10 @@ void UDSScanWindow::setupNodes(uint32_t replyID)
if (serviceShortName.length() < 3) serviceShortName = QString::number(sendingFrames[currIdx].service, 16);
QTreeWidgetItem *replyNode = nullptr;
if (!nodeID || nodeID->text(0) != Utility::formatHexNum(sendingFrames[currIdx].ID))
if (!nodeID || nodeID->text(0) != Utility::formatHexNum(sendingFrames[currIdx].frameId()))
{
nodeID = new QTreeWidgetItem();
nodeID->setText(0, Utility::formatHexNum(sendingFrames[currIdx].ID));
nodeID->setText(0, Utility::formatHexNum(sendingFrames[currIdx].frameId()));
ui->treeResults->addTopLevelItem(nodeID);
nodeService = nullptr;
}