Many fixes to the IsoTP Viewer and UDS internal code.

This commit is contained in:
Collin Kidder
2020-04-02 19:53:35 -04:00
parent 27b5d156b7
commit 43979a6d58
4 changed files with 93 additions and 19 deletions
+20 -9
View File
@@ -7,6 +7,7 @@ ISOTP_HANDLER::ISOTP_HANDLER()
isReceiving = false; isReceiving = false;
issueFlowMsgs = false; issueFlowMsgs = false;
processAll = false; processAll = false;
sendPartialMessages = false;
lastSenderBus = 0; lastSenderBus = 0;
lastSenderID = 0; lastSenderID = 0;
@@ -106,9 +107,11 @@ void ISOTP_HANDLER::updatedFrames(int numFrames)
{ {
if (numFrames == -1) //all frames deleted. Kill the display if (numFrames == -1) //all frames deleted. Kill the display
{ {
messageBuffer.clear();
} }
else if (numFrames == -2) //all new set of frames. Reset else if (numFrames == -2) //all new set of frames. Reset
{ {
messageBuffer.clear();
for (int i = 0; i < modelFrames->length(); i++) processFrame(modelFrames->at(i)); for (int i = 0; i < modelFrames->length(); i++) processFrame(modelFrames->at(i));
} }
else //just got some new frames. See if they are relevant. else //just got some new frames. See if they are relevant.
@@ -125,7 +128,7 @@ void ISOTP_HANDLER::rapidFrames(const CANConnection* conn, const QVector<CANFram
Q_UNUSED(conn) Q_UNUSED(conn)
if (pFrames.length() <= 0) return; if (pFrames.length() <= 0) return;
//qDebug() << "received messages in ISOTP handler"; qDebug() << "received " << QString::number(pFrames.count()) << " messages in ISOTP handler";
foreach(const CANFrame& thisFrame, pFrames) foreach(const CANFrame& thisFrame, pFrames)
{ {
@@ -158,7 +161,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
ISOTP_MESSAGE *pMsg; ISOTP_MESSAGE *pMsg;
QByteArray dataBytes; QByteArray dataBytes;
const unsigned char *data = reinterpret_cast<const unsigned char *>(frame.payload().constData()); const unsigned char *data = reinterpret_cast<const unsigned char *>(frame.payload().constData());
qDebug() << frame.payload().count(); //qDebug() << frame.payload().count();
//int dataLen = frame.payload().count(); //int dataLen = frame.payload().count();
frameType = 0; frameType = 0;
@@ -196,17 +199,19 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
msg.setTimeStamp(frame.timeStamp()); msg.setTimeStamp(frame.timeStamp());
msg.isMultiframe = false; msg.isMultiframe = false;
if (useExtendedAddressing) if (useExtendedAddressing)
{ {
for (int j = 0; j < frameLen; j++) for (int j = 0; j < frameLen; j++)
{ {
dataBytes.append(data[j+2]); if (frame.payload().count() > (j+2))
dataBytes.append(data[j+2]);
} }
} }
else else
{ {
for (int j = 0; j < frameLen; j++) for (int j = 0; j < frameLen; j++)
{ {
dataBytes.append(data[j+1]); if (frame.payload().count() > (j+1))
dataBytes.append(data[j+1]);
} }
} }
qDebug() << "Emitting single frame ISOTP message"; qDebug() << "Emitting single frame ISOTP message";
@@ -216,6 +221,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
case 1: //first frame of a multi-frame message case 1: //first frame of a multi-frame message
checkNeedFlush(ID); checkNeedFlush(ID);
msg.bus = frame.bus; msg.bus = frame.bus;
if (frame.payload().count() < 8) return; //MUST have all 8 data bytes in this first frame.
msg.setExtendedFrameFormat( frame.hasExtendedFrameFormat() ); msg.setExtendedFrameFormat( frame.hasExtendedFrameFormat() );
msg.setFrameId(ID); msg.setFrameId(ID);
msg.setTimeStamp(frame.timeStamp()); msg.setTimeStamp(frame.timeStamp());
@@ -323,12 +329,17 @@ void ISOTP_HANDLER::checkNeedFlush(uint64_t ID)
if (msg->reportedLength <= msg->payload().count()) if (msg->reportedLength <= msg->payload().count())
{ {
qDebug() << "Flushing full frame" << QString::number(msg->frameId(), 16) << " " << msg->reportedLength << " " << msg->payload().count(); qDebug() << "Flushing full frame" << QString::number(msg->frameId(), 16) << " " << msg->reportedLength << " " << msg->payload().count();
if (msg->reportedLength > 0) emit newISOMessage(*msg);
} }
else else
{ {
qDebug() << "Flushing a partial frame " << QString::number(msg->frameId(), 16) << " " << msg->reportedLength << " " << msg->payload().count(); if (sendPartialMessages)
} {
if (msg->reportedLength > 0) emit newISOMessage(*msg); qDebug() << "Flushing a partial frame " << QString::number(msg->frameId(), 16) << " " << msg->reportedLength << " " << msg->payload().count();
if (msg->reportedLength > 0) emit newISOMessage(*msg);
}
else qDebug() << "Have a partial message but sending of such is disabled. Throwing it away";
}
messageBuffer.remove(ID); messageBuffer.remove(ID);
} }
} }
@@ -389,4 +400,4 @@ void ISOTP_HANDLER::clearAllFilters()
filters.clear(); filters.clear();
} }
void setEmitPartials(bool mode);
+2
View File
@@ -19,6 +19,7 @@ public:
~ISOTP_HANDLER(); ~ISOTP_HANDLER();
void setExtendedAddressing(bool mode); void setExtendedAddressing(bool mode);
void setReception(bool mode); //set whether to accept and forward frames or not void setReception(bool mode); //set whether to accept and forward frames or not
void setEmitPartials(bool mode);
void sendISOTPFrame(int bus, int ID, QByteArray data); void sendISOTPFrame(int bus, int ID, QByteArray data);
void setProcessAll(bool state); void setProcessAll(bool state);
void setFlowCtrl(bool state); void setFlowCtrl(bool state);
@@ -45,6 +46,7 @@ private:
int framesUntilFlow; int framesUntilFlow;
bool processAll; bool processAll;
bool issueFlowMsgs; bool issueFlowMsgs;
bool sendPartialMessages;
QTimer frameTimer; QTimer frameTimer;
uint32_t lastSenderID; uint32_t lastSenderID;
uint32_t lastSenderBus; uint32_t lastSenderBus;
+68 -8
View File
@@ -33,6 +33,14 @@ static QVector<CODE_STRUCT> UDS_ROUTINE_SUB = {
{3,"GET_ROUTINE_RESULTS", "Get results from routine specified by ID"}, {3,"GET_ROUTINE_RESULTS", "Get results from routine specified by ID"},
}; };
static QVector<CODE_STRUCT> UDS_FILE_MODEOFOP = {
{1, "ADDFILE", "Add file to file system"},
{2, "DELETEFILE", "Add file to file system"},
{3, "REPLACEFILE", "Add file to file system"},
{4, "READFILE", "Add file to file system"},
{5, "READDIR", "Add file to file system"}
};
static QVector<CODE_STRUCT> UDS_SERVICE_DESC = { static QVector<CODE_STRUCT> UDS_SERVICE_DESC = {
{1, "OBDII_SHOW_CURRENT", "OBDII - Show current data"}, {1, "OBDII_SHOW_CURRENT", "OBDII - Show current data"},
{2, "OBDII_SHOW_FREEZE", "OBDII - Show freeze data"}, {2, "OBDII_SHOW_FREEZE", "OBDII - Show freeze data"},
@@ -328,6 +336,7 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
QString buildString; QString buildString;
int dataSize; int dataSize;
int addrSize; int addrSize;
int compType, encType;
const unsigned char *data = reinterpret_cast<const unsigned char *>(msg.payload().constData()); const unsigned char *data = reinterpret_cast<const unsigned char *>(msg.payload().constData());
int dataLen = msg.payload().length(); int dataLen = msg.payload().length();
@@ -480,20 +489,36 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
buildString.append(Utility::formatHexNum(data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
break; break;
case UDS_SERVICES::WRITE_BY_ID: case UDS_SERVICES::WRITE_BY_ID:
if (dataLen > 3)
{
int writeID = (data[1] * 256 + data[2]);
buildString.append("ID to write to: " + Utility::formatHexNum(writeID) + "\nPayload: ");
for (int i = 3; i < dataLen; i++)
{
buildString.append(Utility::formatHexNum(data[i]) + " ");
}
}
break;
case UDS_SERVICES::WRITE_BY_ID + 0x40:
if (dataLen > 2)
{
int writeID = (data[1] * 256 + data[2]);
buildString.append("ID written to: " + Utility::formatHexNum(writeID));
}
break; break;
case UDS_SERVICES::ROUTINE_CTRL: case UDS_SERVICES::ROUTINE_CTRL:
buildString.append("Routine Control: " + getLongDesc(UDS_ROUTINE_SUB, msg.subFunc)); buildString.append("Routine Control: " + getLongDesc(UDS_ROUTINE_SUB, msg.subFunc));
if (dataLen > 3) if (dataLen > 3)
{ {
int routineID; int routineID;
routineID = (data[2] * 256 + data[3]); routineID = (data[1] * 256 + data[2]);
buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID)); buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID));
} }
if (dataLen > 4) if (dataLen > 4)
{ {
buildString.append("\nParameter bytes to routine: "); buildString.append("\nParameter bytes to routine: ");
for (int i = 4; i < dataLen; i++) for (int i = 3; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
@@ -501,28 +526,63 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
break; break;
case UDS_SERVICES::ROUTINE_CTRL + 0x40: case UDS_SERVICES::ROUTINE_CTRL + 0x40:
buildString.append("Routine Control: " + getLongDesc(UDS_ROUTINE_SUB, msg.subFunc)); buildString.append("Routine Control: " + getLongDesc(UDS_ROUTINE_SUB, msg.subFunc));
if (dataLen > 3) if (dataLen > 2)
{ {
int routineID; int routineID;
routineID = (data[2] * 256 + data[3]); routineID = (data[1] * 256 + data[2]);
buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID)); buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID));
} }
if (dataLen > 4) if (dataLen > 3)
{ {
buildString.append("\nBytes returned by routine: "); buildString.append("\nBytes returned by routine: ");
for (int i = 4; i < dataLen; i++) for (int i = 3; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
} }
break; break;
case UDS_SERVICES::REQUEST_DOWNLOAD: case UDS_SERVICES::REQUEST_DOWNLOAD:
break;
case UDS_SERVICES::REQUEST_UPLOAD: case UDS_SERVICES::REQUEST_UPLOAD:
compType = data[1] >> 4;
encType = data[1] & 0xF;
buildString.append("Compression Type: " + QString(compType) + "\n");
buildString.append("Encryption Type: " + QString(encType) + "\n");
//subfunc byte specifies address and length format, then address, then size
dataSize = data[2] >> 4;
addrSize = data[2] & 0xF;
if (dataLen > (dataSize + addrSize))
{
buildString.append("Address: 0x");
for (int i = 0; i < addrSize; i++) buildString.append(QString::number(data[3 + i], 16).toUpper().rightJustified(2,'0'));
buildString.append("\nSize: 0x");
for (int i = 0; i < dataSize; i++) buildString.append(QString::number(data[3 + i + addrSize], 16).toUpper().rightJustified(2,'0'));
}
else
{
buildString.append("Message has insufficient bytes to properly decode address and size!");
}
break;
case UDS_SERVICES::REQUEST_DOWNLOAD + 0x40:
case UDS_SERVICES::REQUEST_UPLOAD + 0x40:
dataSize = data[1] >> 4;
buildString.append("\nMax Size of data block: 0x");
for (int i = 0; i < dataSize; i++) buildString.append(QString::number(data[2 + i], 16).toUpper().rightJustified(2,'0'));
break; break;
case UDS_SERVICES::TRANSFER_DATA: case UDS_SERVICES::TRANSFER_DATA:
case UDS_SERVICES::TRANSFER_DATA + 0x40:
buildString.append("\nBlock Sequence: " + QString(data[1]) + "\nPayload: ");
for (int i = 2; i < dataLen; i++)
{
buildString.append(Utility::formatHexNum(data[i]) + " ");
}
break; break;
case UDS_SERVICES::REQ_TRANS_EXIT: case UDS_SERVICES::REQ_TRANS_EXIT:
case UDS_SERVICES::REQ_TRANS_EXIT + 0x40:
buildString.append("\nPayload: ");
for (int i = 1; i < dataLen; i++)
{
buildString.append(Utility::formatHexNum(data[i]) + " ");
}
break; break;
case UDS_SERVICES::REQ_FILE_TRANS: case UDS_SERVICES::REQ_FILE_TRANS:
break; break;
+3 -2
View File
@@ -73,7 +73,8 @@ void ISOTP_InterpreterWindow::showEvent(QShowEvent* event)
qApp->processEvents(); qApp->processEvents();
decoder->rapidFrames(nullptr, *modelFrames); decoder->updatedFrames(-2);
//decoder->rapidFrames(nullptr, *modelFrames);
progress.cancel(); progress.cancel();
@@ -130,7 +131,7 @@ void ISOTP_InterpreterWindow::writeSettings()
void ISOTP_InterpreterWindow::interpretCapturedFrames() void ISOTP_InterpreterWindow::interpretCapturedFrames()
{ {
clearList(); clearList();
decoder->rapidFrames(nullptr, *modelFrames); decoder->updatedFrames(-2);
} }
void ISOTP_InterpreterWindow::listFilterItemChanged(QListWidgetItem *item) void ISOTP_InterpreterWindow::listFilterItemChanged(QListWidgetItem *item)