From 1f2c5a38a0a0ef307765e9536b66dfa37f7c8c53 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 25 Nov 2017 17:13:41 +0100 Subject: [PATCH 01/14] Readme: Fix spelling of Qt --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f4bf143..3b7f7cc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # SavvyCAN -QT based cross platform canbus tool +Qt based cross platform canbus tool (C) 2015-2017 EVTV and Collin Kidder -A QT5 based cross platform tool which can be used to load, save, and capture canbus frames. +A Qt5 based cross platform tool which can be used to load, save, and capture canbus frames. This tool is designed to help with visualization, reverse engineering, debugging, and capturing of canbus frames. @@ -37,7 +37,7 @@ of this program. It can load and save in several formats: ## Dependencies Now this code does not depend on anything other than what is in the source tree or available -from the QT installer. +from the Qt installer. Uses QCustomPlot available at: @@ -83,5 +83,5 @@ make ``` Did that fix it? Great! If not, ensure that you selected SerialBUS support -when you installed QT. +when you installed Qt. From 380e3c9da20bb21058c8768a67839fbf97094158 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 2 Sep 2017 16:58:56 +0200 Subject: [PATCH 02/14] Project: Remove unneeded scope Qt 4 is not supported at all, as the project requires QtSerialBus. --- SavvyCAN.pro | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 39f0178..6bde517 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -4,9 +4,7 @@ # #------------------------------------------------- -QT += core gui serialbus - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets serialport printsupport qml +QT = core gui printsupport qml serialbus serialport widgets CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT From 560701e208dca70916c80f176e8b06a14bf38d5a Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 2 Sep 2017 12:07:04 +0200 Subject: [PATCH 03/14] Untangle include forrest Every change in connectionwindow.h led to a heavy project compile, as the header was included in other headers. Avoid this by using forward declarations and only include connectionwindow.h in the C++ files that actually use it. --- connections/canconnectionmodel.h | 3 +-- mainwindow.cpp | 1 + mainwindow.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/connections/canconnectionmodel.h b/connections/canconnectionmodel.h index 190dd27..f4a0094 100644 --- a/connections/canconnectionmodel.h +++ b/connections/canconnectionmodel.h @@ -5,9 +5,8 @@ #include #include "canbus.h" -#include "connections/canconnection.h" -#include "connectionwindow.h" +class CANConnection; class CANConnectionModel : public QAbstractTableModel { diff --git a/mainwindow.cpp b/mainwindow.cpp index c346ff0..9cf225d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -5,6 +5,7 @@ #include #include #include "connections/canconmanager.h" +#include "connections/connectionwindow.h" #include "utility.h" /* diff --git a/mainwindow.h b/mainwindow.h index abdd0a2..fffe39f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,7 +22,6 @@ #include "mainsettingsdialog.h" #include "firmwareuploaderwindow.h" #include "re/discretestatewindow.h" -#include "connections/connectionwindow.h" #include "scriptingwindow.h" #include "re/rangestatewindow.h" #include "dbc/dbcloadsavewindow.h" @@ -33,6 +32,7 @@ #include "motorcontrollerconfigwindow.h" #include "signalviewerwindow.h" +class CANConnection; class ConnectionWindow; class ISOTP_InterpreterWindow; class ScriptingWindow; From 1dd59ed73cb18dd40ff1a83bc12a00b1822b1698 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 2 Sep 2017 10:15:18 +0200 Subject: [PATCH 04/14] SocketCan: Rename to SerialBusConnection QtCanBus is not limited to SocketCAN, it also supports various Windows CAN adapters directly. Also, add the term Connection to describe the inheritance hierarchy better. --- SavvyCAN.pro | 4 +-- connections/canconfactory.cpp | 4 +-- ...{socketcan.cpp => serialbusconnection.cpp} | 34 +++++++++---------- .../{socketcan.h => serialbusconnection.h} | 12 +++---- 4 files changed, 27 insertions(+), 27 deletions(-) rename connections/{socketcan.cpp => serialbusconnection.cpp} (85%) rename connections/{socketcan.h => serialbusconnection.h} (77%) diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 6bde517..1ccb096 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -32,7 +32,7 @@ SOURCES += main.cpp\ can_structs.cpp \ motorcontrollerconfigwindow.cpp \ connections/canconnection.cpp \ - connections/socketcan.cpp \ + connections/serialbusconnection.cpp \ connections/canconfactory.cpp \ connections/gvretserial.cpp \ connections/canconmanager.cpp \ @@ -84,7 +84,7 @@ HEADERS += mainwindow.h \ utils/lfqueue.h \ motorcontrollerconfigwindow.h \ connections/canconnection.h \ - connections/socketcan.h \ + connections/serialbusconnection.h \ connections/canconconst.h \ connections/canconfactory.h \ connections/gvretserial.h \ diff --git a/connections/canconfactory.cpp b/connections/canconfactory.cpp index 7926001..259fd29 100644 --- a/connections/canconfactory.cpp +++ b/connections/canconfactory.cpp @@ -1,6 +1,6 @@ #include #include "canconfactory.h" -#include "socketcan.h" +#include "serialbusconnection.h" #include "gvretserial.h" using namespace CANCon; @@ -9,7 +9,7 @@ CANConnection* CanConFactory::create(type pType, QString pPortName) { switch(pType) { case SOCKETCAN: - return new SocketCan(pPortName); + return new SerialBusConnection(pPortName); case GVRET_SERIAL: return new GVRetSerial(pPortName); default: {} diff --git a/connections/socketcan.cpp b/connections/serialbusconnection.cpp similarity index 85% rename from connections/socketcan.cpp rename to connections/serialbusconnection.cpp index d370784..f348d8a 100644 --- a/connections/socketcan.cpp +++ b/connections/serialbusconnection.cpp @@ -3,7 +3,7 @@ #include #include -#include "socketcan.h" +#include "serialbusconnection.h" @@ -11,7 +11,7 @@ /**** class definition ****/ /***********************************/ -SocketCan::SocketCan(QString portName) : +SerialBusConnection::SerialBusConnection(QString portName) : CANConnection(portName, CANCon::SOCKETCAN, 1, 4000, true), mDev_p(NULL), mTimer(this) /*NB: set connection as parent of timer to manage it from working thread */ @@ -19,13 +19,13 @@ SocketCan::SocketCan(QString portName) : } -SocketCan::~SocketCan() +SerialBusConnection::~SerialBusConnection() { stop(); } -void SocketCan::piStarted() +void SerialBusConnection::piStarted() { connect(&mTimer, SIGNAL(timeout()), this, SLOT(testConnection())); mTimer.setInterval(1000); @@ -36,7 +36,7 @@ void SocketCan::piStarted() } -void SocketCan::piSuspend(bool pSuspend) +void SerialBusConnection::piSuspend(bool pSuspend) { /* update capSuspended */ setCapSuspended(pSuspend); @@ -47,19 +47,19 @@ void SocketCan::piSuspend(bool pSuspend) } -void SocketCan::piStop() { +void SerialBusConnection::piStop() { mTimer.stop(); disconnectDevice(); } -bool SocketCan::piGetBusSettings(int pBusIdx, CANBus& pBus) +bool SerialBusConnection::piGetBusSettings(int pBusIdx, CANBus& pBus) { return getBusConfig(pBusIdx, pBus); } -void SocketCan::piSetBusSettings(int pBusIdx, CANBus bus) +void SerialBusConnection::piSetBusSettings(int pBusIdx, CANBus bus) { CANConStatus stats; /* sanity checks */ @@ -86,9 +86,9 @@ void SocketCan::piSetBusSettings(int pBusIdx, CANBus bus) } /* connect slots */ - connect(mDev_p, &QCanBusDevice::errorOccurred, this, &SocketCan::errorReceived); - connect(mDev_p, &QCanBusDevice::framesWritten, this, &SocketCan::framesWritten); - connect(mDev_p, &QCanBusDevice::framesReceived, this, &SocketCan::framesReceived); + connect(mDev_p, &QCanBusDevice::errorOccurred, this, &SerialBusConnection::errorReceived); + connect(mDev_p, &QCanBusDevice::framesWritten, this, &SerialBusConnection::framesWritten); + connect(mDev_p, &QCanBusDevice::framesReceived, this, &SerialBusConnection::framesReceived); /* set configuration */ /*if (p.useConfigurationEnabled) { @@ -107,7 +107,7 @@ void SocketCan::piSetBusSettings(int pBusIdx, CANBus bus) } -bool SocketCan::piSendFrame(const CANFrame& pFrame) +bool SerialBusConnection::piSendFrame(const CANFrame& pFrame) { /* sanity checks */ if(0 != pFrame.bus || pFrame.len>8) @@ -131,7 +131,7 @@ bool SocketCan::piSendFrame(const CANFrame& pFrame) /* disconnect device */ -void SocketCan::disconnectDevice() { +void SerialBusConnection::disconnectDevice() { if(mDev_p) { mDev_p->disconnectDevice(); delete mDev_p; @@ -140,7 +140,7 @@ void SocketCan::disconnectDevice() { } -void SocketCan::errorReceived(QCanBusDevice::CanBusError error) const +void SerialBusConnection::errorReceived(QCanBusDevice::CanBusError error) const { switch (error) { case QCanBusDevice::ReadError: @@ -155,13 +155,13 @@ void SocketCan::errorReceived(QCanBusDevice::CanBusError error) const } } -void SocketCan::framesWritten(qint64 count) +void SerialBusConnection::framesWritten(qint64 count) { Q_UNUSED(count); //qDebug() << "Number of frames written:" << count; } -void SocketCan::framesReceived() +void SerialBusConnection::framesReceived() { uint64_t timeBasis = CANConManager::getInstance()->getTimeBasis(); @@ -211,7 +211,7 @@ void SocketCan::framesReceived() } -void SocketCan::testConnection() { +void SerialBusConnection::testConnection() { QCanBusDevice* dev_p = QCanBus::instance()->createDevice("socketcan", getPort()); CANConStatus stats; diff --git a/connections/socketcan.h b/connections/serialbusconnection.h similarity index 77% rename from connections/socketcan.h rename to connections/serialbusconnection.h index debd091..dc6cecf 100644 --- a/connections/socketcan.h +++ b/connections/serialbusconnection.h @@ -1,5 +1,5 @@ -#ifndef SocketCan_H -#define SocketCan_H +#ifndef SERIALBUSCONNECTION_H +#define SERIALBUSCONNECTION_H #include #include @@ -11,13 +11,13 @@ #include "canconmanager.h" -class SocketCan : public CANConnection +class SerialBusConnection : public CANConnection { Q_OBJECT public: - SocketCan(QString portName); - virtual ~SocketCan(); + SerialBusConnection(QString portName); + virtual ~SerialBusConnection(); protected: @@ -42,4 +42,4 @@ protected: }; -#endif // SocketCan_H +#endif // SERIALBUSCONNECTION_H From 15aef1afbe2431e91e68017127f8196042d799b8 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 2 Sep 2017 10:23:09 +0200 Subject: [PATCH 05/14] SerialBusConnection: Order and condence includes By practicing the following rules: (4 and 5 are not needed here) 1. own header 2. project headers 3. Qt headers 4. operating system headers 5. compiler headers --- connections/serialbusconnection.cpp | 10 +++++----- connections/serialbusconnection.h | 10 +++------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/connections/serialbusconnection.cpp b/connections/serialbusconnection.cpp index f348d8a..b203439 100644 --- a/connections/serialbusconnection.cpp +++ b/connections/serialbusconnection.cpp @@ -1,11 +1,11 @@ -#include -#include -#include -#include - #include "serialbusconnection.h" +#include "canconmanager.h" +#include +#include +#include +#include /***********************************/ /**** class definition ****/ diff --git a/connections/serialbusconnection.h b/connections/serialbusconnection.h index dc6cecf..3090bfc 100644 --- a/connections/serialbusconnection.h +++ b/connections/serialbusconnection.h @@ -1,15 +1,11 @@ #ifndef SERIALBUSCONNECTION_H #define SERIALBUSCONNECTION_H -#include -#include -#include -#include - -#include "canframemodel.h" #include "canconnection.h" -#include "canconmanager.h" +#include "canframemodel.h" +#include +#include class SerialBusConnection : public CANConnection { From 84cb598a0deb15683c81afe7da059564e73a0ed7 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Mon, 4 Sep 2017 22:34:16 +0200 Subject: [PATCH 06/14] SerialBusConnection: Improve connect/disconnect handling * disconnectDevice() already checks mDev_p * use the error description provided by QCanBus::createDevice() --- connections/serialbusconnection.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/connections/serialbusconnection.cpp b/connections/serialbusconnection.cpp index b203439..50ebe87 100644 --- a/connections/serialbusconnection.cpp +++ b/connections/serialbusconnection.cpp @@ -67,8 +67,7 @@ void SerialBusConnection::piSetBusSettings(int pBusIdx, CANBus bus) return; /* disconnect device if we have one connected */ - if(mDev_p) - disconnectDevice(); + disconnectDevice(); /* copy bus config */ setBusConfig(0, bus); @@ -78,10 +77,11 @@ void SerialBusConnection::piSetBusSettings(int pBusIdx, CANBus bus) return; /* create device */ - mDev_p = QCanBus::instance()->createDevice("socketcan", getPort()); + QString errorString; + mDev_p = QCanBus::instance()->createDevice("socketcan", getPort(), &errorString); if (!mDev_p) { disconnectDevice(); - qDebug() << "can't create device"; + qDebug() << "Error: createDevice(" << getType() << getPort() << "):" << errorString; return; } From d69947bf2ffc55f17cbb459a2962bbc4bb7ff249 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sat, 25 Nov 2017 16:55:46 +0100 Subject: [PATCH 07/14] SerialBusConnection: Use member initialization And as we have full C++11 support, so its also preferred to use nullptr. --- connections/serialbusconnection.cpp | 3 +-- connections/serialbusconnection.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/connections/serialbusconnection.cpp b/connections/serialbusconnection.cpp index 50ebe87..f2f4cd2 100644 --- a/connections/serialbusconnection.cpp +++ b/connections/serialbusconnection.cpp @@ -13,7 +13,6 @@ SerialBusConnection::SerialBusConnection(QString portName) : CANConnection(portName, CANCon::SOCKETCAN, 1, 4000, true), - mDev_p(NULL), mTimer(this) /*NB: set connection as parent of timer to manage it from working thread */ { } @@ -135,7 +134,7 @@ void SerialBusConnection::disconnectDevice() { if(mDev_p) { mDev_p->disconnectDevice(); delete mDev_p; - mDev_p = Q_NULLPTR; + mDev_p = nullptr; } } diff --git a/connections/serialbusconnection.h b/connections/serialbusconnection.h index 3090bfc..2c9d357 100644 --- a/connections/serialbusconnection.h +++ b/connections/serialbusconnection.h @@ -33,7 +33,7 @@ private slots: void testConnection(); protected: - QCanBusDevice* mDev_p; + QCanBusDevice *mDev_p = nullptr; QTimer mTimer; }; From 4c8921ceca0493227a6f57b6e253c29e987c3c92 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 26 Nov 2017 15:35:52 +0100 Subject: [PATCH 08/14] FramesView: Fix auto scrolling when frame capturing is suspended Allow to freely scroll the captured frames window in suspended state. Fixes #111 --- mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 9cf225d..2f4e1ea 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -409,7 +409,7 @@ void MainWindow::tickGUIUpdate() framesPerSec = 0; ui->lbNumFrames->setText(QString::number(model->rowCount())); - if (ui->cbAutoScroll->isChecked()) ui->canFramesView->scrollToBottom(); + if (allowCapture && ui->cbAutoScroll->isChecked()) ui->canFramesView->scrollToBottom(); ui->lbFPS->setText(QString::number(framesPerSec)); if (rxFrames > 0) { From cfc024f98a54ac9fc2b5aac606af4ec0174342f8 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 26 Nov 2017 16:12:06 +0100 Subject: [PATCH 09/14] CanConnectionModel: Remove superflous breaks after return Clang complained about them. --- connections/canconnectionmodel.cpp | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/connections/canconnectionmodel.cpp b/connections/canconnectionmodel.cpp index a63c508..336b9d2 100644 --- a/connections/canconnectionmodel.cpp +++ b/connections/canconnectionmodel.cpp @@ -23,28 +23,20 @@ QVariant CANConnectionModel::headerData(int section, Qt::Orientation orientation { case 0: return QString(tr("Bus")); - break; case 1: return QString(tr("Type")); - break; case 2: return QString(tr("Port")); - break; case 3: return QString(tr("Speed")); - break; case 4: return QString(tr("Listen Only")); - break; case 5: return QString(tr("Single Wire")); - break; case 6: return QString(tr("Active")); - break; case 7: return QString(tr("Status")); - break; } } @@ -94,19 +86,15 @@ Qt::ItemFlags CANConnectionModel::flags(const QModelIndex &index) const { case 3: //speed if (editParams) return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled; - else return Qt::ItemFlag::NoItemFlags; - break; + return Qt::ItemFlag::NoItemFlags; case 4: //listen only case 5: //single wire if (editParams) return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsUserCheckable; - else return Qt::ItemFlag::NoItemFlags; - break; + return Qt::ItemFlag::NoItemFlags; case 6: //enabled return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsUserCheckable; - break; default: return Qt::ItemFlag::ItemIsEnabled; - break; } } @@ -164,7 +152,6 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const case 0: //bus //return QString::number(busId); return QString::number(index.row()); - break; case 1: //type if (conn_p) switch (conn_p->getType()) { @@ -200,13 +187,10 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const { case 4: return (bus.listenOnly) ? Qt::Checked : Qt::Unchecked; - break; case 5: return (bus.singleWire) ? Qt::Checked : Qt::Unchecked; - break; case 6: return (bus.active) ? Qt::Checked : Qt::Unchecked; - break; } } From 55273a1b8516d476da0203d815d5a43fe064030d Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 26 Nov 2017 16:27:24 +0100 Subject: [PATCH 10/14] CanConnection: Convert switches to enumeration and add documentation And add or remove default labels to silence Clang compiler warnings. --- connections/canconnectionmodel.cpp | 79 +++++++++++++++++------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/connections/canconnectionmodel.cpp b/connections/canconnectionmodel.cpp index 336b9d2..719ca38 100644 --- a/connections/canconnectionmodel.cpp +++ b/connections/canconnectionmodel.cpp @@ -11,6 +11,16 @@ CANConnectionModel::~CANConnectionModel() { } +enum class Column { + Bus = 0, ///< A sequential number describing the bus + Type = 1, ///< The CAN driver/backend type, e.g. GVRET, peakcan, or socketcan + Port = 2, ///< The CAN hardware port, e.g. can0 for socketcan + Speed = 3, ///< The bus speed in bit/second + ListenOnly = 4, ///< True if the bus is in listen-only mode + SingleWire = 5, ///< True if the bus operates in single-wire mode + Active = 6, ///< True if the bus is activated for sending and receiving + Status = 7 ///< The bus status as text message +}; QVariant CANConnectionModel::headerData(int section, Qt::Orientation orientation, int role) const { @@ -19,23 +29,23 @@ QVariant CANConnectionModel::headerData(int section, Qt::Orientation orientation if (orientation == Qt::Horizontal) { - switch (section) + switch (Column(section)) { - case 0: + case Column::Bus: return QString(tr("Bus")); - case 1: + case Column::Type: return QString(tr("Type")); - case 2: + case Column::Port: return QString(tr("Port")); - case 3: + case Column::Speed: return QString(tr("Speed")); - case 4: + case Column::ListenOnly: return QString(tr("Listen Only")); - case 5: + case Column::SingleWire: return QString(tr("Single Wire")); - case 6: + case Column::Active: return QString(tr("Active")); - case 7: + case Column::Status: return QString(tr("Status")); } } @@ -82,16 +92,16 @@ Qt::ItemFlags CANConnectionModel::flags(const QModelIndex &index) const bool editParams = false; if (conn_p->getType() == CANCon::GVRET_SERIAL) editParams = true; - switch (index.column()) + switch (Column(index.column())) { - case 3: //speed + case Column::Speed: if (editParams) return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled; return Qt::ItemFlag::NoItemFlags; - case 4: //listen only - case 5: //single wire + case Column::ListenOnly: + case Column::SingleWire: if (editParams) return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsUserCheckable; return Qt::ItemFlag::NoItemFlags; - case 6: //enabled + case Column::Active: return Qt::ItemFlag::ItemIsEditable | Qt::ItemFlag::ItemIsEnabled | Qt::ItemFlag::ItemIsUserCheckable; default: return Qt::ItemFlag::ItemIsEnabled; @@ -110,20 +120,21 @@ bool CANConnectionModel::setData(const QModelIndex &index, const QVariant &value ret = conn_p->getBusSettings(busId, bus); if (!ret) return false; - switch (index.column()) + switch (Column(index.column())) { - case 3: //speed + case Column::Speed: bus.speed = value.toInt(); break; - case 4: //listen only + case Column::ListenOnly: bus.listenOnly = value.toBool(); break; - case 5: //single wire + case Column::SingleWire: bus.singleWire = value.toBool(); break; - case 6: //active + case Column::Active: bus.active = value.toBool(); break; + default: {} } conn_p->setBusSettings(busId, bus); return true; @@ -145,14 +156,14 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const //qDebug() << "ConnP: " << conn_p << " ret " << ret; - if (role == Qt::DisplayRole) { + if (role == Qt::DisplayRole) { - switch (index.column()) + switch (Column(index.column())) { - case 0: //bus + case Column::Bus: //return QString::number(busId); return QString::number(index.row()); - case 1: //type + case Column::Type: if (conn_p) switch (conn_p->getType()) { case CANCon::KVASER: return "KVASER"; @@ -162,35 +173,35 @@ QVariant CANConnectionModel::data(const QModelIndex &index, int role) const } else qDebug() << "Tried to show connection type but connection was NULL"; break; - case 2: //port + case Column::Port: if (conn_p) return conn_p->getPort(); else qDebug() << "Tried to show connection port but connection was NULL"; break; - case 3: //speed + case Column::Speed: if(!ret) return QVariant(); if (!isSocketCAN) return QString::number(bus.speed); else return QString("N/A"); - case 4: //Listen Only + case Column::ListenOnly: return QVariant(); - case 5: //Single Wire + case Column::SingleWire: return QVariant(); - case 6: //Status + case Column::Active: return QVariant(); - case 7: //Active + case Column::Status: return (conn_p->getStatus()==CANCon::CONNECTED) ? "Connected" : "Not Connected"; - default: {} } } if (role == Qt::CheckStateRole) { - switch (index.column()) + switch (Column(index.column())) { - case 4: + case Column::ListenOnly: return (bus.listenOnly) ? Qt::Checked : Qt::Unchecked; - case 5: + case Column::SingleWire: return (bus.singleWire) ? Qt::Checked : Qt::Unchecked; - case 6: + case Column::Active: return (bus.active) ? Qt::Checked : Qt::Unchecked; + default: {} } } From 1b24b1677aab413af270fd6d88cc8482f418f92b Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 26 Nov 2017 16:50:09 +0100 Subject: [PATCH 11/14] CanFrameModel: Remove superflous breaks after return --- canframemodel.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index e1a9548..6c84996 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -261,23 +261,17 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const { case 0: //timestamp return Utility::formatTimestamp(thisFrame.timestamp); - break; case 1: //id return Utility::formatNumber(thisFrame.ID); - break; case 2: //ext return QString::number(thisFrame.extended); - break; case 3: //direction if (thisFrame.isReceived) return QString(tr("Rx")); - else return QString(tr("Tx")); - break; + return QString(tr("Tx")); case 4: //bus return QString::number(thisFrame.bus); - break; case 5: //len return QString::number(thisFrame.len); - break; case 6: //data dLen = thisFrame.len; if (dLen < 0) dLen = 0; @@ -307,7 +301,6 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const } } return tempString; - break; default: return QVariant(); } @@ -328,25 +321,18 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation, { case 0: return QString(tr("Timestamp")); - break; case 1: return QString(tr("ID")); - break; case 2: return QString(tr("Ext")); - break; case 3: return QString(tr("Dir")); - break; case 4: return QString(tr("Bus")); - break; case 5: return QString(tr("Len")); - break; case 6: return QString(tr("Data")); - break; } } From f5ccd9df0554361028743c0477e32d5cfbf728b1 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 26 Nov 2017 16:57:25 +0100 Subject: [PATCH 12/14] CanFrameModel: Convert switches to enumeration and add documentation And add or remove default labels to silence Clang compiler warnings. --- canframemodel.cpp | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index 6c84996..87b5201 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -215,6 +215,16 @@ void CANFrameModel::recalcOverwrite() 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 + Data = 6 ///< The frames payload data +}; + QVariant CANFrameModel::data(const QModelIndex &index, int role) const { int dLen; @@ -257,22 +267,22 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const } if (role == Qt::DisplayRole) { - switch (index.column()) + switch (Column(index.column())) { - case 0: //timestamp + case Column::TimeStamp: return Utility::formatTimestamp(thisFrame.timestamp); - case 1: //id + case Column::FrameId: return Utility::formatNumber(thisFrame.ID); - case 2: //ext + case Column::Extended: return QString::number(thisFrame.extended); - case 3: //direction + case Column::Direction: if (thisFrame.isReceived) return QString(tr("Rx")); return QString(tr("Tx")); - case 4: //bus + case Column::Bus: return QString::number(thisFrame.bus); - case 5: //len + case Column::Length: return QString::number(thisFrame.len); - case 6: //data + case Column::Data: dLen = thisFrame.len; if (dLen < 0) dLen = 0; if (dLen > 8) dLen = 8; @@ -301,8 +311,6 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const } } return tempString; - default: - return QVariant(); } } @@ -317,21 +325,21 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation, if (orientation == Qt::Horizontal) { - switch (section) + switch (Column(section)) { - case 0: + case Column::TimeStamp: return QString(tr("Timestamp")); - case 1: + case Column::FrameId: return QString(tr("ID")); - case 2: + case Column::Extended: return QString(tr("Ext")); - case 3: + case Column::Direction: return QString(tr("Dir")); - case 4: + case Column::Bus: return QString(tr("Bus")); - case 5: + case Column::Length: return QString(tr("Len")); - case 6: + case Column::Data: return QString(tr("Data")); } } From 3b9c793e998e15ef172cd942a61460d2640d6544 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 16:30:48 -0500 Subject: [PATCH 13/14] Make CAN id's either be 3 hex digits or 8 hex digits when displayed - depending on whether a frame uses standard or extended id mode. --- bisectwindow.cpp | 4 ++-- canframemodel.cpp | 2 +- dbc/dbcmaineditor.cpp | 4 ++-- frameplaybackwindow.cpp | 2 +- mainwindow.cpp | 4 ++-- re/discretestatewindow.cpp | 7 ++++--- re/flowviewwindow.cpp | 7 ++++--- re/frameinfowindow.cpp | 10 ++++++---- re/fuzzingwindow.cpp | 9 +++++---- re/isotp_interpreterwindow.cpp | 2 +- re/newgraphdialog.cpp | 4 ++-- re/rangestatewindow.cpp | 6 ++++-- utility.h | 21 +++++++++++++++++++++ 13 files changed, 55 insertions(+), 27 deletions(-) diff --git a/bisectwindow.cpp b/bisectwindow.cpp index bbf9324..50c0400 100644 --- a/bisectwindow.cpp +++ b/bisectwindow.cpp @@ -54,8 +54,8 @@ void BisectWindow::refreshIDList() std::sort(foundID.begin(), foundID.end()); foreach (int id, foundID) { - ui->cbIDLower->addItem(Utility::formatNumber(id)); - ui->cbIDUpper->addItem(Utility::formatNumber(id)); + ui->cbIDLower->addItem(Utility::formatCANID(id)); + ui->cbIDUpper->addItem(Utility::formatCANID(id)); } } diff --git a/canframemodel.cpp b/canframemodel.cpp index 87b5201..b5be4e5 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -272,7 +272,7 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const case Column::TimeStamp: return Utility::formatTimestamp(thisFrame.timestamp); case Column::FrameId: - return Utility::formatNumber(thisFrame.ID); + return Utility::formatCANID(thisFrame.ID, thisFrame.extended); case Column::Extended: return QString::number(thisFrame.extended); case Column::Direction: diff --git a/dbc/dbcmaineditor.cpp b/dbc/dbcmaineditor.cpp index f610f7a..1b041b6 100644 --- a/dbc/dbcmaineditor.cpp +++ b/dbc/dbcmaineditor.cpp @@ -276,7 +276,7 @@ void DBCMainEditor::onCellChangedMessage(int row,int col) item = ui->MessagesTable->item(row, 0); item->setFlags(item->flags() & ~Qt::ItemIsEditable); - item->setText(Utility::formatNumber(msgID)); + item->setText(Utility::formatCANID(msgID)); for(int i=1 ; i < ui->MessagesTable->columnCount(); i++) { @@ -486,7 +486,7 @@ void DBCMainEditor::refreshMessagesTable(const DBC_NODE *node) if (msg->sender == node) { //many of these are simplistic first versions just to test functionality. - QTableWidgetItem *msgID = new QTableWidgetItem(Utility::formatNumber(msg->ID)); + QTableWidgetItem *msgID = new QTableWidgetItem(Utility::formatCANID(msg->ID)); QTableWidgetItem *msgName = new QTableWidgetItem(msg->name); QTableWidgetItem *msgLen = new QTableWidgetItem(QString::number(msg->len)); QTableWidgetItem *msgSignals = new QTableWidgetItem(QString::number(msg->sigHandler->getCount())); diff --git a/frameplaybackwindow.cpp b/frameplaybackwindow.cpp index d8460cb..a44d661 100644 --- a/frameplaybackwindow.cpp +++ b/frameplaybackwindow.cpp @@ -248,7 +248,7 @@ void FramePlaybackWindow::refreshIDList() QHash::Iterator filterIter; for (filterIter = currentSeqItem->idFilters.begin(); filterIter != currentSeqItem->idFilters.end(); ++filterIter) { - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(filterIter.key()), ui->listID); + QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(filterIter.key()), ui->listID); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag if (filterIter.value()) listItem->setCheckState(Qt::Checked); else listItem->setCheckState(Qt::Unchecked); diff --git a/mainwindow.cpp b/mainwindow.cpp index 2f4e1ea..c12b46d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -353,7 +353,7 @@ void MainWindow::updateFilterList() for (filterIter = filters->begin(); filterIter != filters->end(); ++filterIter) { QListWidgetItem *thisItem = new QListWidgetItem(); - thisItem->setText(Utility::formatNumber(filterIter.key())); + thisItem->setText(Utility::formatCANID(filterIter.key())); thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); if (filterIter.value()) thisItem->setCheckState(Qt::Checked); else thisItem->setCheckState(Qt::Unchecked); @@ -632,7 +632,7 @@ Data Bytes: 88 10 00 13 BB 00 06 00 CANFrame thisFrame = frames->at(c); QString builderString; builderString += tr("Time: ") + QString::number((thisFrame.timestamp / 1000000.0), 'f', 6); - builderString += tr(" ID: ") + Utility::formatNumber(thisFrame.ID); + builderString += tr(" ID: ") + Utility::formatCANID(thisFrame.ID, thisFrame.extended); if (thisFrame.extended) builderString += tr(" Ext "); else builderString += tr(" Std "); builderString += tr("Bus: ") + QString::number(thisFrame.bus); diff --git a/re/discretestatewindow.cpp b/re/discretestatewindow.cpp index d9d1edb..82a03c9 100644 --- a/re/discretestatewindow.cpp +++ b/re/discretestatewindow.cpp @@ -121,7 +121,7 @@ void DiscreteStateWindow::updatedFrames(int numFrames) if (!idFilters.contains(thisFrame.ID)) { idFilters.insert(thisFrame.ID, true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(thisFrame.ID), ui->listID); + QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(thisFrame.ID, thisFrame.extended), ui->listID); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setCheckState(Qt::Checked); //default all filters to be set active } @@ -141,11 +141,12 @@ void DiscreteStateWindow::refreshFilterList() for (int i = 0; i < modelFrames->length(); i++) { - id = modelFrames->at(i).ID; + CANFrame thisFrame = modelFrames->at(i); + id = thisFrame.ID; if (!idFilters.contains(id)) { idFilters.insert(id, true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(id), ui->listID); + QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(id, thisFrame.extended), ui->listID); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setCheckState(Qt::Checked); //default all filters to be set active } diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index d359119..e3514b1 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -397,7 +397,7 @@ void FlowViewWindow::updatedFrames(int numFrames) if (!foundID.contains(thisFrame.ID)) { foundID.append(thisFrame.ID); - /*QListWidgetItem* item =*/ new QListWidgetItem(Utility::formatNumber(thisFrame.ID), ui->listFrameID); + /*QListWidgetItem* item =*/ new QListWidgetItem(Utility::formatCANID(thisFrame.ID, thisFrame.extended), ui->listFrameID); } if (thisFrame.ID == refID) @@ -506,11 +506,12 @@ void FlowViewWindow::refreshIDList() int id; for (int i = 0; i < modelFrames->count(); i++) { - id = modelFrames->at(i).ID; + CANFrame thisFrame = modelFrames->at(i); + id = thisFrame.ID; if (!foundID.contains(id)) { foundID.append(id); - /*QListWidgetItem* item = */ new QListWidgetItem(Utility::formatNumber(id), ui->listFrameID); + /*QListWidgetItem* item = */ new QListWidgetItem(Utility::formatCANID(id, thisFrame.extended), ui->listFrameID); } } //default is to sort in ascending order diff --git a/re/frameinfowindow.cpp b/re/frameinfowindow.cpp index b803997..53fdae7 100644 --- a/re/frameinfowindow.cpp +++ b/re/frameinfowindow.cpp @@ -124,11 +124,12 @@ void FrameInfoWindow::updatedFrames(int numFrames) bool thisID = false; for (int x = modelFrames->count() - numFrames; x < modelFrames->count(); x++) { - unsigned int id = modelFrames->at(x).ID; + CANFrame thisFrame = modelFrames->at(x); + unsigned int id = thisFrame.ID; if (!foundID.contains(id)) { foundID.append(id); - ui->listFrameID->addItem(Utility::formatNumber(id)); + ui->listFrameID->addItem(Utility::formatCANID(id, thisFrame.extended)); } if (currID == modelFrames->at(x).ID) @@ -394,11 +395,12 @@ void FrameInfoWindow::refreshIDList() int id; for (int i = 0; i < modelFrames->count(); i++) { - id = (int)modelFrames->at(i).ID; + CANFrame thisFrame = modelFrames->at(i); + id = (int)thisFrame.ID; if (!foundID.contains(id)) { foundID.append(id); - ui->listFrameID->addItem(Utility::formatNumber(id)); + ui->listFrameID->addItem(Utility::formatCANID(id, thisFrame.extended)); } } //default is to sort in ascending order diff --git a/re/fuzzingwindow.cpp b/re/fuzzingwindow.cpp index d2b62a3..6d96e68 100644 --- a/re/fuzzingwindow.cpp +++ b/re/fuzzingwindow.cpp @@ -74,7 +74,7 @@ void FuzzingWindow::updatedFrames(int numFrames) foundIDs.append(id); selectedIDs.append(id); QListWidgetItem *thisItem = new QListWidgetItem(); - thisItem->setText(Utility::formatNumber(id)); + thisItem->setText(Utility::formatCANID(id, modelFrames->at(i).extended)); thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); thisItem->setCheckState(Qt::Checked); ui->listID->addItem(thisItem); @@ -346,14 +346,15 @@ void FuzzingWindow::refreshIDList() int id; for (int i = 0; i < modelFrames->count(); i++) - { - id = modelFrames->at(i).ID; + { + CANFrame thisFrame = modelFrames->at(i); + id = thisFrame.ID; if (!foundIDs.contains(id)) { foundIDs.append(id); selectedIDs.append(id); QListWidgetItem *thisItem = new QListWidgetItem(); - thisItem->setText(Utility::formatNumber(id)); + thisItem->setText(Utility::formatCANID(id, thisFrame.extended)); thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); thisItem->setCheckState(Qt::Checked); ui->listID->addItem(thisItem); diff --git a/re/isotp_interpreterwindow.cpp b/re/isotp_interpreterwindow.cpp index 866b5d1..0393ce6 100644 --- a/re/isotp_interpreterwindow.cpp +++ b/re/isotp_interpreterwindow.cpp @@ -231,7 +231,7 @@ void ISOTP_InterpreterWindow::newISOMessage(ISOTP_MESSAGE msg) { idFilters.insert(msg.ID, true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(msg.ID), ui->listFilter); + QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(msg.ID, msg.extended), ui->listFilter); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setCheckState(Qt::Checked); } diff --git a/re/newgraphdialog.cpp b/re/newgraphdialog.cpp index 9af7095..6807152 100644 --- a/re/newgraphdialog.cpp +++ b/re/newgraphdialog.cpp @@ -85,7 +85,7 @@ void NewGraphDialog::setParams(GraphParams ¶ms) startBit = params.startBit; dataLen = params.numBits; ui->txtDataLen->setText(QString::number(dataLen)); - ui->txtID->setText(Utility::formatNumber(params.ID)); + ui->txtID->setText(Utility::formatCANID(params.ID)); ui->txtName->setText(params.graphName); QPalette p = ui->colorSwatch->palette(); p.setColor(QPalette::Button, params.color); @@ -211,7 +211,7 @@ void NewGraphDialog::copySignalToParamsUI() startBit = sig->startBit; ui->txtBias->setText(QString::number(sig->bias)); ui->txtDataLen->setText(QString::number(sig->signalSize)); - ui->txtID->setText(Utility::formatNumber(msg->ID)); + ui->txtID->setText(Utility::formatCANID(msg->ID)); ui->txtMask->setText("0xFFFFFFFF"); ui->txtName->setText(sig->name); ui->txtScale->setText(QString::number(sig->factor)); diff --git a/re/rangestatewindow.cpp b/re/rangestatewindow.cpp index 76d03e3..16d1b4b 100644 --- a/re/rangestatewindow.cpp +++ b/re/rangestatewindow.cpp @@ -138,7 +138,7 @@ void RangeStateWindow::updatedFrames(int numFrames) if (!idFilters.contains(thisFrame.ID)) { idFilters.insert(thisFrame.ID, true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(thisFrame.ID), ui->listFilter); + QListWidgetItem* listItem = new QListWidgetItem(Utility::formatCANID(thisFrame.ID, thisFrame.extended), ui->listFilter); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setCheckState(Qt::Checked); //default all filters to be set active } @@ -159,7 +159,9 @@ void RangeStateWindow::refreshFilterList() if (!idFilters.contains(id)) { idFilters.insert(id, true); - QListWidgetItem* listItem = new QListWidgetItem(Utility::formatNumber(id), ui->listFilter); + QListWidgetItem* listItem; + if (id < 0x800) listItem = new QListWidgetItem(Utility::formatCANID(id, false), ui->listFilter); + else listItem = new QListWidgetItem(Utility::formatCANID(id, true), ui->listFilter); listItem->setFlags(listItem->flags() | Qt::ItemIsUserCheckable); // set checkable flag listItem->setCheckState(Qt::Checked); //default all filters to be set active } diff --git a/utility.h b/utility.h index 552e6eb..09ec074 100644 --- a/utility.h +++ b/utility.h @@ -96,6 +96,27 @@ public: else return formatHexNum(value); } + static QString formatCANID(uint64_t id, bool extended) + { + if (decimalMode) return QString::number(id, 10); + + if (extended) + { + return "0x" + QString::number(id, 16).toUpper().rightJustified(8,'0'); + } + else + { + id = id & 0x7FF; + return "0x" + QString::number(id, 16).toUpper().rightJustified(3,'0'); + } + } + + static QString formatCANID(uint64_t id) + { + if (id < 0x800) return formatCANID(id, false); + return formatCANID(id, true); + } + static QString formatByteAsBinary(uint8_t value) { QString output; From 923a4c875365881d0d63795aadc1a56e4a6f1278 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Sun, 26 Nov 2017 16:34:42 -0500 Subject: [PATCH 14/14] Update config.h to increment version number --- config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.h b/config.h index 6dfdecb..a7ebdb6 100644 --- a/config.h +++ b/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG #define CONFIG -#define VERSION 180 +#define VERSION 181 //try to keep this in sync. //SavvyCAN will complain if you connect a GVRET board with a revision