Merge branch 'master' of github.com:collin80/SavvyCAN into WIP
This commit is contained in:
+9
-1
@@ -4,6 +4,8 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QtEndian>
|
#include <QtEndian>
|
||||||
|
|
||||||
|
#define BLF_REMOTE_FLAG 0x80
|
||||||
|
|
||||||
BLFHandler::BLFHandler()
|
BLFHandler::BLFHandler()
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -85,8 +87,14 @@ bool BLFHandler::loadBLF(QString filename, QVector<CANFrame>* frames)
|
|||||||
frame.ID = canObject.id & 0x1FFFFFFFull;
|
frame.ID = canObject.id & 0x1FFFFFFFull;
|
||||||
frame.isReceived = true;
|
frame.isReceived = true;
|
||||||
frame.len = canObject.dlc;
|
frame.len = canObject.dlc;
|
||||||
frame.timestamp = obj.header.uncompSize / 100000.0; //uncompsize field also used for timestamp oddly enough
|
|
||||||
|
if (canObject.flags & BLF_REMOTE_FLAG) {
|
||||||
|
frame.remote = true;
|
||||||
|
} else {
|
||||||
|
frame.remote = false;
|
||||||
for (int i = 0; i < 8; i++) frame.data[i] = canObject.data[i];
|
for (int i = 0; i < 8; i++) frame.data[i] = canObject.data[i];
|
||||||
|
}
|
||||||
|
frame.timestamp = obj.header.uncompSize / 1000000.0; //uncompsize field also used for timestamp oddly enough
|
||||||
frames->append(frame);
|
frames->append(frame);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -51,6 +51,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, QVector<unsigned char> data)
|
||||||
{
|
{
|
||||||
CANFrame frame;
|
CANFrame frame;
|
||||||
|
frame.remote = false;
|
||||||
int currByte = 0;
|
int currByte = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
if (bus < 0) return;
|
if (bus < 0) return;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ public:
|
|||||||
uint32_t ID;
|
uint32_t ID;
|
||||||
uint32_t bus;
|
uint32_t bus;
|
||||||
bool extended;
|
bool extended;
|
||||||
|
bool remote;
|
||||||
bool isReceived; //did we receive this or send it?
|
bool isReceived; //did we receive this or send it?
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
unsigned char data[8];
|
unsigned char data[8];
|
||||||
|
|||||||
+26
-12
@@ -6,6 +6,18 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
|
|
||||||
|
enum class Column {
|
||||||
|
TimeStamp = 0, ///< The timestamp when the frame was transmitted or received
|
||||||
|
FrameId = 1, ///< The frames CAN identifier (Standard: 11 or Extended: 29 bit)
|
||||||
|
Extended = 2, ///< True if the frames CAN identifier is 29 bit
|
||||||
|
Remote = 3, ///< True if the frames is a remote frame
|
||||||
|
Direction = 4, ///< Whether the frame was transmitted or received
|
||||||
|
Bus = 5, ///< The bus where the frame was transmitted or received
|
||||||
|
Length = 6, ///< The frames payload data length
|
||||||
|
ASCII = 7, ///< The payload interpreted as ASCII characters
|
||||||
|
Data = 8, ///< The frames payload data
|
||||||
|
NUM_COLUMN
|
||||||
|
};
|
||||||
|
|
||||||
CANFrameModel::~CANFrameModel()
|
CANFrameModel::~CANFrameModel()
|
||||||
{
|
{
|
||||||
@@ -40,7 +52,7 @@ int CANFrameModel::totalFrameCount()
|
|||||||
int CANFrameModel::columnCount(const QModelIndex &index) const
|
int CANFrameModel::columnCount(const QModelIndex &index) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(index);
|
Q_UNUSED(index);
|
||||||
return 8;
|
return (int)Column::NUM_COLUMN;
|
||||||
}
|
}
|
||||||
|
|
||||||
CANFrameModel::CANFrameModel(QObject *parent)
|
CANFrameModel::CANFrameModel(QObject *parent)
|
||||||
@@ -215,17 +227,6 @@ void CANFrameModel::recalcOverwrite()
|
|||||||
mutex.unlock();
|
mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class Column {
|
|
||||||
TimeStamp = 0, ///< The timestamp when the frame was transmitted or received
|
|
||||||
FrameId = 1, ///< The frames CAN identifier (Standard: 11 or Extended: 29 bit)
|
|
||||||
Extended = 2, ///< True if the frames CAN identifier is 29 bit
|
|
||||||
Direction = 3, ///< Whether the frame was transmitted or received
|
|
||||||
Bus = 4, ///< The bus where the frame was transmitted or received
|
|
||||||
Length = 5, ///< The frames payload data length
|
|
||||||
ASCII = 6, ///< The payload interpreted as ASCII characters
|
|
||||||
Data = 7 ///< The frames payload data
|
|
||||||
};
|
|
||||||
|
|
||||||
QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
int dLen;
|
int dLen;
|
||||||
@@ -276,6 +277,8 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
return Utility::formatCANID(thisFrame.ID, thisFrame.extended);
|
return Utility::formatCANID(thisFrame.ID, thisFrame.extended);
|
||||||
case Column::Extended:
|
case Column::Extended:
|
||||||
return QString::number(thisFrame.extended);
|
return QString::number(thisFrame.extended);
|
||||||
|
case Column::Remote:
|
||||||
|
return QString::number(thisFrame.remote);
|
||||||
case Column::Direction:
|
case Column::Direction:
|
||||||
if (thisFrame.isReceived) return QString(tr("Rx"));
|
if (thisFrame.isReceived) return QString(tr("Rx"));
|
||||||
return QString(tr("Tx"));
|
return QString(tr("Tx"));
|
||||||
@@ -291,6 +294,7 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
return tempString;
|
return tempString;
|
||||||
}
|
}
|
||||||
dLen = thisFrame.len;
|
dLen = thisFrame.len;
|
||||||
|
if (!thisFrame.remote) {
|
||||||
if (dLen < 0) dLen = 0;
|
if (dLen < 0) dLen = 0;
|
||||||
if (dLen > 8) dLen = 8;
|
if (dLen > 8) dLen = 8;
|
||||||
for (int i = 0; i < dLen; i++)
|
for (int i = 0; i < dLen; i++)
|
||||||
@@ -300,12 +304,16 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
if (byt > 0x7E) byt = 0x2E;
|
if (byt > 0x7E) byt = 0x2E;
|
||||||
tempString.append(QString::fromUtf8((char *)&byt, 1));
|
tempString.append(QString::fromUtf8((char *)&byt, 1));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return tempString;
|
return tempString;
|
||||||
case Column::Data:
|
case Column::Data:
|
||||||
dLen = thisFrame.len;
|
dLen = thisFrame.len;
|
||||||
if (dLen < 0) dLen = 0;
|
if (dLen < 0) dLen = 0;
|
||||||
if (dLen > 8) dLen = 8;
|
if (dLen > 8) dLen = 8;
|
||||||
//if (useHexMode) tempString.append("0x ");
|
//if (useHexMode) tempString.append("0x ");
|
||||||
|
if (thisFrame.remote) {
|
||||||
|
return tempString;
|
||||||
|
}
|
||||||
for (int i = 0; i < dLen; i++)
|
for (int i = 0; i < dLen; i++)
|
||||||
{
|
{
|
||||||
if (useHexMode) tempString.append( QString::number(thisFrame.data[i], 16).toUpper().rightJustified(2, '0'));
|
if (useHexMode) tempString.append( QString::number(thisFrame.data[i], 16).toUpper().rightJustified(2, '0'));
|
||||||
@@ -332,6 +340,8 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tempString;
|
return tempString;
|
||||||
|
default:
|
||||||
|
return tempString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,6 +364,8 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation,
|
|||||||
return QString(tr("ID"));
|
return QString(tr("ID"));
|
||||||
case Column::Extended:
|
case Column::Extended:
|
||||||
return QString(tr("Ext"));
|
return QString(tr("Ext"));
|
||||||
|
case Column::Remote:
|
||||||
|
return QString(tr("Rem"));
|
||||||
case Column::Direction:
|
case Column::Direction:
|
||||||
return QString(tr("Dir"));
|
return QString(tr("Dir"));
|
||||||
case Column::Bus:
|
case Column::Bus:
|
||||||
@@ -364,6 +376,8 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation,
|
|||||||
return QString(tr("ASCII"));
|
return QString(tr("ASCII"));
|
||||||
case Column::Data:
|
case Column::Data:
|
||||||
return QString(tr("Data"));
|
return QString(tr("Data"));
|
||||||
|
default:
|
||||||
|
return QString("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -504,8 +504,6 @@ CANConnection* ConnectionWindow::create(CANCon::type pTye, QString pPortName)
|
|||||||
|
|
||||||
void ConnectionWindow::loadConnections()
|
void ConnectionWindow::loadConnections()
|
||||||
{
|
{
|
||||||
qRegisterMetaTypeStreamOperators<QVector<QString>>();
|
|
||||||
qRegisterMetaTypeStreamOperators<QVector<int>>();
|
|
||||||
qRegisterMetaTypeStreamOperators<CANBus>();
|
qRegisterMetaTypeStreamOperators<CANBus>();
|
||||||
qRegisterMetaTypeStreamOperators<QList<CANBus>>();
|
qRegisterMetaTypeStreamOperators<QList<CANBus>>();
|
||||||
|
|
||||||
|
|||||||
@@ -230,6 +230,11 @@ bool GVRetSerial::piSendFrame(const CANFrame& frame)
|
|||||||
if (!serial->isOpen()) return false;
|
if (!serial->isOpen()) return false;
|
||||||
//if (!isConnected) return false;
|
//if (!isConnected) return false;
|
||||||
|
|
||||||
|
// Doesn't make sense to send an error frame
|
||||||
|
// to an adapter
|
||||||
|
if (frame.ID & 0x20000000) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
ID = frame.ID;
|
ID = frame.ID;
|
||||||
if (frame.extended) ID |= 1 << 31;
|
if (frame.extended) ID |= 1 << 31;
|
||||||
|
|
||||||
@@ -641,6 +646,7 @@ void GVRetSerial::procRXChar(unsigned char c)
|
|||||||
//qDebug() << "GVRET got frame on bus " << frame_p->bus;
|
//qDebug() << "GVRET got frame on bus " << frame_p->bus;
|
||||||
/* copy frame */
|
/* copy frame */
|
||||||
*frame_p = buildFrame;
|
*frame_p = buildFrame;
|
||||||
|
frame_p->remote = false;
|
||||||
checkTargettedFrame(buildFrame);
|
checkTargettedFrame(buildFrame);
|
||||||
/* enqueue frame */
|
/* enqueue frame */
|
||||||
getQueue().queue();
|
getQueue().queue();
|
||||||
|
|||||||
@@ -117,9 +117,13 @@ bool SerialBusConnection::piSendFrame(const CANFrame& pFrame)
|
|||||||
QCanBusFrame frame;
|
QCanBusFrame frame;
|
||||||
frame.setFrameId(pFrame.ID);
|
frame.setFrameId(pFrame.ID);
|
||||||
frame.setExtendedFrameFormat(pFrame.extended);
|
frame.setExtendedFrameFormat(pFrame.extended);
|
||||||
|
if (pFrame.remote) {
|
||||||
|
frame.setFrameType(QCanBusFrame::FrameType::RemoteRequestFrame);
|
||||||
|
} else {
|
||||||
|
frame.setFrameType(QCanBusFrame::FrameType::DataFrame);
|
||||||
|
}
|
||||||
frame.setPayload(QByteArray(reinterpret_cast<const char *>(pFrame.data),
|
frame.setPayload(QByteArray(reinterpret_cast<const char *>(pFrame.data),
|
||||||
static_cast<int>(pFrame.len)));
|
static_cast<int>(pFrame.len)));
|
||||||
|
|
||||||
return mDev_p->writeFrame(frame);
|
return mDev_p->writeFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,9 +191,47 @@ void SerialBusConnection::framesReceived()
|
|||||||
if(frame_p) {
|
if(frame_p) {
|
||||||
frame_p->len = static_cast<uint32_t>(recFrame.payload().length());
|
frame_p->len = static_cast<uint32_t>(recFrame.payload().length());
|
||||||
frame_p->bus = 0;
|
frame_p->bus = 0;
|
||||||
memcpy(frame_p->data, recFrame.payload().data(), frame_p->len);
|
|
||||||
|
if (recFrame.frameType() == QCanBusFrame::ErrorFrame) {
|
||||||
|
// Constants defined in include/uapi/linux/can/error.h
|
||||||
|
switch (recFrame.error()) {
|
||||||
|
case QCanBusFrame::TransmissionTimeoutError:
|
||||||
|
frame_p->ID = 0x20000001;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::LostArbitrationError:
|
||||||
|
frame_p->ID = 0x20000002;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::ControllerError:
|
||||||
|
frame_p->ID = 0x20000004;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::ProtocolViolationError:
|
||||||
|
frame_p->ID = 0x20000008;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::TransceiverError:
|
||||||
|
frame_p->ID = 0x20000010;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::MissingAcknowledgmentError:
|
||||||
|
frame_p->ID = 0x20000020;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::BusOffError:
|
||||||
|
frame_p->ID = 0x20000040;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::BusError:
|
||||||
|
frame_p->ID = 0x20000080;
|
||||||
|
break;
|
||||||
|
case QCanBusFrame::ControllerRestartError:
|
||||||
|
frame_p->ID = 0x20000100;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
frame_p->extended = true;
|
||||||
|
} else {
|
||||||
frame_p->extended = recFrame.hasExtendedFrameFormat();
|
frame_p->extended = recFrame.hasExtendedFrameFormat();
|
||||||
frame_p->ID = recFrame.frameId();
|
frame_p->ID = recFrame.frameId();
|
||||||
|
memcpy(frame_p->data, recFrame.payload().data(), frame_p->len);
|
||||||
|
}
|
||||||
|
|
||||||
frame_p->isReceived = true;
|
frame_p->isReceived = true;
|
||||||
if (useSystemTime) {
|
if (useSystemTime) {
|
||||||
frame_p->timestamp = QDateTime::currentMSecsSinceEpoch() * 1000ul;
|
frame_p->timestamp = QDateTime::currentMSecsSinceEpoch() * 1000ul;
|
||||||
|
|||||||
+78
-12
@@ -551,8 +551,17 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
thisFrame.len = line.mid(38,1).toInt();
|
thisFrame.len = line.mid(38,1).toInt();
|
||||||
thisFrame.isReceived = true;
|
thisFrame.isReceived = true;
|
||||||
thisFrame.bus = 0;
|
thisFrame.bus = 0;
|
||||||
|
if (line.at(28) == ' ') {
|
||||||
|
thisFrame.extended = true;
|
||||||
|
} else {
|
||||||
thisFrame.extended = false;
|
thisFrame.extended = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.at(41) == 'R') {
|
||||||
|
thisFrame.remote = true;
|
||||||
|
} else {
|
||||||
QList<QByteArray> tokens = line.mid(41, thisFrame.len * 3).split(' ');
|
QList<QByteArray> tokens = line.mid(41, thisFrame.len * 3).split(' ');
|
||||||
|
thisFrame.remote = false;
|
||||||
for (unsigned int d = 0; d < thisFrame.len; d++)
|
for (unsigned int d = 0; d < thisFrame.len; d++)
|
||||||
{
|
{
|
||||||
if (tokens[d] != "")
|
if (tokens[d] != "")
|
||||||
@@ -561,6 +570,7 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
}
|
}
|
||||||
else thisFrame.data[d] = 0;
|
else thisFrame.data[d] = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
frames->append(thisFrame);
|
frames->append(thisFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -574,8 +584,16 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
qDebug() << thisFrame.len;
|
qDebug() << thisFrame.len;
|
||||||
thisFrame.isReceived = true;
|
thisFrame.isReceived = true;
|
||||||
thisFrame.bus = 0;
|
thisFrame.bus = 0;
|
||||||
|
if (line.at(25) == ' ') {
|
||||||
thisFrame.extended = false;
|
thisFrame.extended = false;
|
||||||
|
} else {
|
||||||
|
thisFrame.extended = true;
|
||||||
|
}
|
||||||
|
if (line.at(40) == 'R') {
|
||||||
|
thisFrame.remote = true;
|
||||||
|
} else {
|
||||||
QList<QByteArray> tokens = line.mid(40, thisFrame.len * 3).split(' ');
|
QList<QByteArray> tokens = line.mid(40, thisFrame.len * 3).split(' ');
|
||||||
|
thisFrame.remote = false;
|
||||||
for (unsigned int d = 0; d < thisFrame.len; d++)
|
for (unsigned int d = 0; d < thisFrame.len; d++)
|
||||||
{
|
{
|
||||||
if (tokens[d] != "")
|
if (tokens[d] != "")
|
||||||
@@ -584,6 +602,7 @@ bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
}
|
}
|
||||||
else thisFrame.data[d] = 0;
|
else thisFrame.data[d] = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
frames->append(thisFrame);
|
frames->append(thisFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -610,6 +629,7 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector<CANFrame>* frames)
|
|||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
bool inHeader = true;
|
bool inHeader = true;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -640,6 +660,7 @@ bool FrameFileIO::loadCanalyzerASC(QString filename, QVector<CANFrame>* frames)
|
|||||||
thisFrame.isReceived = tokens[3].toUpper().contains("RX");
|
thisFrame.isReceived = tokens[3].toUpper().contains("RX");
|
||||||
thisFrame.bus = tokens[1].toUInt();
|
thisFrame.bus = tokens[1].toUInt();
|
||||||
thisFrame.extended = (thisFrame.ID > 0x7FF);
|
thisFrame.extended = (thisFrame.ID > 0x7FF);
|
||||||
|
thisFrame.remote = false;
|
||||||
for (unsigned int d = 6; d < (6 + thisFrame.len); d++)
|
for (unsigned int d = 6; d < (6 + thisFrame.len); d++)
|
||||||
{
|
{
|
||||||
if (tokens.count() > d)
|
if (tokens.count() > d)
|
||||||
@@ -677,6 +698,7 @@ bool FrameFileIO::loadNativeCSVFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
long long timeStamp = Utility::GetTimeMS();
|
long long timeStamp = Utility::GetTimeMS();
|
||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -899,6 +921,7 @@ bool FrameFileIO::loadGenericCSVFile(QString filename, QVector<CANFrame>* frames
|
|||||||
long long timeStamp = Utility::GetTimeMS();
|
long long timeStamp = Utility::GetTimeMS();
|
||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -989,7 +1012,7 @@ tokens:
|
|||||||
1 = Transmission direction
|
1 = Transmission direction
|
||||||
2 = Channel
|
2 = Channel
|
||||||
3 = ID
|
3 = ID
|
||||||
4 = Type (s = standard, I believe x = extended)
|
4 = Type (s = standard, x = extended, sr = standard remote, xr = extended remote)
|
||||||
5 = Data byte length
|
5 = Data byte length
|
||||||
6-x = The data bytes
|
6-x = The data bytes
|
||||||
|
|
||||||
@@ -1053,12 +1076,26 @@ bool FrameFileIO::loadLogFile(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.ID = tokens[3].right(tokens[3].length() - 2).toInt(NULL, 16);
|
thisFrame.ID = tokens[3].right(tokens[3].length() - 2).toInt(NULL, 16);
|
||||||
if (tokens[4] == "s") thisFrame.extended = false;
|
if (tokens[4] == "S") {
|
||||||
else thisFrame.extended = true;
|
thisFrame.extended = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
} else if (tokens[4] == "X") {
|
||||||
|
thisFrame.extended = true;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
} else if (tokens[4] == "SR") {
|
||||||
|
thisFrame.extended = false;
|
||||||
|
thisFrame.remote = true;
|
||||||
|
} else { // XR
|
||||||
|
thisFrame.extended = true;
|
||||||
|
thisFrame.remote = true;
|
||||||
|
}
|
||||||
thisFrame.bus = tokens[2].toInt() - 1;
|
thisFrame.bus = tokens[2].toInt() - 1;
|
||||||
thisFrame.len = tokens[5].toUInt();
|
thisFrame.len = tokens[5].toUInt();
|
||||||
if (thisFrame.len > 8) thisFrame.len = 8;
|
if (thisFrame.len > 8) thisFrame.len = 8;
|
||||||
for (unsigned int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = tokens[d + 6].toInt(NULL, 16);
|
if (!thisFrame.remote) {
|
||||||
|
for (unsigned int d = 0; d < thisFrame.len; d++)
|
||||||
|
thisFrame.data[d] = tokens[d + 6].toInt(NULL, 16);
|
||||||
|
}
|
||||||
frames->append(thisFrame);
|
frames->append(thisFrame);
|
||||||
}
|
}
|
||||||
else foundErrors = true;
|
else foundErrors = true;
|
||||||
@@ -1083,7 +1120,7 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector<CANFrame>* frames)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
outFile->write("***BUSMASTER Ver 2.4.0***\n");
|
outFile->write("***BUSMASTER Ver 3.2.0***\n");
|
||||||
outFile->write("***PROTOCOL CAN***\n");
|
outFile->write("***PROTOCOL CAN***\n");
|
||||||
outFile->write("***NOTE: PLEASE DO NOT EDIT THIS DOCUMENT***\n");
|
outFile->write("***NOTE: PLEASE DO NOT EDIT THIS DOCUMENT***\n");
|
||||||
outFile->write("***[START LOGGING SESSION]***\n");
|
outFile->write("***[START LOGGING SESSION]***\n");
|
||||||
@@ -1095,8 +1132,8 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector<CANFrame>* frames)
|
|||||||
outFile->write("***START CHANNEL BAUD RATE***\n");
|
outFile->write("***START CHANNEL BAUD RATE***\n");
|
||||||
outFile->write("***CHANNEL 1 - Kvaser - Kvaser Leaf Light HS #0 (Channel 0), Serial Number- 0, Firmware- 0x00000037 0x00020000 - 500000 bps***\n");
|
outFile->write("***CHANNEL 1 - Kvaser - Kvaser Leaf Light HS #0 (Channel 0), Serial Number- 0, Firmware- 0x00000037 0x00020000 - 500000 bps***\n");
|
||||||
outFile->write("***END CHANNEL BAUD RATE***\n");
|
outFile->write("***END CHANNEL BAUD RATE***\n");
|
||||||
outFile->write("***START DATABASE FILES (DBF/DBC)***\n");
|
outFile->write("***START DATABASE FILES***\n");
|
||||||
outFile->write("***END OF DATABASE FILES (DBF/DBC)***\n");
|
outFile->write("***END OF DATABASE FILES***\n");
|
||||||
outFile->write("***<Time><Tx/Rx><Channel><CAN ID><Type><DLC><DataBytes>***\n");
|
outFile->write("***<Time><Tx/Rx><Channel><CAN ID><Type><DLC><DataBytes>***\n");
|
||||||
|
|
||||||
for (int c = 0; c < frames->count(); c++)
|
for (int c = 0; c < frames->count(); c++)
|
||||||
@@ -1109,20 +1146,30 @@ bool FrameFileIO::saveLogFile(QString filename, const QVector<CANFrame>* frames)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timestamp / 1000);
|
tempStamp = QDateTime::fromMSecsSinceEpoch(frames->at(c).timestamp / 1000);
|
||||||
outFile->write(tempStamp.toString("h:m:s:z").toUtf8());
|
outFile->write(tempStamp.toString("hh:mm:ss:zzz").toUtf8());
|
||||||
if (frames->at(c).isReceived) outFile->write(" Rx ");
|
if (frames->at(c).isReceived) outFile->write(" Rx ");
|
||||||
else outFile->write(" Tx ");
|
else outFile->write(" Tx ");
|
||||||
outFile->write(QString::number(frames->at(c).bus).toUtf8() + " ");
|
// busmaster channel start at 1
|
||||||
|
outFile->write(QString::number(frames->at(c).bus+1).toUtf8() + " ");
|
||||||
|
outFile->write("0x");
|
||||||
|
if (frames->at(c).extended && frames->at(c).ID > 0x7FF) {
|
||||||
outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8());
|
outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(8, '0').toUtf8());
|
||||||
|
} else {
|
||||||
|
outFile->write(QString::number(frames->at(c).ID, 16).toUpper().rightJustified(3, '0').toUtf8());
|
||||||
|
}
|
||||||
if (frames->at(c).extended) outFile->write(" x");
|
if (frames->at(c).extended) outFile->write(" x");
|
||||||
else outFile->write(" s");
|
else outFile->write(" s");
|
||||||
|
if (frames->at(c).remote) outFile->write("r ");
|
||||||
|
else outFile->write(" ");
|
||||||
outFile->write(QString::number(frames->at(c).len).toUtf8() + " ");
|
outFile->write(QString::number(frames->at(c).len).toUtf8() + " ");
|
||||||
|
|
||||||
|
if (!frames->at(c).remote) {
|
||||||
for (unsigned int temp = 0; temp < frames->at(c).len; temp++)
|
for (unsigned int temp = 0; temp < frames->at(c).len; temp++)
|
||||||
{
|
{
|
||||||
outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
|
outFile->write(QString::number(frames->at(c).data[temp], 16).toUpper().rightJustified(2, '0').toUtf8());
|
||||||
outFile->putChar(' ');
|
outFile->putChar(' ');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
outFile->write("\n");
|
outFile->write("\n");
|
||||||
|
|
||||||
@@ -1141,6 +1188,7 @@ bool FrameFileIO::loadIXXATFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
uint64_t timeStamp = Utility::GetTimeMS();
|
uint64_t timeStamp = Utility::GetTimeMS();
|
||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -1268,6 +1316,7 @@ bool FrameFileIO::loadCANDOFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
int timeOffset = 0;
|
int timeOffset = 0;
|
||||||
uint64_t lastTimeStamp = 0;
|
uint64_t lastTimeStamp = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly))
|
if (!inFile->open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
@@ -1391,6 +1440,7 @@ bool FrameFileIO::loadMicrochipFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
long long timeStamp;
|
long long timeStamp;
|
||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -1547,6 +1597,7 @@ bool FrameFileIO::loadTraceFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
long long timeStamp = 0;
|
long long timeStamp = 0;
|
||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@@ -1719,17 +1770,26 @@ bool FrameFileIO::saveCanDumpFile(QString filename, const QVector<CANFrame> * fr
|
|||||||
outFile->write("(");
|
outFile->write("(");
|
||||||
|
|
||||||
tempTime = frames->at(c).timestamp / 1000000.0;
|
tempTime = frames->at(c).timestamp / 1000000.0;
|
||||||
outFile->write(QString::number(tempTime,'f').toUtf8());
|
outFile->write(QString::number(tempTime,'f', 6).rightJustified(17, '0').toUtf8());
|
||||||
outFile->write(") vcan0 ");
|
outFile->write(") vcan0 ");
|
||||||
|
|
||||||
|
if (frames->at(c).extended) {
|
||||||
|
outFile->write(QString::number(frames->at(c).ID, 16).rightJustified(8,'0').toUpper().toUtf8());
|
||||||
|
} else {
|
||||||
outFile->write(QString::number(frames->at(c).ID, 16).rightJustified(3,'0').toUpper().toUtf8());
|
outFile->write(QString::number(frames->at(c).ID, 16).rightJustified(3,'0').toUpper().toUtf8());
|
||||||
|
}
|
||||||
|
|
||||||
outFile->write("#");
|
outFile->write("#");
|
||||||
|
|
||||||
|
if (frames->at(c).remote) {
|
||||||
|
outFile->write("R");
|
||||||
|
outFile->write(QString::number(frames->at(c).len).toUtf8());
|
||||||
|
} else {
|
||||||
for (unsigned int temp = 0; temp < frames->at(c).len; temp++)
|
for (unsigned int temp = 0; temp < frames->at(c).len; temp++)
|
||||||
{
|
{
|
||||||
outFile->write(QString::number(frames->at(c).data[temp], 16).rightJustified(2,'0').toUpper().toUtf8());
|
outFile->write(QString::number(frames->at(c).data[temp], 16).rightJustified(2,'0').toUpper().toUtf8());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
outFile->write("\n");
|
outFile->write("\n");
|
||||||
|
|
||||||
@@ -1784,7 +1844,6 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
if(!ret) continue;
|
if(!ret) continue;
|
||||||
|
|
||||||
/* ID */
|
/* ID */
|
||||||
qDebug() << IdValExp.cap(1);
|
|
||||||
thisFrame.ID = IdValExp.cap(1).toInt(&ret, 16);
|
thisFrame.ID = IdValExp.cap(1).toInt(&ret, 16);
|
||||||
if (IdValExp.cap(1).length() > 3) {
|
if (IdValExp.cap(1).length() > 3) {
|
||||||
thisFrame.extended = true;
|
thisFrame.extended = true;
|
||||||
@@ -1796,9 +1855,14 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
QString val= IdValExp.cap(2);
|
QString val= IdValExp.cap(2);
|
||||||
QRegExp valExp("(\\S{2})");
|
QRegExp valExp("(\\S{2})");
|
||||||
|
|
||||||
/* val byte per byte */
|
|
||||||
pos = 0;
|
pos = 0;
|
||||||
thisFrame.len = 0;
|
thisFrame.len = 0;
|
||||||
|
if (val.startsWith("R") && val.at(1).isDigit()) {
|
||||||
|
thisFrame.len = val.at(1).toLatin1() - '0';
|
||||||
|
thisFrame.remote = true;
|
||||||
|
} else {
|
||||||
|
thisFrame.remote = false;
|
||||||
|
/* val byte per byte */
|
||||||
while ((pos = valExp.indexIn(val, pos)) != -1)
|
while ((pos = valExp.indexIn(val, pos)) != -1)
|
||||||
{
|
{
|
||||||
thisFrame.data[thisFrame.len] = valExp.cap(1).toInt(&ret, 16);
|
thisFrame.data[thisFrame.len] = valExp.cap(1).toInt(&ret, 16);
|
||||||
@@ -1807,6 +1871,7 @@ bool FrameFileIO::loadCanDumpFile(QString filename, QVector<CANFrame>* frames)
|
|||||||
thisFrame.len++;
|
thisFrame.len++;
|
||||||
pos += valExp.matchedLength();
|
pos += valExp.matchedLength();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*NB: should we make sure len <= 8? */
|
/*NB: should we make sure len <= 8? */
|
||||||
thisFrame.isReceived = true;
|
thisFrame.isReceived = true;
|
||||||
@@ -1829,6 +1894,7 @@ bool FrameFileIO::loadKvaserFile(QString filename, QVector<CANFrame> *frames, bo
|
|||||||
int lineCounter = 0;
|
int lineCounter = 0;
|
||||||
int base = 10;
|
int base = 10;
|
||||||
bool foundErrors = false;
|
bool foundErrors = false;
|
||||||
|
thisFrame.remote = false;
|
||||||
|
|
||||||
if (useHex) base = 16;
|
if (useHex) base = 16;
|
||||||
|
|
||||||
|
|||||||
+92
-19
@@ -47,16 +47,19 @@ FrameSenderWindow::FrameSenderWindow(const QVector<CANFrame> *frames, QWidget *p
|
|||||||
void FrameSenderWindow::setupGrid()
|
void FrameSenderWindow::setupGrid()
|
||||||
{
|
{
|
||||||
QStringList headers;
|
QStringList headers;
|
||||||
headers << "En" << "Bus" << "ID" << "Len" << "Data" << "Trigger" << "Modifications" << "Count";
|
headers << "En" << "Bus" << "ID" << "Len" << "Ext" << "Rem" << "Data"
|
||||||
ui->tableSender->setColumnCount(8);
|
<< "Trigger" << "Modifications" << "Count";
|
||||||
|
ui->tableSender->setColumnCount(10);
|
||||||
ui->tableSender->setColumnWidth(0, 50);
|
ui->tableSender->setColumnWidth(0, 50);
|
||||||
ui->tableSender->setColumnWidth(1, 50);
|
ui->tableSender->setColumnWidth(1, 50);
|
||||||
ui->tableSender->setColumnWidth(2, 50);
|
ui->tableSender->setColumnWidth(2, 50);
|
||||||
ui->tableSender->setColumnWidth(3, 50);
|
ui->tableSender->setColumnWidth(3, 50);
|
||||||
ui->tableSender->setColumnWidth(4, 220);
|
ui->tableSender->setColumnWidth(4, 50);
|
||||||
ui->tableSender->setColumnWidth(5, 220);
|
ui->tableSender->setColumnWidth(5, 50);
|
||||||
ui->tableSender->setColumnWidth(6, 220);
|
ui->tableSender->setColumnWidth(6, 220);
|
||||||
ui->tableSender->setColumnWidth(7, 80);
|
ui->tableSender->setColumnWidth(7, 220);
|
||||||
|
ui->tableSender->setColumnWidth(8, 220);
|
||||||
|
ui->tableSender->setColumnWidth(9, 80);
|
||||||
ui->tableSender->setHorizontalHeaderLabels(headers);
|
ui->tableSender->setHorizontalHeaderLabels(headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,11 +101,23 @@ void FrameSenderWindow::createBlankRow()
|
|||||||
inhibitChanged = true;
|
inhibitChanged = true;
|
||||||
ui->tableSender->setItem(row, 0, item);
|
ui->tableSender->setItem(row, 0, item);
|
||||||
|
|
||||||
for (int i = 1; i < 8; i++)
|
item = new QTableWidgetItem();
|
||||||
|
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(Qt::Unchecked);
|
||||||
|
ui->tableSender->setItem(row, 4, item);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem();
|
||||||
|
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(Qt::Unchecked);
|
||||||
|
ui->tableSender->setItem(row, 5, item);
|
||||||
|
|
||||||
|
for (int i = 1; i < 10; i++)
|
||||||
{
|
{
|
||||||
|
if (i != 4 && i != 5) {
|
||||||
item = new QTableWidgetItem("");
|
item = new QTableWidgetItem("");
|
||||||
ui->tableSender->setItem(row, i, item);
|
ui->tableSender->setItem(row, i, item);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inhibitChanged = false;
|
inhibitChanged = false;
|
||||||
}
|
}
|
||||||
@@ -290,9 +305,17 @@ void FrameSenderWindow::saveSenderFile(QString filename)
|
|||||||
outString = "T#";
|
outString = "T#";
|
||||||
}
|
}
|
||||||
else outString = "F#";
|
else outString = "F#";
|
||||||
for (int i = 1; i < 7; i++)
|
for (int i = 1; i < 9; i++)
|
||||||
{
|
{
|
||||||
|
if (i == 4 || i == 5) {
|
||||||
|
if (ui->tableSender->item(c, i)->checkState() == Qt::Checked) {
|
||||||
|
outString.append("T");
|
||||||
|
} else {
|
||||||
|
outString.append("F");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
outString.append(ui->tableSender->item(c, i)->text());
|
outString.append(ui->tableSender->item(c, i)->text());
|
||||||
|
}
|
||||||
outString.append("#");
|
outString.append("#");
|
||||||
}
|
}
|
||||||
outString.append("\n");
|
outString.append("\n");
|
||||||
@@ -330,17 +353,43 @@ void FrameSenderWindow::loadSenderFile(QString filename)
|
|||||||
QTableWidgetItem *item = new QTableWidgetItem();
|
QTableWidgetItem *item = new QTableWidgetItem();
|
||||||
ui->tableSender->setItem(row, 0, item);
|
ui->tableSender->setItem(row, 0, item);
|
||||||
ui->tableSender->item(row, 0)->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
ui->tableSender->item(row, 0)->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem();
|
||||||
|
ui->tableSender->setItem(row, 4, item);
|
||||||
|
ui->tableSender->item(row, 4)->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(Qt::Unchecked);
|
||||||
|
|
||||||
|
item = new QTableWidgetItem();
|
||||||
|
ui->tableSender->setItem(row, 5, item);
|
||||||
|
ui->tableSender->item(row, 5)->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(Qt::Unchecked);
|
||||||
|
|
||||||
if (tokens[0] == "T")
|
if (tokens[0] == "T")
|
||||||
{
|
{
|
||||||
ui->tableSender->item(row, 0)->setCheckState(Qt::Checked);
|
ui->tableSender->item(row, 0)->setCheckState(Qt::Checked);
|
||||||
}
|
}
|
||||||
else ui->tableSender->item(row, 0)->setCheckState(Qt::Unchecked);
|
else ui->tableSender->item(row, 0)->setCheckState(Qt::Unchecked);
|
||||||
for (int i = 1; i < 7; i++)
|
if (tokens.length() >= 9) {
|
||||||
|
for (int i = 1; i < 9; i++)
|
||||||
{
|
{
|
||||||
|
if (i != 4 && i != 5) {
|
||||||
ui->tableSender->setItem(row, i, new QTableWidgetItem(QString(tokens[i])));
|
ui->tableSender->setItem(row, i, new QTableWidgetItem(QString(tokens[i])));
|
||||||
|
} else {
|
||||||
|
if (tokens[i] == "T") {
|
||||||
|
ui->tableSender->item(row, i)->setCheckState(Qt::Checked);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui->tableSender->setItem(row, 1, new QTableWidgetItem(QString(tokens[1])));
|
||||||
|
ui->tableSender->setItem(row, 2, new QTableWidgetItem(QString(tokens[2])));
|
||||||
|
ui->tableSender->setItem(row, 3, new QTableWidgetItem(QString(tokens[3])));
|
||||||
|
ui->tableSender->setItem(row, 6, new QTableWidgetItem(QString(tokens[4])));
|
||||||
|
ui->tableSender->setItem(row, 7, new QTableWidgetItem(QString(tokens[5])));
|
||||||
|
ui->tableSender->setItem(row, 8, new QTableWidgetItem(QString(tokens[6])));
|
||||||
}
|
}
|
||||||
inhibitChanged = false;
|
inhibitChanged = false;
|
||||||
for (int k = 0; k < 7; k++) processCellChange(row, k);
|
for (int k = 0; k < 9; k++) processCellChange(row, k);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -523,7 +572,7 @@ void FrameSenderWindow::processModifierText(int line)
|
|||||||
|
|
||||||
//yeah, lots of operations on this one line but it's for a good cause. Removes the convenience English versions of the
|
//yeah, lots of operations on this one line but it's for a good cause. Removes the convenience English versions of the
|
||||||
//logical operators and replaces them with the math equivs. Also uppercases and removes all superfluous whitespace
|
//logical operators and replaces them with the math equivs. Also uppercases and removes all superfluous whitespace
|
||||||
modString = ui->tableSender->item(line, 6)->text().toUpper().trimmed().replace("AND", "&").replace("XOR", "^").replace("OR", "|").replace(" ", "");
|
modString = ui->tableSender->item(line, 8)->text().toUpper().trimmed().replace("AND", "&").replace("XOR", "^").replace("OR", "|").replace(" ", "");
|
||||||
if (modString != "")
|
if (modString != "")
|
||||||
{
|
{
|
||||||
QStringList mods = modString.split(',');
|
QStringList mods = modString.split(',');
|
||||||
@@ -613,7 +662,7 @@ void FrameSenderWindow::processTriggerText(int line)
|
|||||||
//trigger has two levels of syntactic parsing. First you split by comma to get each
|
//trigger has two levels of syntactic parsing. First you split by comma to get each
|
||||||
//actual trigger. Then you split by spaces to get the tokens within each trigger
|
//actual trigger. Then you split by spaces to get the tokens within each trigger
|
||||||
//trigger = ui->tableSender->item(line, 5)->text().toUpper().trimmed().replace(" ", "");
|
//trigger = ui->tableSender->item(line, 5)->text().toUpper().trimmed().replace(" ", "");
|
||||||
trigger = ui->tableSender->item(line, 5)->text().toUpper();
|
trigger = ui->tableSender->item(line, 7)->text().toUpper();
|
||||||
if (trigger != "")
|
if (trigger != "")
|
||||||
{
|
{
|
||||||
QStringList triggers = trigger.split(',');
|
QStringList triggers = trigger.split(',');
|
||||||
@@ -735,15 +784,19 @@ void FrameSenderWindow::updateGridRow(int idx)
|
|||||||
FrameSendData *temp = &sendingData[idx];
|
FrameSendData *temp = &sendingData[idx];
|
||||||
int gridLine = idx;
|
int gridLine = idx;
|
||||||
QString dataString;
|
QString dataString;
|
||||||
QTableWidgetItem *item = ui->tableSender->item(gridLine, 7);
|
QTableWidgetItem *item = ui->tableSender->item(gridLine, 9);
|
||||||
if (item == NULL) item = new QTableWidgetItem();
|
if (item == NULL) item = new QTableWidgetItem();
|
||||||
item->setText(QString::number(temp->count));
|
item->setText(QString::number(temp->count));
|
||||||
|
if (!temp->remote) {
|
||||||
for (unsigned int i = 0; i < temp->len; i++)
|
for (unsigned int i = 0; i < temp->len; i++)
|
||||||
{
|
{
|
||||||
dataString.append(Utility::formatNumber(temp->data[i]));
|
dataString.append(Utility::formatNumber(temp->data[i]));
|
||||||
dataString.append(" ");
|
dataString.append(" ");
|
||||||
}
|
}
|
||||||
ui->tableSender->item(gridLine, 4)->setText(dataString);
|
ui->tableSender->item(gridLine, 6)->setText(dataString);
|
||||||
|
} else {
|
||||||
|
ui->tableSender->item(gridLine, 6)->setText("");
|
||||||
|
}
|
||||||
inhibitChanged = false;
|
inhibitChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -759,6 +812,8 @@ void FrameSenderWindow::processCellChange(int line, int col)
|
|||||||
{
|
{
|
||||||
FrameSendData tempData;
|
FrameSendData tempData;
|
||||||
tempData.enabled = false;
|
tempData.enabled = false;
|
||||||
|
tempData.remote = false;
|
||||||
|
tempData.extended = false;
|
||||||
sendingData.append(tempData);
|
sendingData.append(tempData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -786,8 +841,12 @@ void FrameSenderWindow::processCellChange(int line, int col)
|
|||||||
if (tempVal < 1) tempVal = 1;
|
if (tempVal < 1) tempVal = 1;
|
||||||
if (tempVal > 0x7FFFFFFF) tempVal = 0x7FFFFFFF;
|
if (tempVal > 0x7FFFFFFF) tempVal = 0x7FFFFFFF;
|
||||||
sendingData[line].ID = tempVal;
|
sendingData[line].ID = tempVal;
|
||||||
if (sendingData[line].ID <= 0x7FF) sendingData[line].extended = false;
|
if (sendingData[line].ID > 0x7FF) {
|
||||||
else sendingData[line].extended = true;
|
sendingData[line].extended = true;
|
||||||
|
ui->tableSender->blockSignals(true);
|
||||||
|
ui->tableSender->item(line, 4)->setCheckState(Qt::Checked);
|
||||||
|
ui->tableSender->blockSignals(false);
|
||||||
|
}
|
||||||
qDebug() << "setting ID to " << tempVal;
|
qDebug() << "setting ID to " << tempVal;
|
||||||
break;
|
break;
|
||||||
case 3: //length field
|
case 3: //length field
|
||||||
@@ -796,19 +855,33 @@ void FrameSenderWindow::processCellChange(int line, int col)
|
|||||||
if (tempVal > 8) tempVal = 8;
|
if (tempVal > 8) tempVal = 8;
|
||||||
sendingData[line].len = tempVal;
|
sendingData[line].len = tempVal;
|
||||||
break;
|
break;
|
||||||
case 4: //Data bytes
|
case 4: // Ext
|
||||||
|
if (ui->tableSender->item(line, 4)->checkState() == Qt::Checked) {
|
||||||
|
sendingData[line].extended = true;
|
||||||
|
} else {
|
||||||
|
sendingData[line].extended = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5: // Rem
|
||||||
|
if (ui->tableSender->item(line, 5)->checkState() == Qt::Checked) {
|
||||||
|
sendingData[line].remote = true;
|
||||||
|
} else {
|
||||||
|
sendingData[line].remote = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6: //Data bytes
|
||||||
for (int i = 0; i < 8; i++) sendingData[line].data[i] = 0;
|
for (int i = 0; i < 8; i++) sendingData[line].data[i] = 0;
|
||||||
|
|
||||||
tokens = ui->tableSender->item(line, 4)->text().split(" ");
|
tokens = ui->tableSender->item(line, 6)->text().split(" ");
|
||||||
for (int j = 0; j < tokens.count(); j++)
|
for (int j = 0; j < tokens.count(); j++)
|
||||||
{
|
{
|
||||||
sendingData[line].data[j] = (uint8_t)Utility::ParseStringToNum(tokens[j]);
|
sendingData[line].data[j] = (uint8_t)Utility::ParseStringToNum(tokens[j]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5: //triggers
|
case 7: //triggers
|
||||||
processTriggerText(line);
|
processTriggerText(line);
|
||||||
break;
|
break;
|
||||||
case 6: //modifiers
|
case 8: //modifiers
|
||||||
processModifierText(line);
|
processModifierText(line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-10
@@ -29,6 +29,8 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
ui(new Ui::MainWindow)
|
ui(new Ui::MainWindow)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
qRegisterMetaTypeStreamOperators<QVector<QString>>();
|
||||||
|
qRegisterMetaTypeStreamOperators<QVector<int>>();
|
||||||
|
|
||||||
useHex = true;
|
useHex = true;
|
||||||
|
|
||||||
@@ -281,11 +283,12 @@ void MainWindow::readSettings()
|
|||||||
ui->canFramesView->setColumnWidth(0, settings.value("Main/TimeColumn", 150).toUInt()); //time stamp
|
ui->canFramesView->setColumnWidth(0, settings.value("Main/TimeColumn", 150).toUInt()); //time stamp
|
||||||
ui->canFramesView->setColumnWidth(1, settings.value("Main/IDColumn", 70).toUInt()); //frame ID
|
ui->canFramesView->setColumnWidth(1, settings.value("Main/IDColumn", 70).toUInt()); //frame ID
|
||||||
ui->canFramesView->setColumnWidth(2, settings.value("Main/ExtColumn", 40).toUInt()); //extended
|
ui->canFramesView->setColumnWidth(2, settings.value("Main/ExtColumn", 40).toUInt()); //extended
|
||||||
ui->canFramesView->setColumnWidth(3, settings.value("Main/DirColumn", 40).toUInt()); //direction
|
ui->canFramesView->setColumnWidth(3, settings.value("Main/RemColumn", 40).toUInt()); //remote
|
||||||
ui->canFramesView->setColumnWidth(4, settings.value("Main/BusColumn", 40).toUInt()); //bus
|
ui->canFramesView->setColumnWidth(4, settings.value("Main/DirColumn", 40).toUInt()); //direction
|
||||||
ui->canFramesView->setColumnWidth(5, settings.value("Main/LengthColumn", 40).toUInt()); //length
|
ui->canFramesView->setColumnWidth(5, settings.value("Main/BusColumn", 40).toUInt()); //bus
|
||||||
ui->canFramesView->setColumnWidth(6, settings.value("Main/AsciiColumn", 50).toUInt()); //ascii
|
ui->canFramesView->setColumnWidth(6, settings.value("Main/LengthColumn", 40).toUInt()); //length
|
||||||
ui->canFramesView->setColumnWidth(7, settings.value("Main/DataColumn", 225).toUInt()); //data
|
ui->canFramesView->setColumnWidth(7, settings.value("Main/AsciiColumn", 50).toUInt()); //ascii
|
||||||
|
ui->canFramesView->setColumnWidth(8, settings.value("Main/DataColumn", 225).toUInt()); //data
|
||||||
}
|
}
|
||||||
if (settings.value("Main/AutoScroll", false).toBool())
|
if (settings.value("Main/AutoScroll", false).toBool())
|
||||||
{
|
{
|
||||||
@@ -325,11 +328,12 @@ void MainWindow::writeSettings()
|
|||||||
settings.setValue("Main/TimeColumn", ui->canFramesView->columnWidth(0));
|
settings.setValue("Main/TimeColumn", ui->canFramesView->columnWidth(0));
|
||||||
settings.setValue("Main/IDColumn", ui->canFramesView->columnWidth(1));
|
settings.setValue("Main/IDColumn", ui->canFramesView->columnWidth(1));
|
||||||
settings.setValue("Main/ExtColumn", ui->canFramesView->columnWidth(2));
|
settings.setValue("Main/ExtColumn", ui->canFramesView->columnWidth(2));
|
||||||
settings.setValue("Main/DirColumn", ui->canFramesView->columnWidth(3));
|
settings.setValue("Main/RemColumn", ui->canFramesView->columnWidth(3));
|
||||||
settings.setValue("Main/BusColumn", ui->canFramesView->columnWidth(4));
|
settings.setValue("Main/DirColumn", ui->canFramesView->columnWidth(4));
|
||||||
settings.setValue("Main/LengthColumn", ui->canFramesView->columnWidth(5));
|
settings.setValue("Main/BusColumn", ui->canFramesView->columnWidth(5));
|
||||||
settings.setValue("Main/AsciiColumn", ui->canFramesView->columnWidth(6));
|
settings.setValue("Main/LengthColumn", ui->canFramesView->columnWidth(6));
|
||||||
settings.setValue("Main/DataColumn", ui->canFramesView->columnWidth(7));
|
settings.setValue("Main/AsciiColumn", ui->canFramesView->columnWidth(7));
|
||||||
|
settings.setValue("Main/DataColumn", ui->canFramesView->columnWidth(8));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ void FuzzingWindow::changedNumDataBytes(int newVal)
|
|||||||
void FuzzingWindow::timerTriggered()
|
void FuzzingWindow::timerTriggered()
|
||||||
{
|
{
|
||||||
CANFrame thisFrame;
|
CANFrame thisFrame;
|
||||||
|
thisFrame.remote = false;
|
||||||
sendingBuffer.clear();
|
sendingBuffer.clear();
|
||||||
int buses = ui->cbBuses->currentIndex();
|
int buses = ui->cbBuses->currentIndex();
|
||||||
for (int count = 0; count < ui->spinBurst->value(); count++)
|
for (int count = 0; count < ui->spinBurst->value(); count++)
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ void CANScriptHelper::sendFrame(QJSValue bus, QJSValue id, QJSValue length, QJSV
|
|||||||
{
|
{
|
||||||
CANFrame frame;
|
CANFrame frame;
|
||||||
frame.extended = false;
|
frame.extended = false;
|
||||||
|
frame.remote = false;
|
||||||
frame.ID = id.toInt();
|
frame.ID = id.toInt();
|
||||||
frame.len = length.toUInt();
|
frame.len = length.toUInt();
|
||||||
if (frame.len > 8) frame.len = 8;
|
if (frame.len > 8) frame.len = 8;
|
||||||
|
|||||||
Reference in New Issue
Block a user