From ef24036d1cfcce81e2a8dd9d6816b2cce3768b01 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Fri, 13 Dec 2019 21:06:48 -0500 Subject: [PATCH] Finished switching over everything to the new can format (I hope). It seems to function now but much more testing is needed. --- blfhandler.cpp | 29 +- canframemodel.cpp | 86 ++--- connections/canconnection.cpp | 2 +- dbc/dbchandler.cpp | 2 +- dbc/dbcsignaleditor.cpp | 2 +- firmwareuploaderwindow.cpp | 85 +++-- framefileio.cpp | 605 ++++++++++++++++---------------- frameplaybackobject.cpp | 18 +- frameplaybackwindow.cpp | 2 +- framesenderwindow.cpp | 58 +-- mainwindow.cpp | 21 +- motorcontrollerconfigwindow.cpp | 64 ++-- re/flowviewwindow.cpp | 34 +- re/frameinfowindow.cpp | 8 +- re/graphingwindow.cpp | 2 +- re/isotp_interpreterwindow.cpp | 4 +- re/sniffer/SnifferDelegate.cpp | 2 +- re/sniffer/snifferitem.cpp | 2 +- scriptcontainer.cpp | 24 +- signalviewerwindow.cpp | 2 +- utility.h | 9 + 21 files changed, 552 insertions(+), 509 deletions(-) diff --git a/blfhandler.cpp b/blfhandler.cpp index 7dde7b3..7192854 100644 --- a/blfhandler.cpp +++ b/blfhandler.cpp @@ -100,19 +100,20 @@ bool BLFHandler::loadBLF(QString filename, QVector* frames) memcpy(&canObject, fileData.constData(), sizeof(BLF_CAN_OBJ)); CANFrame frame; frame.bus = canObject.channel; - frame.extended = (canObject.id & 0x80000000ull)?true:false; - frame.ID = canObject.id & 0x1FFFFFFFull; + frame.setExtendedFrameFormat((canObject.id & 0x80000000ull)?true:false); + frame.setFrameId(canObject.id & 0x1FFFFFFFull); frame.isReceived = true; - frame.len = canObject.dlc; + QByteArray bytes(canObject.dlc, 0); if (canObject.flags & BLF_REMOTE_FLAG) { - frame.remote = true; + frame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - frame.remote = false; - for (int i = 0; i < 8; i++) frame.data[i] = canObject.data[i]; + frame.setFrameType(QCanBusFrame::DataFrame); + for (int i = 0; i < 8; i++) bytes[i] = canObject.data[i]; } + frame.setPayload(bytes); //Should we divide by a thousand or a million? Unsure here. It appears some logs are stamped in microseconds and some in milliseconds? - frame.timestamp = obj.header.v1Obj.uncompSize / 1000.0; //uncompsize field also used for timestamp oddly enough + frame.setTimeStamp(QCanBusFrame::TimeStamp(0, obj.header.v1Obj.uncompSize / 1000.0)); //uncompsize field also used for timestamp oddly enough frames->append(frame); } else if (obj.header.base.objType == BLF_CAN_MSG2) @@ -120,19 +121,19 @@ bool BLFHandler::loadBLF(QString filename, QVector* frames) memcpy(&canObject2, fileData.constData(), sizeof(BLF_CAN_OBJ2)); CANFrame frame; frame.bus = canObject2.channel; - frame.extended = (canObject2.id & 0x80000000ull)?true:false; - frame.ID = canObject2.id & 0x1FFFFFFFull; + frame.setExtendedFrameFormat((canObject2.id & 0x80000000ull)?true:false); + frame.setFrameId(canObject2.id & 0x1FFFFFFFull); frame.isReceived = true; - frame.len = canObject2.dlc; + QByteArray bytes(canObject2.dlc, 0); if (canObject2.flags & BLF_REMOTE_FLAG) { - frame.remote = true; + frame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - frame.remote = false; - for (int i = 0; i < 8; i++) frame.data[i] = canObject2.data[i]; + frame.setFrameType(QCanBusFrame::DataFrame); + for (int i = 0; i < 8; i++) bytes[i] = canObject2.data[i]; } //Should we divide by a thousand or a million? Unsure here. It appears some logs are stamped in microseconds and some in milliseconds? - frame.timestamp = obj.header.v1Obj.uncompSize / 1000.0; //uncompsize field also used for timestamp oddly enough + frame.setTimeStamp(QCanBusFrame::TimeStamp(0, obj.header.v1Obj.uncompSize / 1000.0)); //uncompsize field also used for timestamp oddly enough frames->append(frame); } else diff --git a/canframemodel.cpp b/canframemodel.cpp index 95f30a2..8a70ecc 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -133,23 +133,23 @@ void CANFrameModel::normalizeTiming() { mutex.lock(); if (frames.count() == 0) return; - timeOffset = frames[0].timestamp; + timeOffset = frames[0].timeStamp().microSeconds(); //find the absolute lowest timestamp in the whole time. Needed because maybe timestamp was reset in the middle. for (int j = 0; j < frames.count(); j++) { - if (frames[j].timestamp < timeOffset) timeOffset = frames[j].timestamp; + if (frames[j].timeStamp().microSeconds() < timeOffset) timeOffset = frames[j].timeStamp().microSeconds(); } for (int i = 0; i < frames.count(); i++) { - frames[i].timestamp -= timeOffset; + frames[i].setTimeStamp(QCanBusFrame::TimeStamp(0, frames[i].timeStamp().microSeconds() - timeOffset)); } this->beginResetModel(); for (int i = 0; i < filteredFrames.count(); i++) { - filteredFrames[i].timestamp -= timeOffset; + filteredFrames[i].setTimeStamp(QCanBusFrame::TimeStamp(0, filteredFrames[i].timeStamp().microSeconds() - timeOffset)); } this->endResetModel(); @@ -195,15 +195,15 @@ uint64_t CANFrameModel::getCANFrameVal(int row, Column col) { case Column::TimeStamp: if (overwriteDups) return frame.timedelta; - return frame.timestamp; + return frame.timeStamp().microSeconds(); case Column::FrameId: - return frame.ID; + return frame.frameId(); case Column::Extended: - if (frame.extended) return 1; + if (frame.hasExtendedFrameFormat()) return 1; return 0; case Column::Remote: if (overwriteDups) return frame.frameCount; - if (frame.remote) return 1; + if (frame.frameType() == QCanBusFrame::RemoteRequestFrame) return 1; return 0; case Column::Direction: if (frame.isReceived) return 1; @@ -211,10 +211,10 @@ uint64_t CANFrameModel::getCANFrameVal(int row, Column col) case Column::Bus: return static_cast(frame.bus); case Column::Length: - return static_cast(frame.len); + return static_cast(frame.payload().length()); case Column::ASCII: //sort both the same for now case Column::Data: - for (int i = 0; i < frame.len; i++) temp += (static_cast(frame.data[i]) << (56 - (8 * i))); + for (int i = 0; i < frame.payload().length(); i++) temp += (static_cast(frame.payload()[i]) << (56 - (8 * i))); //qDebug() << temp; return temp; case Column::NUM_COLUMN: @@ -311,7 +311,7 @@ void CANFrameModel::recalcOverwrite() uint64_t idAugmented; //id in lower 29 bits, bus number shifted up 29 bits foreach(CANFrame frame, frames) { - idAugmented = frame.ID; + idAugmented = frame.frameId(); idAugmented = idAugmented + (frame.bus << 29ull); if (!overWriteFrames.contains(idAugmented)) { @@ -321,7 +321,7 @@ void CANFrameModel::recalcOverwrite() } else { - frame.timedelta = frame.timestamp - overWriteFrames[idAugmented].timestamp; + frame.timedelta = frame.timeStamp().microSeconds() - overWriteFrames[idAugmented].timeStamp().microSeconds(); frame.frameCount = overWriteFrames[idAugmented].frameCount + 1; overWriteFrames[idAugmented] = frame; } @@ -335,7 +335,7 @@ void CANFrameModel::recalcOverwrite() for (int i = 0; i < frames.count(); i++) { - if (filters[frames[i].ID]) + if (filters[frames[i].frameId()]) { filteredFrames.append(frames[i]); } @@ -404,17 +404,17 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const if (timeSeconds) return QString::number(thisFrame.timedelta / 1000000.0, 'f', 5); return QString::number(thisFrame.timedelta); } - else ts = Utility::formatTimestamp(thisFrame.timestamp); + else ts = Utility::formatTimestamp(thisFrame.timeStamp().microSeconds()); if (ts.type() == QVariant::Double) return QString::number(ts.toDouble(), 'f', 5); //never scientific notation, 5 decimal places if (ts.type() == QVariant::LongLong) return QString::number(ts.toLongLong()); //never scientific notion, all digits shown if (ts.type() == QVariant::DateTime) return ts.toDateTime().toString(timeFormat); //custom set format for dates and times - return Utility::formatTimestamp(thisFrame.timestamp); + return Utility::formatTimestamp(thisFrame.timeStamp().microSeconds()); case Column::FrameId: - return Utility::formatCANID(thisFrame.ID, thisFrame.extended); + return Utility::formatCANID(thisFrame.frameId(), thisFrame.hasExtendedFrameFormat()); case Column::Extended: - return QString::number(thisFrame.extended); + return QString::number(thisFrame.hasExtendedFrameFormat()); case Column::Remote: - if (!overwriteDups) return QString::number(thisFrame.remote); + if (!overwriteDups) return QString::number(thisFrame.frameType() == QCanBusFrame::RemoteRequestFrame); return QString::number(thisFrame.frameCount); case Column::Direction: if (thisFrame.isReceived) return QString(tr("Rx")); @@ -422,21 +422,21 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const case Column::Bus: return QString::number(thisFrame.bus); case Column::Length: - return QString::number(thisFrame.len); + return QString::number(thisFrame.payload().length()); case Column::ASCII: - if (thisFrame.ID >= 0x7FFFFFF0ull) + if (thisFrame.frameId() >= 0x7FFFFFF0ull) { tempString.append("MARK "); - tempString.append(QString::number(thisFrame.ID & 0x7)); + tempString.append(QString::number(thisFrame.frameId() & 0x7)); return tempString; } - dLen = thisFrame.len; - if (!thisFrame.remote) { + dLen = thisFrame.payload().length(); + if (!thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) { if (dLen < 0) dLen = 0; if (dLen > 8) dLen = 8; for (int i = 0; i < dLen; i++) { - quint8 byt = thisFrame.data[i]; + quint8 byt = thisFrame.payload()[i]; //0x20 through 0x7E are printable characters. Outside of that range they aren't. So use dots instead if (byt < 0x20) byt = 0x2E; //dot character if (byt > 0x7E) byt = 0x2E; @@ -445,17 +445,17 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const } return tempString; case Column::Data: - dLen = thisFrame.len; + dLen = thisFrame.payload().length(); if (dLen < 0) dLen = 0; if (dLen > 8) dLen = 8; //if (useHexMode) tempString.append("0x "); - if (thisFrame.remote) { + if (thisFrame.frameType() == QCanBusFrame::RemoteRequestFrame) { return tempString; } for (int i = 0; i < dLen; i++) { - if (useHexMode) tempString.append( QString::number(thisFrame.data[i], 16).toUpper().rightJustified(2, '0')); - else tempString.append(QString::number(thisFrame.data[i], 10)); + if (useHexMode) tempString.append( QString::number((unsigned char)thisFrame.payload()[i], 16).toUpper().rightJustified(2, '0')); + else tempString.append(QString::number(thisFrame.payload()[i], 10)); tempString.append(" "); } //now, if we're supposed to interpret the data and the DBC handler is loaded then use it @@ -552,25 +552,25 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) mutex.lock(); CANFrame tempFrame; tempFrame = frame; - tempFrame.timestamp -= timeOffset; + tempFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, tempFrame.timeStamp().microSeconds() - timeOffset)); lastUpdateNumFrames++; //if this ID isn't found in the filters list then add it and show it by default - if (!filters.contains(tempFrame.ID)) + if (!filters.contains(tempFrame.frameId())) { // if there are any filters already configured, leave the new filter disabled if (any_filters_are_configured()) - filters.insert(tempFrame.ID, false); + filters.insert(tempFrame.frameId(), false); else - filters.insert(tempFrame.ID, true); + filters.insert(tempFrame.frameId(), true); needFilterRefresh = true; } if (!overwriteDups) { frames.append(tempFrame); - if (filters[tempFrame.ID]) + if (filters[tempFrame.frameId()]) { if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count()); tempFrame.frameCount = 1; @@ -583,10 +583,10 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) bool found = false; for (int i = 0; i < frames.count(); i++) { - if ( (frames[i].ID == tempFrame.ID) && (frames[i].bus == tempFrame.bus) ) + if ( (frames[i].frameId() == tempFrame.frameId()) && (frames[i].bus == tempFrame.bus) ) { tempFrame.frameCount = frames[i].frameCount + 1; - tempFrame.timedelta = tempFrame.timestamp - frames[i].timestamp; + tempFrame.timedelta = tempFrame.timeStamp().microSeconds() - frames[i].timeStamp().microSeconds(); frames.replace(i, tempFrame); found = true; break; @@ -595,7 +595,7 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) if (!found) { frames.append(tempFrame); - if (filters[tempFrame.ID]) + if (filters[tempFrame.frameId()]) { if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count()); tempFrame.frameCount = 1; @@ -608,7 +608,7 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) { for (int j = 0; j < filteredFrames.count(); j++) { - if ( (filteredFrames[j].ID == tempFrame.ID) && (filteredFrames[j].bus == tempFrame.bus) ) + if ( (filteredFrames[j].frameId() == tempFrame.frameId()) && (filteredFrames[j].bus == tempFrame.bus) ) { if (autoRefresh) beginResetModel(); filteredFrames.replace(j, tempFrame); @@ -642,7 +642,7 @@ void CANFrameModel::sendRefresh() int count = frames.count(); for (int i = 0; i < count; i++) { - if (filters[frames[i].ID]) + if (filters[frames[i].frameId()]) { tempContainer.append(frames[i]); } @@ -718,12 +718,12 @@ void CANFrameModel::insertFrames(const QVector &newFrames) for (int i = 0; i < newFrames.count(); i++) { frames.append(newFrames[i]); - if (!filters.contains(newFrames[i].ID)) + if (!filters.contains(newFrames[i].frameId())) { - filters.insert(newFrames[i].ID, true); + filters.insert(newFrames[i].frameId(), true); needFilterRefresh = true; } - if (filters[newFrames[i].ID]) + if (filters[newFrames[i].frameId()]) { insertedFiltered++; filteredFrames.append(newFrames[i]); @@ -743,9 +743,9 @@ int CANFrameModel::getIndexFromTimeID(unsigned int ID, double timestamp) uint64_t intTimeStamp = timestamp * 1000000l; for (int i = 0; i < frames.count(); i++) { - if ((frames[i].ID == ID)) + if ((frames[i].frameId() == ID)) { - if (frames[i].timestamp <= intTimeStamp) bestIndex = i; + if (frames[i].timeStamp().microSeconds() <= intTimeStamp) bestIndex = i; else break; //drop out of loop as soon as we pass the proper timestamp } } diff --git a/connections/canconnection.cpp b/connections/canconnection.cpp index 9dfc0ff..27850ff 100644 --- a/connections/canconnection.cpp +++ b/connections/canconnection.cpp @@ -343,7 +343,7 @@ void CANConnection::checkTargettedFrame(CANFrame &frame) foreach (const CANFltObserver filt, mBusData[frame.bus].mTargettedFrames) { //qDebug() << "Checking filter with id " << filt.id << " mask " << filt.mask; - maskedID = frame.ID & filt.mask; + maskedID = frame.frameId() & filt.mask; if (maskedID == filt.id) { qDebug() << "In connection object I got a targetted frame. Forwarding it."; QMetaObject::invokeMethod(filt.observer, "gotTargettedFrame",Qt::QueuedConnection, Q_ARG(CANFrame, frame)); diff --git a/dbc/dbchandler.cpp b/dbc/dbchandler.cpp index e10cb87..7871227 100644 --- a/dbc/dbchandler.cpp +++ b/dbc/dbchandler.cpp @@ -1531,7 +1531,7 @@ DBC_MESSAGE* DBCHandler::findMessage(const CANFrame &frame) { if (loadedFiles[i].getAssocBus() == -1 || frame.bus == (unsigned int)loadedFiles[i].getAssocBus()) { - DBC_MESSAGE* msg = loadedFiles[i].messageHandler->findMsgByID(frame.ID); + DBC_MESSAGE* msg = loadedFiles[i].messageHandler->findMsgByID(frame.frameId()); if (msg != nullptr) return msg; } } diff --git a/dbc/dbcsignaleditor.cpp b/dbc/dbcsignaleditor.cpp index 2d528c4..6c579ec 100644 --- a/dbc/dbcsignaleditor.cpp +++ b/dbc/dbcsignaleditor.cpp @@ -585,7 +585,7 @@ void DBCSignalEditor::fillValueTable(DBC_SIGNAL *sig) for (int i = 0; i < sig->valList.count(); i++) { - QTableWidgetItem *val = new QTableWidgetItem(Utility::formatNumber(sig->valList[i].value)); + QTableWidgetItem *val = new QTableWidgetItem(Utility::formatNumber((uint64_t)sig->valList[i].value)); QTableWidgetItem *desc = new QTableWidgetItem(sig->valList[i].descript); rowIdx = ui->valuesTable->rowCount(); ui->valuesTable->insertRow(rowIdx); diff --git a/firmwareuploaderwindow.cpp b/firmwareuploaderwindow.cpp index 2b13746..a94a55f 100644 --- a/firmwareuploaderwindow.cpp +++ b/firmwareuploaderwindow.cpp @@ -4,6 +4,13 @@ #include +//You might wonder: Collin, what in the hell is this for? Firmware uploader? For what? I'm interested! Well, it's a custom +//firmware uploader for a motor controller I built. Why would that be in this project. Cuz. It's not really relevant +//to anyone else but might serve as a decent reference for a few things: How to make an uploader interface that runs over CAN, +//how to lay out a screen like this, how to make a comm protocol for firmware updating over CAN. But, most things use UDS +//for firmware updates and wouldn't need this specific code. But, it might be able to be turned into a UDS firmware uploader or downloader. +//Note that this screen is specifically hidden by default because of it's oddball status. You have to re-enable it in mainwindow.cpp to see it. + FirmwareUploaderWindow::FirmwareUploaderWindow(const QVector *frames, QWidget *parent) : QDialog(parent), ui(new Ui::FirmwareUploaderWindow) @@ -70,17 +77,17 @@ void FirmwareUploaderWindow::updatedFrames(int numFrames) void FirmwareUploaderWindow::gotTargettedFrame(CANFrame frame) { - qDebug() << "FUW: Got targetted frame with id " << frame.ID; - if (frame.ID == (uint32_t)(baseAddress + 0x10)) { + qDebug() << "FUW: Got targetted frame with id " << frame.frameId(); + if (frame.frameId() == (uint32_t)(baseAddress + 0x10)) { qDebug() << "Start firmware reply"; - if ((frame.data[0] == 0xAD) && (frame.data[1] == 0xDE)) + if (((char)frame.payload()[0] == (char)0xAD) && ((char)frame.payload()[1] == (char)0xDE)) { - if ((frame.data[2] == 0xAF) && (frame.data[3] == 0xDE)) + if (((char)frame.payload()[2] == (char)0xAF) && ((char)frame.payload()[3] == (char)0xDE)) { - qDebug() << "THere's dead beef here"; - if ((frame.data[4] == (token & 0xFF)) && (frame.data[5] == ((token >> 8) & 0xFF))) + qDebug() << "There's dead beef here"; + if (((char)frame.payload()[4] == (char)(token & 0xFF)) && ((char)frame.payload()[5] == (char)((token >> 8) & 0xFF))) { - if ((frame.data[6] == ((token >> 16) & 0xFF)) && (frame.data[7] == ((token >> 24) & 0xFF))) + if (((char)frame.payload()[6] == (char)((token >> 16) & 0xFF)) && ((char)frame.payload()[7] == (char)((token >> 24) & 0xFF))) { qDebug() << "starting firmware process"; //MainWindow::getReference()->setTargettedID(baseAddress + 0x20); @@ -92,9 +99,9 @@ void FirmwareUploaderWindow::gotTargettedFrame(CANFrame frame) } } - if (frame.ID == (uint32_t)(baseAddress + 0x20)) { + if (frame.frameId() == (uint32_t)(baseAddress + 0x20)) { qDebug() << "Firmware reception success reply"; - int seq = frame.data[0] + (256 * frame.data[1]); + int seq = frame.payload()[0] + (256 * frame.payload()[1]); if (seq == currentSendingPosition) { currentSendingPosition++; @@ -126,18 +133,19 @@ void FirmwareUploaderWindow::sendFirmwareChunk() CANFrame *output = new CANFrame; int firmwareLocation = currentSendingPosition * 4; int xorByte = 0; - output->extended = false; - output->len = 7; + output->setExtendedFrameFormat(false); + QByteArray bytes(7,0); output->bus = bus; - output->ID = baseAddress + 0x16; - output->data[0] = currentSendingPosition & 0xFF; - output->data[1] = (currentSendingPosition >> 8) & 0xFF; - output->data[2] = firmwareData[firmwareLocation++]; - output->data[3] = firmwareData[firmwareLocation++]; - output->data[4] = firmwareData[firmwareLocation++]; - output->data[5] = firmwareData[firmwareLocation++]; - for (int i = 0; i < 6; i++) xorByte = xorByte ^ output->data[i]; - output->data[6] = xorByte; + output->setFrameId(baseAddress + 0x16); + output->payload()[0] = currentSendingPosition & 0xFF; + output->payload()[1] = (currentSendingPosition >> 8) & 0xFF; + output->payload()[2] = firmwareData[firmwareLocation++]; + output->payload()[3] = firmwareData[firmwareLocation++]; + output->payload()[4] = firmwareData[firmwareLocation++]; + output->payload()[5] = firmwareData[firmwareLocation++]; + for (int i = 0; i < 6; i++) xorByte = xorByte ^ output->payload()[i]; + output->payload()[6] = xorByte; + output->setPayload(bytes); sendCANFrame(output); timer->start(); } @@ -145,14 +153,15 @@ void FirmwareUploaderWindow::sendFirmwareChunk() void FirmwareUploaderWindow::sendFirmwareEnding() { CANFrame *output = new CANFrame; - output->extended = false; + output->setExtendedFrameFormat(false); output->bus = bus; - output->len = 4; - output->ID = baseAddress + 0x30; - output->data[3] = 0xC0; - output->data[2] = 0xDE; - output->data[1] = 0xFA; - output->data[0] = 0xDE; + QByteArray bytes(4,0); + output->setFrameId(baseAddress + 0x30); + output->payload()[3] = 0xC0; + output->payload()[2] = 0xDE; + output->payload()[1] = 0xFA; + output->payload()[0] = 0xDE; + output->setPayload(bytes); //sendCANFrame(output, bus); } @@ -171,19 +180,19 @@ void FirmwareUploaderWindow::handleStartStopTransfer() CANConManager::getInstance()->addTargettedFrame(bus, baseAddress + 0x10, 0x7FF, this); CANConManager::getInstance()->addTargettedFrame(bus, baseAddress + 0x20, 0x7FF, this); CANFrame *output = new CANFrame; - output->extended = false; - output->len = 8; + output->setExtendedFrameFormat(false); + QByteArray bytes(8,0); output->bus = bus; - output->ID = baseAddress; + output->setFrameId(baseAddress); - output->data[0] = 0xEF; - output->data[1] = 0xBE; - output->data[2] = 0xAD; - output->data[3] = 0xDE; - output->data[4] = token & 0xFF; - output->data[5] = (token >> 8) & 0xFF; - output->data[6] = (token >> 16) & 0xFF; - output->data[7] = (token >> 24) & 0xFF; + output->payload()[0] = 0xEF; + output->payload()[1] = 0xBE; + output->payload()[2] = 0xAD; + output->payload()[3] = 0xDE; + output->payload()[4] = token & 0xFF; + output->payload()[5] = (token >> 8) & 0xFF; + output->payload()[6] = (token >> 16) & 0xFF; + output->payload()[7] = (token >> 24) & 0xFF; sendCANFrame(output); } else //stop anything in process diff --git a/framefileio.cpp b/framefileio.cpp index 3944744..760c062 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -511,26 +511,25 @@ bool FrameFileIO::loadVehicleSpyFile(QString filename, QVector *frames if (tokens.length() > 20) { thisFrame.bus = 0; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); tempTime = now; tempTime = tempTime.addMSecs(static_cast(tokens[1].toDouble() * 1000.0)); - thisFrame.timestamp = static_cast(tempTime.toMSecsSinceEpoch() * 1000); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(tempTime.toMSecsSinceEpoch() * 1000))); if (tokens[5].startsWith("T")) thisFrame.isReceived = false; else thisFrame.isReceived = true; - thisFrame.ID = static_cast(tokens[9].toInt(nullptr, 16)); - if (tokens[11].startsWith("T")) thisFrame.extended = true; - else thisFrame.extended = false; - - thisFrame.len = 0; + thisFrame.setFrameId(static_cast(tokens[9].toInt(nullptr, 16))); + if (tokens[11].startsWith("T")) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); + QByteArray bytes; for (int i = 0; i < 8; i++) { if (tokens[12 + i].length() > 0) { - thisFrame.data[i] = static_cast(tokens[12 + i].toInt(nullptr, 16)); - thisFrame.len++; + bytes.append(static_cast(tokens[12 + i].toInt(nullptr, 16))); } else break; } + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -667,7 +666,7 @@ bool FrameFileIO::loadCRTDFile(QString filename, QVector* frames) multiplier = 1; //special case. Assume no decimal means microseconds } //qDebug() << "decimal places " << decimalPlaces; - thisFrame.timestamp = static_cast((tokens[0].toDouble() * multiplier)); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast((tokens[0].toDouble() * multiplier)))); thisFrame.bus = 0; char firstChar = tokens[1].left(1)[0]; if (firstChar >= '1' && firstChar <= '9') @@ -678,21 +677,22 @@ bool FrameFileIO::loadCRTDFile(QString filename, QVector* frames) } if (firstChar == 'R' || firstChar == 'T') { - thisFrame.ID = static_cast(tokens[2].toInt(nullptr, 16)); - if (tokens[1] == "R29" || tokens[1] == "T29") thisFrame.extended = true; - else thisFrame.extended = false; + thisFrame.setFrameId(static_cast(tokens[2].toInt(nullptr, 16))); + if (tokens[1] == "R29" || tokens[1] == "T29") thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); if (firstChar == 'T') thisFrame.isReceived = false; else thisFrame.isReceived = true; - thisFrame.len = tokens.length() - 3; - thisFrame.remote = false; - for (int d = 0; d < thisFrame.len; d++) + QByteArray bytes(tokens.length() - 3, 0); + thisFrame.setFrameType(QCanBusFrame::DataFrame); + for (int d = 0; d < bytes.length(); d++) { if (tokens[d + 3] != "") { - thisFrame.data[d] = static_cast(tokens[d + 3].toInt(nullptr, 16)); + bytes[d] = static_cast(tokens[d + 3].toInt(nullptr, 16)); } - else thisFrame.data[d] = 0; + else bytes[d] = 0; } + thisFrame.setPayload(bytes); frames->append(thisFrame); } } @@ -798,21 +798,22 @@ bool FrameFileIO::loadCANHackerFile(QString filename, QVector* frames) multiplier = 1; //special case. Assume no decimal means microseconds } //qDebug() << "decimal places " << decimalPlaces; - thisFrame.timestamp = static_cast(tokens[0].toDouble() * multiplier); - thisFrame.ID = static_cast(tokens[1].toInt(nullptr, 16)); - thisFrame.extended = (thisFrame.ID > 0x7FF); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(tokens[0].toDouble() * multiplier))); + thisFrame.setFrameId( static_cast(tokens[1].toInt(nullptr, 16)) ); + thisFrame.setExtendedFrameFormat((thisFrame.frameId() > 0x7FF)); thisFrame.isReceived = true; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.bus = 0; - thisFrame.len = tokens[2].toInt(nullptr, 16); - for (int d = 0; d < thisFrame.len; d++) + QByteArray bytes( tokens[2].toInt(nullptr, 16), 0); + for (int d = 0; d < thisFrame.payload().length(); d++) { if (tokens[d + 3] != "") { - thisFrame.data[d] = static_cast(tokens[d + 3].toInt(nullptr, 16)); + bytes[d] = static_cast(tokens[d + 3].toInt(nullptr, 16)); } - else thisFrame.data[d] = 0; + else bytes[d] = 0; } + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -914,22 +915,23 @@ bool FrameFileIO::loadCANOpenFile(QString filename, QVector* frames) QList tokens = line.split(','); if (tokens.length() > 11) { - thisFrame.timestamp = static_cast(tokens[1].simplified().toDouble() * 1000.0); - thisFrame.ID = static_cast(Utility::ParseStringToNum(tokens[5].simplified())); - thisFrame.extended = (thisFrame.ID > 0x7FF); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(tokens[1].simplified().toDouble() * 1000.0))); + thisFrame.setFrameId(static_cast(Utility::ParseStringToNum(tokens[5].simplified()))); + thisFrame.setExtendedFrameFormat( (thisFrame.frameId() > 0x7FF) ); thisFrame.isReceived = true; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.bus = 0; QList dataTok = tokens[11].simplified().split(' '); - thisFrame.len = dataTok.length(); - for (int d = 0; d < thisFrame.len; d++) + QByteArray bytes(dataTok.length(), 0); + for (int d = 0; d < thisFrame.payload().length(); d++) { if (dataTok[d] != "") { - thisFrame.data[d] = static_cast(dataTok[d].simplified().toInt(nullptr, 16)); + bytes[d] = static_cast(dataTok[d].simplified().toInt(nullptr, 16)); } - else thisFrame.data[d] = 0; + else bytes[d] = 0; } + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -952,7 +954,7 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector* frames } //write in float format with 6 digits after the decimal point - outFile->write(QString::number(frames->at(0).timestamp / 1000000.0, 'f', 6).toUtf8() + tr(" CXX GVRET-PC Reverse Engineering Tool Output V").toUtf8() + QString::number(VERSION).toUtf8()); + outFile->write(QString::number(frames->at(0).timeStamp().microSeconds() / 1000000.0, 'f', 6).toUtf8() + tr(" CXX GVRET-PC Reverse Engineering Tool Output V").toUtf8() + QString::number(VERSION).toUtf8()); outFile->write("\n"); for (int c = 0; c < frames->count(); c++) @@ -964,24 +966,24 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector* frames lineCounter = 0; } - outFile->write(QString::number(frames->at(c).timestamp / 1000000.0, 'f', 6).toUtf8()); + outFile->write(QString::number(frames->at(c).timeStamp().microSeconds() / 1000000.0, 'f', 6).toUtf8()); outFile->putChar(' '); outFile->write(QString::number(frames->at(c).bus + 1).toUtf8()); if (frames->at(c).isReceived) outFile->putChar('R'); else outFile->putChar('T'); - if (frames->at(c).extended) + if (frames->at(c).hasExtendedFrameFormat()) { outFile->write("29 "); } else outFile->write("11 "); - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->putChar(' '); - for (int temp = 0; temp < frames->at(c).len; temp++) + for (int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(' '); } @@ -1112,65 +1114,67 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector* frames) { if (fileVersion == 1) { - thisFrame.timestamp = (uint64_t)(line.mid(10, 8).simplified().toDouble() * 1000.0); - thisFrame.ID = line.mid(28, 8).simplified().toUInt(nullptr, 16); - if (thisFrame.ID < 0x1FFFFFFF) + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (uint64_t)(line.mid(10, 8).simplified().toDouble() * 1000.0))); + thisFrame.setFrameId(line.mid(28, 8).simplified().toUInt(nullptr, 16)); + if (thisFrame.frameId() < 0x1FFFFFFF) { - thisFrame.len = line.mid(38,1).toInt(); + QByteArray bytes(line.mid(38,1).toInt(), 0); thisFrame.isReceived = true; thisFrame.bus = 0; if (line.at(28) == ' ') { - thisFrame.extended = false; + thisFrame.setExtendedFrameFormat(false); } else { - thisFrame.extended = true; + thisFrame.setExtendedFrameFormat(true); } if (line.at(41) == 'R') { - thisFrame.remote = true; + thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - QList tokens = line.mid(41, thisFrame.len * 3).split(' '); - thisFrame.remote = false; - for (int d = 0; d < thisFrame.len; d++) + QList tokens = line.mid(41, thisFrame.payload().length() * 3).split(' '); + thisFrame.setFrameType(QCanBusFrame::DataFrame); + for (int d = 0; d < thisFrame.payload().length(); d++) { if (tokens[d] != "") { - thisFrame.data[d] = static_cast(tokens[d].toInt(nullptr, 16)); + bytes[d] = static_cast(tokens[d].toInt(nullptr, 16)); } - else thisFrame.data[d] = 0; + else bytes[d] = 0; } } + thisFrame.setPayload(bytes); frames->append(thisFrame); } } else if (fileVersion == 2) { - thisFrame.timestamp = static_cast(line.mid(8, 13).simplified().toDouble() * 1000.0); - thisFrame.ID = line.mid(25, 8).simplified().toUInt(nullptr, 16); - if (thisFrame.ID < 0x1FFFFFFF) + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(line.mid(8, 13).simplified().toDouble() * 1000.0))); + thisFrame.setFrameId(line.mid(25, 8).simplified().toUInt(nullptr, 16)); + if (thisFrame.frameId() < 0x1FFFFFFF) { - thisFrame.len = line.mid(37,2).trimmed().toInt(); - qDebug() << thisFrame.len; + QByteArray bytes(line.mid(37,2).trimmed().toInt(), 0); + qDebug() << thisFrame.payload().length(); thisFrame.isReceived = true; thisFrame.bus = 0; if (line.at(25) == ' ') { - thisFrame.extended = false; + thisFrame.setExtendedFrameFormat(false); } else { - thisFrame.extended = true; + thisFrame.setExtendedFrameFormat(true); } if (line.at(40) == 'R') { - thisFrame.remote = true; + thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - QList tokens = line.mid(40, thisFrame.len * 3).split(' '); - thisFrame.remote = false; - for (int d = 0; d < thisFrame.len; d++) + QList tokens = line.mid(40, thisFrame.payload().length() * 3).split(' '); + thisFrame.setFrameType(QCanBusFrame::DataFrame); + for (int d = 0; d < thisFrame.payload().length(); d++) { if (tokens[d] != "") { - thisFrame.data[d] = static_cast(tokens[d].toInt(nullptr, 16)); + bytes[d] = static_cast(tokens[d].toInt(nullptr, 16)); } - else thisFrame.data[d] = 0; + else bytes[d] = 0; } } + thisFrame.setPayload(bytes); frames->append(thisFrame); } } @@ -1255,7 +1259,7 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector* frames) int lineCounter = 0; bool foundErrors = false; bool inHeader = true; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); QList tokens; if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) @@ -1286,37 +1290,38 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector* frames) tokens = line.simplified().split(' '); if (tokens.length() > 5) { - thisFrame.timestamp = static_cast(tokens[0].toDouble() * 1000000.0); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(tokens[0].toDouble() * 1000000.0))); if (tokens[2].endsWith('x')) { QByteArray copied_id = tokens[2]; copied_id.chop(1); - thisFrame.ID = copied_id.toUInt(nullptr, 16); - thisFrame.extended = true; + thisFrame.setFrameId(copied_id.toUInt(nullptr, 16)); + thisFrame.setExtendedFrameFormat(true); } else { - thisFrame.ID = tokens[2].toUInt(nullptr, 16); - thisFrame.extended = false; + thisFrame.setFrameId(tokens[2].toUInt(nullptr, 16)); + thisFrame.setExtendedFrameFormat(false); } - thisFrame.len = tokens[5].toInt(); - if (thisFrame.len > 8) return false; - if (thisFrame.len < 0) return false; + QByteArray bytes(tokens[5].toInt(), 0); + if (thisFrame.payload().length() > 8) return false; + if (thisFrame.payload().length() < 0) return false; thisFrame.isReceived = tokens[3].toUpper().contains("RX"); thisFrame.bus = tokens[1].toInt(); - thisFrame.remote = tokens[4] == "r"; - for (int d = 6; d < (6 + static_cast(thisFrame.len)); d++) + if (tokens[4] == "r") thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); + for (int d = 6; d < (6 + static_cast(thisFrame.payload().length())); d++) { if (tokens.count() > d) { - thisFrame.data[d - 6] = static_cast(tokens[d].toInt(nullptr, 16)); + bytes[d - 6] = static_cast(tokens[d].toInt(nullptr, 16)); } else //expected byte wasn't there to read. Set it zero and set error flag { - thisFrame.data[d - 6] = 0; + bytes[d - 6] = 0; foundErrors = true; } } + thisFrame.setPayload(bytes); } frames->append(thisFrame); } @@ -1331,10 +1336,10 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector* fr { QFile *outFile = new QFile(filename); int lineCounter = 0; - uint64_t offsetTime = frames->at(0).timestamp; + uint64_t offsetTime = frames->at(0).timeStamp().microSeconds(); for (int c = 0; c < frames->count(); c++) { - if (frames->at(c).timestamp < offsetTime) offsetTime = frames->at(c).timestamp; + if (frames->at(c).timeStamp().microSeconds() < offsetTime) offsetTime = frames->at(c).timeStamp().microSeconds(); } if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) @@ -1364,24 +1369,24 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector* fr lineCounter = 0; } - uint64_t timeStamp = (frames->at(c).timestamp - offsetTime) / 1000000ull; + uint64_t timeStamp = (frames->at(c).timeStamp().microSeconds() - offsetTime) / 1000000ull; int tsLen = QString::number(timeStamp).length(); int precision = 6; //vector seems to keep 10 bytes at the start of the line for the timestamp. It should never exceed this //and there should never be a precision over 6 digits after the decimal if (tsLen > 3) precision = 9 - tsLen; - outFile->write(QString::number((frames->at(c).timestamp - offsetTime) / 1000000.0, 'f', precision).rightJustified(10, ' ').toUtf8()); + outFile->write(QString::number((frames->at(c).timeStamp().microSeconds() - offsetTime) / 1000000.0, 'f', precision).rightJustified(10, ' ').toUtf8()); outFile->putChar(' '); outFile->write(QString::number(frames->at(c).bus + 1).toUtf8()); outFile->write(" "); - if (frames->at(c).extended) + if (frames->at(c).hasExtendedFrameFormat()) { - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->write("x"); } else { - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(3, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(3, '0').toUtf8()); outFile->write(" "); } outFile->write(" "); @@ -1389,15 +1394,15 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector* fr if (frames->at(c).isReceived) outFile->write("Rx "); else outFile->write("Tx "); - if (frames->at(c).remote) outFile->write("r "); + if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r "); else outFile->write("d "); - outFile->write(QString::number(frames->at(c).len).toUtf8()); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); outFile->write(" "); - for (int temp = 0; temp < frames->at(c).len; temp++) + for (int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(" "); } @@ -1506,7 +1511,7 @@ bool FrameFileIO::loadNativeCSVFile(QString filename, QVector* frames) uint64_t timeStamp = Utility::GetTimeMS(); int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -1533,44 +1538,48 @@ bool FrameFileIO::loadNativeCSVFile(QString filename, QVector* frames) { if (tokens[0].length() > 3) { - thisFrame.timestamp = tokens[0].toULongLong(); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, tokens[0].toULongLong())); } else { timeStamp += 5; - thisFrame.timestamp = timeStamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp)); } - thisFrame.ID = tokens[1].toUInt(nullptr, 16); - if (tokens[2].toUpper().contains("TRUE")) thisFrame.extended = 1; - else thisFrame.extended = 0; + thisFrame.setFrameId(tokens[1].toUInt(nullptr, 16)); + if (tokens[2].toUpper().contains("TRUE")) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (fileVersion == 1) { thisFrame.isReceived = true; thisFrame.bus = tokens[3].toInt(); - thisFrame.len = tokens[4].toInt(); - if (thisFrame.len > 8) thisFrame.len = 8; - if (thisFrame.len < 0) thisFrame.len = 0; - for (int c = 0; c < 8; c++) thisFrame.data[c] = 0; - if (thisFrame.len + 5 > tokens.length()) thisFrame.len = tokens.length() - 5; - for (int d = 0; d < thisFrame.len; d++) - thisFrame.data[d] = static_cast(tokens[5 + d].toInt(nullptr, 16)); + int lng = tokens[4].toInt(); + if (lng > 8) lng = 8; + if (lng < 0) lng = 0; + if (lng + 5 > tokens.length()) lng = tokens.length() - 5; + QByteArray bytes(lng, 0); + for (int c = 0; c < 8; c++) bytes[c] = 0; + for (int d = 0; d < thisFrame.payload().length(); d++) + bytes[d] = static_cast(tokens[5 + d].toInt(nullptr, 16)); + thisFrame.setPayload(bytes); } else if (fileVersion == 2) { if (tokens[3].at(0) == 'R') thisFrame.isReceived = true; else thisFrame.isReceived = false; - thisFrame.bus = tokens[4].toInt(); - thisFrame.len = tokens[5].toInt(); - if (thisFrame.len > 8) thisFrame.len = 8; - if (thisFrame.len < 0) thisFrame.len = 0; - if (thisFrame.len + 6 > tokens.length()) thisFrame.len = tokens.length() - 6; - for (int c = 0; c < 8; c++) thisFrame.data[c] = 0; - for (int d = 0; d < thisFrame.len; d++) - thisFrame.data[d] = static_cast(tokens[6 + d].toInt(nullptr, 16)); + thisFrame.bus = tokens[4].toInt(); + int lng = tokens[5].toInt(); + if (lng > 8) lng = 8; + if (lng < 0) lng = 0; + if (lng + 6 > tokens.length()) lng = tokens.length() - 6; + QByteArray bytes(lng, 0); + for (int c = 0; c < 8; c++) bytes[c] = 0; + for (int d = 0; d < thisFrame.payload().length(); d++) + bytes[d] = static_cast(tokens[6 + d].toInt(nullptr, 16)); + thisFrame.setPayload(bytes); } frames->append(thisFrame); @@ -1606,13 +1615,13 @@ bool FrameFileIO::saveNativeCSVFile(QString filename, const QVector* f lineCounter = 0; } - outFile->write(QString::number(frames->at(c).timestamp).toUtf8()); + outFile->write(QString::number(frames->at(c).timeStamp().microSeconds()).toUtf8()); outFile->putChar(44); - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->putChar(44); - if (frames->at(c).extended) outFile->write("true,"); + if (frames->at(c).hasExtendedFrameFormat()) outFile->write("true,"); else outFile->write("false,"); if (frames->at(c).isReceived) outFile->write("Rx,"); @@ -1621,13 +1630,13 @@ bool FrameFileIO::saveNativeCSVFile(QString filename, const QVector* f outFile->write(QString::number(frames->at(c).bus).toUtf8()); outFile->putChar(44); - outFile->write(QString::number(frames->at(c).len).toUtf8()); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); outFile->putChar(44); for (int temp = 0; temp < 8; temp++) { - if (temp < frames->at(c).len) - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + if (temp < frames->at(c).payload().length()) + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); else outFile->write("00"); outFile->putChar(44); @@ -1689,13 +1698,13 @@ bool FrameFileIO::writeContinuousNative(const QVector* frames, int beg qDebug() << "Bgn: " << beginningFrame << " Count: " << frames->count(); for (int c = beginningFrame; c < frames->count(); c++) { - continuousFile.write(QString::number(frames->at(c).timestamp).toUtf8()); + continuousFile.write(QString::number(frames->at(c).timeStamp().microSeconds()).toUtf8()); continuousFile.putChar(44); - continuousFile.write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + continuousFile.write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); continuousFile.putChar(44); - if (frames->at(c).extended) continuousFile.write("true,"); + if (frames->at(c).hasExtendedFrameFormat()) continuousFile.write("true,"); else continuousFile.write("false,"); if (frames->at(c).isReceived) continuousFile.write("Rx,"); @@ -1704,13 +1713,13 @@ bool FrameFileIO::writeContinuousNative(const QVector* frames, int beg continuousFile.write(QString::number(frames->at(c).bus).toUtf8()); continuousFile.putChar(44); - continuousFile.write(QString::number(frames->at(c).len).toUtf8()); + continuousFile.write(QString::number(frames->at(c).payload().length()).toUtf8()); continuousFile.putChar(44); for (int temp = 0; temp < 8; temp++) { - if (temp < frames->at(c).len) - continuousFile.write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + if (temp < frames->at(c).payload().length()) + continuousFile.write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); else continuousFile.write("00"); continuousFile.putChar(44); @@ -1788,7 +1797,7 @@ bool FrameFileIO::loadGenericCSVFile(QString filename, QVector* frames uint64_t timeStamp = Utility::GetTimeMS(); int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -1812,17 +1821,16 @@ bool FrameFileIO::loadGenericCSVFile(QString filename, QVector* frames QList tokens = line.split(','); timeStamp += 5000; - thisFrame.timestamp = timeStamp; - thisFrame.ID = tokens[0].toUInt(nullptr, 16); - if (thisFrame.ID > 0x7FF) thisFrame.extended = true; - else thisFrame.extended = false; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp)); + thisFrame.setFrameId(tokens[0].toUInt(nullptr, 16)); + if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); thisFrame.bus = 0; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); QList dataTok = tokens[1].split(' '); - thisFrame.len = dataTok.length(); - if (thisFrame.len > 8) thisFrame.len = 8; - for (int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = static_cast(dataTok[d].toInt(nullptr, 16)); - + QByteArray bytes(dataTok.length(), 0); + for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast(dataTok[d].toInt(nullptr, 16)); + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -1856,12 +1864,12 @@ bool FrameFileIO::saveGenericCSVFile(QString filename, const QVector* lineCounter = 0; } - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->putChar(44); - for (int temp = 0; temp < frames->at(c).len; temp++) + for (int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(' '); } @@ -1992,31 +2000,34 @@ bool FrameFileIO::loadLogFile(QString filename, QVector* frames) QList timeToks = tokens[0].split(':'); timeStamp = (timeToks[0].toUInt() * (1000ul * 1000ul * 60ul * 60ul)) + (timeToks[1].toUInt() * (1000ul * 1000ul * 60ul)) + (timeToks[2].toUInt() * (1000ul * 1000ul)) + (timeToks[3].toUInt() * 100ul); - thisFrame.timestamp = timeStamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp)); if (tokens[1].at(0) == 'R') thisFrame.isReceived = true; else thisFrame.isReceived = false; - thisFrame.ID = tokens[3].right(tokens[3].length() - 2).toUInt(nullptr, 16); + thisFrame.setFrameId(tokens[3].right(tokens[3].length() - 2).toUInt(nullptr, 16)); if (tokens[4] == "S") { - thisFrame.extended = false; - thisFrame.remote = false; + thisFrame.setExtendedFrameFormat(false); + thisFrame.setFrameType(QCanBusFrame::DataFrame); } else if (tokens[4] == "X") { - thisFrame.extended = true; - thisFrame.remote = false; + thisFrame.setExtendedFrameFormat(true); + thisFrame.setFrameType(QCanBusFrame::DataFrame); } else if (tokens[4] == "SR") { - thisFrame.extended = false; - thisFrame.remote = true; + thisFrame.setExtendedFrameFormat(false); + thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { // XR - thisFrame.extended = true; - thisFrame.remote = true; + thisFrame.setExtendedFrameFormat(true); + thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); } thisFrame.bus = tokens[2].toInt() - 1; - thisFrame.len = tokens[5].toInt(); - if (thisFrame.len > 8) thisFrame.len = 8; - if (thisFrame.len < 0) thisFrame.len = 0; - if (!thisFrame.remote) { - for (int d = 0; d < thisFrame.len; d++) - thisFrame.data[d] = static_cast(tokens[d + 6].toInt(nullptr, 16)); + + int lng = tokens[5].toInt(); + if (lng > 8) lng = 8; + if (lng < 0) lng = 0; + QByteArray bytes(lng, 0); + if (thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) { + for (int d = 0; d < thisFrame.payload().length(); d++) + bytes[d] = static_cast(tokens[d + 6].toInt(nullptr, 16)); } + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -2066,28 +2077,28 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector* frames) lineCounter = 0; } - tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timestamp / 1000); + tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timeStamp().microSeconds() / 1000); outFile->write(tempStamp.toString("hh:mm:ss:zzz").toUtf8()); if (frames->at(c).isReceived) outFile->write(" Rx "); else outFile->write(" Tx "); // busmaster channel start at 1 outFile->write(QString::number(frames->at(c).bus+1).toUtf8() + " "); outFile->write("0x"); - if (frames->at(c).extended && frames->at(c).ID > 0x7FF) { - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8()); + if (frames->at(c).hasExtendedFrameFormat() && frames->at(c).frameId() > 0x7FF) { + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); } else { - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(3, '0').toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(3, '0').toUtf8()); } - if (frames->at(c).extended) outFile->write(" x"); + if (frames->at(c).hasExtendedFrameFormat()) outFile->write(" x"); else outFile->write(" s"); - if (frames->at(c).remote) outFile->write("r "); + if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r "); else outFile->write(" "); - outFile->write(QString::number(frames->at(c).len).toUtf8() + " "); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8() + " "); - if (!frames->at(c).remote) { - for (int temp = 0; temp < frames->at(c).len; temp++) + if (frames->at(c).frameType() != QCanBusFrame::RemoteRequestFrame) { + for (int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(' '); } } @@ -2144,7 +2155,7 @@ bool FrameFileIO::loadIXXATFile(QString filename, QVector* frames) uint64_t timeStamp = Utility::GetTimeMS(); int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -2181,29 +2192,30 @@ bool FrameFileIO::loadIXXATFile(QString filename, QVector* frames) foundErrors = true; return false; } - thisFrame.timestamp = timeStamp; - thisFrame.ID = Utility::unQuote(tokens[1]).toUInt(nullptr, 16); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp)); + thisFrame.setFrameId(Utility::unQuote(tokens[1]).toUInt(nullptr, 16)); QString tempStr = Utility::unQuote(tokens[2]).toUpper(); if (tempStr.length() > 0) { - if (tempStr.at(0) == 'S') thisFrame.extended = false; - else thisFrame.extended = true; + if (tempStr.at(0) == 'S') thisFrame.setExtendedFrameFormat(false); + else thisFrame.setExtendedFrameFormat(true); } else { - thisFrame.extended = false; + thisFrame.setExtendedFrameFormat(false); foundErrors = true; return false; } thisFrame.isReceived = true; thisFrame.bus = 0; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); QStringList dataToks = Utility::unQuote(tokens[4]).simplified().split(' '); - thisFrame.len = dataToks.length(); - if (thisFrame.len > 8) return false; - for (int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = static_cast(dataToks[d].toInt(nullptr, 16)); + QByteArray bytes(dataToks.length(), 0); + if (thisFrame.payload().length() > 8) return false; + for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast(dataToks[d].toInt(nullptr, 16)); + thisFrame.setPayload(bytes); frames->append(thisFrame); } else return false; @@ -2231,7 +2243,7 @@ bool FrameFileIO::saveIXXATFile(QString filename, const QVector* frame outFile->write("ASCII Trace IXXAT SavvyCAN V" + QString::number(VERSION).toUtf8() + "\n"); outFile->write("Date: " + timestamp.toString("d:M:yyyy").toUtf8() + "\n"); outFile->write("Start time: " + timestamp.toString("h:m:s").toUtf8() + "\n"); - timestamp = timestamp.addMSecs((frames->last().timestamp - frames->first().timestamp) / 1000); + timestamp = timestamp.addMSecs((frames->last().timeStamp().microSeconds() - frames->first().timeStamp().microSeconds()) / 1000); outFile->write("Stop time: " + timestamp.toString("h:m:s").toUtf8() + "\n"); outFile->write("Overruns: 0\n"); outFile->write("Baudrate: 500 kbit/s\n"); //could be a lie... this code has no way to know the baud rate (at the moment) @@ -2245,17 +2257,17 @@ bool FrameFileIO::saveIXXATFile(QString filename, const QVector* frame qApp->processEvents(); lineCounter = 0; } - tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timestamp / 1000); + tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timeStamp().microSeconds() / 1000); outFile->write("\"" + tempStamp.toString("h:m:s.").toUtf8() + tempStamp.toString("z").rightJustified(3, '0').toUtf8() + "\""); - outFile->write(",\"" + QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8() + "\""); - if (frames->at(c).extended) outFile->write(",\"Ext\""); + outFile->write(",\"" + QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\""); + if (frames->at(c).hasExtendedFrameFormat()) outFile->write(",\"Ext\""); else outFile->write(",\"Std\""); outFile->write(",\"\",\""); - for (int temp = 0; temp < frames->at(c).len; temp++) + for (int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(' '); } @@ -2324,7 +2336,7 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector* frames) int timeOffset = 0; uint64_t lastTimeStamp = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly)) { @@ -2350,23 +2362,25 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector* frames) thisFrame.bus = 0; thisFrame.isReceived = true; - thisFrame.extended = false; //format is incapable of extended frames - thisFrame.remote = false; - - thisFrame.timestamp = 1000000ul * ((unsigned char)data[0] >> 2); - thisFrame.timestamp += (((data[0] & 3) << 8) + (unsigned char)data[1]) * 1000; - thisFrame.timestamp += timeOffset; - if (thisFrame.timestamp < lastTimeStamp) + thisFrame.setExtendedFrameFormat(false); //format is incapable of extended frames + thisFrame.setFrameType(QCanBusFrame::DataFrame); + qint64 tempStamp; + tempStamp = 1000000ul * ((unsigned char)data[0] >> 2); + tempStamp += (((data[0] & 3) << 8) + (unsigned char)data[1]) * 1000; + tempStamp += timeOffset; + if (tempStamp < lastTimeStamp) { timeOffset += 60000000ul; } - lastTimeStamp = thisFrame.timestamp; - thisFrame.ID = (((unsigned char)data[3] & 0x0F) * 256 + (unsigned char)data[2]) & 0x7FF; - thisFrame.len = (unsigned char)data[3] >> 4; + lastTimeStamp = tempStamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, tempStamp)); + thisFrame.setFrameId((((unsigned char)data[3] & 0x0F) * 256 + (unsigned char)data[2]) & 0x7FF); + QByteArray bytes((unsigned char)data[3] >> 4, 0); - if (thisFrame.len <= 8 && thisFrame.ID <= 0x7FF) + if (thisFrame.payload().length() <= 8 && thisFrame.frameId() <= 0x7FF) { - for (unsigned int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = (unsigned char)data[4 + d]; + for (unsigned int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = (unsigned char)data[4 + d]; + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -2395,7 +2409,7 @@ bool FrameFileIO::saveCANDOFile(QString filename, const QVector* frame //The initial frame in official files sets the global time but I don't care so it is set all zeros here. thisFrame = frames->at(0); - ms = (thisFrame.timestamp / 1000); + ms = (thisFrame.timeStamp().microSeconds() / 1000); data[0] = (((ms / 1000) % 60) << 2) + ((ms % 1000) >> 8); data[1] = (char)(ms & 0xFF); data[2] = (char)0xFF; @@ -2414,15 +2428,15 @@ bool FrameFileIO::saveCANDOFile(QString filename, const QVector* frame for (int j = 0; j < 8; j++) data[4 + j] = (char)0xFF; thisFrame = frames->at(c); - if (!thisFrame.extended) + if (!thisFrame.hasExtendedFrameFormat()) { - ms = (thisFrame.timestamp / 1000); - id = thisFrame.ID & 0x7FF; + ms = (thisFrame.timeStamp().microSeconds() / 1000); + id = thisFrame.frameId() & 0x7FF; data[0] = (((ms / 1000) % 60) << 2) + ((ms % 1000) >> 8); data[1] = (char)(ms & 0xFF); data[2] = (char)(id & 0xFF); - data[3] = (char)((id >> 8) + (thisFrame.len << 4)); - for (unsigned int d = 0; d < thisFrame.len; d++) data[4 + d] = (char)thisFrame.data[d]; + data[3] = (char)((id >> 8) + (thisFrame.payload().length() << 4)); + for (unsigned int d = 0; d < thisFrame.payload().length(); d++) data[4 + d] = (char)thisFrame.payload()[d]; outFile->write(data); } } @@ -2502,7 +2516,7 @@ bool FrameFileIO::loadMicrochipFile(QString filename, QVector* frames) long long timeStamp; int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -2535,18 +2549,19 @@ bool FrameFileIO::loadMicrochipFile(QString filename, QVector* frames) if (tokens.length() >= 4) { timeStamp = tokens[0].toInt() * 1000; - thisFrame.timestamp = timeStamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp)); if (tokens[1].at(0) == 'R') thisFrame.isReceived = true; else thisFrame.isReceived = false; - thisFrame.remote = false; - thisFrame.ID = Utility::ParseStringToNum(tokens[2]); - if (thisFrame.ID <= 0x7FF) thisFrame.extended = false; - else thisFrame.extended = true; + thisFrame.setFrameType(QCanBusFrame::DataFrame); + thisFrame.setFrameId(Utility::ParseStringToNum(tokens[2])); + if (thisFrame.frameId() <= 0x7FF) thisFrame.setExtendedFrameFormat(false); + else thisFrame.setExtendedFrameFormat(true); thisFrame.bus = 0; - thisFrame.len = tokens[3].toUInt(); - if (thisFrame.len > 8) thisFrame.len = 8; - if (thisFrame.len + 4 > (unsigned int) tokens.length()) thisFrame.len = tokens.length() - 4; - for (unsigned int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = (unsigned char)Utility::ParseStringToNum(tokens[4 + d]); + QByteArray bytes(tokens[3].toUInt(), 0); + if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8); + if (thisFrame.payload().length() + 4 > (unsigned int) tokens.length()) thisFrame.payload().resize( tokens.length() - 4 ); + for (unsigned int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = (unsigned char)Utility::ParseStringToNum(tokens[4 + d]); + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -2602,15 +2617,15 @@ bool FrameFileIO::saveMicrochipFile(QString filename, const QVector* f lineCounter = 0; } - outFile->write(QString::number((int)(frames->at(c).timestamp / 1000)).toUtf8()); + outFile->write(QString::number((int)(frames->at(c).timeStamp().microSeconds() / 1000)).toUtf8()); if (frames->at(c).isReceived) outFile->write(";RX;"); else outFile->write(";TX;"); - outFile->write("0x" + QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8() + ";"); - outFile->write(QString::number(frames->at(c).len).toUtf8() + ";"); + outFile->write("0x" + QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + ";"); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8() + ";"); - for (unsigned int temp = 0; temp < frames->at(c).len; temp++) + for (unsigned int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write("0x" + QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write("0x" + QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(';'); } @@ -2715,7 +2730,7 @@ bool FrameFileIO::loadTraceFile(QString filename, QVector* frames) long long timeStamp = 0; int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -2751,18 +2766,19 @@ bool FrameFileIO::loadTraceFile(QString filename, QVector* frames) timeStamp += timestampToks[2].toInt() * 1000000l; timeStamp += timestampToks[3].toInt() * 100; - thisFrame.timestamp = static_cast(timeStamp); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, static_cast(timeStamp))); - thisFrame.ID = static_cast(tokens[2].toLong(nullptr, 16)); - if (thisFrame.ID <= 0x7FF) thisFrame.extended = false; - else thisFrame.extended = true; + thisFrame.setFrameId(static_cast(tokens[2].toLong(nullptr, 16))); + if (thisFrame.frameId() <= 0x7FF) thisFrame.setExtendedFrameFormat(false); + else thisFrame.setExtendedFrameFormat(true); thisFrame.bus = 0; - thisFrame.remote = false; - thisFrame.len = tokens[3].toUInt(); - if (thisFrame.len > 8) thisFrame.len = 8; + thisFrame.setFrameType(QCanBusFrame::DataFrame); + QByteArray bytes(tokens[3].toUInt(), 0); + if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8); QList dataToks = tokens[4].split(' '); - if (thisFrame.len > (unsigned int) dataToks.length()) thisFrame.len = static_cast(dataToks.length()); - for (unsigned int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = (unsigned char)dataToks[d].toInt(nullptr, 16); + if (thisFrame.payload().length() > (unsigned int) dataToks.length()) thisFrame.payload().resize( static_cast(dataToks.length()) ); + for (unsigned int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = (unsigned char)dataToks[d].toInt(nullptr, 16); + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -2825,7 +2841,7 @@ bool FrameFileIO::saveTraceFile(QString filename, const QVector * fram outFile->write(QString::number(lineCounter).rightJustified(10, ' ').toUtf8()); outFile->write("\t"); - tempTime = frames->at(c).timestamp; + tempTime = frames->at(c).timeStamp().microSeconds(); tempTimePiece = tempTime / 1000000ul / 60 / 60; tempTime -= tempTimePiece * 1000000ul * 60 * 60; outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8()); @@ -2845,13 +2861,13 @@ bool FrameFileIO::saveTraceFile(QString filename, const QVector * fram outFile->write(QString::number(tempTimePiece).rightJustified(4, '0').toUtf8()); outFile->write("\t"); - outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8() + "\t"); + outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\t"); - outFile->write(QString::number(frames->at(c).len).toUtf8() + "\t"); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8() + "\t"); - for (unsigned int temp = 0; temp < frames->at(c).len; temp++) + for (unsigned int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->putChar(' '); } @@ -2888,25 +2904,25 @@ bool FrameFileIO::saveCanDumpFile(QString filename, const QVector * fr outFile->write("("); - tempTime = frames->at(c).timestamp / 1000000.0; + tempTime = frames->at(c).timeStamp().microSeconds() / 1000000.0; outFile->write(QString::number(tempTime,'f', 6).rightJustified(17, '0').toUtf8()); outFile->write(") vcan0 "); - if (frames->at(c).extended) { - outFile->write(QString::number(frames->at(c).ID, 16).rightJustified(8,'0').toUpper().toUtf8()); + if (frames->at(c).hasExtendedFrameFormat()) { + outFile->write(QString::number(frames->at(c).frameId(), 16).rightJustified(8,'0').toUpper().toUtf8()); } else { - outFile->write(QString::number(frames->at(c).ID, 16).rightJustified(3,'0').toUpper().toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 16).rightJustified(3,'0').toUpper().toUtf8()); } outFile->write("#"); - if (frames->at(c).remote) { + if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) { outFile->write("R"); - outFile->write(QString::number(frames->at(c).len).toUtf8()); + outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); } else { - for (unsigned int temp = 0; temp < frames->at(c).len; temp++) + for (unsigned int temp = 0; temp < frames->at(c).payload().length(); temp++) { - outFile->write(QString::number(frames->at(c).data[temp], 16).rightJustified(2,'0').toUpper().toUtf8()); + outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).rightJustified(2,'0').toUpper().toUtf8()); } } @@ -3079,22 +3095,23 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector* frames) ret = timeExp.exactMatch(tokens[0]); if(!ret) continue; - thisFrame.timestamp = (uint64_t)(timeExp.cap(1).toDouble(&ret) * (double)1000000.0); + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (uint64_t)(timeExp.cap(1).toDouble(&ret) * (double)1000000.0))); if(!ret) continue; if (line.contains('[')) //the expanded format (second one from the above list) { //(1551774790.942758) can1 7A8 [8] F4 DC D1 83 0E 02 00 00 // 0 1 2 3 4 5 6 7 8 9 10 11 - thisFrame.ID = tokens[2].toULong(nullptr, 16); - if (thisFrame.ID > 0x7FF) thisFrame.extended = true; - else thisFrame.extended = false; - thisFrame.remote = false; - thisFrame.len = tokens[3].at(1) - '0'; - for (uint32_t c = 0; c < thisFrame.len; c++) + thisFrame.setFrameId(tokens[2].toULong(nullptr, 16)); + if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); + thisFrame.setFrameType(QCanBusFrame::DataFrame); + QByteArray bytes(tokens[3].at(1) - '0', 0); + for (uint32_t c = 0; c < thisFrame.payload().length(); c++) { - thisFrame.data[c] = static_cast(tokens[4 + c].toInt(nullptr, 16)); + bytes[c] = static_cast(tokens[4 + c].toInt(nullptr, 16)); } + thisFrame.setPayload(bytes); } else //the more concise format (first one from list above) { @@ -3108,32 +3125,32 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector* frames) } /* ID */ - thisFrame.ID = static_cast(IdValExp.cap(1).toInt(&ret, 16)); + thisFrame.setFrameId(static_cast(IdValExp.cap(1).toInt(&ret, 16))); if (IdValExp.cap(1).length() > 3) { - thisFrame.extended = true; + thisFrame.setExtendedFrameFormat(true); } else { - thisFrame.extended = false; + thisFrame.setExtendedFrameFormat(false); } QString val= IdValExp.cap(2); pos = 0; - thisFrame.len = 0; + QByteArray bytes; if (val.startsWith("R") && val.at(1).isDigit()) { - thisFrame.len = val.at(1).toLatin1() - '0'; - thisFrame.remote = true; + thisFrame.payload().resize( val.at(1).toLatin1() - '0' ); + thisFrame.setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); /* val byte per byte */ while ((pos = valExp.indexIn(val, pos)) != -1) { - thisFrame.data[thisFrame.len] = valExp.cap(1).toInt(&ret, 16); + bytes.append((char)valExp.cap(1).toInt(&ret, 16)); if(!ret) continue; - thisFrame.len++; pos += valExp.matchedLength(); } } + thisFrame.setPayload(bytes); } /*NB: should we make sure len <= 8? */ @@ -3218,18 +3235,19 @@ bool FrameFileIO::loadLawicelFile(QString filename, QVector* frames) line = inFile->readLine().simplified(); if (line.length() > 4 && !line.startsWith("S")) { - thisFrame.timestamp = (timeStamp += 100); - thisFrame.ID = line.mid(0, 3).toInt(nullptr, 16); - thisFrame.extended = false; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, timeStamp += 100)); + thisFrame.setFrameId( line.mid(0, 3).toInt(nullptr, 16) ); + thisFrame.setExtendedFrameFormat(false); thisFrame.isReceived = true; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.bus = 0; line.remove(0, 3); - thisFrame.len = line.length() / 2; - for (int d = 0; d < thisFrame.len; d++) + QByteArray bytes(line.length() / 2, 0); + for (int d = 0; d < bytes.length(); d++) { - thisFrame.data[d] = static_cast(line.mid(d * 2, 2).toInt(nullptr, 16)); + bytes[d] = static_cast(line.mid(d * 2, 2).toInt(nullptr, 16)); } + thisFrame.setPayload(bytes); frames->append(thisFrame); } } @@ -3292,7 +3310,7 @@ bool FrameFileIO::loadKvaserFile(QString filename, QVector *frames, bo int lineCounter = 0; int base = 10; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (useHex) base = 16; @@ -3322,18 +3340,18 @@ bool FrameFileIO::loadKvaserFile(QString filename, QVector *frames, bo //Chn Identifier Flg DLC D0...1...2...3...4...5...6..D7 Time Dir // 0 000000AD 8 FF FF 00 00 00 00 00 00 154.266550 R thisFrame.bus = line.mid(0,3).simplified().toInt(); - thisFrame.ID = line.mid(4,10).simplified().toInt(nullptr, base); - if (thisFrame.ID > 0x7FF) thisFrame.extended = true; - else thisFrame.extended = false; - thisFrame.remote = false; - thisFrame.len = line.mid(21, 3).simplified().toInt(); + thisFrame.setFrameId(line.mid(4,10).simplified().toInt(nullptr, base)); + if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); + thisFrame.setFrameType(QCanBusFrame::DataFrame); + QByteArray bytes(line.mid(21, 3).simplified().toInt(), 0); for (int i = 0; i < 8; i++) { - thisFrame.data[i] = line.mid(25 + i * 4, 3).simplified().toInt(nullptr, base); + bytes[i] = line.mid(25 + i * 4, 3).simplified().toInt(nullptr, base); } - thisFrame.timestamp = line.mid(57, 14).simplified().toDouble() * 1000000; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, line.mid(57, 14).simplified().toDouble() * 1000000)); if (line.mid(72, 1).toUpper() == "R") thisFrame.isReceived = true; else thisFrame.isReceived = false; - + thisFrame.setPayload(bytes); frames->append(thisFrame); } //else foundErrors = true; @@ -3404,7 +3422,7 @@ bool FrameFileIO::loadCabanaFile(QString filename, QVector* frames) uint64_t lastTimeStamp = 0; int lineCounter = 0; bool foundErrors = false; - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -3440,42 +3458,41 @@ bool FrameFileIO::loadCabanaFile(QString filename, QVector* frames) } if(timeStampBaseSet) { - thisFrame.timestamp = ((uint64_t)(temp) - timeStampBase); - lastTimeStamp = thisFrame.timestamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, ((uint64_t)(temp) - timeStampBase))); + lastTimeStamp = thisFrame.timeStamp().microSeconds(); } else { - thisFrame.timestamp = (lastTimeStamp + 1); - lastTimeStamp = thisFrame.timestamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (lastTimeStamp + 1))); + lastTimeStamp = thisFrame.timeStamp().microSeconds(); } } else { - thisFrame.timestamp = (lastTimeStamp + 1); - lastTimeStamp = thisFrame.timestamp; + thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (lastTimeStamp + 1))); + lastTimeStamp = thisFrame.timeStamp().microSeconds(); } - thisFrame.ID = tokens[1].toInt(); - if (thisFrame.ID > 0x7ff) thisFrame.extended = 1; - else thisFrame.extended = 0; + thisFrame.setFrameId(tokens[1].toInt()); + if (thisFrame.frameId() > 0x7ff) thisFrame.setExtendedFrameFormat(true); + else thisFrame.setExtendedFrameFormat(false); - thisFrame.remote = false; + thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.isReceived = true; thisFrame.bus = tokens[2].toInt(); - thisFrame.len = 8; - + QByteArray bytes(8,0); { unsigned long long int tempData = tokens[3].toULongLong(nullptr, 16); - thisFrame.data[0] = ((tempData >> 56) & 0xFF); - thisFrame.data[1] = ((tempData >> 48) & 0xFF); - thisFrame.data[2] = ((tempData >> 40) & 0xFF); - thisFrame.data[3] = ((tempData >> 32) & 0xFF); - thisFrame.data[4] = ((tempData >> 24) & 0xFF); - thisFrame.data[5] = ((tempData >> 16) & 0xFF); - thisFrame.data[6] = ((tempData >> 8) & 0xFF); - thisFrame.data[7] = (tempData & 0xFF); + bytes[0] = ((tempData >> 56) & 0xFF); + bytes[1] = ((tempData >> 48) & 0xFF); + bytes[2] = ((tempData >> 40) & 0xFF); + bytes[3] = ((tempData >> 32) & 0xFF); + bytes[4] = ((tempData >> 24) & 0xFF); + bytes[5] = ((tempData >> 16) & 0xFF); + bytes[6] = ((tempData >> 8) & 0xFF); + bytes[7] = (tempData & 0xFF); } - + thisFrame.setPayload(bytes); frames->append(thisFrame); } else foundErrors = true; @@ -3509,14 +3526,14 @@ bool FrameFileIO::saveCabanaFile(QString filename, const QVector* fram lineCounter = 0; } - double tempTimeStamp = frames->at(c).timestamp; + double tempTimeStamp = frames->at(c).timeStamp().microSeconds(); tempTimeStamp /= 1000000; outFile->write(QString::number(tempTimeStamp, 'f').toUtf8()); outFile->write(".0"); outFile->putChar(44); - outFile->write(QString::number(frames->at(c).ID, 10).toUpper().toUtf8()); + outFile->write(QString::number(frames->at(c).frameId(), 10).toUpper().toUtf8()); outFile->putChar(44); outFile->write(QString::number(frames->at(c).bus).toUtf8()); @@ -3524,8 +3541,8 @@ bool FrameFileIO::saveCabanaFile(QString filename, const QVector* fram for (unsigned int temp = 0; temp < 8; temp++) { - if (temp < frames->at(c).len) - outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); + if (temp < frames->at(c).payload().length()) + outFile->write(QString::number(frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); else outFile->write("00"); } diff --git a/frameplaybackobject.cpp b/frameplaybackobject.cpp index e990efe..b918b07 100644 --- a/frameplaybackobject.cpp +++ b/frameplaybackobject.cpp @@ -68,7 +68,7 @@ quint64 FramePlaybackObject::updatePosition(bool forward) //only send frame out if its ID is checked in the list. Otherwise discard it. CANFrame *thisFrame = ¤tSeqItem->data[currentPosition]; uint32_t originalBus = thisFrame->bus; - if (currentSeqItem->idFilters.find(thisFrame->ID).value()) + if (currentSeqItem->idFilters.find(thisFrame->frameId()).value()) { if (whichBusSend > -1) { @@ -90,7 +90,7 @@ quint64 FramePlaybackObject::updatePosition(bool forward) thisFrame->bus = originalBus; } - return thisFrame->timestamp; + return thisFrame->timeStamp().microSeconds(); } quint64 FramePlaybackObject::peekPosition(bool forward) @@ -113,7 +113,7 @@ quint64 FramePlaybackObject::peekPosition(bool forward) } } CANFrame *thisFrame = ¤tSeqItem->data[peekCurrentPosition]; - return thisFrame->timestamp; + return thisFrame->timeStamp().microSeconds(); } void FramePlaybackObject::piStart() @@ -197,8 +197,8 @@ void FramePlaybackObject::startPlaybackForward() { playbackTimer->setInterval(1); playbackElapsed.start(); - if (currentSeqItem->data[currentPosition].timestamp > 2000) - playbackLastTimeStamp = currentSeqItem->data[currentPosition].timestamp - 2000; + if (currentSeqItem->data[currentPosition].timeStamp().microSeconds() > 2000) + playbackLastTimeStamp = currentSeqItem->data[currentPosition].timeStamp().microSeconds() - 2000; else playbackLastTimeStamp = 0; } playbackTimer->start(); @@ -219,7 +219,7 @@ void FramePlaybackObject::startPlaybackBackward() { playbackElapsed.start(); playbackTimer->setInterval(1); - playbackLastTimeStamp = currentSeqItem->data[currentPosition].timestamp + 2000; + playbackLastTimeStamp = currentSeqItem->data[currentPosition].timeStamp().microSeconds() + 2000; } playbackTimer->start(); } @@ -350,8 +350,8 @@ void FramePlaybackObject::timerTriggered() if (peekPosition(true) == 0xFFFFFFFFFFFFFFFFull) { updatePosition(true); //this'll go to the next log (if there is one) - if (currentSeqItem->data[currentPosition].timestamp > 1000) - playbackLastTimeStamp = currentSeqItem->data[currentPosition].timestamp - 1000; + if (currentSeqItem->data[currentPosition].timeStamp().microSeconds() > 1000) + playbackLastTimeStamp = currentSeqItem->data[currentPosition].timeStamp().microSeconds() - 1000; else playbackLastTimeStamp = 0; } } @@ -367,7 +367,7 @@ void FramePlaybackObject::timerTriggered() if (peekPosition(false) == 0xFFFFFFFFFFFFFFFFull) { updatePosition(false); //this'll go to the next log (if there is one) - playbackLastTimeStamp = currentSeqItem->data[currentPosition].timestamp + 1000; + playbackLastTimeStamp = currentSeqItem->data[currentPosition].timeStamp().microSeconds() + 1000; } } statusCounter++; diff --git a/frameplaybackwindow.cpp b/frameplaybackwindow.cpp index 975df44..5f9ff76 100644 --- a/frameplaybackwindow.cpp +++ b/frameplaybackwindow.cpp @@ -426,7 +426,7 @@ void FramePlaybackWindow::fillIDHash(SequenceItem &item) for (int i = 0; i < item.data.count(); i++) { - id = item.data[i].ID; + id = item.data[i].frameId(); if (!item.idFilters.contains(id)) { item.idFilters.insert(id, true); diff --git a/framesenderwindow.cpp b/framesenderwindow.cpp index fbd4093..1a8a4a7 100644 --- a/framesenderwindow.cpp +++ b/framesenderwindow.cpp @@ -130,13 +130,13 @@ void FrameSenderWindow::buildFrameCache() for (int i = 0; i < modelFrames->count(); i++) { thisFrame = modelFrames->at(i); - if (!frameCache.contains(thisFrame.ID)) + if (!frameCache.contains(thisFrame.frameId())) { - frameCache.insert(thisFrame.ID, thisFrame); + frameCache.insert(thisFrame.frameId(), thisFrame); } else { - frameCache[thisFrame.ID] = thisFrame; + frameCache[thisFrame.frameId()] = thisFrame; } } } @@ -160,13 +160,13 @@ void FrameSenderWindow::updatedFrames(int numFrames) for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) { thisFrame = modelFrames->at(i); - if (!frameCache.contains(thisFrame.ID)) + if (!frameCache.contains(thisFrame.frameId())) { - frameCache.insert(thisFrame.ID, thisFrame); + frameCache.insert(thisFrame.frameId(), thisFrame); } else { - frameCache[thisFrame.ID] = thisFrame; + frameCache[thisFrame.frameId()] = thisFrame; } processIncomingFrame(&thisFrame); } @@ -182,8 +182,8 @@ void FrameSenderWindow::processIncomingFrame(CANFrame *frame) { Trigger *thisTrigger = &sendingData[sd].triggers[trig]; qDebug() << "Trigger ID: " << thisTrigger->ID; - qDebug() << "Frame ID: " << frame->ID; - if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->ID) + qDebug() << "Frame ID: " << frame->frameId(); + if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->frameId()) { if ((uint32_t)thisTrigger->bus == frame->bus || thisTrigger->bus == -1) { @@ -511,7 +511,7 @@ void FrameSenderWindow::doModifiers(int idx) } } //Finally, drop the result into the proper data byte - sendData->data[mod->destByte] = (unsigned char) shadowReg; + sendData->payload().data()[mod->destByte] = (char) shadowReg; } } @@ -525,16 +525,16 @@ int FrameSenderWindow::fetchOperand(int idx, ModifierOperand op) } else if (op.ID == -2) //fetch data from a data byte within the output frame { - if (op.notOper) return ~sendingData.at(idx).data[op.databyte]; - else return sendingData.at(idx).data[op.databyte]; + if (op.notOper) return ~sendingData.at(idx).payload()[op.databyte]; + else return sendingData.at(idx).payload()[op.databyte]; } else //look up external data byte { tempFrame = lookupFrame(op.ID, op.bus); if (tempFrame != nullptr) { - if (op.notOper) return ~tempFrame->data[op.databyte]; - else return tempFrame->data[op.databyte]; + if (op.notOper) return ~tempFrame->payload()[op.databyte]; + else return tempFrame->payload()[op.databyte]; } else return 0; } @@ -643,7 +643,7 @@ void FrameSenderWindow::processModifierText(int line) } else thisOp.second.notOper = false; thisOp.second.bus = sendingData[line].bus; - thisOp.second.ID = sendingData[line].ID; + thisOp.second.ID = sendingData[line].frameId(); parseOperandString(secondOp.split(":"), thisOp.second); thisMod.operations.append(thisOp); } @@ -793,10 +793,10 @@ void FrameSenderWindow::updateGridRow(int idx) QTableWidgetItem *item = ui->tableSender->item(gridLine, 9); if (item == nullptr) item = new QTableWidgetItem(); item->setText(QString::number(temp->count)); - if (!temp->remote) { - for (unsigned int i = 0; i < temp->len; i++) + if (temp->frameType() != QCanBusFrame::RemoteRequestFrame) { + for (unsigned int i = 0; i < temp->payload().length(); i++) { - dataString.append(Utility::formatNumber(temp->data[i])); + dataString.append(Utility::formatNumber(temp->payload()[i])); dataString.append(" "); } ui->tableSender->item(gridLine, 6)->setText(dataString); @@ -818,8 +818,8 @@ void FrameSenderWindow::processCellChange(int line, int col) { FrameSendData tempData; tempData.enabled = false; - tempData.remote = false; - tempData.extended = false; + tempData.setFrameType(QCanBusFrame::DataFrame); + tempData.setExtendedFrameFormat(false); sendingData.append(tempData); } @@ -848,9 +848,9 @@ void FrameSenderWindow::processCellChange(int line, int col) tempVal = Utility::ParseStringToNum(ui->tableSender->item(line, 2)->text()); if (tempVal < 0) tempVal = 0; if (tempVal > 0x7FFFFFFF) tempVal = 0x7FFFFFFF; - sendingData[line].ID = tempVal; - if (sendingData[line].ID > 0x7FF) { - sendingData[line].extended = true; + sendingData[line].setFrameId(tempVal); + if (sendingData[line].frameId() > 0x7FF) { + sendingData[line].setExtendedFrameFormat(true); ui->tableSender->blockSignals(true); ui->tableSender->item(line, 4)->setCheckState(Qt::Checked); ui->tableSender->blockSignals(false); @@ -861,29 +861,29 @@ void FrameSenderWindow::processCellChange(int line, int col) tempVal = Utility::ParseStringToNum(ui->tableSender->item(line, 3)->text()); if (tempVal < 0) tempVal = 0; if (tempVal > 8) tempVal = 8; - sendingData[line].len = tempVal; + sendingData[line].payload().resize(tempVal); break; case 4: // Ext if (ui->tableSender->item(line, 4)->checkState() == Qt::Checked) { - sendingData[line].extended = true; + sendingData[line].setExtendedFrameFormat(true); } else { - sendingData[line].extended = false; + sendingData[line].setExtendedFrameFormat(false); } break; case 5: // Rem if (ui->tableSender->item(line, 5)->checkState() == Qt::Checked) { - sendingData[line].remote = true; + sendingData[line].setFrameType(QCanBusFrame::RemoteRequestFrame); } else { - sendingData[line].remote = false; + sendingData[line].setFrameType(QCanBusFrame::DataFrame); } break; case 6: //Data bytes - for (int i = 0; i < 8; i++) sendingData[line].data[i] = 0; + for (int i = 0; i < 8; i++) sendingData[line].payload().data()[i] = 0; tokens = ui->tableSender->item(line, 6)->text().split(" "); for (int j = 0; j < tokens.count(); j++) { - sendingData[line].data[j] = (uint8_t)Utility::ParseStringToNum(tokens[j]); + sendingData[line].payload().data()[j] = (uint8_t)Utility::ParseStringToNum(tokens[j]); } break; case 7: //triggers diff --git a/mainwindow.cpp b/mainwindow.cpp index 7cee894..0e9fc71 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -168,12 +168,9 @@ MainWindow::MainWindow(QWidget *parent) : //of scaling or font differences between different computers. CANFrame temp; temp.bus = 0; - temp.ID = 0x100; - temp.len = 0; - temp.extended = false; + temp.setFrameId(0x100); temp.isReceived = true; - temp.remote = false; - temp.timestamp = 100000000; + temp.setTimeStamp(QCanBusFrame::TimeStamp(0, 100000000)); model->addFrame(temp, true); qApp->processEvents(); tickGUIUpdate(); //force a GUI refresh so that the row exists to measure @@ -402,7 +399,7 @@ void MainWindow::gridDoubleClicked(QModelIndex idx) //qDebug() << "Grid double clicked"; //grab ID and timestamp and send them away CANFrame frame = model->getListReference()->at(idx.row()); - emit sendCenterTimeID(frame.ID, frame.timestamp / 1000000.0); + emit sendCenterTimeID(frame.frameId(), frame.timeStamp().microSeconds() / 1000000.0); } void MainWindow::interpretToggled(bool state) @@ -743,18 +740,18 @@ Data Bytes: 88 10 00 13 BB 00 06 00 { CANFrame thisFrame = frames->at(c); QString builderString; - builderString += tr("Time: ") + QString::number((thisFrame.timestamp / 1000000.0), 'f', 6); - builderString += tr(" ID: ") + Utility::formatCANID(thisFrame.ID, thisFrame.extended); - if (thisFrame.extended) builderString += tr(" Ext "); + builderString += tr("Time: ") + QString::number((thisFrame.timeStamp().microSeconds() / 1000000.0), 'f', 6); + builderString += tr(" ID: ") + Utility::formatCANID(thisFrame.frameId(), thisFrame.hasExtendedFrameFormat()); + if (thisFrame.hasExtendedFrameFormat()) builderString += tr(" Ext "); else builderString += tr(" Std "); builderString += tr("Bus: ") + QString::number(thisFrame.bus); - builderString += " Len: " + QString::number(thisFrame.len) + "\n"; + builderString += " Len: " + QString::number(thisFrame.payload().length()) + "\n"; outFile->write(builderString.toUtf8()); builderString = tr("Data Bytes: "); - for (unsigned int temp = 0; temp < thisFrame.len; temp++) + for (unsigned int temp = 0; temp < thisFrame.payload().length(); temp++) { - builderString += Utility::formatNumber(thisFrame.data[temp]) + " "; + builderString += Utility::formatNumber(thisFrame.payload()[temp]) + " "; } builderString += "\n"; outFile->write(builderString.toUtf8()); diff --git a/motorcontrollerconfigwindow.cpp b/motorcontrollerconfigwindow.cpp index eafc31a..1fe9dae 100644 --- a/motorcontrollerconfigwindow.cpp +++ b/motorcontrollerconfigwindow.cpp @@ -4,6 +4,17 @@ #include "mainwindow.h" #include +/* + * Nothing to see here, these are not the droids you're looking for. Go away + * + * + * + * You didn't go away, did you... This is a screen that allows for setting EEPROM configuration for a + * custom motor controller project I was working on. It's hidden by default. You could re-enable it and play around + * with it if you're bored. It might be a good basis for how to set a list of parameters on a device. But, it could be broken + * these days too. It is not maintained any longer as the project it was meant for is abandoned. YMMV. +*/ + MotorControllerConfigWindow::MotorControllerConfigWindow(const QVector *frames, QWidget *parent) : QDialog(parent), ui(new Ui::MotorControllerConfigWindow) @@ -57,18 +68,18 @@ void MotorControllerConfigWindow::updatedFrames(int numFrames) for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) { thisFrame = modelFrames->at(i); - id = thisFrame.ID; + id = thisFrame.frameId(); if (id == 0xC2) //response to a query we made { - if (thisFrame.data[2] == 0) + if ((char)thisFrame.payload()[2] == 0) { - int paramID = thisFrame.data[0] + (thisFrame.data[1] * 256); + int paramID = thisFrame.payload()[0] + (thisFrame.payload()[1] * 256); for (int i = 0; i < params.length(); i++) { if (params[i].paramID == paramID) { - params[i].value = thisFrame.data[4] + (thisFrame.data[5] * 256); + params[i].value = thisFrame.payload()[4] + (thisFrame.payload()[5] * 256); if (params[i].paramType == ASCII) item = new QTableWidgetItem(); //QString::fromUtf8((char *)params[i].value, 2)); if (params[i].paramType == HEX) item = new QTableWidgetItem(Utility::formatHexNum(params[i].value)); if (params[i].paramType == DEC) @@ -177,18 +188,19 @@ void MotorControllerConfigWindow::timerTick() { qDebug() << "Request: " << QString::number(transmitStep); - outFrame.ID = 0xC1; - outFrame.len = 8; + outFrame.setFrameId(0xC1); + QByteArray bytes(8, 0); outFrame.bus = 0; - outFrame.extended = false; - outFrame.data[0] = params[transmitStep].paramID & 0xFF; - outFrame.data[1] = (params[transmitStep].paramID >> 8) & 0xFF; - outFrame.data[2] = 0; //0 = read, 1 = write - outFrame.data[3] = 0; //reserved - outFrame.data[4] = 0; //value goes in bytes 4,5 when writing - outFrame.data[5] = 0; - outFrame.data[6] = 0; //reserved - outFrame.data[7] = 0; //reserved + outFrame.setExtendedFrameFormat(false); + bytes[0] = params[transmitStep].paramID & 0xFF; + bytes[1] = (params[transmitStep].paramID >> 8) & 0xFF; + bytes[2] = 0; //0 = read, 1 = write + bytes[3] = 0; //reserved + bytes[4] = 0; //value goes in bytes 4,5 when writing + bytes[5] = 0; + bytes[6] = 0; //reserved + bytes[7] = 0; //reserved + outFrame.setPayload(bytes); CANConManager::getInstance()->sendFrame(outFrame); @@ -213,18 +225,18 @@ void MotorControllerConfigWindow::timerTick() if (thisValue != params[transmitStep].value) { - outFrame.ID = 0xC1; - outFrame.len = 8; + outFrame.setFrameId(0xC1); + QByteArray bytes(8, 0); outFrame.bus = 0; - outFrame.extended = false; - outFrame.data[0] = params[transmitStep].paramID & 0xFF; - outFrame.data[1] = (params[transmitStep].paramID >> 8) & 0xFF; - outFrame.data[2] = 1; //0 = read, 1 = write - outFrame.data[3] = 0; //reserved - outFrame.data[4] = params[transmitStep].value & 0xFF; - outFrame.data[5] = (params[transmitStep].value >> 8) & 0xFF; - outFrame.data[6] = 0; //reserved - outFrame.data[7] = 0; //reserved + outFrame.setExtendedFrameFormat(false); + bytes[0] = params[transmitStep].paramID & 0xFF; + bytes[1] = (params[transmitStep].paramID >> 8) & 0xFF; + bytes[2] = 1; //0 = read, 1 = write + bytes[3] = 0; //reserved + bytes[4] = params[transmitStep].value & 0xFF; + bytes[5] = (params[transmitStep].value >> 8) & 0xFF; + bytes[6] = 0; //reserved + bytes[7] = 0; //reserved CANConManager::getInstance()->sendFrame(outFrame); } diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index dcd627a..8261aef 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -293,7 +293,7 @@ void FlowViewWindow::gotCenterTimeID(int32_t ID, double timestamp) memcpy(refBytes, currBytes, 8); } - memcpy(currBytes, frameCache.at(currentPosition).data, 8); + memcpy(currBytes, frameCache.at(currentPosition).payload().data(), 8); updateDataView(); } @@ -696,23 +696,23 @@ void FlowViewWindow::timerTriggered() void FlowViewWindow::updateDataView() { - ui->txtCurr1->setText(Utility::formatNumber(currBytes[0])); - ui->txtCurr2->setText(Utility::formatNumber(currBytes[1])); - ui->txtCurr3->setText(Utility::formatNumber(currBytes[2])); - ui->txtCurr4->setText(Utility::formatNumber(currBytes[3])); - ui->txtCurr5->setText(Utility::formatNumber(currBytes[4])); - ui->txtCurr6->setText(Utility::formatNumber(currBytes[5])); - ui->txtCurr7->setText(Utility::formatNumber(currBytes[6])); - ui->txtCurr8->setText(Utility::formatNumber(currBytes[7])); + ui->txtCurr1->setText(Utility::formatNumber((char)currBytes[0])); + ui->txtCurr2->setText(Utility::formatNumber((char)currBytes[1])); + ui->txtCurr3->setText(Utility::formatNumber((char)currBytes[2])); + ui->txtCurr4->setText(Utility::formatNumber((char)currBytes[3])); + ui->txtCurr5->setText(Utility::formatNumber((char)currBytes[4])); + ui->txtCurr6->setText(Utility::formatNumber((char)currBytes[5])); + ui->txtCurr7->setText(Utility::formatNumber((char)currBytes[6])); + ui->txtCurr8->setText(Utility::formatNumber((char)currBytes[7])); - ui->txtRef1->setText(Utility::formatNumber(refBytes[0])); - ui->txtRef2->setText(Utility::formatNumber(refBytes[1])); - ui->txtRef3->setText(Utility::formatNumber(refBytes[2])); - ui->txtRef4->setText(Utility::formatNumber(refBytes[3])); - ui->txtRef5->setText(Utility::formatNumber(refBytes[4])); - ui->txtRef6->setText(Utility::formatNumber(refBytes[5])); - ui->txtRef7->setText(Utility::formatNumber(refBytes[6])); - ui->txtRef8->setText(Utility::formatNumber(refBytes[7])); + ui->txtRef1->setText(Utility::formatNumber((char)refBytes[0])); + ui->txtRef2->setText(Utility::formatNumber((char)refBytes[1])); + ui->txtRef3->setText(Utility::formatNumber((char)refBytes[2])); + ui->txtRef4->setText(Utility::formatNumber((char)refBytes[3])); + ui->txtRef5->setText(Utility::formatNumber((char)refBytes[4])); + ui->txtRef6->setText(Utility::formatNumber((char)refBytes[5])); + ui->txtRef7->setText(Utility::formatNumber((char)refBytes[6])); + ui->txtRef8->setText(Utility::formatNumber((char)refBytes[7])); ui->flowView->setReference(refBytes, false); ui->flowView->updateData(currBytes, true); diff --git a/re/frameinfowindow.cpp b/re/frameinfowindow.cpp index 3410565..e200a8b 100644 --- a/re/frameinfowindow.cpp +++ b/re/frameinfowindow.cpp @@ -336,13 +336,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID) baseNode->addChild(tempItem); tempItem = new QTreeWidgetItem(); - tempItem->setText(0, tr(" Priority bits: ") + Utility::formatNumber( FilterUtility::getGMLanPriorityBits(targettedID))); + tempItem->setText(0, tr(" Priority bits: ") + Utility::formatNumber( (uint64_t)FilterUtility::getGMLanPriorityBits(targettedID))); baseNode->addChild(tempItem); tempItem = new QTreeWidgetItem(); - tempItem->setText(0, tr(" Arbitration Id: ") + Utility::formatNumber( FilterUtility::getGMLanArbitrationId(targettedID))); + tempItem->setText(0, tr(" Arbitration Id: ") + Utility::formatNumber( (uint64_t)FilterUtility::getGMLanArbitrationId(targettedID))); baseNode->addChild(tempItem); tempItem = new QTreeWidgetItem(); - tempItem->setText(0, tr(" Sender Id: ") + Utility::formatNumber( FilterUtility::getGMLanSenderId(targettedID))); + tempItem->setText(0, tr(" Sender Id: ") + Utility::formatNumber( (uint64_t)FilterUtility::getGMLanSenderId(targettedID))); baseNode->addChild(tempItem); } @@ -506,7 +506,7 @@ void FrameInfoWindow::updateDetailsWindow(QString newID) dataBase->addChild(tempItem); tempItem = new QTreeWidgetItem(); - tempItem->setText(0, tr("Range: ") + Utility::formatNumber(minData[c]) + tr(" to ") + Utility::formatNumber(maxData[c])); + tempItem->setText(0, tr("Range: ") + Utility::formatNumber((char)minData[c]) + tr(" to ") + Utility::formatNumber((char)maxData[c])); dataBase->addChild(tempItem); histBase->setText(0, tr("Histogram")); dataBase->addChild(histBase); diff --git a/re/graphingwindow.cpp b/re/graphingwindow.cpp index 6a709ab..8849183 100644 --- a/re/graphingwindow.cpp +++ b/re/graphingwindow.cpp @@ -1153,7 +1153,7 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam) } else { - params.x[j] = frameCache[k].timeStamp.microSeconds(); + params.x[j] = frameCache[k].timeStamp().microSeconds(); } params.y[j] = (tempVal * params.scale) + params.bias; if (params.y[j] < yminval) yminval = params.y[j]; diff --git a/re/isotp_interpreterwindow.cpp b/re/isotp_interpreterwindow.cpp index 3aeb8fc..5fe264b 100644 --- a/re/isotp_interpreterwindow.cpp +++ b/re/isotp_interpreterwindow.cpp @@ -218,7 +218,7 @@ void ISOTP_InterpreterWindow::showDetailView() buildString.append(tr("Raw Payload: ")); for (int i = 0; i < messages[rowNum].data.count(); i++) { - buildString.append(Utility::formatNumber(messages[rowNum].data[i])); + buildString.append(Utility::formatNumber((char)messages[rowNum].data[i])); buildString.append(" "); } buildString.append("\r\r"); @@ -291,7 +291,7 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg) for (int i = 0; i < msg.data.count(); i++) { - tempString.append(Utility::formatNumber(msg.data[i])); + tempString.append(Utility::formatNumber((char)msg.data[i])); tempString.append(" "); } ui->tableIsoFrames->setItem(rowNum, 5, new QTableWidgetItem(tempString)); diff --git a/re/sniffer/SnifferDelegate.cpp b/re/sniffer/SnifferDelegate.cpp index bd594a0..f9358d6 100644 --- a/re/sniffer/SnifferDelegate.cpp +++ b/re/sniffer/SnifferDelegate.cpp @@ -116,7 +116,7 @@ void SnifferDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio painter->setOpacity(1.0); painter->setPen(QApplication::palette().color(QPalette::Text)); painter->setFont(mainFont); - painter->drawText(QRect(viewport.left(), viewport.top() + xSector + yOffset, xSpan, mainFontInfo->pixelSize()), Qt::AlignCenter, Utility::formatNumber(val)); + painter->drawText(QRect(viewport.left(), viewport.top() + xSector + yOffset, xSpan, mainFontInfo->pixelSize()), Qt::AlignCenter, Utility::formatNumber((char)val)); } QSize SnifferDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const diff --git a/re/sniffer/snifferitem.cpp b/re/sniffer/snifferitem.cpp index 2267835..8e102eb 100644 --- a/re/sniffer/snifferitem.cpp +++ b/re/sniffer/snifferitem.cpp @@ -4,7 +4,7 @@ SnifferItem::SnifferItem(const CANFrame& pFrame, quint32 seq): - mID(pFrame.ID) + mID(pFrame.frameId()) { for (int i = 0; i < 8; i++) { mNotch[i] =0; diff --git a/scriptcontainer.cpp b/scriptcontainer.cpp index 83c64d9..c3ef718 100644 --- a/scriptcontainer.cpp +++ b/scriptcontainer.cpp @@ -230,23 +230,21 @@ void CANScriptHelper::clearFilters() void CANScriptHelper::sendFrame(QJSValue bus, QJSValue id, QJSValue length, QJSValue data) { CANFrame frame; - frame.extended = false; - frame.remote = false; - frame.ID = static_cast(id.toInt()); - frame.len = length.toUInt(); - if (frame.len > 8) frame.len = 8; + frame.setExtendedFrameFormat(false); + frame.setFrameId(static_cast(id.toInt())); + QByteArray bytes(length.toUInt(), 0); if (!data.isArray()) qDebug() << "data isn't an array"; - for (unsigned int i = 0; i < frame.len; i++) + for (unsigned int i = 0; i < bytes.length(); i++) { - frame.data[i] = (uint8_t)data.property(i).toInt(); + bytes[i] = (uint8_t)data.property(i).toInt(); } - + frame.setPayload(bytes); frame.bus = (uint32_t)bus.toInt(); //if (frame.bus > 1) frame.bus = 1; - if (frame.ID > 0x7FF) frame.extended = true; + if (frame.frameId() > 0x7FF) frame.setExtendedFrameFormat(true); qDebug() << "sending frame from script"; CANConManager::getInstance()->sendFrame(frame); @@ -258,13 +256,13 @@ void CANScriptHelper::gotTargettedFrame(const CANFrame &frame) //qDebug() << "Got frame in script interface"; for (int i = 0; i < filters.length(); i++) { - if (filters[i].checkFilter(frame.ID, frame.bus)) + if (filters[i].checkFilter(frame.frameId(), frame.bus)) { QJSValueList args; - args << frame.bus << frame.ID << frame.len; - QJSValue dataBytes = scriptEngine->newArray(frame.len); + args << frame.bus << frame.frameId() << frame.payload().length(); + QJSValue dataBytes = scriptEngine->newArray(frame.payload().length()); - for (unsigned int j = 0; j < frame.len; j++) dataBytes.setProperty(j, QJSValue(frame.data[j])); + for (unsigned int j = 0; j < frame.payload().length(); j++) dataBytes.setProperty(j, QJSValue((unsigned char)frame.payload()[j])); args.append(dataBytes); gotFrameFunction.call(args); return; //as soon as one filter matches we jump out diff --git a/signalviewerwindow.cpp b/signalviewerwindow.cpp index a093bee..c401b49 100644 --- a/signalviewerwindow.cpp +++ b/signalviewerwindow.cpp @@ -71,7 +71,7 @@ void SignalViewerWindow::processFrame(CANFrame &frame) { sig = signalList.at(i); if (!sig) return; - if (sig->parentMessage->ID == frame.ID) + if (sig->parentMessage->ID == frame.frameId()) { if (sig->processAsText(frame, sigString, false)) //if true we could interpret the signal so update it in the list { diff --git a/utility.h b/utility.h index 8160aa7..d4f7f62 100644 --- a/utility.h +++ b/utility.h @@ -97,6 +97,15 @@ public: else return formatHexNum(value); } + static QString formatNumber(char value) + { + if (decimalMode) + { + return QString::number((unsigned char)value, 10); + } + else return formatHexNum((unsigned char)value); + } + static QString formatCANID(uint64_t id, bool extended) { if (decimalMode) return QString::number(id, 10);