From 367c072b45435259b765d2f38942e0aeeebaeaea Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 18 Feb 2020 21:31:18 -0500 Subject: [PATCH] Various fixes to issues caused by recent transition to QCanBusFrame --- bus_protocols/isotp_handler.cpp | 34 +++++++++++++++++++++-------- filterutility.cpp | 2 +- framefileio.cpp | 4 ++-- framesenderwindow.cpp | 15 +++++++++---- re/flowviewwindow.cpp | 38 ++++++++++++++++----------------- re/isotp_interpreterwindow.cpp | 25 +++------------------- re/rangestatewindow.cpp | 13 ++++------- scriptcontainer.cpp | 12 +++++++---- 8 files changed, 73 insertions(+), 70 deletions(-) diff --git a/bus_protocols/isotp_handler.cpp b/bus_protocols/isotp_handler.cpp index 583cdc5..ecfb332 100644 --- a/bus_protocols/isotp_handler.cpp +++ b/bus_protocols/isotp_handler.cpp @@ -156,7 +156,9 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) //int offset; ISOTP_MESSAGE msg; ISOTP_MESSAGE *pMsg; + QByteArray dataBytes; const unsigned char *data = reinterpret_cast(frame.payload().constData()); + qDebug() << frame.payload().count(); //int dataLen = frame.payload().count(); frameType = 0; @@ -185,16 +187,29 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) if (frameLen > 7) return; msg.bus = frame.bus; + msg.setFrameType(QCanBusFrame::FrameType::DataFrame); msg.setExtendedFrameFormat( frame.hasExtendedFrameFormat() ); msg.setFrameId(ID); msg.isReceived = frame.isReceived; - msg.payload().reserve(frameLen); + dataBytes.reserve(frameLen); msg.reportedLength = frameLen; msg.setTimeStamp(frame.timeStamp()); msg.isMultiframe = false; - if (useExtendedAddressing) for (int j = 0; j < frameLen; j++) msg.payload().append(frame.payload()[j+2]); - else for (int j = 0; j < frameLen; j++) msg.payload().append(frame.payload()[j+1]); - //qDebug() << "Emitting single frame ISOTP message"; + if (useExtendedAddressing) + { + for (int j = 0; j < frameLen; j++) + { + dataBytes.append(data[j+2]); + } + } + else + { + for (int j = 0; j < frameLen; j++) + { + dataBytes.append(data[j+1]); + } + } + qDebug() << "Emitting single frame ISOTP message"; emit newISOMessage(msg); break; case 1: //first frame of a multi-frame message @@ -210,9 +225,9 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) { frameLen += data[2]; frameLen = frameLen & 0xFFF; - msg.payload().reserve(frameLen); + dataBytes.reserve(frameLen); msg.reportedLength = frameLen; - for (int j = 0; j < 5; j++) msg.payload().append(frame.payload()[3 + j]); + for (int j = 0; j < 5; j++) dataBytes.append(frame.payload()[3 + j]); } else { @@ -220,9 +235,10 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) frameLen = frameLen & 0xFFF; msg.payload().reserve(frameLen); msg.reportedLength = frameLen; - for (int j = 0; j < 6; j++) msg.payload().append(frame.payload()[2 + j]); + for (int j = 0; j < 6; j++) dataBytes.append(frame.payload()[2 + j]); } msg.lastSequence = -1; + msg.setPayload(dataBytes); messageBuffer.append(msg); //The sending ID is set to the last ID we used to send from this class which is //very likely to be correct. But, caution, there is a chance that it isn't. Beware. @@ -266,7 +282,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame) } if (pMsg->reportedLength <= pMsg->payload().count()) { - //qDebug() << "Emitting multiframe ISOTP message"; + qDebug() << "Emitting multiframe ISOTP message"; checkNeedFlush(pMsg->frameId()); } break; @@ -316,7 +332,7 @@ void ISOTP_HANDLER::checkNeedFlush(uint64_t ID) qDebug() << "Flushing a partial frame " << QString::number(messageBuffer[i].frameId(), 16) << " " << messageBuffer[i].reportedLength << " " << messageBuffer[i].payload().count(); } } - emit newISOMessage(messageBuffer[i]); + if (messageBuffer[i].reportedLength > 0) emit newISOMessage(messageBuffer[i]); messageBuffer.removeAt(i); return; } diff --git a/filterutility.cpp b/filterutility.cpp index b577c3d..657deec 100644 --- a/filterutility.cpp +++ b/filterutility.cpp @@ -60,7 +60,7 @@ QListWidgetItem * FilterUtility::createFilterItem(int32_t id, QListWidget* paren // Filter labeling (show interpreted frame names next to the CAN addr ID) MatchingCriteria_t matchingCriteria; DBC_MESSAGE *msg = dbcHandler->findMessageForFilter(id,&matchingCriteria); - if (msg != NULL) + if (msg != nullptr) { filterItemName.append(" "); filterItemName.append(msg->name); diff --git a/framefileio.cpp b/framefileio.cpp index c5a8439..a931a63 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -3198,10 +3198,10 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector* frames) if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true); else thisFrame.setExtendedFrameFormat(false); thisFrame.setFrameType(QCanBusFrame::DataFrame); - QByteArray bytes(tokens[3].at(1) - '0', 0); + QByteArray bytes(tokens[3].at(1) - '0', 0); for (int c = 0; c < thisFrame.payload().length(); c++) { - bytes[c] = static_cast(tokens[4 + c].toInt(nullptr, 16)); + if ((4 + c) < tokens.size()) bytes[c] = static_cast(tokens[4 + c].toInt(nullptr, 16)); } thisFrame.setPayload(bytes); } diff --git a/framesenderwindow.cpp b/framesenderwindow.cpp index 2d17b36..622f729 100644 --- a/framesenderwindow.cpp +++ b/framesenderwindow.cpp @@ -511,7 +511,9 @@ void FrameSenderWindow::doModifiers(int idx) } } //Finally, drop the result into the proper data byte - sendData->payload().data()[mod->destByte] = (char) shadowReg; + QByteArray newArr(sendData->payload()); + newArr[mod->destByte] = (char) shadowReg; + sendData->setPayload(newArr); } } @@ -830,6 +832,7 @@ void FrameSenderWindow::processCellChange(int line, int col) sendingData[line].count = 0; int numBuses = CANConManager::getInstance()->getNumBuses(); + QByteArray arr; switch (col) { @@ -864,8 +867,9 @@ void FrameSenderWindow::processCellChange(int line, int col) case 3: //length field tempVal = Utility::ParseStringToNum(ui->tableSender->item(line, 3)->text()); if (tempVal < 0) tempVal = 0; - if (tempVal > 8) tempVal = 8; - sendingData[line].payload().resize(tempVal); + if (tempVal > 8) tempVal = 8; + arr.resize(tempVal); + sendingData[line].setPayload(arr); break; case 4: // Ext if (ui->tableSender->item(line, 4)->checkState() == Qt::Checked) { @@ -885,10 +889,13 @@ void FrameSenderWindow::processCellChange(int line, int col) for (int i = 0; i < 8; i++) sendingData[line].payload().data()[i] = 0; tokens = ui->tableSender->item(line, 6)->text().split(" "); + arr.clear(); + arr.reserve(tokens.count()); for (int j = 0; j < tokens.count(); j++) { - sendingData[line].payload().data()[j] = (uint8_t)Utility::ParseStringToNum(tokens[j]); + arr.append((uint8_t)Utility::ParseStringToNum(tokens[j])); } + sendingData[line].setPayload(arr); break; case 7: //triggers processTriggerText(line); diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index 9d8f3de..31e4010 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -609,7 +609,7 @@ void FlowViewWindow::changeID(QString newID) updateGraphLocation(); - memcpy(currBytes, frameCache.at(currentPosition).payload(), 8); + memcpy(currBytes, frameCache.at(currentPosition).payload().constData(), 8); memcpy(refBytes, currBytes, 8); updateDataView(); @@ -645,7 +645,7 @@ void FlowViewWindow::btnStopClick() currentPosition = 0; - memcpy(currBytes, frameCache.at(currentPosition).payload().data_ptr(), 8); + memcpy(currBytes, frameCache.at(currentPosition).payload().constData(), 8); memcpy(refBytes, currBytes, 8); updateFrameLabel(); @@ -705,23 +705,23 @@ void FlowViewWindow::timerTriggered() void FlowViewWindow::updateDataView() { - 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->txtCurr1->setText(Utility::formatNumber((unsigned char)currBytes[0])); + ui->txtCurr2->setText(Utility::formatNumber((unsigned char)currBytes[1])); + ui->txtCurr3->setText(Utility::formatNumber((unsigned char)currBytes[2])); + ui->txtCurr4->setText(Utility::formatNumber((unsigned char)currBytes[3])); + ui->txtCurr5->setText(Utility::formatNumber((unsigned char)currBytes[4])); + ui->txtCurr6->setText(Utility::formatNumber((unsigned char)currBytes[5])); + ui->txtCurr7->setText(Utility::formatNumber((unsigned char)currBytes[6])); + ui->txtCurr8->setText(Utility::formatNumber((unsigned char)currBytes[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->txtRef1->setText(Utility::formatNumber((unsigned char)refBytes[0])); + ui->txtRef2->setText(Utility::formatNumber((unsigned char)refBytes[1])); + ui->txtRef3->setText(Utility::formatNumber((unsigned char)refBytes[2])); + ui->txtRef4->setText(Utility::formatNumber((unsigned char)refBytes[3])); + ui->txtRef5->setText(Utility::formatNumber((unsigned char)refBytes[4])); + ui->txtRef6->setText(Utility::formatNumber((unsigned char)refBytes[5])); + ui->txtRef7->setText(Utility::formatNumber((unsigned char)refBytes[6])); + ui->txtRef8->setText(Utility::formatNumber((unsigned char)refBytes[7])); ui->flowView->setReference(refBytes, false); ui->flowView->updateData(currBytes, true); @@ -782,7 +782,7 @@ void FlowViewWindow::updatePosition(bool forward) playbackTimer->stop(); } - memcpy(currBytes, frameCache.at(currentPosition).payload().data(), 8); + memcpy(currBytes, frameCache.at(currentPosition).payload().constData(), 8); if (ui->cbSync->checkState() == Qt::Checked) emit sendCenterTimeID(frameCache[currentPosition].frameId(), frameCache[currentPosition].timeStamp().microSeconds() / 1000000.0); } diff --git a/re/isotp_interpreterwindow.cpp b/re/isotp_interpreterwindow.cpp index f18eafd..50ff657 100644 --- a/re/isotp_interpreterwindow.cpp +++ b/re/isotp_interpreterwindow.cpp @@ -2,6 +2,7 @@ #include "ui_isotp_interpreterwindow.h" #include "mainwindow.h" #include "helpwindow.h" +#include "filterutility.h" ISOTP_InterpreterWindow::ISOTP_InterpreterWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -136,7 +137,7 @@ void ISOTP_InterpreterWindow::listFilterItemChanged(QListWidgetItem *item) { if (item) { - int id = item->text().toInt(nullptr, 16); + int id = FilterUtility::getIdAsInt(item); bool state = item->checkState(); //qDebug() << id << "*" << state; idFilters[id] = state; @@ -240,22 +241,6 @@ void ISOTP_InterpreterWindow::newUDSMessage(UDS_MESSAGE msg) buildText = ui->txtFrameDetails->toPlainText(); - /* - buildText.append("UDS Message:\n"); - if (msg.isErrorReply) - { - buildText.append("Error reply for service " + udsDecoder->getServiceShortDesc(msg.service)); - buildText.append("\nError Desc: " + udsDecoder->getNegativeResponseShort(msg.subFunc)); - } - else - { - if (msg.service < 0x3F || (msg.service > 0x7F && msg.service < 0xAF)) - buildText.append("Request for service " + udsDecoder->getServiceShortDesc(msg.service) + " Sub Func: " + QString::number(msg.subFunc)); - else - buildText.append("Response on service " + udsDecoder->getServiceShortDesc(msg.service - 0x40) + " Sub Func: " + QString::number(msg.subFunc)); - }*/ - - //Much more detailed analysis than the code above. You'll like it. buildText.append(udsDecoder->getDetailedMessageAnalysis(msg)); ui->txtFrameDetails->setPlainText(buildText); @@ -275,9 +260,7 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg) { idFilters.insert(msg.frameId(), true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.frameId(), msg.hasExtendedFrameFormat()), ui->listFilter); - listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag - listItem->setCheckState(Qt::Checked); + FilterUtility::createCheckableFilterItem(msg.frameId(), true, ui->listFilter); } if (!idFilters[msg.frameId()]) return; messages.append(msg); @@ -303,5 +286,3 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg) } ui->tableIsoFrames->setItem(rowNum, 5, new QTableWidgetItem(tempString)); } - - diff --git a/re/rangestatewindow.cpp b/re/rangestatewindow.cpp index 30ccd44..498ff20 100644 --- a/re/rangestatewindow.cpp +++ b/re/rangestatewindow.cpp @@ -3,6 +3,7 @@ #include "mainwindow.h" #include "utility.h" #include "helpwindow.h" +#include "filterutility.h" RangeStateWindow::RangeStateWindow(const QVector *frames, QWidget *parent) : QDialog(parent), @@ -68,7 +69,7 @@ RangeStateWindow::RangeStateWindow(const QVector *frames, QWidget *par [=](QListWidgetItem *item) { bool isChecked = false; - int id = Utility::ParseStringToNum(item->text()); + int id = FilterUtility::getIdAsInt(item); if (item->checkState() == Qt::Checked) isChecked = true; idFilters[id] = isChecked; }); @@ -161,9 +162,7 @@ void RangeStateWindow::updatedFrames(int numFrames) if (!idFilters.contains(thisFrame.frameId())) { idFilters.insert(thisFrame.frameId(), true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(thisFrame.frameId(), thisFrame.hasExtendedFrameFormat()), ui->listFilter); - listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag - listItem->setCheckState(Qt::Checked); //default all filters to be set active + FilterUtility::createCheckableFilterItem(thisFrame.frameId(), true, ui->listFilter); } } } @@ -182,11 +181,7 @@ void RangeStateWindow::refreshFilterList() if (!idFilters.contains(id)) { idFilters.insert(id, true); - QListWidgetItem* listItem; - if (id < 0x800) listItem = new QListWidgetItem(Utility::formatCANID(id, false), ui->listFilter); - else listItem = new QListWidgetItem(Utility::formatCANID(id, true), ui->listFilter); - listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag - listItem->setCheckState(Qt::Checked); //default all filters to be set active + FilterUtility::createCheckableFilterItem(id, true, ui->listFilter); } } diff --git a/scriptcontainer.cpp b/scriptcontainer.cpp index 30969be..e877944 100644 --- a/scriptcontainer.cpp +++ b/scriptcontainer.cpp @@ -306,9 +306,10 @@ void ISOTPScriptHelper::setFilter(QJSValue id, QJSValue mask, QJSValue bus) void ISOTPScriptHelper::sendISOTP(QJSValue bus, QJSValue id, QJSValue length, QJSValue dataBytes) { ISOTP_MESSAGE msg; + QByteArray dataArray; msg.setExtendedFrameFormat(false); msg.setFrameId(id.toUInt()); - msg.payload().resize(length.toInt()); + dataArray.resize(length.toInt()); int dataLen = msg.payload().length(); @@ -316,8 +317,9 @@ void ISOTPScriptHelper::sendISOTP(QJSValue bus, QJSValue id, QJSValue length, QJ for (int i = 0; i < dataLen; i++) { - msg.payload()[i] = static_cast(dataBytes.property(i).toInt()); + dataArray[i] = static_cast(dataBytes.property(i).toInt()); } + msg.setPayload(dataArray); msg.bus = bus.toInt(); @@ -379,9 +381,10 @@ void UDSScriptHelper::setFilter(QJSValue id, QJSValue mask, QJSValue bus) void UDSScriptHelper::sendUDS(QJSValue bus, QJSValue id, QJSValue service, QJSValue sublen, QJSValue subFunc, QJSValue length, QJSValue data) { UDS_MESSAGE msg; + QByteArray dataArray; msg.setExtendedFrameFormat(false); msg.setFrameId( id.toUInt() ); - msg.payload().resize(length.toUInt()); + dataArray.resize(length.toUInt()); msg.service = service.toUInt(); msg.subFuncLen = sublen.toUInt(); msg.subFunc = subFunc.toUInt(); @@ -390,8 +393,9 @@ void UDSScriptHelper::sendUDS(QJSValue bus, QJSValue id, QJSValue service, QJSVa for (int i = 0; i < msg.payload().length(); i++) { - msg.payload().append(static_cast(data.property(static_cast(i)).toInt())); + dataArray[i] = (static_cast(data.property(static_cast(i)).toInt())); } + msg.setPayload(dataArray); msg.bus = bus.toInt();