Converted more code to be easier to generalize to larger CAN payloads

for CAN-FD. Improved some code to be faster. Fixed up some compile
time warnings.
This commit is contained in:
Collin Kidder
2019-12-15 15:02:06 -05:00
parent ef24036d1c
commit 8beb0e31a0
28 changed files with 589 additions and 435 deletions
+3 -1
View File
@@ -78,7 +78,7 @@ bool BLFHandler::loadBLF(QString filename, QVector<CANFrame>* frames)
} }
qDebug() << "Uncompressed size: " << uncompressedData.count(); qDebug() << "Uncompressed size: " << uncompressedData.count();
pos = 0; pos = 0;
bool foundHeader = false; //bool foundHeader = false;
//first skip forward to find a header signature - usually not necessary //first skip forward to find a header signature - usually not necessary
while ( (int)(pos + sizeof(BLF_OBJ_HEADER)) < uncompressedData.count()) while ( (int)(pos + sizeof(BLF_OBJ_HEADER)) < uncompressedData.count())
{ {
@@ -163,5 +163,7 @@ bool BLFHandler::loadBLF(QString filename, QVector<CANFrame>* frames)
bool BLFHandler::saveBLF(QString filename, QVector<CANFrame> *frames) bool BLFHandler::saveBLF(QString filename, QVector<CANFrame> *frames)
{ {
Q_UNUSED(filename)
Q_UNUSED(frames)
return false; return false;
} }
+39 -37
View File
@@ -47,7 +47,7 @@ void ISOTP_HANDLER::setReception(bool mode)
} }
} }
void ISOTP_HANDLER::sendISOTPFrame(int bus, int ID, QVector<unsigned char> data) void ISOTP_HANDLER::sendISOTPFrame(int bus, int ID, QByteArray data)
{ {
CANFrame frame; CANFrame frame;
frame.setFrameType(QCanBusFrame::DataFrame); frame.setFrameType(QCanBusFrame::DataFrame);
@@ -159,6 +159,8 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
//int offset; //int offset;
ISOTP_MESSAGE msg; ISOTP_MESSAGE msg;
ISOTP_MESSAGE *pMsg; ISOTP_MESSAGE *pMsg;
unsigned char *data = reinterpret_cast<unsigned char *>(frame.payload().data());
//int dataLen = frame.payload().count();
frameType = 0; frameType = 0;
frameLen = 0; frameLen = 0;
@@ -166,14 +168,14 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
if (useExtendedAddressing) if (useExtendedAddressing)
{ {
ID = ID << 8; ID = ID << 8;
ID += frame.payload()[0]; ID += data[0];
frameType = frame.payload()[1] >> 4; frameType = data[1] >> 4;
frameLen = frame.payload()[1] & 0xF; frameLen = data[1] & 0xF;
} }
else else
{ {
frameType = frame.payload()[0] >> 4; frameType = data[0] >> 4;
frameLen = frame.payload()[0] & 0xF; frameLen = data[0] & 0xF;
} }
switch(frameType) switch(frameType)
@@ -186,42 +188,42 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
if (frameLen > 7) return; if (frameLen > 7) return;
msg.bus = frame.bus; msg.bus = frame.bus;
msg.extended = frame.hasExtendedFrameFormat(); msg.setExtendedFrameFormat( frame.hasExtendedFrameFormat() );
msg.ID = ID; msg.setFrameId(ID);
msg.isReceived = frame.isReceived; msg.isReceived = frame.isReceived;
msg.len = frameLen; msg.payload().reserve(frameLen);
msg.data.reserve(frameLen); msg.reportedLength = frameLen;
msg.timestamp = frame.timeStamp().microSeconds(); msg.setTimeStamp(frame.timeStamp());
msg.isMultiframe = false; msg.isMultiframe = false;
if (useExtendedAddressing) for (int j = 0; j < frameLen; j++) msg.data.append(frame.payload()[j+2]); 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.data.append(frame.payload()[j+1]); else for (int j = 0; j < frameLen; j++) msg.payload().append(frame.payload()[j+1]);
//qDebug() << "Emitting single frame ISOTP message"; //qDebug() << "Emitting single frame ISOTP message";
emit newISOMessage(msg); emit newISOMessage(msg);
break; break;
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;
msg.extended = frame.hasExtendedFrameFormat(); msg.setExtendedFrameFormat( frame.hasExtendedFrameFormat() );
msg.ID = ID; msg.setFrameId(ID);
msg.timestamp = frame.timeStamp().microSeconds(); msg.setTimeStamp(frame.timeStamp());
msg.isReceived = frame.isReceived; msg.isReceived = frame.isReceived;
msg.isMultiframe = true; msg.isMultiframe = true;
frameLen = frameLen << 8; frameLen = frameLen << 8;
if (useExtendedAddressing) if (useExtendedAddressing)
{ {
frameLen += frame.payload()[2]; frameLen += data[2];
frameLen = frameLen & 0xFFF; frameLen = frameLen & 0xFFF;
msg.len = frameLen; msg.payload().reserve(frameLen);
msg.data.reserve(frameLen); msg.reportedLength = frameLen;
for (int j = 0; j < 5; j++) msg.data.append(frame.payload()[3 + j]); for (int j = 0; j < 5; j++) msg.payload().append(frame.payload()[3 + j]);
} }
else else
{ {
frameLen += frame.payload()[1]; frameLen += data[1];
frameLen = frameLen & 0xFFF; frameLen = frameLen & 0xFFF;
msg.len = frameLen; msg.payload().reserve(frameLen);
msg.data.reserve(frameLen); msg.reportedLength = frameLen;
for (int j = 0; j < 6; j++) msg.data.append(frame.payload()[2 + j]); for (int j = 0; j < 6; j++) msg.payload().append(frame.payload()[2 + j]);
} }
msg.lastSequence = -1; msg.lastSequence = -1;
messageBuffer.append(msg); messageBuffer.append(msg);
@@ -245,7 +247,7 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
pMsg = nullptr; pMsg = nullptr;
for (int i = 0; i < messageBuffer.length(); i++) for (int i = 0; i < messageBuffer.length(); i++)
{ {
if (messageBuffer[i].ID == ID) if (messageBuffer[i].frameId() == ID)
{ {
pMsg = &messageBuffer[i]; pMsg = &messageBuffer[i];
break; break;
@@ -253,22 +255,22 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
} }
if (!pMsg) return; if (!pMsg) return;
if (!pMsg->isMultiframe) return; //if we didn't get a frame type 1 (start of multiframe) first then ignore this frame. if (!pMsg->isMultiframe) return; //if we didn't get a frame type 1 (start of multiframe) first then ignore this frame.
ln = pMsg->len - pMsg->data.count(); ln = pMsg->payload().length() - pMsg->payload().count();
//offset = pMsg->data.count(); //offset = pMsg->data.count();
if (useExtendedAddressing) if (useExtendedAddressing)
{ {
if (ln > 6) ln = 6; if (ln > 6) ln = 6;
for (int j = 0; j < ln; j++) pMsg->data.append(frame.payload()[j+2]); for (int j = 0; j < ln; j++) pMsg->payload().append(frame.payload()[j+2]);
} }
else else
{ {
if (ln > 7) ln = 7; if (ln > 7) ln = 7;
for (int j = 0; j < ln; j++) pMsg->data.append(frame.payload()[j+1]); for (int j = 0; j < ln; j++) pMsg->payload().append(frame.payload()[j+1]);
} }
if (pMsg->len <= pMsg->data.count()) if (pMsg->reportedLength <= pMsg->payload().count())
{ {
//qDebug() << "Emitting multiframe ISOTP message"; //qDebug() << "Emitting multiframe ISOTP message";
checkNeedFlush(pMsg->ID); checkNeedFlush(pMsg->frameId());
} }
break; break;
case 3: //flow control messages case 3: //flow control messages
@@ -277,10 +279,10 @@ void ISOTP_HANDLER::processFrame(const CANFrame &frame)
case 0: //continue to send frames but maybe change inter-frame delay case 0: //continue to send frames but maybe change inter-frame delay
waitingForFlow = false; waitingForFlow = false;
//data[1] contains number of frames to send before waiting for next flow control //data[1] contains number of frames to send before waiting for next flow control
framesUntilFlow = frame.payload()[1]; framesUntilFlow = data[1];
if (framesUntilFlow == 0) framesUntilFlow = -1; //-1 means don't count frames and just keep going if (framesUntilFlow == 0) framesUntilFlow = -1; //-1 means don't count frames and just keep going
//data[2] contains the interframe delay to use (0xF1 through 0xF9 are special through) //data[2] contains the interframe delay to use (0xF1 through 0xF9 are special through)
if (frame.payload()[2] < (char)0xF1) frameTimer.start(frame.payload()[2]); //set proper delay between frames if (data[2] < 0xF1) frameTimer.start(data[2]); //set proper delay between frames
else frameTimer.start(1); //can't do sub-millisecond sending with this code so just use 1ms timing else frameTimer.start(1); //can't do sub-millisecond sending with this code so just use 1ms timing
break; break;
case 1: //wait - do not send any more frames until other side says so case 1: //wait - do not send any more frames until other side says so
@@ -303,18 +305,18 @@ void ISOTP_HANDLER::checkNeedFlush(uint64_t ID)
{ {
for (int i = 0; i < messageBuffer.length(); i++) for (int i = 0; i < messageBuffer.length(); i++)
{ {
if (messageBuffer[i].ID == ID) if (messageBuffer[i].frameId() == ID)
{ {
//used to pass by reference but now newISOMessage should pass by value which makes it easier to use cross thread //used to pass by reference but now newISOMessage should pass by value which makes it easier to use cross thread
if (messageBuffer[i].ID > 0x600 && messageBuffer[i].ID < 0x630) if (messageBuffer[i].frameId() > 0x600 && messageBuffer[i].frameId() < 0x630)
{ {
if (messageBuffer[i].len <= messageBuffer[i].data.count()) if (messageBuffer[i].reportedLength <= messageBuffer[i].payload().count())
{ {
qDebug() << "Flushing full frame" << QString::number(messageBuffer[i].ID, 16) << " " << messageBuffer[i].len << " " << messageBuffer[i].data.count(); qDebug() << "Flushing full frame" << QString::number(messageBuffer[i].frameId(), 16) << " " << messageBuffer[i].reportedLength << " " << messageBuffer[i].payload().count();
} }
else else
{ {
qDebug() << "Flushing a partial frame " << QString::number(messageBuffer[i].ID, 16) << " " << messageBuffer[i].len << " " << messageBuffer[i].data.count(); qDebug() << "Flushing a partial frame " << QString::number(messageBuffer[i].frameId(), 16) << " " << messageBuffer[i].reportedLength << " " << messageBuffer[i].payload().count();
} }
} }
emit newISOMessage(messageBuffer[i]); emit newISOMessage(messageBuffer[i]);
+1 -1
View File
@@ -19,7 +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 sendISOTPFrame(int bus, int ID, QVector<unsigned char> 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);
void addFilter(uint32_t pBusId, uint32_t ID, uint32_t mask); void addFilter(uint32_t pBusId, uint32_t ID, uint32_t mask);
+5 -10
View File
@@ -3,21 +3,16 @@
#include <Qt> #include <Qt>
#include <QVector> #include <QVector>
#include <can_structs.h>
//the same as the CANFrame struct but with arbitrary data size. //Now a child class of CANFrame. We just add the ability to track how long it was supposed to be and other
class ISOTP_MESSAGE //ISOTP related details. But, mostly just CANFrame.
class ISOTP_MESSAGE : public CANFrame
{ {
public: public:
uint32_t ID; int reportedLength;
int bus;
bool extended;
bool isReceived;
int len; //# of bytes this message should have (as reported)
int actualSize; //# we actually got
int lastSequence; int lastSequence;
bool isMultiframe; bool isMultiframe;
QVector<unsigned char> data;
uint64_t timestamp;
}; };
#endif // ISOTP_MESSAGE_H #endif // ISOTP_MESSAGE_H
+56 -55
View File
@@ -158,7 +158,6 @@ UDS_MESSAGE::UDS_MESSAGE()
subFunc = 0; subFunc = 0;
service = 0; service = 0;
subFuncLen = 1; subFuncLen = 1;
extended = false;
isErrorReply = false; isErrorReply = false;
} }
@@ -178,39 +177,39 @@ UDS_HANDLER::~UDS_HANDLER()
void UDS_HANDLER::gotISOTPFrame(ISOTP_MESSAGE msg) void UDS_HANDLER::gotISOTPFrame(ISOTP_MESSAGE msg)
{ {
qDebug() << "UDS handler got ISOTP frame"; qDebug() << "UDS handler got ISOTP frame";
unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().count();
UDS_MESSAGE udsMsg; UDS_MESSAGE udsMsg;
udsMsg.bus = msg.bus; udsMsg.bus = msg.bus;
udsMsg.extended = msg.extended; udsMsg.setExtendedFrameFormat(msg.hasExtendedFrameFormat());
udsMsg.ID = msg.ID; udsMsg.setFrameId(msg.frameId());
udsMsg.isReceived = msg.isReceived; udsMsg.isReceived = msg.isReceived;
udsMsg.timestamp = msg.timestamp; udsMsg.setTimeStamp(msg.timeStamp());
udsMsg.actualSize = msg.actualSize; udsMsg.reportedLength = msg.reportedLength;
udsMsg.service = 0; udsMsg.service = 0;
udsMsg.subFunc = 0; udsMsg.subFunc = 0;
udsMsg.subFuncLen = 0; udsMsg.subFuncLen = 0;
udsMsg.isErrorReply = false; udsMsg.isErrorReply = false;
udsMsg.len = msg.len; udsMsg.setPayload(msg.payload());
if (msg.data.length() > 0) { if (dataLen > 0) {
udsMsg.service = msg.data.at(0); udsMsg.service = data[0];
if (udsMsg.service == 0x7F) if (udsMsg.service == 0x7F)
{ {
udsMsg.isErrorReply = true; udsMsg.isErrorReply = true;
if (msg.data.length() > 1) if (dataLen > 1)
{ {
udsMsg.service = msg.data.at(1); udsMsg.service = data[1];
if (msg.data.length() > 2) udsMsg.subFunc = msg.data.at(2); if (dataLen > 2) udsMsg.subFunc = data[2];
else return; else return;
} }
else return; else return;
udsMsg.data = msg.data.mid(2, -1); //don't copy error byte nor service byte udsMsg.payload().remove(0, 2);
udsMsg.len -= 2; //and remove those bytes from the length reported too.
} }
else else
{ {
udsMsg.isErrorReply = false; udsMsg.isErrorReply = false;
if (msg.data.length() > 1) udsMsg.subFunc = msg.data.at(1); if (dataLen > 1) udsMsg.subFunc = data[1];
udsMsg.data = msg.data.mid(1, -1); //don't copy service byte udsMsg.payload().remove(0, 1);
udsMsg.len -= 1; //and remove service byte from length too.
} }
} }
else return; else return;
@@ -245,7 +244,7 @@ void UDS_HANDLER::setReception(bool mode)
void UDS_HANDLER::sendUDSFrame(const UDS_MESSAGE &msg) void UDS_HANDLER::sendUDSFrame(const UDS_MESSAGE &msg)
{ {
QVector<unsigned char> data; QByteArray data;
if (msg.bus < 0) return; if (msg.bus < 0) return;
if (msg.bus >= CANConManager::getInstance()->getNumBuses()) return; if (msg.bus >= CANConManager::getInstance()->getNumBuses()) return;
if (msg.service > 0xFF) return; if (msg.service > 0xFF) return;
@@ -256,8 +255,8 @@ void UDS_HANDLER::sendUDSFrame(const UDS_MESSAGE &msg)
data.append((msg.subFunc >> (8 * b)) & 0xFF); data.append((msg.subFunc >> (8 * b)) & 0xFF);
} }
data.append(msg.data); data.append(msg.payload());
isoHandler->sendISOTPFrame(msg.bus, msg.ID, data); isoHandler->sendISOTPFrame(msg.bus, msg.frameId(), data);
qDebug() << "Sent UDS service: " << getServiceShortDesc(msg.service) << " on bus " << msg.bus; qDebug() << "Sent UDS service: " << getServiceShortDesc(msg.service) << " on bus " << msg.bus;
} }
@@ -328,6 +327,8 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
bool isResponse = true; bool isResponse = true;
int dataSize; int dataSize;
int addrSize; int addrSize;
unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
if (msg.isErrorReply) if (msg.isErrorReply)
{ {
@@ -363,15 +364,15 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
case UDS_SERVICES::DIAG_CONTROL + 0x40: //positive response case UDS_SERVICES::DIAG_CONTROL + 0x40: //positive response
buildString.append("Session Request: " + getLongDesc(UDS_DIAG_CTRL_SUB, msg.subFunc)); buildString.append("Session Request: " + getLongDesc(UDS_DIAG_CTRL_SUB, msg.subFunc));
//there should be four extra bytes now //there should be four extra bytes now
if (msg.data.length() < 5) //5 because subfunc codes are left in data so it starts with one subfunc byte if (dataLen < 5) //5 because subfunc codes are left in data so it starts with one subfunc byte
{ {
//buildString.append("\nReturned data payload wasn't at least \n4 bytes like it should have been"); //buildString.append("\nReturned data payload wasn't at least \n4 bytes like it should have been");
} }
else else
{ {
int p2 = msg.data[1] * 256 + msg.data[2]; int p2 = data[1] * 256 + data[2];
buildString.append("\nP2MAX (Max Wait / Resp Time): " + QString::number(p2) + "ms"); buildString.append("\nP2MAX (Max Wait / Resp Time): " + QString::number(p2) + "ms");
p2 = (msg.data[3] * 256 + msg.data[4]) * 10; p2 = (data[3] * 256 + data[4]) * 10;
buildString.append("\nP2 Ext MAX: " + QString::number(p2) + "ms"); buildString.append("\nP2 Ext MAX: " + QString::number(p2) + "ms");
} }
break; break;
@@ -382,11 +383,11 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
case UDS_SERVICES::ECU_RESET + 0x40: case UDS_SERVICES::ECU_RESET + 0x40:
buildString.append("Reset Type: " + getLongDesc(UDS_ECU_RESET_SUB, msg.subFunc)); buildString.append("Reset Type: " + getLongDesc(UDS_ECU_RESET_SUB, msg.subFunc));
//There should be one additional byte which encodes power down time //There should be one additional byte which encodes power down time
if (msg.data.length() > 1) if (dataLen > 1)
{ {
if (msg.data[1] < 0xFF) if (data[1] < 0xFF)
{ {
buildString.append("\nMinimum powered down time: " + QString::number(msg.data[1])); buildString.append("\nMinimum powered down time: " + QString::number(data[1]));
} }
else buildString.append("\nPowerdown time not available"); else buildString.append("\nPowerdown time not available");
} }
@@ -395,11 +396,11 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
case UDS_SERVICES::COMM_CTRL: case UDS_SERVICES::COMM_CTRL:
//Comm control has potentially a lot of parameters. control type, comm type, nodeID //Comm control has potentially a lot of parameters. control type, comm type, nodeID
buildString.append("Control type: " + getLongDesc(UDS_COMM_CTRL_SUB, msg.subFunc)); buildString.append("Control type: " + getLongDesc(UDS_COMM_CTRL_SUB, msg.subFunc));
if (msg.data.length() > 1) if (dataLen > 1)
buildString.append("\nComm Type: " + QString::number(msg.data[1])); //TODO: no attempt to interpret yet buildString.append("\nComm Type: " + QString::number(data[1])); //TODO: no attempt to interpret yet
if (msg.data.length() > 3) if (dataLen > 3)
{ {
int nodeID = (msg.data[2] * 256 + msg.data[3]); int nodeID = (data[2] * 256 + data[3]);
buildString.append("\nNode ID: " + Utility::formatHexNum(nodeID)); buildString.append("\nNode ID: " + Utility::formatHexNum(nodeID));
} }
break; break;
@@ -407,19 +408,19 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
if ((msg.subFunc % 2) == 1) if ((msg.subFunc % 2) == 1)
{ {
buildString.append("Seed request for security level: " + QString::number(msg.subFunc) + "\n"); buildString.append("Seed request for security level: " + QString::number(msg.subFunc) + "\n");
if (msg.data.length()> 1) if (dataLen > 1)
{ {
buildString.append("Data payload: "); buildString.append("Data payload: ");
for (int j = 1; j < msg.data.length(); j++) buildString.append(Utility::formatHexNum(msg.data[j]) + " "); for (int j = 1; j < dataLen; j++) buildString.append(Utility::formatHexNum(data[j]) + " ");
} }
} }
else else
{ {
buildString.append("Key sending for security level: " + QString::number(msg.subFunc - 1)); buildString.append("Key sending for security level: " + QString::number(msg.subFunc - 1));
if (msg.data.length()> 1) //and it sure as hell should be! if (dataLen > 1) //and it sure as hell should be!
{ {
buildString.append("KEY: "); buildString.append("KEY: ");
for (int j = 1; j < msg.data.length(); j++) buildString.append(Utility::formatHexNum(msg.data[j]) + " "); for (int j = 1; j < dataLen; j++) buildString.append(Utility::formatHexNum(data[j]) + " ");
} }
} }
break; break;
@@ -427,10 +428,10 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
if ((msg.subFunc % 2) == 1) if ((msg.subFunc % 2) == 1)
{ {
buildString.append("Seed response for security level: " + QString::number(msg.subFunc) + "\n"); buildString.append("Seed response for security level: " + QString::number(msg.subFunc) + "\n");
if (msg.data.length()> 1) //be kinda pointless if it weren't if (dataLen > 1) //be kinda pointless if it weren't
{ {
buildString.append("SEED: "); buildString.append("SEED: ");
for (int j = 1; j < msg.data.length(); j++) buildString.append(Utility::formatHexNum(msg.data[j]) + " "); for (int j = 1; j < dataLen; j++) buildString.append(Utility::formatHexNum(data[j]) + " ");
} }
} }
else else
@@ -441,33 +442,33 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
break; break;
case UDS_SERVICES::READ_BY_ID: case UDS_SERVICES::READ_BY_ID:
//parameter is groups of two bytes, each of which specify an ID to read //parameter is groups of two bytes, each of which specify an ID to read
if (msg.data.length() > 2) if (dataLen > 2)
{ {
uint32_t id; uint32_t id;
for (int i = 1; i < msg.data.length(); i = i + 2) for (int i = 1; i < dataLen; i = i + 2)
{ {
id = (msg.data[i] * 256) + msg.data[i+1]; id = (data[i] * 256) + data[i+1];
buildString.append("\nID to read: " + Utility::formatHexNum(id)); buildString.append("\nID to read: " + Utility::formatHexNum(id));
} }
} }
break; break;
case UDS_SERVICES::READ_BY_ID + 0x40: //reply case UDS_SERVICES::READ_BY_ID + 0x40: //reply
buildString.append("Reply is non-standard and so no decoding is done. The format is (ID) followed by how ever much data that ID returns, followed by more ID/data pairs if applicable.\nPayload: "); buildString.append("Reply is non-standard and so no decoding is done. The format is (ID) followed by how ever much data that ID returns, followed by more ID/data pairs if applicable.\nPayload: ");
for (int i = 1; i < msg.data.length(); i++) for (int i = 1; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(msg.data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
break; break;
case UDS_SERVICES::READ_BY_ADDR: case UDS_SERVICES::READ_BY_ADDR:
//subfunc byte specifies address and length format, then address, then size //subfunc byte specifies address and length format, then address, then size
dataSize = msg.subFunc >> 4; dataSize = msg.subFunc >> 4;
addrSize = msg.subFunc & 0xF; addrSize = msg.subFunc & 0xF;
if (msg.data.length() > (dataSize + addrSize)) if (dataLen > (dataSize + addrSize))
{ {
buildString.append("Address: 0x"); buildString.append("Address: 0x");
for (int i = 0; i < addrSize; i++) buildString.append(QString::number(msg.data[1+i], 16).toUpper().rightJustified(2,'0')); for (int i = 0; i < addrSize; i++) buildString.append(QString::number(data[1+i], 16).toUpper().rightJustified(2,'0'));
buildString.append("\nSize: 0x"); buildString.append("\nSize: 0x");
for (int i = 0; i < dataSize; i++) buildString.append(QString::number(msg.data[1+i+addrSize], 16).toUpper().rightJustified(2,'0')); for (int i = 0; i < dataSize; i++) buildString.append(QString::number(data[1+i+addrSize], 16).toUpper().rightJustified(2,'0'));
} }
else else
{ {
@@ -476,44 +477,44 @@ QString UDS_HANDLER::getDetailedMessageAnalysis(const UDS_MESSAGE &msg)
break; break;
case UDS_SERVICES::READ_BY_ADDR + 0x40: case UDS_SERVICES::READ_BY_ADDR + 0x40:
buildString.append("Reply is a raw packet of data of the size requested.\nPayload: "); buildString.append("Reply is a raw packet of data of the size requested.\nPayload: ");
for (int i = 1; i < msg.data.length(); i++) for (int i = 1; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(msg.data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
break; break;
case UDS_SERVICES::WRITE_BY_ID: case UDS_SERVICES::WRITE_BY_ID:
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 (msg.data.length() > 2) if (dataLen > 2)
{ {
int routineID; int routineID;
routineID = (msg.data[1] * 256 + msg.data[2]); routineID = (data[1] * 256 + data[2]);
buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID)); buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID));
} }
if (msg.data.length() > 3) if (dataLen > 3)
{ {
buildString.append("\nParameter bytes to routine: "); buildString.append("\nParameter bytes to routine: ");
for (int i = 4; i < msg.data.length(); i++) for (int i = 4; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(msg.data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
} }
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 (msg.data.length() > 2) if (dataLen > 2)
{ {
int routineID; int routineID;
routineID = (msg.data[1] * 256 + msg.data[2]); routineID = (data[1] * 256 + data[2]);
buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID)); buildString.append("\nRoutine ID: " + Utility::formatHexNum(routineID));
} }
if (msg.data.length() > 3) if (dataLen > 3)
{ {
buildString.append("\nBytes returned by routine: "); buildString.append("\nBytes returned by routine: ");
for (int i = 4; i < msg.data.length(); i++) for (int i = 4; i < dataLen; i++)
{ {
buildString.append(Utility::formatHexNum(msg.data[i]) + " "); buildString.append(Utility::formatHexNum(data[i]) + " ");
} }
} }
break; break;
+15 -16
View File
@@ -347,7 +347,6 @@ void CANFrameModel::recalcOverwrite()
QVariant CANFrameModel::data(const QModelIndex &index, int role) const QVariant CANFrameModel::data(const QModelIndex &index, int role) const
{ {
int dLen;
QString tempString; QString tempString;
CANFrame thisFrame; CANFrame thisFrame;
static bool rowFlip = false; static bool rowFlip = false;
@@ -361,6 +360,9 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
thisFrame = filteredFrames.at(index.row()); thisFrame = filteredFrames.at(index.row());
unsigned char *data = reinterpret_cast<unsigned char *>(thisFrame.payload().data());
int dataLen = thisFrame.payload().count();
if (role == Qt::BackgroundColorRole) if (role == Qt::BackgroundColorRole)
{ {
if (dbcHandler != nullptr && interpretFrames) if (dbcHandler != nullptr && interpretFrames)
@@ -422,7 +424,7 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
case Column::Bus: case Column::Bus:
return QString::number(thisFrame.bus); return QString::number(thisFrame.bus);
case Column::Length: case Column::Length:
return QString::number(thisFrame.payload().length()); return QString::number(dataLen);
case Column::ASCII: case Column::ASCII:
if (thisFrame.frameId() >= 0x7FFFFFF0ull) if (thisFrame.frameId() >= 0x7FFFFFF0ull)
{ {
@@ -430,32 +432,29 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
tempString.append(QString::number(thisFrame.frameId() & 0x7)); tempString.append(QString::number(thisFrame.frameId() & 0x7));
return tempString; return tempString;
} }
dLen = thisFrame.payload().length(); if (thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) {
if (!thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) { if (dataLen < 0) dataLen = 0;
if (dLen < 0) dLen = 0; //if (dLen > 8) dLen = 8;
if (dLen > 8) dLen = 8; for (int i = 0; i < dataLen; i++)
for (int i = 0; i < dLen; i++)
{ {
quint8 byt = thisFrame.payload()[i]; char byt = thisFrame.payload()[i];
//0x20 through 0x7E are printable characters. Outside of that range they aren't. So use dots instead //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 < 0x20) byt = 0x2E; //dot character
if (byt > 0x7E) byt = 0x2E; if (byt > 0x7E) byt = 0x2E;
tempString.append(QString::fromUtf8((char *)&byt, 1)); tempString.append(QString::fromUtf8(&byt, 1));
} }
} }
return tempString; return tempString;
case Column::Data: case Column::Data:
dLen = thisFrame.payload().length(); if (dataLen < 0) dataLen = 0;
if (dLen < 0) dLen = 0;
if (dLen > 8) dLen = 8;
//if (useHexMode) tempString.append("0x "); //if (useHexMode) tempString.append("0x ");
if (thisFrame.frameType() == QCanBusFrame::RemoteRequestFrame) { if (thisFrame.frameType() == QCanBusFrame::RemoteRequestFrame) {
return tempString; return tempString;
} }
for (int i = 0; i < dLen; i++) for (int i = 0; i < dataLen; i++)
{ {
if (useHexMode) tempString.append( QString::number((unsigned char)thisFrame.payload()[i], 16).toUpper().rightJustified(2, '0')); if (useHexMode) tempString.append( QString::number(data[i], 16).toUpper().rightJustified(2, '0'));
else tempString.append(QString::number(thisFrame.payload()[i], 10)); else tempString.append(QString::number(data[i], 10));
tempString.append(" "); tempString.append(" ");
} }
//now, if we're supposed to interpret the data and the DBC handler is loaded then use it //now, if we're supposed to interpret the data and the DBC handler is loaded then use it
@@ -740,7 +739,7 @@ void CANFrameModel::insertFrames(const QVector<CANFrame> &newFrames)
int CANFrameModel::getIndexFromTimeID(unsigned int ID, double timestamp) int CANFrameModel::getIndexFromTimeID(unsigned int ID, double timestamp)
{ {
int bestIndex = -1; int bestIndex = -1;
uint64_t intTimeStamp = timestamp * 1000000l; int64_t intTimeStamp = static_cast<int64_t> (timestamp * 1000000l);
for (int i = 0; i < frames.count(); i++) for (int i = 0; i < frames.count(); i++)
{ {
if ((frames[i].frameId() == ID)) if ((frames[i].frameId() == ID))
+1 -1
View File
@@ -88,7 +88,7 @@ private:
bool timeSeconds; bool timeSeconds;
bool useSystemTime; bool useSystemTime;
bool needFilterRefresh; bool needFilterRefresh;
uint64_t timeOffset; int64_t timeOffset;
int lastUpdateNumFrames; int lastUpdateNumFrames;
uint32_t preallocSize; uint32_t preallocSize;
bool sortDirAsc; bool sortDirAsc;
+4 -2
View File
@@ -70,10 +70,10 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const
//qDebug() << "Row: " << index.row(); //qDebug() << "Row: " << index.row();
CANConnection *conn_p = getAtIdx(index.row()); CANConnection *conn_p = getAtIdx(index.row());
bool ret;
if (!conn_p) return QVariant(); if (!conn_p) return QVariant();
bool isSocketCAN = (conn_p->getType() == CANCon::SERIALBUS) ? true: false; //bool isSocketCAN = (conn_p->getType() == CANCon::SERIALBUS) ? true: false;
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
@@ -147,6 +147,8 @@ CANConnection* CANConnectionModel::getAtIdx(int pIdx) const
void CANConnectionModel::refresh(int pIndex) void CANConnectionModel::refresh(int pIndex)
{ {
Q_UNUSED(pIndex)
beginResetModel(); beginResetModel();
endResetModel(); endResetModel();
/* /*
+3 -3
View File
@@ -312,8 +312,8 @@ void ConnectionWindow::populateBusDetails(int offset)
} }
else else
{ {
bool ret; //bool ret;
int numBuses; //int numBuses;
CANConnection* conn_p = connModel->getAtIdx(selIdx); CANConnection* conn_p = connModel->getAtIdx(selIdx);
CANBus bus; CANBus bus;
@@ -365,7 +365,7 @@ void ConnectionWindow::currentRowChanged(const QModelIndex &current, const QMode
} }
else else
{ {
bool ret; //bool ret;
ui->groupBus->setEnabled(true); ui->groupBus->setEnabled(true);
int numBuses; int numBuses;
+30 -30
View File
@@ -192,14 +192,14 @@ void GVRetSerial::piSetBusSettings(int pBusIdx, CANBus bus)
sendDebug("Got signal to update bauds. 1: " + QString::number((can0Baud & 0xFFFFFFF)) + " 2: " + QString::number((can1Baud & 0xFFFFFFF))); sendDebug("Got signal to update bauds. 1: " + QString::number((can0Baud & 0xFFFFFFF)) + " 2: " + QString::number((can1Baud & 0xFFFFFFF)));
buffer[0] = (char)0xF1; //start of a command over serial buffer[0] = (char)0xF1; //start of a command over serial
buffer[1] = 5; //setup canbus buffer[1] = 5; //setup canbus
buffer[2] = (unsigned char)(can0Baud & 0xFF); //four bytes of ID LSB first buffer[2] = (char)(can0Baud & 0xFF); //four bytes of ID LSB first
buffer[3] = (unsigned char)(can0Baud >> 8); buffer[3] = (char)(can0Baud >> 8);
buffer[4] = (unsigned char)(can0Baud >> 16); buffer[4] = (char)(can0Baud >> 16);
buffer[5] = (unsigned char)(can0Baud >> 24); buffer[5] = (char)(can0Baud >> 24);
buffer[6] = (unsigned char)(can1Baud & 0xFF); //four bytes of ID LSB first buffer[6] = (char)(can1Baud & 0xFF); //four bytes of ID LSB first
buffer[7] = (unsigned char)(can1Baud >> 8); buffer[7] = (char)(can1Baud >> 8);
buffer[8] = (unsigned char)(can1Baud >> 16); buffer[8] = (char)(can1Baud >> 16);
buffer[9] = (unsigned char)(can1Baud >> 24); buffer[9] = (char)(can1Baud >> 24);
buffer[10] = 0; buffer[10] = 0;
sendToSerial(buffer); sendToSerial(buffer);
} }
@@ -210,18 +210,18 @@ void GVRetSerial::piSetBusSettings(int pBusIdx, CANBus bus)
sendDebug("Got signal to update extended bus speeds SWCAN: " + QString::number(swcanBaud) + " LIN1: " + QString::number(lin1Baud) + " LIN2: " + QString::number(lin2Baud)); sendDebug("Got signal to update extended bus speeds SWCAN: " + QString::number(swcanBaud) + " LIN1: " + QString::number(lin1Baud) + " LIN2: " + QString::number(lin2Baud));
buffer[0] = (char)0xF1; //start of a command over serial buffer[0] = (char)0xF1; //start of a command over serial
buffer[1] = 14; //setup extended buses buffer[1] = 14; //setup extended buses
buffer[2] = (unsigned char)(swcanBaud & 0xFF); //four bytes of ID LSB first buffer[2] = (char)(swcanBaud & 0xFF); //four bytes of ID LSB first
buffer[3] = (unsigned char)(swcanBaud >> 8); buffer[3] = (char)(swcanBaud >> 8);
buffer[4] = (unsigned char)(swcanBaud >> 16); buffer[4] = (char)(swcanBaud >> 16);
buffer[5] = (unsigned char)(swcanBaud >> 24); buffer[5] = (char)(swcanBaud >> 24);
buffer[6] = (unsigned char)(lin1Baud & 0xFF); //four bytes of ID LSB first buffer[6] = (char)(lin1Baud & 0xFF); //four bytes of ID LSB first
buffer[7] = (unsigned char)(lin1Baud >> 8); buffer[7] = (char)(lin1Baud >> 8);
buffer[8] = (unsigned char)(lin1Baud >> 16); buffer[8] = (char)(lin1Baud >> 16);
buffer[9] = (unsigned char)(lin1Baud >> 24); buffer[9] = (char)(lin1Baud >> 24);
buffer[10] = (unsigned char)(lin2Baud & 0xFF); //four bytes of ID LSB first buffer[10] = (char)(lin2Baud & 0xFF); //four bytes of ID LSB first
buffer[11] = (unsigned char)(lin2Baud >> 8); buffer[11] = (char)(lin2Baud >> 8);
buffer[12] = (unsigned char)(lin2Baud >> 16); buffer[12] = (char)(lin2Baud >> 16);
buffer[13] = (unsigned char)(lin2Baud >> 24); buffer[13] = (char)(lin2Baud >> 24);
buffer[14] = 0; buffer[14] = 0;
sendToSerial(buffer); sendToSerial(buffer);
} }
@@ -231,8 +231,8 @@ void GVRetSerial::piSetBusSettings(int pBusIdx, CANBus bus)
bool GVRetSerial::piSendFrame(const CANFrame& frame) bool GVRetSerial::piSendFrame(const CANFrame& frame)
{ {
QByteArray buffer; QByteArray buffer;
unsigned int c; int c;
int ID; quint32 ID;
//qDebug() << "Sending out GVRET frame with id " << frame.ID << " on bus " << frame.bus; //qDebug() << "Sending out GVRET frame with id " << frame.ID << " on bus " << frame.bus;
@@ -250,16 +250,16 @@ bool GVRetSerial::piSendFrame(const CANFrame& frame)
return true; return true;
} }
ID = frame.frameId(); ID = frame.frameId();
if (frame.hasExtendedFrameFormat()) ID |= 1 << 31; if (frame.hasExtendedFrameFormat()) ID |= 1u << 31;
buffer[0] = (unsigned char)0xF1; //start of a command over serial buffer[0] = (char)0xF1; //start of a command over serial
buffer[1] = 0; //command ID for sending a CANBUS frame buffer[1] = 0; //command ID for sending a CANBUS frame
buffer[2] = (unsigned char)(ID & 0xFF); //four bytes of ID LSB first buffer[2] = (char)(ID & 0xFF); //four bytes of ID LSB first
buffer[3] = (unsigned char)(ID >> 8); buffer[3] = (char)(ID >> 8);
buffer[4] = (unsigned char)(ID >> 16); buffer[4] = (char)(ID >> 16);
buffer[5] = (unsigned char)(ID >> 24); buffer[5] = (char)(ID >> 24);
buffer[6] = (unsigned char)((frame.bus) & 3); buffer[6] = (char)((frame.bus) & 3);
buffer[7] = (unsigned char)frame.payload().length(); buffer[7] = (char)frame.payload().length();
for (c = 0; c < frame.payload().length(); c++) for (c = 0; c < frame.payload().length(); c++)
{ {
buffer[8 + c] = frame.payload()[c]; buffer[8 + c] = frame.payload()[c];
+1 -1
View File
@@ -47,7 +47,7 @@ bool DBC_SIGNAL::processAsText(const CANFrame &frame, QString &outString, bool o
QString buildString; QString buildString;
int startByte = startBit / 8; int startByte = startBit / 8;
int bytes = signalSize / 8; int bytes = signalSize / 8;
for (int x = 0; x < bytes; x++) buildString.append((char)frame.payload()[startByte + x]); for (int x = 0; x < bytes; x++) buildString.append(frame.payload().data()[startByte + x]);
outString = buildString; outString = buildString;
cachedValue = outString; cachedValue = outString;
return true; return true;
+6 -6
View File
@@ -22,22 +22,22 @@ QString FilterUtility::getId( QListWidgetItem * item )
return getId(item->text()); return getId(item->text());
} }
uint32_t FilterUtility::getGMLanArbitrationId(uint32_t id) uint32_t FilterUtility::getGMLanArbitrationId(int32_t id)
{ {
return (id >> 13) & 0x1FFF; return (id >> 13) & 0x1FFF;
} }
uint32_t FilterUtility::getGMLanPriorityBits(uint32_t id) uint32_t FilterUtility::getGMLanPriorityBits(int32_t id)
{ {
return (id >> 26) & 0x7; return (id >> 26) & 0x7;
} }
uint32_t FilterUtility::getGMLanSenderId(uint32_t id) uint32_t FilterUtility::getGMLanSenderId(int32_t id)
{ {
return id & 0x1FFF; return id & 0x1FFF;
} }
QListWidgetItem * FilterUtility::createCheckableFilterItem(uint32_t id, bool checked, QListWidget* parent) QListWidgetItem * FilterUtility::createCheckableFilterItem(int32_t id, bool checked, QListWidget* parent)
{ {
QListWidgetItem * thisItem = createFilterItem(id,parent); QListWidgetItem * thisItem = createFilterItem(id,parent);
thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable);
@@ -48,7 +48,7 @@ QListWidgetItem * FilterUtility::createCheckableFilterItem(uint32_t id, bool che
return thisItem; return thisItem;
} }
QListWidgetItem * FilterUtility::createFilterItem(uint32_t id, QListWidget* parent) QListWidgetItem * FilterUtility::createFilterItem(int32_t id, QListWidget* parent)
{ {
QSettings settings; QSettings settings;
DBCHandler * dbcHandler = DBCHandler::getReference(); DBCHandler * dbcHandler = DBCHandler::getReference();
@@ -77,4 +77,4 @@ QListWidgetItem * FilterUtility::createFilterItem(uint32_t id, QListWidget* pare
thisItem->setText(filterItemName); thisItem->setText(filterItemName);
return thisItem; return thisItem;
} }
+6 -6
View File
@@ -8,16 +8,16 @@ class FilterUtility
{ {
public: public:
static QListWidgetItem * createFilterItem(uint32_t id, QListWidget* parent=NULL); // if parent is given, add item automatically to listwidget static QListWidgetItem * createFilterItem(int32_t id, QListWidget* parent=NULL); // if parent is given, add item automatically to listwidget
static QListWidgetItem * createCheckableFilterItem(uint32_t id, bool checked, QListWidget* parent=NULL); static QListWidgetItem * createCheckableFilterItem(int32_t id, bool checked, QListWidget* parent=NULL);
static uint32_t getIdAsInt( QListWidgetItem * item ); static uint32_t getIdAsInt( QListWidgetItem * item );
static QString getId( QListWidgetItem * item ); static QString getId( QListWidgetItem * item );
static QString getId( QString itemText ); static QString getId( QString itemText );
static uint32_t getGMLanArbitrationId(uint32_t id); static uint32_t getGMLanArbitrationId(int32_t id);
static uint32_t getGMLanSenderId(uint32_t id); static uint32_t getGMLanSenderId(int32_t id);
static uint32_t getGMLanPriorityBits(uint32_t id); static uint32_t getGMLanPriorityBits(int32_t id);
}; };
#endif // DBCLOADSAVEWINDOW_H #endif // DBCLOADSAVEWINDOW_H
+10 -7
View File
@@ -77,17 +77,20 @@ void FirmwareUploaderWindow::updatedFrames(int numFrames)
void FirmwareUploaderWindow::gotTargettedFrame(CANFrame frame) void FirmwareUploaderWindow::gotTargettedFrame(CANFrame frame)
{ {
unsigned char *data = reinterpret_cast<unsigned char *>(frame.payload().data());
int dataLen = frame.payload().count();
qDebug() << "FUW: Got targetted frame with id " << frame.frameId(); qDebug() << "FUW: Got targetted frame with id " << frame.frameId();
if (frame.frameId() == (uint32_t)(baseAddress + 0x10)) { if (frame.frameId() == (uint32_t)(baseAddress + 0x10) && (dataLen == 8) ) {
qDebug() << "Start firmware reply"; qDebug() << "Start firmware reply";
if (((char)frame.payload()[0] == (char)0xAD) && ((char)frame.payload()[1] == (char)0xDE)) if ((data[0] == 0xAD) && (data[1] == 0xDE))
{ {
if (((char)frame.payload()[2] == (char)0xAF) && ((char)frame.payload()[3] == (char)0xDE)) if ((data[2] == 0xAF) && (data[3] == 0xDE))
{ {
qDebug() << "There's dead beef here"; qDebug() << "There's dead beef here";
if (((char)frame.payload()[4] == (char)(token & 0xFF)) && ((char)frame.payload()[5] == (char)((token >> 8) & 0xFF))) if ( (data[4] == (token & 0xFF)) && (data[5] == ((token >> 8) & 0xFF) ) )
{ {
if (((char)frame.payload()[6] == (char)((token >> 16) & 0xFF)) && ((char)frame.payload()[7] == (char)((token >> 24) & 0xFF))) if ((data[6] == ((token >> 16) & 0xFF)) && (data[7] == ((token >> 24) & 0xFF)))
{ {
qDebug() << "starting firmware process"; qDebug() << "starting firmware process";
//MainWindow::getReference()->setTargettedID(baseAddress + 0x20); //MainWindow::getReference()->setTargettedID(baseAddress + 0x20);
@@ -101,7 +104,7 @@ void FirmwareUploaderWindow::gotTargettedFrame(CANFrame frame)
if (frame.frameId() == (uint32_t)(baseAddress + 0x20)) { if (frame.frameId() == (uint32_t)(baseAddress + 0x20)) {
qDebug() << "Firmware reception success reply"; qDebug() << "Firmware reception success reply";
int seq = frame.payload()[0] + (256 * frame.payload()[1]); int seq = data[0] + (256 * data[1]);
if (seq == currentSendingPosition) if (seq == currentSendingPosition)
{ {
currentSendingPosition++; currentSendingPosition++;
@@ -143,7 +146,7 @@ void FirmwareUploaderWindow::sendFirmwareChunk()
output->payload()[3] = firmwareData[firmwareLocation++]; output->payload()[3] = firmwareData[firmwareLocation++];
output->payload()[4] = firmwareData[firmwareLocation++]; output->payload()[4] = firmwareData[firmwareLocation++];
output->payload()[5] = firmwareData[firmwareLocation++]; output->payload()[5] = firmwareData[firmwareLocation++];
for (int i = 0; i < 6; i++) xorByte = xorByte ^ output->payload()[i]; for (int i = 0; i < 6; i++) xorByte = xorByte ^ static_cast<unsigned char>(output->payload()[i]);
output->payload()[6] = xorByte; output->payload()[6] = xorByte;
output->setPayload(bytes); output->setPayload(bytes);
sendCANFrame(output); sendCANFrame(output);
+220 -121
View File
@@ -809,7 +809,7 @@ bool FrameFileIO::loadCANHackerFile(QString filename, QVector<CANFrame>* frames)
{ {
if (tokens[d + 3] != "") if (tokens[d + 3] != "")
{ {
bytes[d] = static_cast<unsigned char>(tokens[d + 3].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[d + 3].toInt(nullptr, 16));
} }
else bytes[d] = 0; else bytes[d] = 0;
} }
@@ -927,7 +927,7 @@ bool FrameFileIO::loadCANOpenFile(QString filename, QVector<CANFrame>* frames)
{ {
if (dataTok[d] != "") if (dataTok[d] != "")
{ {
bytes[d] = static_cast<unsigned char>(dataTok[d].simplified().toInt(nullptr, 16)); bytes[d] = static_cast<char>(dataTok[d].simplified().toInt(nullptr, 16));
} }
else bytes[d] = 0; else bytes[d] = 0;
} }
@@ -947,6 +947,10 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector<CANFrame>* frames
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
{ {
delete outFile; delete outFile;
@@ -966,24 +970,28 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector<CANFrame>* frames
lineCounter = 0; lineCounter = 0;
} }
outFile->write(QString::number(frames->at(c).timeStamp().microSeconds() / 1000000.0, 'f', 6).toUtf8()); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
outFile->write(QString::number(frame->timeStamp().microSeconds() / 1000000.0, 'f', 6).toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
outFile->write(QString::number(frames->at(c).bus + 1).toUtf8()); outFile->write(QString::number(frame->bus + 1).toUtf8());
if (frames->at(c).isReceived) outFile->putChar('R'); if (frame->isReceived) outFile->putChar('R');
else outFile->putChar('T'); else outFile->putChar('T');
if (frames->at(c).hasExtendedFrameFormat()) if (frame->hasExtendedFrameFormat())
{ {
outFile->write("29 "); outFile->write("29 ");
} }
else outFile->write("11 "); else outFile->write("11 ");
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
for (int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number(frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
} }
@@ -1136,7 +1144,7 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
{ {
if (tokens[d] != "") if (tokens[d] != "")
{ {
bytes[d] = static_cast<unsigned char>(tokens[d].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[d].toInt(nullptr, 16));
} }
else bytes[d] = 0; else bytes[d] = 0;
} }
@@ -1169,7 +1177,7 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
{ {
if (tokens[d] != "") if (tokens[d] != "")
{ {
bytes[d] = static_cast<unsigned char>(tokens[d].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[d].toInt(nullptr, 16));
} }
else bytes[d] = 0; else bytes[d] = 0;
} }
@@ -1313,7 +1321,7 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector<CANFrame>* frames)
{ {
if (tokens.count() > d) if (tokens.count() > d)
{ {
bytes[d - 6] = static_cast<unsigned char>(tokens[d].toInt(nullptr, 16)); bytes[d - 6] = static_cast<char>(tokens[d].toInt(nullptr, 16));
} }
else //expected byte wasn't there to read. Set it zero and set error flag else //expected byte wasn't there to read. Set it zero and set error flag
{ {
@@ -1336,7 +1344,12 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector<CANFrame>* fr
{ {
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
int lineCounter = 0; int lineCounter = 0;
uint64_t offsetTime = frames->at(0).timeStamp().microSeconds(); int64_t offsetTime = frames->at(0).timeStamp().microSeconds();
unsigned char *data;
int dataLen;
const CANFrame *frame;
for (int c = 0; c < frames->count(); c++) for (int c = 0; c < frames->count(); c++)
{ {
if (frames->at(c).timeStamp().microSeconds() < offsetTime) offsetTime = frames->at(c).timeStamp().microSeconds(); if (frames->at(c).timeStamp().microSeconds() < offsetTime) offsetTime = frames->at(c).timeStamp().microSeconds();
@@ -1369,24 +1382,28 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector<CANFrame>* fr
lineCounter = 0; lineCounter = 0;
} }
uint64_t timeStamp = (frames->at(c).timeStamp().microSeconds() - offsetTime) / 1000000ull; frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
uint64_t timeStamp = (frame->timeStamp().microSeconds() - offsetTime) / 1000000ull;
int tsLen = QString::number(timeStamp).length(); int tsLen = QString::number(timeStamp).length();
int precision = 6; int precision = 6;
//vector seems to keep 10 bytes at the start of the line for the timestamp. It should never exceed this //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 //and there should never be a precision over 6 digits after the decimal
if (tsLen > 3) precision = 9 - tsLen; if (tsLen > 3) precision = 9 - tsLen;
outFile->write(QString::number((frames->at(c).timeStamp().microSeconds() - offsetTime) / 1000000.0, 'f', precision).rightJustified(10, ' ').toUtf8()); outFile->write(QString::number((frame->timeStamp().microSeconds() - offsetTime) / 1000000.0, 'f', precision).rightJustified(10, ' ').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
outFile->write(QString::number(frames->at(c).bus + 1).toUtf8()); outFile->write(QString::number(frame->bus + 1).toUtf8());
outFile->write(" "); outFile->write(" ");
if (frames->at(c).hasExtendedFrameFormat()) if (frames->at(c).hasExtendedFrameFormat())
{ {
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
outFile->write("x"); outFile->write("x");
} }
else else
{ {
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(3, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(3, '0').toUtf8());
outFile->write(" "); outFile->write(" ");
} }
outFile->write(" "); outFile->write(" ");
@@ -1397,12 +1414,12 @@ bool FrameFileIO::saveCanalyzerASC(QString filename, const QVector<CANFrame>* fr
if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r "); if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r ");
else outFile->write("d "); else outFile->write("d ");
outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); outFile->write(QString::number(dataLen).toUtf8());
outFile->write(" "); outFile->write(" ");
for (int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->write(" "); outFile->write(" ");
} }
@@ -1563,7 +1580,7 @@ bool FrameFileIO::loadNativeCSVFile(QString filename, QVector<CANFrame>* frames)
QByteArray bytes(lng, 0); QByteArray bytes(lng, 0);
for (int c = 0; c < 8; c++) bytes[c] = 0; for (int c = 0; c < 8; c++) bytes[c] = 0;
for (int d = 0; d < thisFrame.payload().length(); d++) for (int d = 0; d < thisFrame.payload().length(); d++)
bytes[d] = static_cast<unsigned char>(tokens[5 + d].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[5 + d].toInt(nullptr, 16));
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
} }
else if (fileVersion == 2) else if (fileVersion == 2)
@@ -1578,7 +1595,7 @@ bool FrameFileIO::loadNativeCSVFile(QString filename, QVector<CANFrame>* frames)
QByteArray bytes(lng, 0); QByteArray bytes(lng, 0);
for (int c = 0; c < 8; c++) bytes[c] = 0; for (int c = 0; c < 8; c++) bytes[c] = 0;
for (int d = 0; d < thisFrame.payload().length(); d++) for (int d = 0; d < thisFrame.payload().length(); d++)
bytes[d] = static_cast<unsigned char>(tokens[6 + d].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[6 + d].toInt(nullptr, 16));
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
} }
@@ -1597,6 +1614,10 @@ bool FrameFileIO::saveNativeCSVFile(QString filename, const QVector<CANFrame>* f
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
{ {
delete outFile; delete outFile;
@@ -1615,28 +1636,32 @@ bool FrameFileIO::saveNativeCSVFile(QString filename, const QVector<CANFrame>* f
lineCounter = 0; lineCounter = 0;
} }
outFile->write(QString::number(frames->at(c).timeStamp().microSeconds()).toUtf8()); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
outFile->write(QString::number(frame->timeStamp().microSeconds()).toUtf8());
outFile->putChar(44); outFile->putChar(44);
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
outFile->putChar(44); outFile->putChar(44);
if (frames->at(c).hasExtendedFrameFormat()) outFile->write("true,"); if (frame->hasExtendedFrameFormat()) outFile->write("true,");
else outFile->write("false,"); else outFile->write("false,");
if (frames->at(c).isReceived) outFile->write("Rx,"); if (frame->isReceived) outFile->write("Rx,");
else outFile->write("Tx,"); else outFile->write("Tx,");
outFile->write(QString::number(frames->at(c).bus).toUtf8()); outFile->write(QString::number(frame->bus).toUtf8());
outFile->putChar(44); outFile->putChar(44);
outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); outFile->write(QString::number(dataLen).toUtf8());
outFile->putChar(44); outFile->putChar(44);
for (int temp = 0; temp < 8; temp++) for (int temp = 0; temp < 8; temp++)
{ {
if (temp < frames->at(c).payload().length()) if (temp < dataLen)
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
else else
outFile->write("00"); outFile->write("00");
outFile->putChar(44); outFile->putChar(44);
@@ -1694,32 +1719,41 @@ bool FrameFileIO::closeContinuousNative()
bool FrameFileIO::writeContinuousNative(const QVector<CANFrame>* frames, int beginningFrame) bool FrameFileIO::writeContinuousNative(const QVector<CANFrame>* frames, int beginningFrame)
{ {
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!continuousFile.isOpen()) return false; if (!continuousFile.isOpen()) return false;
qDebug() << "Bgn: " << beginningFrame << " Count: " << frames->count(); qDebug() << "Bgn: " << beginningFrame << " Count: " << frames->count();
for (int c = beginningFrame; c < frames->count(); c++) for (int c = beginningFrame; c < frames->count(); c++)
{ {
continuousFile.write(QString::number(frames->at(c).timeStamp().microSeconds()).toUtf8()); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
continuousFile.write(QString::number(frame->timeStamp().microSeconds()).toUtf8());
continuousFile.putChar(44); continuousFile.putChar(44);
continuousFile.write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); continuousFile.write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
continuousFile.putChar(44); continuousFile.putChar(44);
if (frames->at(c).hasExtendedFrameFormat()) continuousFile.write("true,"); if (frame->hasExtendedFrameFormat()) continuousFile.write("true,");
else continuousFile.write("false,"); else continuousFile.write("false,");
if (frames->at(c).isReceived) continuousFile.write("Rx,"); if (frame->isReceived) continuousFile.write("Rx,");
else continuousFile.write("Tx,"); else continuousFile.write("Tx,");
continuousFile.write(QString::number(frames->at(c).bus).toUtf8()); continuousFile.write(QString::number(frame->bus).toUtf8());
continuousFile.putChar(44); continuousFile.putChar(44);
continuousFile.write(QString::number(frames->at(c).payload().length()).toUtf8()); continuousFile.write(QString::number(dataLen).toUtf8());
continuousFile.putChar(44); continuousFile.putChar(44);
for (int temp = 0; temp < 8; temp++) for (int temp = 0; temp < 8; temp++)
{ {
if (temp < frames->at(c).payload().length()) if (temp < dataLen)
continuousFile.write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); continuousFile.write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
else else
continuousFile.write("00"); continuousFile.write("00");
continuousFile.putChar(44); continuousFile.putChar(44);
@@ -1829,7 +1863,7 @@ bool FrameFileIO::loadGenericCSVFile(QString filename, QVector<CANFrame>* frames
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
QList<QByteArray> dataTok = tokens[1].split(' '); QList<QByteArray> dataTok = tokens[1].split(' ');
QByteArray bytes(dataTok.length(), 0); QByteArray bytes(dataTok.length(), 0);
for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<unsigned char>(dataTok[d].toInt(nullptr, 16)); for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<char>(dataTok[d].toInt(nullptr, 16));
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
} }
@@ -1846,6 +1880,10 @@ bool FrameFileIO::saveGenericCSVFile(QString filename, const QVector<CANFrame>*
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
{ {
delete outFile; delete outFile;
@@ -1864,12 +1902,16 @@ bool FrameFileIO::saveGenericCSVFile(QString filename, const QVector<CANFrame>*
lineCounter = 0; lineCounter = 0;
} }
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
outFile->putChar(44); outFile->putChar(44);
for (int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
} }
@@ -2025,7 +2067,7 @@ bool FrameFileIO::loadLogFile(QString filename, QVector<CANFrame>* frames)
QByteArray bytes(lng, 0); QByteArray bytes(lng, 0);
if (thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) { if (thisFrame.frameType() != QCanBusFrame::RemoteRequestFrame) {
for (int d = 0; d < thisFrame.payload().length(); d++) for (int d = 0; d < thisFrame.payload().length(); d++)
bytes[d] = static_cast<unsigned char>(tokens[d + 6].toInt(nullptr, 16)); bytes[d] = static_cast<char>(tokens[d + 6].toInt(nullptr, 16));
} }
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
@@ -2044,6 +2086,10 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector<CANFrame>* frames)
QDateTime timestamp, tempStamp; QDateTime timestamp, tempStamp;
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
//timestamp = QDateTime::currentDateTime(); //timestamp = QDateTime::currentDateTime();
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
@@ -2077,28 +2123,32 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector<CANFrame>* frames)
lineCounter = 0; lineCounter = 0;
} }
tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timeStamp().microSeconds() / 1000); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
tempStamp = QDateTime::fromMSecsSinceEpoch(frame->timeStamp().microSeconds() / 1000);
outFile->write(tempStamp.toString("hh:mm:ss:zzz").toUtf8()); outFile->write(tempStamp.toString("hh:mm:ss:zzz").toUtf8());
if (frames->at(c).isReceived) outFile->write(" Rx "); if (frame->isReceived) outFile->write(" Rx ");
else outFile->write(" Tx "); else outFile->write(" Tx ");
// busmaster channel start at 1 // busmaster channel start at 1
outFile->write(QString::number(frames->at(c).bus+1).toUtf8() + " "); outFile->write(QString::number(frame->bus + 1).toUtf8() + " ");
outFile->write("0x"); outFile->write("0x");
if (frames->at(c).hasExtendedFrameFormat() && frames->at(c).frameId() > 0x7FF) { if (frame->hasExtendedFrameFormat() && frame->frameId() > 0x7FF) {
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8());
} else { } else {
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(3, '0').toUtf8()); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(3, '0').toUtf8());
} }
if (frames->at(c).hasExtendedFrameFormat()) outFile->write(" x"); if (frame->hasExtendedFrameFormat()) outFile->write(" x");
else outFile->write(" s"); else outFile->write(" s");
if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r "); if (frame->frameType() == QCanBusFrame::RemoteRequestFrame) outFile->write("r ");
else outFile->write(" "); else outFile->write(" ");
outFile->write(QString::number(frames->at(c).payload().length()).toUtf8() + " "); outFile->write(QString::number(dataLen).toUtf8() + " ");
if (frames->at(c).frameType() != QCanBusFrame::RemoteRequestFrame) { if (frame->frameType() != QCanBusFrame::RemoteRequestFrame) {
for (int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
} }
} }
@@ -2214,7 +2264,7 @@ bool FrameFileIO::loadIXXATFile(QString filename, QVector<CANFrame>* frames)
QStringList dataToks = Utility::unQuote(tokens[4]).simplified().split(' '); QStringList dataToks = Utility::unQuote(tokens[4]).simplified().split(' ');
QByteArray bytes(dataToks.length(), 0); QByteArray bytes(dataToks.length(), 0);
if (thisFrame.payload().length() > 8) return false; if (thisFrame.payload().length() > 8) return false;
for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<unsigned char>(dataToks[d].toInt(nullptr, 16)); for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<char>(dataToks[d].toInt(nullptr, 16));
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
} }
@@ -2232,6 +2282,10 @@ bool FrameFileIO::saveIXXATFile(QString filename, const QVector<CANFrame>* frame
QDateTime timestamp, tempStamp; QDateTime timestamp, tempStamp;
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
timestamp = QDateTime::currentDateTime(); timestamp = QDateTime::currentDateTime();
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
@@ -2257,17 +2311,22 @@ bool FrameFileIO::saveIXXATFile(QString filename, const QVector<CANFrame>* frame
qApp->processEvents(); qApp->processEvents();
lineCounter = 0; lineCounter = 0;
} }
tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timeStamp().microSeconds() / 1000);
frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
tempStamp = QDateTime::fromMSecsSinceEpoch(frame->timeStamp().microSeconds() / 1000);
outFile->write("\"" + tempStamp.toString("h:m:s.").toUtf8() + tempStamp.toString("z").rightJustified(3, '0').toUtf8() + "\""); outFile->write("\"" + tempStamp.toString("h:m:s.").toUtf8() + tempStamp.toString("z").rightJustified(3, '0').toUtf8() + "\"");
outFile->write(",\"" + QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\""); outFile->write(",\"" + QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\"");
if (frames->at(c).hasExtendedFrameFormat()) outFile->write(",\"Ext\""); if (frame->hasExtendedFrameFormat()) outFile->write(",\"Ext\"");
else outFile->write(",\"Std\""); else outFile->write(",\"Std\"");
outFile->write(",\"\",\""); outFile->write(",\"\",\"");
for (int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
} }
@@ -2334,7 +2393,7 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector<CANFrame>* frames)
int lineCounter = 0; int lineCounter = 0;
QByteArray data; QByteArray data;
int timeOffset = 0; int timeOffset = 0;
uint64_t lastTimeStamp = 0; int64_t lastTimeStamp = 0;
bool foundErrors = false; bool foundErrors = false;
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
@@ -2359,14 +2418,15 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector<CANFrame>* frames)
} }
data = inFile->read(12); data = inFile->read(12);
unsigned char *uData = reinterpret_cast<unsigned char *>(data.data());
thisFrame.bus = 0; thisFrame.bus = 0;
thisFrame.isReceived = true; thisFrame.isReceived = true;
thisFrame.setExtendedFrameFormat(false); //format is incapable of extended frames thisFrame.setExtendedFrameFormat(false); //format is incapable of extended frames
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
qint64 tempStamp; qint64 tempStamp;
tempStamp = 1000000ul * ((unsigned char)data[0] >> 2); tempStamp = 1000000ul * (uData[0] >> 2);
tempStamp += (((data[0] & 3) << 8) + (unsigned char)data[1]) * 1000; tempStamp += (((uData[0] & 3) << 8) + uData[1]) * 1000;
tempStamp += timeOffset; tempStamp += timeOffset;
if (tempStamp < lastTimeStamp) if (tempStamp < lastTimeStamp)
{ {
@@ -2374,12 +2434,12 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector<CANFrame>* frames)
} }
lastTimeStamp = tempStamp; lastTimeStamp = tempStamp;
thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, tempStamp)); thisFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, tempStamp));
thisFrame.setFrameId((((unsigned char)data[3] & 0x0F) * 256 + (unsigned char)data[2]) & 0x7FF); thisFrame.setFrameId(((uData[3] & 0x0F) * 256 + uData[2]) & 0x7FF);
QByteArray bytes((unsigned char)data[3] >> 4, 0); QByteArray bytes(uData[3] >> 4, 0);
if (thisFrame.payload().length() <= 8 && thisFrame.frameId() <= 0x7FF) if (thisFrame.payload().length() <= 8 && thisFrame.frameId() <= 0x7FF)
{ {
for (unsigned int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = (unsigned char)data[4 + d]; for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = data[4 + d];
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
} }
@@ -2397,7 +2457,12 @@ bool FrameFileIO::saveCANDOFile(QString filename, const QVector<CANFrame>* frame
int lineCounter = 0; int lineCounter = 0;
QByteArray data; QByteArray data;
CANFrame thisFrame; CANFrame thisFrame;
int ms, id; int id;
qint64 ms;
unsigned char *inData;
int inDataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly)) if (!outFile->open(QIODevice::WriteOnly))
{ {
@@ -2425,18 +2490,22 @@ bool FrameFileIO::saveCANDOFile(QString filename, const QVector<CANFrame>* frame
qApp->processEvents(); qApp->processEvents();
lineCounter = 0; lineCounter = 0;
} }
frame = &frames->at(c);
inData = reinterpret_cast<unsigned char *>(frame->payload().data());
inDataLen = frame->payload().count();
for (int j = 0; j < 8; j++) data[4 + j] = (char)0xFF; for (int j = 0; j < 8; j++) data[4 + j] = (char)0xFF;
thisFrame = frames->at(c); if (!frame->hasExtendedFrameFormat())
if (!thisFrame.hasExtendedFrameFormat())
{ {
ms = (thisFrame.timeStamp().microSeconds() / 1000); ms = (frame->timeStamp().microSeconds() / 1000);
id = thisFrame.frameId() & 0x7FF; id = frame->frameId() & 0x7FF;
data[0] = (((ms / 1000) % 60) << 2) + ((ms % 1000) >> 8); data[0] = (((ms / 1000) % 60) << 2) + ((ms % 1000) >> 8);
data[1] = (char)(ms & 0xFF); data[1] = (char)(ms & 0xFF);
data[2] = (char)(id & 0xFF); data[2] = (char)(id & 0xFF);
data[3] = (char)((id >> 8) + (thisFrame.payload().length() << 4)); data[3] = (char)((id >> 8) + (inDataLen << 4));
for (unsigned int d = 0; d < thisFrame.payload().length(); d++) data[4 + d] = (char)thisFrame.payload()[d]; for (int d = 0; d < inDataLen; d++) data[4 + d] = (char)inData[d];
outFile->write(data); outFile->write(data);
} }
} }
@@ -2553,14 +2622,14 @@ bool FrameFileIO::loadMicrochipFile(QString filename, QVector<CANFrame>* frames)
if (tokens[1].at(0) == 'R') thisFrame.isReceived = true; if (tokens[1].at(0) == 'R') thisFrame.isReceived = true;
else thisFrame.isReceived = false; else thisFrame.isReceived = false;
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
thisFrame.setFrameId(Utility::ParseStringToNum(tokens[2])); thisFrame.setFrameId(static_cast<quint32>( Utility::ParseStringToNum(tokens[2])) );
if (thisFrame.frameId() <= 0x7FF) thisFrame.setExtendedFrameFormat(false); if (thisFrame.frameId() <= 0x7FF) thisFrame.setExtendedFrameFormat(false);
else thisFrame.setExtendedFrameFormat(true); else thisFrame.setExtendedFrameFormat(true);
thisFrame.bus = 0; thisFrame.bus = 0;
QByteArray bytes(tokens[3].toUInt(), 0); QByteArray bytes(tokens[3].toInt(), 0);
if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8); if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8);
if (thisFrame.payload().length() + 4 > (unsigned int) tokens.length()) thisFrame.payload().resize( tokens.length() - 4 ); if (thisFrame.payload().length() + 4 > 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]); for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<char>( Utility::ParseStringToNum(tokens[4 + d]) );
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
} }
@@ -2591,6 +2660,10 @@ bool FrameFileIO::saveMicrochipFile(QString filename, const QVector<CANFrame>* f
QDateTime timestamp, tempStamp; QDateTime timestamp, tempStamp;
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
timestamp = QDateTime::currentDateTime(); timestamp = QDateTime::currentDateTime();
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
@@ -2617,15 +2690,19 @@ bool FrameFileIO::saveMicrochipFile(QString filename, const QVector<CANFrame>* f
lineCounter = 0; lineCounter = 0;
} }
outFile->write(QString::number((int)(frames->at(c).timeStamp().microSeconds() / 1000)).toUtf8()); frame = &frames->at(c);
if (frames->at(c).isReceived) outFile->write(";RX;"); data = reinterpret_cast<unsigned char *>(frame->payload().data());
else outFile->write(";TX;"); dataLen = frame->payload().count();
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).payload().length(); temp++) outFile->write(QString::number((frame->timeStamp().microSeconds() / 1000)).toUtf8());
if (frame->isReceived) outFile->write(";RX;");
else outFile->write(";TX;");
outFile->write("0x" + QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + ";");
outFile->write(QString::number(dataLen).toUtf8() + ";");
for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write("0x" + QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write("0x" + QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(';'); outFile->putChar(';');
} }
@@ -2773,11 +2850,11 @@ bool FrameFileIO::loadTraceFile(QString filename, QVector<CANFrame>* frames)
else thisFrame.setExtendedFrameFormat(true); else thisFrame.setExtendedFrameFormat(true);
thisFrame.bus = 0; thisFrame.bus = 0;
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
QByteArray bytes(tokens[3].toUInt(), 0); QByteArray bytes(tokens[3].toInt(), 0);
if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8); if (thisFrame.payload().length() > 8) thisFrame.payload().resize(8);
QList<QByteArray> dataToks = tokens[4].split(' '); QList<QByteArray> dataToks = tokens[4].split(' ');
if (thisFrame.payload().length() > (unsigned int) dataToks.length()) thisFrame.payload().resize( static_cast<unsigned int>(dataToks.length()) ); if (thisFrame.payload().length() > dataToks.length()) thisFrame.payload().resize(dataToks.length());
for (unsigned int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = (unsigned char)dataToks[d].toInt(nullptr, 16); for (int d = 0; d < thisFrame.payload().length(); d++) bytes[d] = static_cast<char>(dataToks[d].toInt(nullptr, 16));
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
} }
@@ -2795,9 +2872,13 @@ bool FrameFileIO::saveTraceFile(QString filename, const QVector<CANFrame> * fram
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
QDateTime timestamp; QDateTime timestamp;
int lineCounter = 0; int lineCounter = 0;
uint64_t tempTime; int64_t tempTime;
int tempTimePiece; int tempTimePiece;
unsigned char *data;
int dataLen;
const CANFrame *frame;
timestamp = QDateTime::currentDateTime(); timestamp = QDateTime::currentDateTime();
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
@@ -2836,38 +2917,41 @@ bool FrameFileIO::saveTraceFile(QString filename, const QVector<CANFrame> * fram
//lineCounter = 0; //lineCounter = 0;
} }
frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
//1F D3 3F FF 08 FF E0 CB //1F D3 3F FF 08 FF E0 CB
outFile->write(QString::number(lineCounter).rightJustified(10, ' ').toUtf8()); outFile->write(QString::number(lineCounter).rightJustified(10, ' ').toUtf8());
outFile->write("\t"); outFile->write("\t");
tempTime = frames->at(c).timeStamp().microSeconds(); tempTime = frame->timeStamp().microSeconds();
tempTimePiece = tempTime / 1000000ul / 60 / 60; tempTimePiece = static_cast<int>(tempTime / 1000000l / 60 / 60);
tempTime -= tempTimePiece * 1000000ul * 60 * 60; tempTime -= tempTimePiece * 1000000l * 60 * 60;
outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8()); outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8());
outFile->write(":"); outFile->write(":");
tempTimePiece = tempTime / 1000000ul / 60; tempTimePiece = static_cast<int>(tempTime / 1000000l / 60);
tempTime -= tempTimePiece * 1000000ul * 60; tempTime -= tempTimePiece * 1000000l * 60;
outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8()); outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8());
outFile->write(":"); outFile->write(":");
tempTimePiece = tempTime / 1000000ul; tempTimePiece = static_cast<int>(tempTime / 1000000l);
tempTime -= tempTimePiece * 1000000ul; tempTime -= tempTimePiece * 1000000l;
outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8()); outFile->write(QString::number(tempTimePiece).rightJustified(2, '0').toUtf8());
outFile->write(":"); outFile->write(":");
tempTimePiece = tempTime / 100; tempTimePiece = static_cast<int>(tempTime / 100);
outFile->write(QString::number(tempTimePiece).rightJustified(4, '0').toUtf8()); outFile->write(QString::number(tempTimePiece).rightJustified(4, '0').toUtf8());
outFile->write("\t"); outFile->write("\t");
outFile->write(QString::number(frames->at(c).frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\t"); outFile->write(QString::number(frame->frameId(), 16).toUpper().rightJustified(8, '0').toUtf8() + "\t");
outFile->write(QString::number(frames->at(c).payload().length()).toUtf8() + "\t"); outFile->write(QString::number(dataLen).toUtf8() + "\t");
for (unsigned int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
outFile->putChar(' '); outFile->putChar(' ');
} }
@@ -2886,6 +2970,10 @@ bool FrameFileIO::saveCanDumpFile(QString filename, const QVector<CANFrame> * fr
int lineCounter = 0; int lineCounter = 0;
double tempTime; double tempTime;
unsigned char *data;
int dataLen;
const CANFrame *frame;
timestamp = QDateTime::currentDateTime(); timestamp = QDateTime::currentDateTime();
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
@@ -2902,27 +2990,31 @@ bool FrameFileIO::saveCanDumpFile(QString filename, const QVector<CANFrame> * fr
qApp->processEvents(); qApp->processEvents();
} }
frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
outFile->write("("); outFile->write("(");
tempTime = frames->at(c).timeStamp().microSeconds() / 1000000.0; tempTime = frame->timeStamp().microSeconds() / 1000000.0;
outFile->write(QString::number(tempTime,'f', 6).rightJustified(17, '0').toUtf8()); outFile->write(QString::number(tempTime,'f', 6).rightJustified(17, '0').toUtf8());
outFile->write(") vcan0 "); outFile->write(") vcan0 ");
if (frames->at(c).hasExtendedFrameFormat()) { if (frame->hasExtendedFrameFormat()) {
outFile->write(QString::number(frames->at(c).frameId(), 16).rightJustified(8,'0').toUpper().toUtf8()); outFile->write(QString::number(frame->frameId(), 16).rightJustified(8,'0').toUpper().toUtf8());
} else { } else {
outFile->write(QString::number(frames->at(c).frameId(), 16).rightJustified(3,'0').toUpper().toUtf8()); outFile->write(QString::number(frame->frameId(), 16).rightJustified(3,'0').toUpper().toUtf8());
} }
outFile->write("#"); outFile->write("#");
if (frames->at(c).frameType() == QCanBusFrame::RemoteRequestFrame) { if (frame->frameType() == QCanBusFrame::RemoteRequestFrame) {
outFile->write("R"); outFile->write("R");
outFile->write(QString::number(frames->at(c).payload().length()).toUtf8()); outFile->write(QString::number(dataLen).toUtf8());
} else { } else {
for (unsigned int temp = 0; temp < frames->at(c).payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
outFile->write(QString::number((unsigned char)frames->at(c).payload()[temp], 16).rightJustified(2,'0').toUpper().toUtf8()); outFile->write(QString::number(data[temp], 16).rightJustified(2,'0').toUpper().toUtf8());
} }
} }
@@ -3102,14 +3194,14 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector<CANFrame>* frames)
{ {
//(1551774790.942758) can1 7A8 [8] F4 DC D1 83 0E 02 00 00 //(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 // 0 1 2 3 4 5 6 7 8 9 10 11
thisFrame.setFrameId(tokens[2].toULong(nullptr, 16)); thisFrame.setFrameId(tokens[2].toLong(nullptr, 16));
if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true); if (thisFrame.frameId() > 0x7FF) thisFrame.setExtendedFrameFormat(true);
else thisFrame.setExtendedFrameFormat(false); else thisFrame.setExtendedFrameFormat(false);
thisFrame.setFrameType(QCanBusFrame::DataFrame); thisFrame.setFrameType(QCanBusFrame::DataFrame);
QByteArray bytes(tokens[3].at(1) - '0', 0); QByteArray bytes(tokens[3].at(1) - '0', 0);
for (uint32_t c = 0; c < thisFrame.payload().length(); c++) for (int c = 0; c < thisFrame.payload().length(); c++)
{ {
bytes[c] = static_cast<unsigned char>(tokens[4 + c].toInt(nullptr, 16)); bytes[c] = static_cast<char>(tokens[4 + c].toInt(nullptr, 16));
} }
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
} }
@@ -3170,7 +3262,6 @@ bool FrameFileIO::isLawicelFile(QString filename)
QByteArray line; QByteArray line;
int lineCounter = 0; int lineCounter = 0;
bool isMatch = false; bool isMatch = false;
bool ret;
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
{ {
@@ -3245,7 +3336,7 @@ bool FrameFileIO::loadLawicelFile(QString filename, QVector<CANFrame>* frames)
QByteArray bytes(line.length() / 2, 0); QByteArray bytes(line.length() / 2, 0);
for (int d = 0; d < bytes.length(); d++) for (int d = 0; d < bytes.length(); d++)
{ {
bytes[d] = static_cast<unsigned char>(line.mid(d * 2, 2).toInt(nullptr, 16)); bytes[d] = static_cast<char>(line.mid(d * 2, 2).toInt(nullptr, 16));
} }
thisFrame.setPayload(bytes); thisFrame.setPayload(bytes);
frames->append(thisFrame); frames->append(thisFrame);
@@ -3508,6 +3599,10 @@ bool FrameFileIO::saveCabanaFile(QString filename, const QVector<CANFrame>* fram
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
int lineCounter = 0; int lineCounter = 0;
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
{ {
delete outFile; delete outFile;
@@ -3526,23 +3621,27 @@ bool FrameFileIO::saveCabanaFile(QString filename, const QVector<CANFrame>* fram
lineCounter = 0; lineCounter = 0;
} }
double tempTimeStamp = frames->at(c).timeStamp().microSeconds(); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
double tempTimeStamp = frame->timeStamp().microSeconds();
tempTimeStamp /= 1000000; tempTimeStamp /= 1000000;
outFile->write(QString::number(tempTimeStamp, 'f').toUtf8()); outFile->write(QString::number(tempTimeStamp, 'f').toUtf8());
outFile->write(".0"); outFile->write(".0");
outFile->putChar(44); outFile->putChar(44);
outFile->write(QString::number(frames->at(c).frameId(), 10).toUpper().toUtf8()); outFile->write(QString::number(frame->frameId(), 10).toUpper().toUtf8());
outFile->putChar(44); outFile->putChar(44);
outFile->write(QString::number(frames->at(c).bus).toUtf8()); outFile->write(QString::number(frame->bus).toUtf8());
outFile->putChar(44); outFile->putChar(44);
for (unsigned int temp = 0; temp < 8; temp++) for (int temp = 0; temp < 8; temp++)
{ {
if (temp < frames->at(c).payload().length()) if (temp < dataLen)
outFile->write(QString::number(frames->at(c).payload()[temp], 16).toUpper().rightJustified(2, '0').toUtf8()); outFile->write(QString::number(data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
else else
outFile->write("00"); outFile->write("00");
} }
+3 -3
View File
@@ -297,7 +297,7 @@ void FramePlaybackWindow::refreshIDList()
QHash<int, bool>::Iterator filterIter; QHash<int, bool>::Iterator filterIter;
for (filterIter = currentSeqItem->idFilters.begin(); filterIter != currentSeqItem->idFilters.end(); ++filterIter) for (filterIter = currentSeqItem->idFilters.begin(); filterIter != currentSeqItem->idFilters.end(); ++filterIter)
{ {
QListWidgetItem* listItem = FilterUtility::createCheckableFilterItem(filterIter.key(), filterIter.value(), ui->listID); /*QListWidgetItem* listItem = */ FilterUtility::createCheckableFilterItem(filterIter.key(), filterIter.value(), ui->listID);
} }
//default is to sort in ascending order //default is to sort in ascending order
ui->listID->sortItems(); ui->listID->sortItems();
@@ -479,7 +479,7 @@ void FramePlaybackWindow::btnLoadFile()
if (FrameFileIO::loadFrameFile(filename, &item.data)) if (FrameFileIO::loadFrameFile(filename, &item.data))
{ {
qSort(item.data); //sort by timestamp to be sure it's in order std::sort(item.data.begin(), item.data.end()); //sort by timestamp to be sure it's in order
QStringList fileList = filename.split('/'); QStringList fileList = filename.split('/');
item.filename = fileList[fileList.length() - 1]; item.filename = fileList[fileList.length() - 1];
item.currentLoopCount = 0; item.currentLoopCount = 0;
@@ -513,7 +513,7 @@ void FramePlaybackWindow::btnLoadLive()
item.currentLoopCount = 0; item.currentLoopCount = 0;
item.maxLoops = 1; item.maxLoops = 1;
item.data = QVector<CANFrame>(*modelFrames); //create a copy of the current frames from the main view item.data = QVector<CANFrame>(*modelFrames); //create a copy of the current frames from the main view
qSort(item.data); //be sure it's all in time based order std::sort(item.data.begin(), item.data.end()); //be sure it's all in time based order
fillIDHash(item); fillIDHash(item);
if (ui->tblSequence->currentRow() == -1) if (ui->tblSequence->currentRow() == -1)
{ {
+12 -8
View File
@@ -185,7 +185,7 @@ void FrameSenderWindow::processIncomingFrame(CANFrame *frame)
qDebug() << "Frame ID: " << frame->frameId(); qDebug() << "Frame ID: " << frame->frameId();
if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->frameId()) if (thisTrigger->ID > 0 && (uint32_t)thisTrigger->ID == frame->frameId())
{ {
if ((uint32_t)thisTrigger->bus == frame->bus || thisTrigger->bus == -1) if (thisTrigger->bus == frame->bus || thisTrigger->bus == -1)
{ {
if (thisTrigger->currCount < thisTrigger->maxCount) if (thisTrigger->currCount < thisTrigger->maxCount)
{ {
@@ -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 else if (op.ID == -2) //fetch data from a data byte within the output frame
{ {
if (op.notOper) return ~sendingData.at(idx).payload()[op.databyte]; if (op.notOper) return ~((unsigned char)sendingData.at(idx).payload()[op.databyte]);
else return sendingData.at(idx).payload()[op.databyte]; else return (unsigned char)sendingData.at(idx).payload()[op.databyte];
} }
else //look up external data byte else //look up external data byte
{ {
tempFrame = lookupFrame(op.ID, op.bus); tempFrame = lookupFrame(op.ID, op.bus);
if (tempFrame != nullptr) if (tempFrame != nullptr)
{ {
if (op.notOper) return ~tempFrame->payload()[op.databyte]; if (op.notOper) return ~((unsigned char)tempFrame->payload()[op.databyte]);
else return tempFrame->payload()[op.databyte]; else return (unsigned char)tempFrame->payload()[op.databyte];
} }
else return 0; else return 0;
} }
@@ -550,7 +550,7 @@ CANFrame* FrameSenderWindow::lookupFrame(int ID, int bus)
{ {
if (!frameCache.contains(ID)) return nullptr; if (!frameCache.contains(ID)) return nullptr;
if (bus == -1 || frameCache[ID].bus == (unsigned int)bus) return &frameCache[ID]; if (bus == -1 || frameCache[ID].bus == bus) return &frameCache[ID];
return nullptr; return nullptr;
} }
@@ -786,17 +786,21 @@ ModifierOperationType FrameSenderWindow::parseOperation(QString op)
void FrameSenderWindow::updateGridRow(int idx) void FrameSenderWindow::updateGridRow(int idx)
{ {
qDebug() << "updateGridRow"; qDebug() << "updateGridRow";
inhibitChanged = true; inhibitChanged = true;
FrameSendData *temp = &sendingData[idx]; FrameSendData *temp = &sendingData[idx];
int gridLine = idx; int gridLine = idx;
QString dataString; QString dataString;
QTableWidgetItem *item = ui->tableSender->item(gridLine, 9); QTableWidgetItem *item = ui->tableSender->item(gridLine, 9);
unsigned char *data = reinterpret_cast<unsigned char *>(temp->payload().data());
int dataLen = temp->payload().length();
if (item == nullptr) item = new QTableWidgetItem(); if (item == nullptr) item = new QTableWidgetItem();
item->setText(QString::number(temp->count)); item->setText(QString::number(temp->count));
if (temp->frameType() != QCanBusFrame::RemoteRequestFrame) { if (temp->frameType() != QCanBusFrame::RemoteRequestFrame) {
for (unsigned int i = 0; i < temp->payload().length(); i++) for (int i = 0; i < dataLen; i++)
{ {
dataString.append(Utility::formatNumber(temp->payload()[i])); dataString.append(Utility::formatNumber(data[i]));
dataString.append(" "); dataString.append(" ");
} }
ui->tableSender->item(gridLine, 6)->setText(dataString); ui->tableSender->item(gridLine, 6)->setText(dataString);
+18 -11
View File
@@ -444,7 +444,7 @@ void MainWindow::updateFilterList()
QMap<int, bool>::const_iterator filterIter; QMap<int, bool>::const_iterator filterIter;
for (filterIter = filters->begin(); filterIter != filters->end(); ++filterIter) for (filterIter = filters->begin(); filterIter != filters->end(); ++filterIter)
{ {
QListWidgetItem *thisItem = FilterUtility::createCheckableFilterItem(filterIter.key(), filterIter.value(), ui->listFilters); /*QListWidgetItem *thisItem = */FilterUtility::createCheckableFilterItem(filterIter.key(), filterIter.value(), ui->listFilters);
} }
inhibitFilterUpdate = false; inhibitFilterUpdate = false;
} }
@@ -729,6 +729,10 @@ void MainWindow::saveDecodedTextFile(QString filename)
QFile *outFile = new QFile(filename); QFile *outFile = new QFile(filename);
const QVector<CANFrame> *frames = model->getFilteredListReference(); const QVector<CANFrame> *frames = model->getFilteredListReference();
unsigned char *data;
int dataLen;
const CANFrame *frame;
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
return; return;
/* /*
@@ -738,20 +742,23 @@ Data Bytes: 88 10 00 13 BB 00 06 00
*/ */
for (int c = 0; c < frames->count(); c++) for (int c = 0; c < frames->count(); c++)
{ {
CANFrame thisFrame = frames->at(c); frame = &frames->at(c);
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().count();
QString builderString; QString builderString;
builderString += tr("Time: ") + QString::number((thisFrame.timeStamp().microSeconds() / 1000000.0), 'f', 6); builderString += tr("Time: ") + QString::number((frame->timeStamp().microSeconds() / 1000000.0), 'f', 6);
builderString += tr(" ID: ") + Utility::formatCANID(thisFrame.frameId(), thisFrame.hasExtendedFrameFormat()); builderString += tr(" ID: ") + Utility::formatCANID(frame->frameId(), frame->hasExtendedFrameFormat());
if (thisFrame.hasExtendedFrameFormat()) builderString += tr(" Ext "); if (frame->hasExtendedFrameFormat()) builderString += tr(" Ext ");
else builderString += tr(" Std "); else builderString += tr(" Std ");
builderString += tr("Bus: ") + QString::number(thisFrame.bus); builderString += tr("Bus: ") + QString::number(frame->bus);
builderString += " Len: " + QString::number(thisFrame.payload().length()) + "\n"; builderString += " Len: " + QString::number(dataLen) + "\n";
outFile->write(builderString.toUtf8()); outFile->write(builderString.toUtf8());
builderString = tr("Data Bytes: "); builderString = tr("Data Bytes: ");
for (unsigned int temp = 0; temp < thisFrame.payload().length(); temp++) for (int temp = 0; temp < dataLen; temp++)
{ {
builderString += Utility::formatNumber(thisFrame.payload()[temp]) + " "; builderString += Utility::formatNumber(data[temp]) + " ";
} }
builderString += "\n"; builderString += "\n";
outFile->write(builderString.toUtf8()); outFile->write(builderString.toUtf8());
@@ -759,14 +766,14 @@ Data Bytes: 88 10 00 13 BB 00 06 00
builderString = ""; builderString = "";
if (dbcHandler != nullptr) if (dbcHandler != nullptr)
{ {
DBC_MESSAGE *msg = dbcHandler->findMessage(thisFrame); DBC_MESSAGE *msg = dbcHandler->findMessage(*frame);
if (msg != nullptr) if (msg != nullptr)
{ {
for (int j = 0; j < msg->sigHandler->getCount(); j++) for (int j = 0; j < msg->sigHandler->getCount(); j++)
{ {
QString temp; QString temp;
if (msg->sigHandler->findSignalByIdx(j)->processAsText(thisFrame, temp)) if (msg->sigHandler->findSignalByIdx(j)->processAsText(*frame, temp))
{ {
builderString.append("\t" + temp); builderString.append("\t" + temp);
builderString.append("\n"); builderString.append("\n");
+22 -14
View File
@@ -123,6 +123,8 @@ void FileComparatorWindow::calculateDetails()
QTreeWidgetItem *interestedOnlyBase, *referenceOnlyBase = nullptr, *sharedBase, *bitmapBaseInterested, *bitmapBaseReference = nullptr; QTreeWidgetItem *interestedOnlyBase, *referenceOnlyBase = nullptr, *sharedBase, *bitmapBaseInterested, *bitmapBaseReference = nullptr;
QTreeWidgetItem *valuesBase, *detail, *sharedItem, *valuesInterested, *valuesReference = nullptr; QTreeWidgetItem *valuesBase, *detail, *sharedItem, *valuesInterested, *valuesReference = nullptr;
uint64_t tmp; uint64_t tmp;
unsigned char *data;
int dataLen;
bool uniqueInterested = ui->ckUniqueToInterested->isChecked(); bool uniqueInterested = ui->ckUniqueToInterested->isChecked();
@@ -152,12 +154,15 @@ void FileComparatorWindow::calculateDetails()
for (int x = 0; x < interestedFrames.count(); x++) for (int x = 0; x < interestedFrames.count(); x++)
{ {
CANFrame frame = interestedFrames.at(x); CANFrame frame = interestedFrames.at(x);
data = reinterpret_cast<unsigned char *>(frame.payload().data());
dataLen = frame.payload().count();
if (interestedIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there if (interestedIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there
{ {
for (unsigned int y = 0; y < frame.payload().length(); y++) for (unsigned int y = 0; y < dataLen; y++)
{ {
interestedIDs[frame.frameId()].values[y][frame.payload()[y]]++; interestedIDs[frame.frameId()].values[y][data[y]]++;
tmp = frame.payload()[y]; tmp = data[y];
tmp = tmp << (8 * y); tmp = tmp << (8 * y);
interestedIDs[frame.frameId()].bitmap |= tmp; interestedIDs[frame.frameId()].bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(interestedIDs[frame.frameId()].bitmap, 16); //qDebug() << "bitmap: " << QString::number(interestedIDs[frame.frameId()].bitmap, 16);
@@ -167,7 +172,7 @@ void FileComparatorWindow::calculateDetails()
{ {
FrameData *newData = new FrameData(); FrameData *newData = new FrameData();
newData->ID = frame.frameId(); newData->ID = frame.frameId();
newData->dataLen = frame.payload().length(); newData->dataLen = dataLen;
//it would be possible to implement a constructor for FrameData //it would be possible to implement a constructor for FrameData
//that sets the bitmap and values to zero. That would be cleaner and better. //that sets the bitmap and values to zero. That would be cleaner and better.
newData->bitmap = 0; newData->bitmap = 0;
@@ -179,10 +184,10 @@ void FileComparatorWindow::calculateDetails()
} }
} }
//memset(newData->values, 0, 256 * 8); //memset(newData->values, 0, 256 * 8);
for (unsigned int y = 0; y < frame.payload().length(); y++) for (unsigned int y = 0; y < dataLen; y++)
{ {
newData->values[y][frame.payload()[y]] = 1; newData->values[y][data[y]] = 1;
tmp = frame.payload()[y]; tmp = data[y];
tmp = tmp << (8 * y); tmp = tmp << (8 * y);
newData->bitmap |= tmp; newData->bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(newData->bitmap, 16); //qDebug() << "bitmap: " << QString::number(newData->bitmap, 16);
@@ -196,12 +201,15 @@ void FileComparatorWindow::calculateDetails()
for (int x = 0; x < referenceFrames.count(); x++) for (int x = 0; x < referenceFrames.count(); x++)
{ {
CANFrame frame = referenceFrames.at(x); CANFrame frame = referenceFrames.at(x);
data = reinterpret_cast<unsigned char *>(frame.payload().data());
dataLen = frame.payload().count();
if (referenceIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there if (referenceIDs.contains(frame.frameId())) //if we saw this ID before then add to the QList in there
{ {
for (unsigned int y = 0; y < frame.payload().length(); y++) for (unsigned int y = 0; y < dataLen; y++)
{ {
referenceIDs[frame.frameId()].values[y][frame.payload()[y]]++; referenceIDs[frame.frameId()].values[y][data[y]]++;
tmp = frame.payload()[y]; tmp = data[y];
tmp = tmp << (8 * y); tmp = tmp << (8 * y);
referenceIDs[frame.frameId()].bitmap |= tmp; referenceIDs[frame.frameId()].bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(referenceIDs[frame.frameId()].bitmap, 16); //qDebug() << "bitmap: " << QString::number(referenceIDs[frame.frameId()].bitmap, 16);
@@ -211,7 +219,7 @@ void FileComparatorWindow::calculateDetails()
{ {
FrameData *newData = new FrameData(); FrameData *newData = new FrameData();
newData->ID = frame.frameId(); newData->ID = frame.frameId();
newData->dataLen = frame.payload().length(); newData->dataLen = dataLen;
newData->bitmap = 0; newData->bitmap = 0;
for (int x = 0; x < 8; x++) for (int x = 0; x < 8; x++)
{ {
@@ -221,10 +229,10 @@ void FileComparatorWindow::calculateDetails()
} }
} }
//memset(newData->values, 0, 256 * 8); //memset(newData->values, 0, 256 * 8);
for (unsigned int y = 0; y < frame.payload().length(); y++) for (unsigned int y = 0; y < dataLen; y++)
{ {
newData->values[y][frame.payload()[y]] = 1; newData->values[y][data[y]] = 1;
tmp = frame.payload()[y]; tmp = data[y];
tmp = tmp << (8 * y); tmp = tmp << (8 * y);
newData->bitmap |= tmp; newData->bitmap |= tmp;
//qDebug() << "bitmap: " << QString::number(newData->bitmap, 16); //qDebug() << "bitmap: " << QString::number(newData->bitmap, 16);
+29 -17
View File
@@ -257,7 +257,7 @@ void FlowViewWindow::plottableDoubleClick(QCPAbstractPlottable* plottable, QMous
void FlowViewWindow::gotCenterTimeID(int32_t ID, double timestamp) void FlowViewWindow::gotCenterTimeID(int32_t ID, double timestamp)
{ {
uint64_t t_stamp; int64_t t_stamp;
t_stamp = timestamp * 1000000l; t_stamp = timestamp * 1000000l;
@@ -397,8 +397,10 @@ void FlowViewWindow::updatedFrames(int numFrames)
{ {
QVector<double>newX[8]; QVector<double>newX[8];
QVector<double>newY[8]; QVector<double>newY[8];
unsigned char *data;
int dataLen = 0;
CANFrame thisFrame; const CANFrame *thisFrame;
if (numFrames == -1) //all frames deleted. Kill the display if (numFrames == -1) //all frames deleted. Kill the display
{ {
ui->listFrameID->clear(); ui->listFrameID->clear();
@@ -433,35 +435,37 @@ void FlowViewWindow::updatedFrames(int numFrames)
bool needRefresh = false; bool needRefresh = false;
for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++) for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++)
{ {
thisFrame = modelFrames->at(i); thisFrame = &modelFrames->at(i);
data = reinterpret_cast<unsigned char *>(thisFrame->payload().data());
dataLen = thisFrame->payload().length();
if (!foundID.contains(thisFrame.frameId())) if (!foundID.contains(thisFrame->frameId()))
{ {
foundID.append(thisFrame.frameId()); foundID.append(thisFrame->frameId());
FilterUtility::createFilterItem(thisFrame.frameId(), ui->listFrameID); FilterUtility::createFilterItem(thisFrame->frameId(), ui->listFrameID);
} }
if (thisFrame.frameId() == refID) if (thisFrame->frameId() == refID)
{ {
frameCache.append(thisFrame); frameCache.append(*thisFrame);
for (int k = 0; k < 8; k++) for (int k = 0; k < dataLen; k++)
{ {
if (ui->cbTimeGraph->isChecked()) if (ui->cbTimeGraph->isChecked())
{ {
if (secondsMode){ if (secondsMode){
newX[k].append((double)(thisFrame.timeStamp().microSeconds()) / 1000000.0); newX[k].append((double)(thisFrame->timeStamp().microSeconds()) / 1000000.0);
} }
else else
{ {
newX[k].append(thisFrame.timeStamp().microSeconds()); newX[k].append(thisFrame->timeStamp().microSeconds());
} }
} }
else else
{ {
newX[k].append(x[k].count()); newX[k].append(x[k].count());
} }
newY[k].append(thisFrame.payload()[k]); newY[k].append(data[k]);
needRefresh = true; needRefresh = true;
} }
} }
@@ -475,7 +479,7 @@ void FlowViewWindow::updatedFrames(int numFrames)
} }
if (needRefresh) if (needRefresh)
{ {
for (int k = 0; k < 8; k++) for (int k = 0; k < dataLen; k++)
{ {
if (graphRef[k] && graphRef[k]->data()) if (graphRef[k] && graphRef[k]->data())
graphRef[k]->addData(newX[k], newY[k]); graphRef[k]->addData(newX[k], newY[k]);
@@ -498,6 +502,9 @@ void FlowViewWindow::createGraph(int byteNum)
{ {
int tempVal; int tempVal;
float minval=1000000, maxval = -100000; float minval=1000000, maxval = -100000;
unsigned char *data;
int dataLen = 0;
const CANFrame *frame;
qDebug() << "Create Graph " << byteNum; qDebug() << "Create Graph " << byteNum;
@@ -512,16 +519,20 @@ void FlowViewWindow::createGraph(int byteNum)
for (int j = 0; j < numEntries; j++) for (int j = 0; j < numEntries; j++)
{ {
tempVal = frameCache[j].payload()[byteNum]; frame = &frameCache[j];
data = reinterpret_cast<unsigned char *>(frame->payload().data());
dataLen = frame->payload().length();
tempVal = data[byteNum];
if (graphByTime) if (graphByTime)
{ {
if (secondsMode){ if (secondsMode){
x[byteNum][j] = (double)(frameCache[j].timeStamp().microSeconds()) / 1000000.0; x[byteNum][j] = (double)(frame->timeStamp().microSeconds()) / 1000000.0;
} }
else else
{ {
x[byteNum][j] = frameCache[j].timeStamp().microSeconds(); x[byteNum][j] = frame->timeStamp().microSeconds();
} }
} }
else else
@@ -758,7 +769,8 @@ void FlowViewWindow::updatePosition(bool forward)
uint8_t cngByte; uint8_t cngByte;
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
cngByte = currBytes[i] ^ frameCache.at(currentPosition).payload()[i]; unsigned char thisByte = static_cast<unsigned char>(frameCache.at(currentPosition).payload().data()[i]);
cngByte = currBytes[i] ^ thisByte;
changedBits |= (uint64_t)cngByte << (8ull * i); changedBits |= (uint64_t)cngByte << (8ull * i);
} }
+1 -1
View File
@@ -44,7 +44,7 @@ signals:
private: private:
Ui::FlowViewWindow *ui; Ui::FlowViewWindow *ui;
QList<int> foundID; QList<quint32> foundID;
QList<CANFrame> frameCache; QList<CANFrame> frameCache;
const QVector<CANFrame> *modelFrames; const QVector<CANFrame> *modelFrames;
unsigned char refBytes[8]; unsigned char refBytes[8];
+18 -9
View File
@@ -138,7 +138,7 @@ FrameInfoWindow::~FrameInfoWindow()
void FrameInfoWindow::closeEvent(QCloseEvent *event) void FrameInfoWindow::closeEvent(QCloseEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event)
writeSettings(); writeSettings();
} }
@@ -260,10 +260,10 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
uint8_t referenceBits[8]; uint8_t referenceBits[8];
QTreeWidgetItem *baseNode, *dataBase, *histBase, *tempItem; QTreeWidgetItem *baseNode, *dataBase, *histBase, *tempItem;
targettedID = static_cast<int>(Utility::ParseStringToNum(newID));
if (modelFrames->count() == 0) return; if (modelFrames->count() == 0) return;
targettedID = static_cast<int>(Utility::ParseStringToNum(newID));
qDebug() << "Started update details window with id " << targettedID; qDebug() << "Started update details window with id " << targettedID;
avgInterval = 0; avgInterval = 0;
@@ -278,6 +278,9 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
if (thisFrame.frameId() == static_cast<uint32_t>(targettedID)) frameCache.append(thisFrame); if (thisFrame.frameId() == static_cast<uint32_t>(targettedID)) frameCache.append(thisFrame);
} }
unsigned char *data = reinterpret_cast<unsigned char *>(frameCache.at(0).payload().data());
int dataLen = frameCache.at(0).payload().length();
ui->treeDetails->clear(); ui->treeDetails->clear();
if (frameCache.count() == 0) return; if (frameCache.count() == 0) return;
@@ -364,10 +367,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
} }
for (int j = 0; j < 64; j++) bitfieldHistogram[j] = 0; for (int j = 0; j < 64; j++) bitfieldHistogram[j] = 0;
for (int c = 0; c < 8; c++) data = reinterpret_cast<unsigned char *>(frameCache.at(0).payload().data());
dataLen = frameCache.at(0).payload().length();
for (int c = 0; c < dataLen; c++)
{ {
changedBits[c] = 0; changedBits[c] = 0;
referenceBits[c] = frameCache.at(0).payload()[c]; referenceBits[c] = data[c];
//qDebug() << referenceBits[c]; //qDebug() << referenceBits[c];
} }
@@ -377,10 +383,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
//then find all data points //then find all data points
for (int j = 0; j < frameCache.count(); j++) for (int j = 0; j < frameCache.count(); j++)
{ {
data = reinterpret_cast<unsigned char *>(frameCache.at(j).payload().data());
dataLen = frameCache.at(j).payload().length();
byteGraphX.append(j); byteGraphX.append(j);
for (uint32_t bytcnt = 0; bytcnt < frameCache[j].payload().length(); bytcnt++) for (uint32_t bytcnt = 0; bytcnt < dataLen; bytcnt++)
{ {
byteGraphY[bytcnt].append(frameCache[j].payload()[bytcnt]); byteGraphY[bytcnt].append(data[bytcnt]);
} }
if (j != 0) if (j != 0)
@@ -398,12 +407,12 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
if (thisInterval < minInterval) minInterval = thisInterval; if (thisInterval < minInterval) minInterval = thisInterval;
avgInterval += thisInterval; avgInterval += thisInterval;
} }
thisLen = frameCache.at(j).payload().length(); thisLen = dataLen;
if (thisLen > maxLen) maxLen = thisLen; if (thisLen > maxLen) maxLen = thisLen;
if (thisLen < minLen) minLen = thisLen; if (thisLen < minLen) minLen = thisLen;
for (int c = 0; c < thisLen; c++) for (int c = 0; c < thisLen; c++)
{ {
unsigned char dat = frameCache.at(j).payload()[c]; unsigned char dat = data[c];
if (minData[c] > dat) minData[c] = dat; if (minData[c] > dat) minData[c] = dat;
if (maxData[c] < dat) maxData[c] = dat; if (maxData[c] < dat) maxData[c] = dat;
dataHistogram[dat][c]++; //add one to count for this dataHistogram[dat][c]++; //add one to count for this
+24 -18
View File
@@ -81,7 +81,7 @@ void ISOTP_InterpreterWindow::showEvent(QShowEvent* event)
void ISOTP_InterpreterWindow::closeEvent(QCloseEvent *event) void ISOTP_InterpreterWindow::closeEvent(QCloseEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event)
removeEventFilter(this); removeEventFilter(this);
writeSettings(); writeSettings();
} }
@@ -194,7 +194,7 @@ void ISOTP_InterpreterWindow::updatedFrames(int numFrames)
void ISOTP_InterpreterWindow::headerClicked(int logicalIndex) void ISOTP_InterpreterWindow::headerClicked(int logicalIndex)
{ {
ui->tableIsoFrames->setSortingEnabled(false); ui->tableIsoFrames->setSortingEnabled(false);
ui->tableIsoFrames->sortByColumn(logicalIndex); ui->tableIsoFrames->sortByColumn(logicalIndex, Qt::SortOrder::AscendingOrder);
} }
void ISOTP_InterpreterWindow::showDetailView() void ISOTP_InterpreterWindow::showDetailView()
@@ -208,17 +208,21 @@ void ISOTP_InterpreterWindow::showDetailView()
msg = &messages[rowNum]; msg = &messages[rowNum];
if (msg->len != msg->data.length()) unsigned char *data = reinterpret_cast<unsigned char *>(msg->payload().data());
int dataLen = msg->payload().length();
if (msg->reportedLength != dataLen)
{ {
buildString.append("Message didn't have the correct number of bytes.\rExpected " buildString.append("Message didn't have the correct number of bytes.\rExpected "
+ QString::number(msg->len) + " got " + QString::number(msg->reportedLength) + " got "
+ QString::number(msg->data.length()) + "\r\r"); + QString::number(dataLen) + "\r\r");
} }
buildString.append(tr("Raw Payload: ")); buildString.append(tr("Raw Payload: "));
for (int i = 0; i < messages[rowNum].data.count(); i++)
for (int i = 0; i < dataLen; i++)
{ {
buildString.append(Utility::formatNumber((char)messages[rowNum].data[i])); buildString.append(Utility::formatNumber(data[i]));
buildString.append(" "); buildString.append(" ");
} }
buildString.append("\r\r"); buildString.append("\r\r");
@@ -262,17 +266,20 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg)
int rowNum; int rowNum;
QString tempString; QString tempString;
if ((msg.len != msg.data.count()) && !ui->cbShowIncomplete->isChecked()) return; unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
if (idFilters.find(msg.ID) == idFilters.end()) if ((msg.reportedLength != dataLen) && !ui->cbShowIncomplete->isChecked()) return;
if (idFilters.find(msg.frameId()) == idFilters.end())
{ {
idFilters.insert(msg.ID, true); idFilters.insert(msg.frameId(), true);
QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.ID, msg.extended), ui->listFilter); QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.frameId(), msg.hasExtendedFrameFormat()), ui->listFilter);
listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag
listItem->setCheckState(Qt::Checked); listItem->setCheckState(Qt::Checked);
} }
if (!idFilters[msg.ID]) return; if (!idFilters[msg.frameId()]) return;
messages.append(msg); messages.append(msg);
rowNum = ui->tableIsoFrames->rowCount(); rowNum = ui->tableIsoFrames->rowCount();
@@ -280,22 +287,21 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg)
ui->tableIsoFrames->insertRow(rowNum); ui->tableIsoFrames->insertRow(rowNum);
QTableWidgetItem *item = new QTableWidgetItem; QTableWidgetItem *item = new QTableWidgetItem;
item->setData(Qt::EditRole, Utility::formatTimestamp(msg.timestamp)); item->setData(Qt::EditRole, Utility::formatTimestamp(msg.timeStamp().microSeconds()));
//ui->tableIsoFrames->setItem(rowNum, 0, (double)msg.timestamp, Utility::formatTimestamp(msg.timestamp))); //ui->tableIsoFrames->setItem(rowNum, 0, (double)msg.timestamp, Utility::formatTimestamp(msg.timestamp)));
ui->tableIsoFrames->setItem(rowNum, 0, item); ui->tableIsoFrames->setItem(rowNum, 0, item);
ui->tableIsoFrames->setItem(rowNum, 1, new QTableWidgetItem(QString::number(msg.ID, 16))); ui->tableIsoFrames->setItem(rowNum, 1, new QTableWidgetItem(QString::number(msg.frameId(), 16)));
ui->tableIsoFrames->setItem(rowNum, 2, new QTableWidgetItem(QString::number(msg.bus))); ui->tableIsoFrames->setItem(rowNum, 2, new QTableWidgetItem(QString::number(msg.bus)));
if (msg.isReceived) ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Rx")); if (msg.isReceived) ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Rx"));
else ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Tx")); else ui->tableIsoFrames->setItem(rowNum, 3, new QTableWidgetItem("Tx"));
ui->tableIsoFrames->setItem(rowNum, 4, new QTableWidgetItem(QString::number(msg.len))); ui->tableIsoFrames->setItem(rowNum, 4, new QTableWidgetItem(QString::number(msg.payload().length())));
for (int i = 0; i < msg.data.count(); i++) for (int i = 0; i < dataLen; i++)
{ {
tempString.append(Utility::formatNumber((char)msg.data[i])); tempString.append(Utility::formatNumber(data[i]));
tempString.append(" "); tempString.append(" ");
} }
ui->tableIsoFrames->setItem(rowNum, 5, new QTableWidgetItem(tempString)); ui->tableIsoFrames->setItem(rowNum, 5, new QTableWidgetItem(tempString));
} }
+17 -9
View File
@@ -6,18 +6,23 @@
SnifferItem::SnifferItem(const CANFrame& pFrame, quint32 seq): SnifferItem::SnifferItem(const CANFrame& pFrame, quint32 seq):
mID(pFrame.frameId()) mID(pFrame.frameId())
{ {
for (int i = 0; i < 8; i++) { unsigned char *data = reinterpret_cast<unsigned char *>(pFrame.payload().data());
mNotch[i] =0; int dataLen = pFrame.payload().length();
for (int i = 0; i < 0; i++) {
mNotch[i] = 0;
mMarker.data[i] = 0; mMarker.data[i] = 0;
mMarker.dataTimestamp[i] = 0; mMarker.dataTimestamp[i] = 0;
mCurrent.data[i] = pFrame.payload()[i]; if (i < dataLen) mCurrent.data[i] = data[i];
else mCurrent.data[i] = 0;
mCurrent.dataTimestamp[i] = seq; mCurrent.dataTimestamp[i] = seq;
} }
mLastMarker = mMarker; mLastMarker = mMarker;
mCurrent.len = pFrame.payload().length(); mCurrent.len = dataLen;
/* that's dirty */ /* that's dirty */
update(pFrame, seq, false); update(pFrame, seq, false);
update(pFrame, seq, false); update(pFrame, seq, false); //anyone know why we're doing this twice?!
} }
@@ -112,20 +117,23 @@ void SnifferItem::update(const CANFrame& pFrame, quint32 timeSeq, bool mute)
mLastTime = mCurrentTime; mLastTime = mCurrentTime;
mCurrSeqVal = timeSeq; mCurrSeqVal = timeSeq;
unsigned char *data = reinterpret_cast<unsigned char *>(pFrame.payload().data());
int dataLen = pFrame.payload().length();
/* copy new value */ /* copy new value */
for (int i = 0; i < 8; i++) for (int i = 0; i < dataLen; i++)
{ {
maskedData = pFrame.payload()[i]; maskedData = data[i];
if (mute) maskedData &= ~mNotch[i]; if (mute) maskedData &= ~mNotch[i];
maskedCurr = mCurrent.data[i]; maskedCurr = mCurrent.data[i];
if (mute) maskedCurr &= ~mNotch[i]; if (mute) maskedCurr &= ~mNotch[i];
if (maskedCurr != maskedData) if (maskedCurr != maskedData)
{ {
mCurrent.data[i] = pFrame.payload()[i]; mCurrent.data[i] = data[i];
mCurrent.dataTimestamp[i] = timeSeq; mCurrent.dataTimestamp[i] = timeSeq;
} }
} }
mCurrent.len = pFrame.payload().length(); mCurrent.len = dataLen;
mCurrentTime = pFrame.timeStamp().microSeconds(); mCurrentTime = pFrame.timeStamp().microSeconds();
/* update marker */ /* update marker */
+13 -11
View File
@@ -237,8 +237,8 @@ void UDSScanWindow::scanUDS()
for (id = startID; id <= endID; id++) for (id = startID; id <= endID; id++)
{ {
test.ID = id; test.setFrameId( id );
test.data.clear(); test.payload().clear();
if (ui->ckTester->isChecked()) if (ui->ckTester->isChecked())
{ {
@@ -354,17 +354,19 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
int offset = ui->spinReplyOffset->value(); int offset = ui->spinReplyOffset->value();
UDS_MESSAGE sentFrame; UDS_MESSAGE sentFrame;
bool gotReply = false; bool gotReply = false;
unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
int numSending = sendingFrames.length(); int numSending = sendingFrames.length();
if (numSending == 0) return; if (numSending == 0) return;
if (currIdx >= numSending) return; if (currIdx >= numSending) return;
sentFrame = sendingFrames[currIdx]; sentFrame = sendingFrames[currIdx];
id = msg.ID; id = msg.frameId();
qDebug() << "UDS message ID " << QString::number(msg.ID,16) << " service: " << QString::number(msg.service, 16) << " subfunc: " << QString::number(msg.subFunc, 16); qDebug() << "UDS message ID " << QString::number(msg.frameId(),16) << " service: " << QString::number(msg.service, 16) << " subfunc: " << QString::number(msg.subFunc, 16);
if ((id == (uint32_t)(sentFrame.ID + offset)) || ui->cbAllowAdaptiveOffset->isChecked()) if ((id == (uint32_t)(sentFrame.frameId() + offset)) || ui->cbAllowAdaptiveOffset->isChecked())
{ {
serviceShortName = udsHandler->getServiceShortDesc(sentFrame.service); serviceShortName = udsHandler->getServiceShortDesc(sentFrame.service);
if (serviceShortName.length() < 3) serviceShortName = QString::number(sentFrame.service, 16); if (serviceShortName.length() < 3) serviceShortName = QString::number(sentFrame.service, 16);
@@ -374,10 +376,10 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
QTreeWidgetItem *nodePositive = new QTreeWidgetItem(); QTreeWidgetItem *nodePositive = new QTreeWidgetItem();
QString reply = "POSITIVE "; QString reply = "POSITIVE ";
for (int i = 0; i < msg.data.length(); i++) for (int i = 0; i < dataLen; i++)
{ {
reply.append(" "); reply.append(" ");
reply.append(Utility::formatHexNum(msg.data[i])); reply.append(Utility::formatHexNum(data[i]));
} }
nodePositive->setText(0, reply); nodePositive->setText(0, reply);
nodePositive->setForeground(0, QBrush(Qt::darkGreen)); nodePositive->setForeground(0, QBrush(Qt::darkGreen));
@@ -387,12 +389,12 @@ void UDSScanWindow::gotUDSReply(UDS_MESSAGE msg)
} }
else if ( msg.isErrorReply && (msg.service == sendingFrames[currIdx].service) ) else if ( msg.isErrorReply && (msg.service == sendingFrames[currIdx].service) )
{ {
if (msg.data.length()) if (dataLen)
{ {
setupNodes(id); setupNodes(id);
QTreeWidgetItem *nodeNegative = new QTreeWidgetItem(); QTreeWidgetItem *nodeNegative = new QTreeWidgetItem();
qDebug() << ui->spinNumBytes->value(); qDebug() << ui->spinNumBytes->value();
nodeNegative->setText(0, "NEGATIVE - " + udsHandler->getNegativeResponseShort(msg.data[0])); nodeNegative->setText(0, "NEGATIVE - " + udsHandler->getNegativeResponseShort(data[0]));
nodeNegative->setForeground(0, QBrush(Qt::darkRed)); nodeNegative->setForeground(0, QBrush(Qt::darkRed));
nodeSubFunc->addChild(nodeNegative); nodeSubFunc->addChild(nodeNegative);
nodeSubFunc->setForeground(0, QBrush(Qt::darkRed)); nodeSubFunc->setForeground(0, QBrush(Qt::darkRed));
@@ -413,10 +415,10 @@ void UDSScanWindow::setupNodes(uint32_t replyID)
if (serviceShortName.length() < 3) serviceShortName = QString::number(sendingFrames[currIdx].service, 16); if (serviceShortName.length() < 3) serviceShortName = QString::number(sendingFrames[currIdx].service, 16);
QTreeWidgetItem *replyNode = nullptr; QTreeWidgetItem *replyNode = nullptr;
if (!nodeID || nodeID->text(0) != Utility::formatHexNum(sendingFrames[currIdx].ID)) if (!nodeID || nodeID->text(0) != Utility::formatHexNum(sendingFrames[currIdx].frameId()))
{ {
nodeID = new QTreeWidgetItem(); nodeID = new QTreeWidgetItem();
nodeID->setText(0, Utility::formatHexNum(sendingFrames[currIdx].ID)); nodeID->setText(0, Utility::formatHexNum(sendingFrames[currIdx].frameId()));
ui->treeResults->addTopLevelItem(nodeID); ui->treeResults->addTopLevelItem(nodeID);
nodeService = nullptr; nodeService = nullptr;
} }
+32 -27
View File
@@ -236,7 +236,7 @@ void CANScriptHelper::sendFrame(QJSValue bus, QJSValue id, QJSValue length, QJSV
if (!data.isArray()) qDebug() << "data isn't an array"; if (!data.isArray()) qDebug() << "data isn't an array";
for (unsigned int i = 0; i < bytes.length(); i++) for (int i = 0; i < bytes.length(); i++)
{ {
bytes[i] = (uint8_t)data.property(i).toInt(); bytes[i] = (uint8_t)data.property(i).toInt();
} }
@@ -254,15 +254,19 @@ void CANScriptHelper::gotTargettedFrame(const CANFrame &frame)
{ {
if (!gotFrameFunction.isCallable()) return; //nothing to do if we can't even call the function if (!gotFrameFunction.isCallable()) return; //nothing to do if we can't even call the function
//qDebug() << "Got frame in script interface"; //qDebug() << "Got frame in script interface";
unsigned char *data = reinterpret_cast<unsigned char *>(frame.payload().data());
int dataLen = frame.payload().length();
for (int i = 0; i < filters.length(); i++) for (int i = 0; i < filters.length(); i++)
{ {
if (filters[i].checkFilter(frame.frameId(), frame.bus)) if (filters[i].checkFilter(frame.frameId(), frame.bus))
{ {
QJSValueList args; QJSValueList args;
args << frame.bus << frame.frameId() << frame.payload().length(); args << frame.bus << frame.frameId() << frame.payload().length();
QJSValue dataBytes = scriptEngine->newArray(frame.payload().length()); QJSValue dataBytes = scriptEngine->newArray(dataLen);
for (unsigned int j = 0; j < frame.payload().length(); j++) dataBytes.setProperty(j, QJSValue((unsigned char)frame.payload()[j])); for (int j = 0; j < dataLen; j++) dataBytes.setProperty(j, QJSValue(data[j]));
args.append(dataBytes); args.append(dataBytes);
gotFrameFunction.call(args); gotFrameFunction.call(args);
return; //as soon as one filter matches we jump out return; //as soon as one filter matches we jump out
@@ -299,26 +303,29 @@ void ISOTPScriptHelper::setFilter(QJSValue id, QJSValue mask, QJSValue bus)
handler->addFilter(busVal, idVal, maskVal); handler->addFilter(busVal, idVal, maskVal);
} }
void ISOTPScriptHelper::sendISOTP(QJSValue bus, QJSValue id, QJSValue length, QJSValue data) void ISOTPScriptHelper::sendISOTP(QJSValue bus, QJSValue id, QJSValue length, QJSValue dataBytes)
{ {
ISOTP_MESSAGE msg; ISOTP_MESSAGE msg;
msg.extended = false; msg.setExtendedFrameFormat(false);
msg.ID = id.toInt(); msg.setFrameId(id.toUInt());
msg.len = length.toUInt(); msg.payload().resize(length.toInt());
if (!data.isArray()) qDebug() << "data isn't an array"; unsigned char *data = reinterpret_cast<unsigned char *>(msg.payload().data());
int dataLen = msg.payload().length();
for (int i = 0; i < msg.len; i++) if (!dataBytes.isArray()) qDebug() << "data isn't an array";
for (int i = 0; i < dataLen; i++)
{ {
msg.data[i] = static_cast<uint8_t>(data.property(i).toInt()); data[i] = static_cast<uint8_t>(dataBytes.property(i).toInt());
} }
msg.bus = bus.toInt(); msg.bus = bus.toInt();
if (msg.ID > 0x7FF) msg.extended = true; if (msg.frameId() > 0x7FF) msg.setExtendedFrameFormat(true);
qDebug() << "sending isotp message from script"; qDebug() << "sending isotp message from script";
handler->sendISOTPFrame(msg.bus, msg.ID, msg.data); handler->sendISOTPFrame(msg.bus, msg.frameId(), msg.payload());
} }
void ISOTPScriptHelper::setRxCallback(QJSValue cb) void ISOTPScriptHelper::setRxCallback(QJSValue cb)
@@ -333,10 +340,10 @@ void ISOTPScriptHelper::newISOMessage(ISOTP_MESSAGE msg)
//qDebug() << "Got frame in script interface"; //qDebug() << "Got frame in script interface";
QJSValueList args; QJSValueList args;
args << msg.bus << msg.ID << msg.len; args << msg.bus << msg.frameId() << msg.payload().length();
QJSValue dataBytes = scriptEngine->newArray(static_cast<uint>(msg.len)); QJSValue dataBytes = scriptEngine->newArray(static_cast<uint>(msg.payload().length()));
for (int j = 0; j < msg.len; j++) dataBytes.setProperty(static_cast<quint32>(j), QJSValue(msg.data[j])); for (int j = 0; j < msg.payload().length(); j++) dataBytes.setProperty(static_cast<quint32>(j), QJSValue((unsigned char)msg.payload()[j]));
args.append(dataBytes); args.append(dataBytes);
gotFrameFunction.call(args); gotFrameFunction.call(args);
} }
@@ -373,25 +380,23 @@ 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) void UDSScriptHelper::sendUDS(QJSValue bus, QJSValue id, QJSValue service, QJSValue sublen, QJSValue subFunc, QJSValue length, QJSValue data)
{ {
UDS_MESSAGE msg; UDS_MESSAGE msg;
msg.extended = false; msg.setExtendedFrameFormat(false);
msg.ID = id.toUInt(); msg.setFrameId( id.toUInt() );
msg.len = length.toUInt(); msg.payload().resize(length.toUInt());
msg.service = service.toUInt(); msg.service = service.toUInt();
msg.subFuncLen = sublen.toUInt(); msg.subFuncLen = sublen.toUInt();
msg.subFunc = subFunc.toUInt(); msg.subFunc = subFunc.toUInt();
if (!data.isArray()) qDebug() << "data isn't an array"; if (!data.isArray()) qDebug() << "data isn't an array";
msg.data.reserve(msg.len); for (int i = 0; i < msg.payload().length(); i++)
for (int i = 0; i < msg.len; i++)
{ {
msg.data.append(static_cast<uint8_t>(data.property(static_cast<quint32>(i)).toInt())); msg.payload().append(static_cast<uint8_t>(data.property(static_cast<quint32>(i)).toInt()));
} }
msg.bus = bus.toInt(); msg.bus = bus.toInt();
if (msg.ID > 0x7FF) msg.extended = true; if (msg.frameId() > 0x7FF) msg.setExtendedFrameFormat( true );
qDebug() << "sending UDS message from script"; qDebug() << "sending UDS message from script";
@@ -406,15 +411,15 @@ void UDSScriptHelper::setRxCallback(QJSValue cb)
void UDSScriptHelper::newUDSMessage(UDS_MESSAGE msg) void UDSScriptHelper::newUDSMessage(UDS_MESSAGE msg)
{ {
//qDebug() << "udsScriptHelper got a UDS message"; //qDebug() << "udsScriptHelper got a UDS message";
qDebug() << "UDS script helper. Msg data len: " << msg.len; qDebug() << "UDS script helper. Msg data len: " << msg.payload().length();
if (!gotFrameFunction.isCallable()) return; //nothing to do if we can't even call the function if (!gotFrameFunction.isCallable()) return; //nothing to do if we can't even call the function
qDebug() << "Got frame in script interface"; qDebug() << "Got frame in script interface";
QJSValueList args; QJSValueList args;
args << msg.bus << msg.ID << msg.service << msg.subFunc << msg.len; args << msg.bus << msg.frameId() << msg.service << msg.subFunc << msg.payload().length();
QJSValue dataBytes = scriptEngine->newArray(static_cast<unsigned int>(msg.len)); QJSValue dataBytes = scriptEngine->newArray(static_cast<unsigned int>(msg.payload().length()));
for (int j = 0; j < msg.data.length(); j++) dataBytes.setProperty(static_cast<quint32>(j), QJSValue(msg.data[j])); for (int j = 0; j < msg.payload().length(); j++) dataBytes.setProperty(static_cast<quint32>(j), QJSValue((unsigned char)msg.payload()[j]));
args.append(dataBytes); args.append(dataBytes);
gotFrameFunction.call(args); gotFrameFunction.call(args);
} }
-1
View File
@@ -18,7 +18,6 @@ ScriptingWindow::ScriptingWindow(const QVector<CANFrame> *frames, QWidget *paren
editor = new JSEdit(); editor = new JSEdit();
editor->setFrameShape(JSEdit::NoFrame); editor->setFrameShape(JSEdit::NoFrame);
editor->setWordWrapMode(QTextOption::NoWrap); editor->setWordWrapMode(QTextOption::NoWrap);
editor->setTabStopWidth(4);
editor->setEnabled(false); editor->setEnabled(false);
editor->setFont(QFont("Monospace", 12)); editor->setFont(QFont("Monospace", 12));
editor->show(); editor->show();
-9
View File
@@ -97,15 +97,6 @@ public:
else return formatHexNum(value); 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) static QString formatCANID(uint64_t id, bool extended)
{ {
if (decimalMode) return QString::number(id, 10); if (decimalMode) return QString::number(id, 10);