From 1f421c5d2c4f47e39419020f70f08159801b2a44 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 6 Sep 2021 19:25:59 -0400 Subject: [PATCH] Added hex labeling option to graphs in flowview and frame info windows, a few tweaks for potential QT6 support --- SavvyCAN.pro | 4 +++- mainsettingsdialog.cpp | 9 ++++++++- qcpaxistickerhex.cpp | 8 ++++++++ qcpaxistickerhex.h | 12 ++++++++++++ re/flowviewwindow.cpp | 12 +++++++++++- re/flowviewwindow.h | 1 + re/frameinfowindow.cpp | 12 ++++++++++-- re/frameinfowindow.h | 1 + ui/mainsettingsdialog.ui | 14 ++++++++++++++ utility.h | 2 +- utils/lfqueue.h | 12 ++++++------ 11 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 qcpaxistickerhex.cpp create mode 100644 qcpaxistickerhex.h diff --git a/SavvyCAN.pro b/SavvyCAN.pro index 4e6b2ea..789ec72 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT = core gui printsupport qml serialbus serialport widgets help network +QT = core gui printsupport qml serialbus serialport widgets help network opengl CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT @@ -33,6 +33,7 @@ SOURCES += main.cpp\ mqtt/qmqtt_timer.cpp \ mqtt/qmqtt_websocket.cpp \ mqtt/qmqtt_websocketiodevice.cpp \ + qcpaxistickerhex.cpp \ re/dbccomparatorwindow.cpp \ mainwindow.cpp \ canframemodel.cpp \ @@ -117,6 +118,7 @@ HEADERS += mainwindow.h \ mqtt/qmqtt_timerinterface.h \ mqtt/qmqtt_websocket_p.h \ mqtt/qmqtt_websocketiodevice_p.h \ + qcpaxistickerhex.h \ re/dbccomparatorwindow.h \ simplecrypt.h \ utility.h \ diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index b7c778a..ad851a3 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -28,7 +28,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : //defaults if nothing was stored (if this is the first time) ui->cbDisplayHex->setChecked(settings.value("Main/UseHex", true).toBool()); ui->cbFlowAutoRef->setChecked(settings.value("FlowView/AutoRef", false).toBool()); + ui->cbHexGraphFlow->setChecked(settings.value("FlowView/GraphHex", false).toBool()); ui->cbFlowUseTimestamp->setChecked(settings.value("FlowView/UseTimestamp", true).toBool()); + ui->cbHexGraphInfo->setChecked(settings.value("InfoCompare/GraphHex", false).toBool()); ui->cbInfoAutoExpand->setChecked(settings.value("InfoCompare/AutoExpand", false).toBool()); ui->cbMainAutoScroll->setChecked(settings.value("Main/AutoScroll", false).toBool()); ui->cbPlaybackLoop->setChecked(settings.value("Playback/AutoLoop", false).toBool()); @@ -74,7 +76,7 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->comboSendingBus->setCurrentIndex(settings.value("Playback/SendingBus", 4).toInt()); ui->cbUseFiltered->setChecked(settings.value("Main/UseFiltered", false).toBool()); ui->cbUseOpenGL->setChecked(settings.value("Main/UseOpenGL", false).toBool()); - ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", false).toBool()); + ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", true).toBool()); //just for simplicity they all call the same function and that function updates all settings at once connect(ui->cbDisplayHex, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); @@ -99,6 +101,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : connect(ui->lineRemotePassword, SIGNAL(editingFinished()), this, SLOT(updateSettings())); connect(ui->cbLoadConnections, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbFilterLabeling, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + connect(ui->cbHexGraphFlow, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + connect(ui->cbHexGraphInfo, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); + installEventFilter(this); } @@ -140,6 +145,8 @@ void MainSettingsDialog::updateSettings() settings.setValue("Main/UseHex", ui->cbDisplayHex->isChecked()); settings.setValue("FlowView/AutoRef", ui->cbFlowAutoRef->isChecked()); settings.setValue("FlowView/UseTimestamp", ui->cbFlowUseTimestamp->isChecked()); + settings.setValue("FlowView/GraphHex", ui->cbHexGraphFlow->isChecked()); + settings.setValue("InfoCompare/GraphHex", ui->cbHexGraphInfo->isChecked()); settings.setValue("InfoCompare/AutoExpand", ui->cbInfoAutoExpand->isChecked()); settings.setValue("Main/AutoScroll", ui->cbMainAutoScroll->isChecked()); settings.setValue("Playback/AutoLoop", ui->cbPlaybackLoop->isChecked()); diff --git a/qcpaxistickerhex.cpp b/qcpaxistickerhex.cpp new file mode 100644 index 0000000..45ca1ac --- /dev/null +++ b/qcpaxistickerhex.cpp @@ -0,0 +1,8 @@ +#include +#include "qcpaxistickerhex.h" + +QString QCPAxisTickerHex::getTickLabel (double tick, const QLocale &locale, QChar formatChar, int precision) +{ + int64_t hexVal = static_cast(tick); + return QString::number(hexVal, 16); +} diff --git a/qcpaxistickerhex.h b/qcpaxistickerhex.h new file mode 100644 index 0000000..51bfcd8 --- /dev/null +++ b/qcpaxistickerhex.h @@ -0,0 +1,12 @@ +#ifndef QCPAXISTICKERHEX_H +#define QCPAXISTICKERHEX_H + +#include "qcustomplot.h" + +class QCPAxisTickerHex: public QCPAxisTicker +{ +public: + QString getTickLabel (double tick, const QLocale &locale, QChar formatChar, int precision); +}; + +#endif // QCPAXISTICKERHEX_H diff --git a/re/flowviewwindow.cpp b/re/flowviewwindow.cpp index ed1698d..6c9d719 100644 --- a/re/flowviewwindow.cpp +++ b/re/flowviewwindow.cpp @@ -3,6 +3,7 @@ #include "mainwindow.h" #include "helpwindow.h" #include "filterutility.h" +#include "qcpaxistickerhex.h" const QColor FlowViewWindow::graphColors[8] = {Qt::blue, Qt::green, Qt::black, Qt::red, //0 1 2 3 Qt::gray, Qt::yellow, Qt::cyan, Qt::darkMagenta}; //4 5 6 7 @@ -34,6 +35,11 @@ FlowViewWindow::FlowViewWindow(const QVector *frames, QWidget *parent) ui->graphView->xAxis->setRange(0, 8); ui->graphView->yAxis->setRange(-10, 265); //run range a bit outside possible number so they aren't plotted in a hard to see place + if (useHexTicker) + { + QSharedPointer hexTicker(new QCPAxisTickerHex); + ui->graphView->yAxis->setTicker(hexTicker); + } ui->graphView->axisRect()->setupFullAxesBox(); QCPItemText *textLabel = new QCPItemText(ui->graphView); @@ -46,7 +52,9 @@ FlowViewWindow::FlowViewWindow(const QVector *frames, QWidget *parent) textLabel->setPen(QPen(Qt::black)); // show black border around text ui->graphView->xAxis->setLabel("Time Axis"); - ui->graphView->yAxis->setLabel("Value Axis"); + if (useHexTicker) ui->graphView->yAxis->setLabel("Value Axis (HEX)"); + else ui->graphView->yAxis->setLabel("Value Axis (dec)"); + QFont legendFont = font(); legendFont.setPointSize(10); QFont legendSelectedFont = font(); @@ -150,6 +158,7 @@ void FlowViewWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event); writeSettings(); + emit rejected(); //can be picked up by main window if needed } void FlowViewWindow::readSettings() @@ -178,6 +187,7 @@ void FlowViewWindow::readSettings() secondsMode = settings.value("Main/TimeSeconds", false).toBool(); openGLMode = settings.value("Main/UseOpenGL", false).toBool(); + useHexTicker = settings.value("FlowView/GraphHex", false).toBool(); } void FlowViewWindow::writeSettings() diff --git a/re/flowviewwindow.h b/re/flowviewwindow.h index 258c614..826912e 100644 --- a/re/flowviewwindow.h +++ b/re/flowviewwindow.h @@ -58,6 +58,7 @@ private: static const QColor graphColors[8]; bool secondsMode; bool openGLMode; + bool useHexTicker; QVector x[8], y[8]; QCPGraph *graphRef[8]; diff --git a/re/frameinfowindow.cpp b/re/frameinfowindow.cpp index 49e03af..a6508be 100644 --- a/re/frameinfowindow.cpp +++ b/re/frameinfowindow.cpp @@ -5,6 +5,7 @@ #include #include #include "filterutility.h" +#include "qcpaxistickerhex.h" const QColor FrameInfoWindow::byteGraphColors[8] = {Qt::blue, Qt::green, Qt::black, Qt::red, //0 1 2 3 Qt::gray, Qt::yellow, Qt::cyan, Qt::darkMagenta}; //4 5 6 7 @@ -57,10 +58,16 @@ FrameInfoWindow::FrameInfoWindow(const QVector *frames, QWidget *paren ui->graphBytes->xAxis->setRange(0, 63); ui->graphBytes->yAxis->setRange(0, 265); + if (useHexTicker) + { + QSharedPointer hexTicker(new QCPAxisTickerHex); + ui->graphBytes->yAxis->setTicker(hexTicker); + } ui->graphBytes->axisRect()->setupFullAxesBox(); ui->graphBytes->xAxis->setLabel("Time"); - ui->graphBytes->yAxis->setLabel("Value"); + if (useHexTicker) ui->graphBytes->yAxis->setLabel("Value (HEX)"); + else ui->graphBytes->yAxis->setLabel("Value (Dec)"); ui->graphBytes->legend->setVisible(false); @@ -154,6 +161,7 @@ void FrameInfoWindow::closeEvent(QCloseEvent *event) { Q_UNUSED(event) writeSettings(); + emit rejected(); } void FrameInfoWindow::readSettings() @@ -175,7 +183,7 @@ void FrameInfoWindow::readSettings() move(Utility::constrainedWindowPos(settings.value("FrameInfo/WindowPos", QPoint(50, 50)).toPoint())); } useOpenGL = settings.value("Main/UseOpenGL", false).toBool(); - + useHexTicker = settings.value("InfoCompare/GraphHex", false).toBool(); } void FrameInfoWindow::writeSettings() diff --git a/re/frameinfowindow.h b/re/frameinfowindow.h index 8600020..72e7a47 100644 --- a/re/frameinfowindow.h +++ b/re/frameinfowindow.h @@ -34,6 +34,7 @@ private: QList frameCache; const QVector *modelFrames; bool useOpenGL; + bool useHexTicker; static const QColor byteGraphColors[8]; static QPen bytePens[8]; DBCHandler *dbcHandler; diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index 678280e..1590d17 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -197,6 +197,13 @@ + + + + Hexadecimal Graph Y Axis + + + @@ -281,6 +288,13 @@ + + + + Hexadecimal Graph Y Axis + + + diff --git a/utility.h b/utility.h index fd369e3..b050b0f 100644 --- a/utility.h +++ b/utility.h @@ -8,7 +8,7 @@ #include #include #include -#include +//#include class Utility { diff --git a/utils/lfqueue.h b/utils/lfqueue.h index 15d298d..83b4193 100644 --- a/utils/lfqueue.h +++ b/utils/lfqueue.h @@ -6,8 +6,8 @@ /* macros */ -#define IS_EMPTY() ( mWIdx.load() == mRIdx.load() ) -#define IS_FULL() ( (mWIdx.load()+1)%mSize == mRIdx.load() ) +#define IS_EMPTY() ( mWIdx.loadAcquire() == mRIdx.loadAcquire() ) +#define IS_FULL() ( (mWIdx.loadAcquire()+1)%mSize == mRIdx.loadAcquire() ) template @@ -38,8 +38,8 @@ public: } void flush() { - mRIdx.store(0); - mWIdx.store(0); + mRIdx.storeRelease(0); + mWIdx.storeRelease(0); } T* get() { @@ -56,7 +56,7 @@ public: qCritical() << "BUG: queueing in full queue"; #endif - int wIdx = mWIdx.load(); + int wIdx = mWIdx.loadAcquire(); mWIdx.storeRelease((wIdx+1)%mSize); } @@ -75,7 +75,7 @@ public: qCritical() << "BUG: dequeueing an empty queue"; #endif - int rIdx = mRIdx.load(); + int rIdx = mRIdx.loadAcquire(); mRIdx.storeRelease((rIdx+1)%mSize); }