Merge branch 'master' into add_nodenameinsignalviewer
This commit is contained in:
+51
-15
@@ -4,6 +4,7 @@
|
||||
#include <QApplication>
|
||||
#include <QPalette>
|
||||
#include <QDateTime>
|
||||
#include <QSettings>
|
||||
#include "utility.h"
|
||||
|
||||
CANFrameModel::~CANFrameModel()
|
||||
@@ -45,24 +46,29 @@ int CANFrameModel::columnCount(const QModelIndex &index) const
|
||||
CANFrameModel::CANFrameModel(QObject *parent)
|
||||
: QAbstractTableModel(parent)
|
||||
{
|
||||
|
||||
int maxFramesDefault;
|
||||
if (QSysInfo::WordSize > 32)
|
||||
{
|
||||
qDebug() << "64 bit OS detected. Requesting a large preallocation";
|
||||
preallocSize = 10000000;
|
||||
maxFramesDefault = 10000000;
|
||||
}
|
||||
else //if compiling for 32 bit you can't ask for gigabytes of preallocation so tone it down.
|
||||
{
|
||||
qDebug() << "32 bit OS detected. Requesting a much restricted prealloc";
|
||||
preallocSize = 2000000;
|
||||
maxFramesDefault = 2000000;
|
||||
}
|
||||
|
||||
QSettings settings;
|
||||
preallocSize = settings.value("Main/MaximumFrames", maxFramesDefault).toInt();
|
||||
|
||||
//the goal is to prevent a reallocation from ever happening
|
||||
frames.reserve(preallocSize);
|
||||
filteredFrames.reserve(preallocSize); //the goal is to prevent a reallocation from ever happening
|
||||
filteredFrames.reserve(preallocSize);
|
||||
|
||||
dbcHandler = DBCHandler::getReference();
|
||||
interpretFrames = false;
|
||||
overwriteDups = false;
|
||||
filtersPersistDuringClear = false;
|
||||
useHexMode = true;
|
||||
timeSeconds = false;
|
||||
timeOffset = 0;
|
||||
@@ -196,6 +202,11 @@ void CANFrameModel::setOverwriteMode(bool mode)
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void CANFrameModel::setClearMode(bool mode)
|
||||
{
|
||||
filtersPersistDuringClear = mode;
|
||||
}
|
||||
|
||||
void CANFrameModel::setFilterState(unsigned int ID, bool state)
|
||||
{
|
||||
if (!filters.contains(ID)) return;
|
||||
@@ -404,7 +415,7 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
||||
const unsigned char *data = reinterpret_cast<const unsigned char *>(thisFrame.payload().constData());
|
||||
int dataLen = thisFrame.payload().count();
|
||||
|
||||
if (role == Qt::BackgroundColorRole)
|
||||
if (role == Qt::BackgroundRole)
|
||||
{
|
||||
if (dbcHandler != nullptr && interpretFrames && !ignoreDBCColors)
|
||||
{
|
||||
@@ -437,7 +448,7 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
||||
}
|
||||
}
|
||||
|
||||
if (role == Qt::TextColorRole)
|
||||
if (role == Qt::ForegroundRole)
|
||||
{
|
||||
if (dbcHandler != nullptr && interpretFrames && !ignoreDBCColors)
|
||||
{
|
||||
@@ -673,13 +684,21 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
|
||||
|
||||
if (!overwriteDups)
|
||||
{
|
||||
frames.append(tempFrame);
|
||||
if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus])
|
||||
try
|
||||
{
|
||||
if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count());
|
||||
tempFrame.frameCount = 1;
|
||||
filteredFrames.append(tempFrame);
|
||||
if (autoRefresh) endInsertRows();
|
||||
frames.append(tempFrame);
|
||||
|
||||
if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus])
|
||||
{
|
||||
if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count());
|
||||
tempFrame.frameCount = 1;
|
||||
filteredFrames.append(tempFrame);
|
||||
if (autoRefresh) endInsertRows();
|
||||
}
|
||||
}
|
||||
catch (const std::exception& ex)
|
||||
{
|
||||
qDebug() << "addFrame failed to append. App is probably going to crash. frames.length(): " << frames.length() << " Exception: " << ex.what();
|
||||
}
|
||||
}
|
||||
else //yes, overwrite dups
|
||||
@@ -728,6 +747,20 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
|
||||
|
||||
void CANFrameModel::addFrames(const CANConnection*, const QVector<CANFrame>& pFrames)
|
||||
{
|
||||
if(frames.length() > frames.capacity() * 0.99)
|
||||
{
|
||||
qDebug() << "Frames count: " << frames.length() << " of " << frames.capacity() << " capacity, removing first " << (int)(frames.capacity() * 0.05) << " frames";
|
||||
frames.remove(0, (int)(frames.capacity() * 0.05));
|
||||
qDebug() << "Frames removed, new count: " << frames.length();
|
||||
}
|
||||
|
||||
if(filteredFrames.length() > filteredFrames.capacity() * 0.99)
|
||||
{
|
||||
qDebug() << "filteredFrames count: " << filteredFrames.length() << " of " << filteredFrames.capacity() << " capacity, removing first " << (int)(filteredFrames.capacity() * 0.05) << " frames";
|
||||
filteredFrames.remove(0, (int)(filteredFrames.capacity() * 0.05));
|
||||
qDebug() << "filteredFrames removed, new count: " << filteredFrames.length();
|
||||
}
|
||||
|
||||
foreach(const CANFrame& frame, pFrames)
|
||||
{
|
||||
addFrame(frame);
|
||||
@@ -754,8 +787,8 @@ void CANFrameModel::sendRefresh()
|
||||
mutex.lock();
|
||||
beginResetModel();
|
||||
filteredFrames.clear();
|
||||
filteredFrames.reserve(preallocSize);
|
||||
filteredFrames.append(tempContainer);
|
||||
filteredFrames.reserve(preallocSize);
|
||||
|
||||
lastUpdateNumFrames = 0;
|
||||
endResetModel();
|
||||
@@ -796,8 +829,11 @@ void CANFrameModel::clearFrames()
|
||||
this->beginResetModel();
|
||||
frames.clear();
|
||||
filteredFrames.clear();
|
||||
filters.clear();
|
||||
busFilters.clear();
|
||||
if(filtersPersistDuringClear == false)
|
||||
{
|
||||
filters.clear();
|
||||
busFilters.clear();
|
||||
}
|
||||
frames.reserve(preallocSize);
|
||||
filteredFrames.reserve(preallocSize);
|
||||
this->endResetModel();
|
||||
|
||||
@@ -46,6 +46,7 @@ public:
|
||||
bool getInterpretMode();
|
||||
void setOverwriteMode(bool);
|
||||
void setHexMode(bool);
|
||||
void setClearMode(bool mode);
|
||||
void setSysTimeMode(bool);
|
||||
void setMillisMode(bool mode);
|
||||
void setIgnoreDBCColors(bool mode);
|
||||
@@ -89,6 +90,7 @@ private:
|
||||
QMutex mutex;
|
||||
bool interpretFrames; //should we use the dbcHandler?
|
||||
bool overwriteDups; //should we display all frames or only the newest for each ID?
|
||||
bool filtersPersistDuringClear;
|
||||
QString timeFormat;
|
||||
bool useHexMode;
|
||||
bool timeSeconds;
|
||||
|
||||
@@ -245,11 +245,11 @@ CANCon::type CANConnection::getType() {
|
||||
|
||||
|
||||
CANCon::status CANConnection::getStatus() {
|
||||
return (CANCon::status) mStatus.load();
|
||||
return (CANCon::status) mStatus.loadRelaxed();
|
||||
}
|
||||
|
||||
void CANConnection::setStatus(CANCon::status pStatus) {
|
||||
mStatus.store(pStatus);
|
||||
mStatus.storeRelaxed(pStatus);
|
||||
}
|
||||
|
||||
bool CANConnection::isCapSuspended() {
|
||||
|
||||
@@ -501,8 +501,10 @@ CANConnection* ConnectionWindow::create(CANCon::type pTye, QString pPortName, QS
|
||||
|
||||
void ConnectionWindow::loadConnections()
|
||||
{
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||
qRegisterMetaTypeStreamOperators<CANBus>();
|
||||
qRegisterMetaTypeStreamOperators<QList<CANBus>>();
|
||||
#endif
|
||||
|
||||
QSettings settings;
|
||||
|
||||
|
||||
+5
-1
@@ -351,7 +351,11 @@ DBC_NODE* DBCFile::findNodeByNameAndComment(QString fullname)
|
||||
if (dbc_nodes.length() == 0) return nullptr;
|
||||
for (int i = 0; i < dbc_nodes.length(); i++)
|
||||
{
|
||||
nameAndComment = dbc_nodes[i].name + " - " + dbc_nodes[i].comment;
|
||||
if(dbc_nodes[i].comment.isEmpty())
|
||||
nameAndComment = dbc_nodes[i].name;
|
||||
else
|
||||
nameAndComment = dbc_nodes[i].name + " - " + dbc_nodes[i].comment;
|
||||
|
||||
if (fullname.compare(nameAndComment, Qt::CaseInsensitive) == 0)
|
||||
{
|
||||
return &dbc_nodes[i];
|
||||
|
||||
@@ -111,8 +111,11 @@ void DBCNodeEditor::showEvent(QShowEvent* event)
|
||||
|
||||
void DBCNodeEditor::refreshView()
|
||||
{
|
||||
ui->lineComment->setText(dbcNode->comment);
|
||||
ui->lineMsgName->setText(dbcNode->name);
|
||||
if(dbcNode)
|
||||
{
|
||||
ui->lineComment->setText(dbcNode->comment);
|
||||
ui->lineMsgName->setText(dbcNode->name);
|
||||
}
|
||||
|
||||
//generateSampleText();
|
||||
}
|
||||
|
||||
@@ -90,6 +90,20 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) :
|
||||
ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", true).toBool());
|
||||
ui->cbIgnoreDBCColors->setChecked(settings.value("Main/IgnoreDBCColors", false).toBool());
|
||||
|
||||
int maxFramesDefault;
|
||||
if (QSysInfo::WordSize > 32)
|
||||
{
|
||||
qDebug() << "64 bit OS detected. Requesting a large preallocation";
|
||||
maxFramesDefault = 10000000;
|
||||
}
|
||||
else //if compiling for 32 bit you can't ask for gigabytes of preallocation so tone it down.
|
||||
{
|
||||
qDebug() << "32 bit OS detected. Requesting a much restricted prealloc";
|
||||
maxFramesDefault = 2000000;
|
||||
}
|
||||
|
||||
ui->spinMaximumFrames->setValue(settings.value("Main/MaximumFrames", maxFramesDefault).toInt());
|
||||
|
||||
//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()));
|
||||
connect(ui->cbFlowAutoRef, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
|
||||
@@ -117,6 +131,7 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) :
|
||||
connect(ui->cbHexGraphFlow, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
|
||||
connect(ui->cbHexGraphInfo, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
|
||||
connect(ui->cbIgnoreDBCColors, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
|
||||
connect(ui->spinMaximumFrames, SIGNAL(valueChanged(int)), this, SLOT(updateSettings()));
|
||||
|
||||
installEventFilter(this);
|
||||
}
|
||||
@@ -183,6 +198,7 @@ void MainSettingsDialog::updateSettings()
|
||||
settings.setValue("Remote/Pass", encPass);
|
||||
settings.setValue("Main/FilterLabeling", ui->cbFilterLabeling->isChecked());
|
||||
settings.setValue("Main/IgnoreDBCColors", ui->cbIgnoreDBCColors->isChecked());
|
||||
settings.setValue("Main/MaximumFrames", ui->spinMaximumFrames->value());
|
||||
|
||||
settings.sync();
|
||||
emit updatedSettings();
|
||||
|
||||
+34
-4
@@ -30,8 +30,10 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
|
||||
qRegisterMetaTypeStreamOperators<QVector<QString>>();
|
||||
qRegisterMetaTypeStreamOperators<QVector<int>>();
|
||||
#endif
|
||||
|
||||
useHex = true;
|
||||
|
||||
@@ -55,7 +57,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
verticalHeader->setSectionResizeMode(QHeaderView::Fixed);
|
||||
QSettings settings;
|
||||
int fontSize = settings.value("Main/FontSize", 9).toUInt();
|
||||
QFont sysFont = QFont(); //get default font
|
||||
QFont sysFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); //get default font
|
||||
sysFont.setPointSize(fontSize);
|
||||
verticalHeader->setDefaultSectionSize(sysFont.pixelSize());
|
||||
ui->canFramesView->setFont(sysFont);
|
||||
@@ -141,6 +143,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
|
||||
connect(ui->cbInterpret, &QAbstractButton::toggled, this, &MainWindow::interpretToggled);
|
||||
connect(ui->cbOverwrite, &QAbstractButton::toggled, this, &MainWindow::overwriteToggled);
|
||||
connect(ui->cbPersistentFilters, &QAbstractButton::toggled, this, &MainWindow::presistentFiltersToggled);
|
||||
connect(ui->listFilters, &QListWidget::itemChanged, this, &MainWindow::filterListItemChanged);
|
||||
connect(ui->listBusFilters, &QListWidget::itemChanged, this, &MainWindow::busFilterListItemChanged);
|
||||
|
||||
@@ -177,7 +180,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
updateTimer.setInterval(250);
|
||||
updateTimer.start();
|
||||
|
||||
elapsedTime = new QTime;
|
||||
elapsedTime = new QElapsedTimer;
|
||||
elapsedTime->start();
|
||||
|
||||
isConnected = false;
|
||||
@@ -616,6 +619,18 @@ void MainWindow::overwriteToggled(bool state)
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::presistentFiltersToggled(bool state)
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
model->setClearMode(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
model->setClearMode(false);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::updateFilterList()
|
||||
{
|
||||
if (model == nullptr) return;
|
||||
@@ -1146,11 +1161,26 @@ void MainWindow::showTemporalGraphWindow()
|
||||
//only create an instance of the object if we dont have one. Otherwise just display the existing one.
|
||||
if (!temporalGraphWindow)
|
||||
{
|
||||
const QVector<CANFrame> *frames;
|
||||
if (!useFiltered)
|
||||
temporalGraphWindow = new TemporalGraphWindow(model->getListReference());
|
||||
frames = model->getListReference();
|
||||
else
|
||||
temporalGraphWindow = new TemporalGraphWindow(model->getFilteredListReference());
|
||||
frames = model->getFilteredListReference();
|
||||
|
||||
if(frames->count() > 2000)
|
||||
{
|
||||
QMessageBox::StandardButton confirmDialog;
|
||||
confirmDialog = QMessageBox::question(this, "Danger Will Robinson", "There are a lot of frames (>2000) to plot, this may take a while or crash the app. Crash likely with more than 10k frames. Continue?",
|
||||
QMessageBox::Yes|QMessageBox::No);
|
||||
if (confirmDialog == QMessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
temporalGraphWindow = new TemporalGraphWindow(frames);
|
||||
}
|
||||
|
||||
temporalGraphWindow->show();
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -99,6 +99,7 @@ private slots:
|
||||
void setupSendToLatestGraphWindow();
|
||||
void interpretToggled(bool);
|
||||
void overwriteToggled(bool);
|
||||
void presistentFiltersToggled(bool state);
|
||||
void logReceivedFrame(CANConnection*, QVector<CANFrame>);
|
||||
void tickGUIUpdate();
|
||||
void toggleCapture();
|
||||
@@ -137,7 +138,7 @@ private:
|
||||
DBCHandler *dbcHandler;
|
||||
QByteArray inputBuffer;
|
||||
QTimer updateTimer;
|
||||
QTime *elapsedTime;
|
||||
QElapsedTimer *elapsedTime;
|
||||
int framesPerSec;
|
||||
int rxFrames;
|
||||
bool inhibitFilterUpdate;
|
||||
|
||||
+16
-28
@@ -156,26 +156,8 @@ class QCPPolarGraph;
|
||||
|
||||
It provides QMetaObject-based reflection of its enums and flags via \a QCP::staticMetaObject.
|
||||
*/
|
||||
#ifndef Q_MOC_RUN
|
||||
namespace QCP {
|
||||
#else
|
||||
class QCP { // when in moc-run, make it look like a class, so we get Q_GADGET, Q_ENUMS/Q_FLAGS features in namespace
|
||||
Q_GADGET
|
||||
Q_ENUMS(ExportPen)
|
||||
Q_ENUMS(ResolutionUnit)
|
||||
Q_ENUMS(SignDomain)
|
||||
Q_ENUMS(MarginSide)
|
||||
Q_FLAGS(MarginSides)
|
||||
Q_ENUMS(AntialiasedElement)
|
||||
Q_FLAGS(AntialiasedElements)
|
||||
Q_ENUMS(PlottingHint)
|
||||
Q_FLAGS(PlottingHints)
|
||||
Q_ENUMS(Interaction)
|
||||
Q_FLAGS(Interactions)
|
||||
Q_ENUMS(SelectionRectMode)
|
||||
Q_ENUMS(SelectionType)
|
||||
public:
|
||||
#endif
|
||||
Q_NAMESPACE
|
||||
|
||||
/*!
|
||||
Defines the different units in which the image resolution can be specified in the export
|
||||
@@ -318,6 +300,20 @@ enum SelectionType { stNone ///< The plottable is not selectable
|
||||
,stMultipleDataRanges ///< Any combination of data points/ranges can be selected
|
||||
};
|
||||
|
||||
Q_ENUM_NS(ExportPen)
|
||||
Q_ENUM_NS(ResolutionUnit)
|
||||
Q_ENUM_NS(SignDomain)
|
||||
Q_ENUM_NS(MarginSide)
|
||||
Q_FLAG_NS(MarginSides)
|
||||
Q_ENUM_NS(AntialiasedElement)
|
||||
Q_FLAG_NS(AntialiasedElements)
|
||||
Q_ENUM_NS(PlottingHint)
|
||||
Q_FLAG_NS(PlottingHints)
|
||||
Q_ENUM_NS(Interaction)
|
||||
Q_FLAG_NS(Interactions)
|
||||
Q_ENUM_NS(SelectionRectMode)
|
||||
Q_ENUM_NS(SelectionType)
|
||||
|
||||
/*! \internal
|
||||
|
||||
Returns whether the specified \a value is considered an invalid data value for plottables (i.e.
|
||||
@@ -386,15 +382,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::AntialiasedElements)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::PlottingHints)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::MarginSides)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::Interactions)
|
||||
Q_DECLARE_METATYPE(QCP::ExportPen)
|
||||
Q_DECLARE_METATYPE(QCP::ResolutionUnit)
|
||||
Q_DECLARE_METATYPE(QCP::SignDomain)
|
||||
Q_DECLARE_METATYPE(QCP::MarginSide)
|
||||
Q_DECLARE_METATYPE(QCP::AntialiasedElement)
|
||||
Q_DECLARE_METATYPE(QCP::PlottingHint)
|
||||
Q_DECLARE_METATYPE(QCP::Interaction)
|
||||
Q_DECLARE_METATYPE(QCP::SelectionRectMode)
|
||||
Q_DECLARE_METATYPE(QCP::SelectionType)
|
||||
//no need to use Q_DECLARE_METATYPE on enum since Q_ENUM_NS adds enum as metatype automatically
|
||||
|
||||
/* end of 'src/global.h' */
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define SNIFFERITEM_H
|
||||
|
||||
#include <QVariant>
|
||||
#include <QTime>
|
||||
#include <QElapsedTimer>
|
||||
#include "can_structs.h"
|
||||
|
||||
struct fstCan
|
||||
@@ -50,7 +50,7 @@ private:
|
||||
quint64 mCurrentTime;
|
||||
quint64 mCurrSeqVal;
|
||||
|
||||
QTime mTime;
|
||||
QElapsedTimer mTime;
|
||||
};
|
||||
|
||||
#endif // SNIFFERITEM_H
|
||||
|
||||
+10
-1
@@ -4,6 +4,9 @@
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QSettings>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 )
|
||||
#include <QtCore/QRandomGenerator>
|
||||
#endif
|
||||
|
||||
#include "connections/canconmanager.h"
|
||||
#include "helpwindow.h"
|
||||
@@ -234,7 +237,13 @@ void ScriptingWindow::createNewScript()
|
||||
|
||||
container = new ScriptContainer();
|
||||
|
||||
container->fileName = "UNNAMED_" + QString::number((qrand() % 10000)) + ".js";
|
||||
QString randomPart;
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 )
|
||||
randomPart = QString::number((qrand() % 10000));
|
||||
#else
|
||||
randomPart = QString::number((QRandomGenerator::global()->bounded(10000)));
|
||||
#endif
|
||||
container->fileName = "UNNAMED_" + randomPart + ".js";
|
||||
container->filePath = QString();
|
||||
container->scriptText = QString();
|
||||
container->setScriptWindow(this);
|
||||
|
||||
+173
-1
@@ -27,6 +27,10 @@ SignalViewerWindow::SignalViewerWindow(const QVector<CANFrame> *frames, QWidget
|
||||
connect(ui->btnAdd, SIGNAL(clicked(bool)), this, SLOT(addSignal()));
|
||||
connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int)));
|
||||
connect(ui->btnRemove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedSignal()));
|
||||
connect(ui->btnSave, SIGNAL(clicked(bool)), this, SLOT(saveSignalsFile()));
|
||||
connect(ui->btnLoad, SIGNAL(clicked(bool)), this, SLOT(loadSignalsFile()));
|
||||
connect(ui->btnAppend, SIGNAL(clicked(bool)), this, SLOT(appendSignalsFile()));
|
||||
connect(ui->btnClear, SIGNAL(clicked(bool)), this, SLOT(clearSignalsTable()));
|
||||
|
||||
loadMessages();
|
||||
}
|
||||
@@ -137,11 +141,179 @@ void SignalViewerWindow::addSignal()
|
||||
DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(ui->cbSignals->currentText());
|
||||
if (!sig) return;
|
||||
|
||||
addSignal(sig);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::addSignal(DBC_SIGNAL *sig)
|
||||
{
|
||||
signalList.append(sig);
|
||||
|
||||
int rowIdx = ui->tableViewer->rowCount();
|
||||
ui->tableViewer->insertRow(rowIdx);
|
||||
QTableWidgetItem *item = new QTableWidgetItem(msg->sender->name + " - " + sig->name);
|
||||
QTableWidgetItem *item = new QTableWidgetItem(sig->parentMessage->sender->name + " - " + sig->name);
|
||||
ui->tableViewer->setItem(rowIdx, 0, item);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::saveSignalsFile()
|
||||
{
|
||||
saveDefinitions();
|
||||
}
|
||||
|
||||
void SignalViewerWindow::loadSignalsFile()
|
||||
{
|
||||
loadDefinitions(false);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::appendSignalsFile()
|
||||
{
|
||||
loadDefinitions(true);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::clearSignalsTable()
|
||||
{
|
||||
clearSignalsTable(true);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::clearSignalsTable(bool askForConfirmation)
|
||||
{
|
||||
if(askForConfirmation)
|
||||
{
|
||||
QMessageBox::StandardButton confirmDialog;
|
||||
confirmDialog = QMessageBox::question(this, "Danger Will Robinson", "Are you sure you want to clear all of your signals?",
|
||||
QMessageBox::Yes|QMessageBox::No);
|
||||
if (confirmDialog == QMessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
signalList.clear();
|
||||
ui->tableViewer->setRowCount(0);
|
||||
}
|
||||
|
||||
void SignalViewerWindow::saveDefinitions()
|
||||
{
|
||||
QString filename;
|
||||
QFileDialog dialog(this);
|
||||
QSettings settings;
|
||||
|
||||
QStringList filters;
|
||||
filters.append(QString(tr("SignalViewer definition (*.sdf)")));
|
||||
|
||||
dialog.setFileMode(QFileDialog::AnyFile);
|
||||
dialog.setNameFilters(filters);
|
||||
dialog.setViewMode(QFileDialog::Detail);
|
||||
dialog.setAcceptMode(QFileDialog::AcceptSave);
|
||||
dialog.setDirectory(settings.value("SignalViewer/LoadSaveDirectory", dialog.directory().path()).toString());
|
||||
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
filename = dialog.selectedFiles()[0];
|
||||
settings.setValue("SignalViewer/LoadSaveDirectory", dialog.directory().path());
|
||||
|
||||
if (!filename.contains('.')) filename += ".sdf";
|
||||
|
||||
QFile *outFile = new QFile(filename);
|
||||
|
||||
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
|
||||
return;
|
||||
|
||||
DBC_SIGNAL *sig;
|
||||
for (int i = 0; i < signalList.count(); i++)
|
||||
{
|
||||
sig = signalList.at(i);
|
||||
|
||||
outFile->write("SV1");
|
||||
outFile->putChar(',');
|
||||
outFile->write(QString::number(sig->parentMessage->ID, 16).toUtf8());
|
||||
outFile->putChar(',');
|
||||
outFile->write(sig->parentMessage->name.toUtf8());
|
||||
outFile->putChar(',');
|
||||
outFile->write(sig->name.toUtf8());
|
||||
|
||||
outFile->write("\n");
|
||||
}
|
||||
outFile->close();
|
||||
}
|
||||
}
|
||||
|
||||
void SignalViewerWindow::loadDefinitions(bool append)
|
||||
{
|
||||
QString filename;
|
||||
QFileDialog dialog;
|
||||
QSettings settings;
|
||||
|
||||
QStringList filters;
|
||||
filters.append(QString(tr("SignalViewer definition (*.sdf)")));
|
||||
|
||||
QList<DBC_SIGNAL *> loadedSignals;
|
||||
|
||||
if (dbcHandler == nullptr) return;
|
||||
if (dbcHandler->getFileCount() == 0) dbcHandler->createBlankFile();
|
||||
|
||||
dialog.setFileMode(QFileDialog::ExistingFile);
|
||||
dialog.setNameFilters(filters);
|
||||
dialog.setViewMode(QFileDialog::Detail);
|
||||
dialog.setDirectory(settings.value("SignalViewer/LoadSaveDirectory", dialog.directory().path()).toString());
|
||||
|
||||
if (dialog.exec() == QDialog::Accepted)
|
||||
{
|
||||
filename = dialog.selectedFiles()[0];
|
||||
settings.setValue("SignalViewer/LoadSaveDirectory", dialog.directory().path());
|
||||
|
||||
QFile *inFile = new QFile(filename);
|
||||
QByteArray line;
|
||||
|
||||
if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
return;
|
||||
|
||||
while (!inFile->atEnd()) {
|
||||
line = inFile->readLine().simplified();
|
||||
if (line.length() > 2)
|
||||
{
|
||||
QList<QByteArray> tokens = line.split(',');
|
||||
|
||||
DBC_SIGNAL *sig;
|
||||
|
||||
if (tokens[0] == "SV1") //signal viewer save format v1
|
||||
{
|
||||
// = tokens[1].toUInt(nullptr, 16);
|
||||
|
||||
int msgId = tokens[1].toUInt(nullptr, 16);
|
||||
QString msgName = QString(tokens[2]);
|
||||
QString sigName = QString(tokens[3]);
|
||||
DBC_MESSAGE *msg;;
|
||||
if (msg = dbcHandler->findMessage(msgName))
|
||||
{
|
||||
sig = msg->sigHandler->findSignalByName(sigName);
|
||||
loadedSignals.append(sig);
|
||||
}
|
||||
else if(msg = dbcHandler->findMessage(msgId))
|
||||
{
|
||||
sig = msg->sigHandler->findSignalByName(sigName);
|
||||
//fix anything up about the name?
|
||||
loadedSignals.append(sig);
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Couldn't find the message by name! " << msgName << " " << sigName;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
inFile->close();
|
||||
|
||||
if(loadedSignals.count() > 0)
|
||||
{
|
||||
if(append == false)
|
||||
{
|
||||
clearSignalsTable(false);
|
||||
}
|
||||
|
||||
for (int i=0; i<loadedSignals.count(); i++)
|
||||
{
|
||||
addSignal(loadedSignals[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,8 +20,16 @@ private slots:
|
||||
void loadMessages();
|
||||
void loadSignals(int idx);
|
||||
void addSignal();
|
||||
void addSignal(DBC_SIGNAL *sig);
|
||||
void removeSelectedSignal();
|
||||
void updatedFrames(int);
|
||||
void saveSignalsFile();
|
||||
void loadSignalsFile();
|
||||
void appendSignalsFile();
|
||||
void clearSignalsTable();
|
||||
void clearSignalsTable(bool);
|
||||
void saveDefinitions();
|
||||
void loadDefinitions(bool);
|
||||
|
||||
private:
|
||||
Ui::SignalViewerWindow *ui;
|
||||
|
||||
@@ -31,6 +31,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <QDateTime>
|
||||
#include <QCryptographicHash>
|
||||
#include <QDataStream>
|
||||
#include <QIODevice>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 )
|
||||
#include <QtCore/QRandomGenerator>
|
||||
#endif
|
||||
|
||||
SimpleCrypt::SimpleCrypt():
|
||||
m_key(0),
|
||||
@@ -38,7 +42,9 @@ SimpleCrypt::SimpleCrypt():
|
||||
m_protectionMode(ProtectionChecksum),
|
||||
m_lastError(ErrorNoError)
|
||||
{
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 )
|
||||
qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));
|
||||
#endif
|
||||
}
|
||||
|
||||
SimpleCrypt::SimpleCrypt(quint64 key):
|
||||
@@ -47,7 +53,9 @@ SimpleCrypt::SimpleCrypt(quint64 key):
|
||||
m_protectionMode(ProtectionChecksum),
|
||||
m_lastError(ErrorNoError)
|
||||
{
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 )
|
||||
qsrand(uint(QDateTime::currentMSecsSinceEpoch() & 0xFFFF));
|
||||
#endif
|
||||
splitKey();
|
||||
}
|
||||
|
||||
@@ -113,7 +121,11 @@ QByteArray SimpleCrypt::encryptToByteArray(QByteArray plaintext)
|
||||
}
|
||||
|
||||
//prepend a random char to the string
|
||||
#if QT_VERSION < QT_VERSION_CHECK( 5, 10, 0 )
|
||||
char randomChar = char(qrand() & 0xFF);
|
||||
#else
|
||||
char randomChar = char(QRandomGenerator::global()->bounded(256));
|
||||
#endif
|
||||
ba = randomChar + integrityProtection + ba;
|
||||
|
||||
int pos(0);
|
||||
|
||||
@@ -80,6 +80,39 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Maximum Frames to Capture</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinMaximumFrames">
|
||||
<property name="minimum">
|
||||
<number>100000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000000000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>100000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>10000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_6">
|
||||
<property name="title">
|
||||
|
||||
@@ -227,6 +227,13 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbPersistentFilters">
|
||||
<property name="text">
|
||||
<string>Keep Filters When Clearing</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbAutoScroll">
|
||||
<property name="text">
|
||||
|
||||
@@ -85,6 +85,34 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnSave">
|
||||
<property name="text">
|
||||
<string>Save View</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnLoad">
|
||||
<property name="text">
|
||||
<string>Load View</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnAppend">
|
||||
<property name="text">
|
||||
<string>Append to View</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnClear">
|
||||
<property name="text">
|
||||
<string>Clear View</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
||||
Reference in New Issue
Block a user