Various fixes to issues caused by recent transition to QCanBusFrame

This commit is contained in:
Collin Kidder
2020-02-18 21:31:18 -05:00
parent 3b41b9579c
commit 367c072b45
8 changed files with 73 additions and 70 deletions
+25 -9
View File
@@ -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<const unsigned char *>(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;
}
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -3201,7 +3201,7 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector<CANFrame>* frames)
QByteArray bytes(tokens[3].at(1) - '0', 0);
for (int c = 0; c < thisFrame.payload().length(); c++)
{
bytes[c] = static_cast<char>(tokens[4 + c].toInt(nullptr, 16));
if ((4 + c) < tokens.size()) bytes[c] = static_cast<char>(tokens[4 + c].toInt(nullptr, 16));
}
thisFrame.setPayload(bytes);
}
+10 -3
View File
@@ -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)
{
@@ -865,7 +868,8 @@ 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].payload().resize(tempVal);
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);
+19 -19
View File
@@ -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);
}
+3 -22
View File
@@ -2,6 +2,7 @@
#include "ui_isotp_interpreterwindow.h"
#include "mainwindow.h"
#include "helpwindow.h"
#include "filterutility.h"
ISOTP_InterpreterWindow::ISOTP_InterpreterWindow(const QVector<CANFrame> *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));
}
+4 -9
View File
@@ -3,6 +3,7 @@
#include "mainwindow.h"
#include "utility.h"
#include "helpwindow.h"
#include "filterutility.h"
RangeStateWindow::RangeStateWindow(const QVector<CANFrame> *frames, QWidget *parent) :
QDialog(parent),
@@ -68,7 +69,7 @@ RangeStateWindow::RangeStateWindow(const QVector<CANFrame> *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);
}
}
+8 -4
View File
@@ -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<int8_t>(dataBytes.property(i).toInt());
dataArray[i] = static_cast<int8_t>(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<uint8_t>(data.property(static_cast<quint32>(i)).toInt()));
dataArray[i] = (static_cast<uint8_t>(data.property(static_cast<quint32>(i)).toInt()));
}
msg.setPayload(dataArray);
msg.bus = bus.toInt();