Various fixes to issues caused by recent transition to QCanBusFrame
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user