From ba63a25fe3989efd85ec15f6681072680efd6fbf Mon Sep 17 00:00:00 2001 From: Bertrand Date: Tue, 23 Feb 2021 08:10:39 +0100 Subject: [PATCH 1/5] added bus filter to main window --- .gitignore | 3 +++ canframemodel.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++---- canframemodel.h | 4 ++++ mainwindow.cpp | 25 ++++++++++++++++++++++- mainwindow.h | 2 ++ 5 files changed, 80 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index cff24fb..77754fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +#Build directory +build/ + # Compiled Object files *.slo *.lo diff --git a/canframemodel.cpp b/canframemodel.cpp index de09091..3edcdeb 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -11,6 +11,7 @@ CANFrameModel::~CANFrameModel() frames.clear(); filteredFrames.clear(); filters.clear(); + busFilters.clear(); } int CANFrameModel::rowCount(const QModelIndex &parent) const @@ -171,6 +172,13 @@ void CANFrameModel::setFilterState(unsigned int ID, bool state) sendRefresh(); } +void CANFrameModel::setBusFilterState(unsigned int BusID, bool state) +{ + if (!busFilters.contains(BusID)) return; + busFilters[BusID] = state; + sendRefresh(); +} + void CANFrameModel::setAllFilters(bool state) { QMap::iterator it; @@ -337,7 +345,7 @@ void CANFrameModel::recalcOverwrite() for (int i = 0; i < frames.count(); i++) { - if (filters[frames[i].frameId()]) + if (filters[frames[i].frameId()] && busFilters[frames[i].bus]) { filteredFrames.append(frames[i]); } @@ -578,6 +586,18 @@ bool CANFrameModel::any_filters_are_configured(void) return false; } +bool CANFrameModel::any_busfilters_are_configured(void) +{ + for (auto const &val : busFilters) + { + if (val == true) + continue; + else + return true; + } + return false; +} + void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) { @@ -601,10 +621,21 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) needFilterRefresh = true; } + //if this BusID isn't found in the busFilters list then add it and show it by default + if (!busFilters.contains(tempFrame.bus)) + { + // if there are any busFilters already configured, leave the new filter disabled + if (any_busfilters_are_configured()) + busFilters.insert(tempFrame.bus, false); + else + busFilters.insert(tempFrame.bus, true); + needFilterRefresh = true; + } + if (!overwriteDups) { frames.append(tempFrame); - if (filters[tempFrame.frameId()]) + if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus]) { if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count()); tempFrame.frameCount = 1; @@ -629,7 +660,7 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false) if (!found) { frames.append(tempFrame); - if (filters[tempFrame.frameId()]) + if (filters[tempFrame.frameId()] && busFilters[tempFrame.bus]) { if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count()); tempFrame.frameCount = 1; @@ -676,7 +707,7 @@ void CANFrameModel::sendRefresh() int count = frames.count(); for (int i = 0; i < count; i++) { - if (filters[frames[i].frameId()]) + if (filters[frames[i].frameId()] && busFilters[frames[i].bus]) { tempContainer.append(frames[i]); } @@ -727,6 +758,7 @@ void CANFrameModel::clearFrames() frames.clear(); filteredFrames.clear(); filters.clear(); + busFilters.clear(); frames.reserve(preallocSize); filteredFrames.reserve(preallocSize); this->endResetModel(); @@ -758,6 +790,11 @@ void CANFrameModel::insertFrames(const QVector &newFrames) needFilterRefresh = true; } if (filters[newFrames[i].frameId()]) + { + busFilters.insert(newFrames[i].bus, true); + needFilterRefresh = true; + } + if (filters[newFrames[i].frameId()] && busFilters[newFrames[i].bus]) { insertedFiltered++; filteredFrames.append(newFrames[i]); @@ -796,6 +833,7 @@ void CANFrameModel::loadFilterFile(QString filename) return; filters.clear(); + busFilters.clear(); while (!inFile->atEnd()) { line = inFile->readLine().simplified(); @@ -861,3 +899,8 @@ const QMap* CANFrameModel::getFiltersReference() const { return &filters; } + +const QMap* CANFrameModel::getBusFiltersReference() const +{ + return &busFilters; +} diff --git a/canframemodel.h b/canframemodel.h index 51762a1..47ceed7 100644 --- a/canframemodel.h +++ b/canframemodel.h @@ -48,6 +48,7 @@ public: void setHexMode(bool); void setSysTimeMode(bool); void setFilterState(unsigned int ID, bool state); + void setBusFilterState(unsigned int BusID, bool state); void setAllFilters(bool state); void setSecondsMode(bool); void setTimeFormat(QString); @@ -62,6 +63,7 @@ public: const QVector *getListReference() const; //thou shalt not modify these frames externally! const QVector *getFilteredListReference() const; //Thus saith the Lord, NO. const QMap *getFiltersReference() const; //this neither + const QMap *getBusFiltersReference() const; //this neither public slots: void addFrame(const CANFrame&, bool); @@ -75,10 +77,12 @@ private: void qSortCANFrameDesc(QVector* frames, Column column, int lowerBound, int upperBound); uint64_t getCANFrameVal(int row, Column col); bool any_filters_are_configured(void); + bool any_busfilters_are_configured(void); QVector frames; QVector filteredFrames; QMap filters; + QMap busFilters; DBCHandler *dbcHandler; QMutex mutex; bool interpretFrames; //should we use the dbcHandler? diff --git a/mainwindow.cpp b/mainwindow.cpp index dd5c091..eb47a56 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -124,6 +124,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->actionPreferences, &QAction::triggered, this, &MainWindow::showSettingsDialog); connect(model, &CANFrameModel::updatedFiltersList, this, &MainWindow::updateFilterList); connect(ui->listFilters, &QListWidget::itemChanged, this, &MainWindow::filterListItemChanged); + connect(ui->listBusFilters, &QListWidget::itemChanged, this, &MainWindow::busFilterListItemChanged); connect(ui->btnFilterAll, &QAbstractButton::clicked, this, &MainWindow::filterSetAll); connect(ui->btnFilterNone, &QAbstractButton::clicked, this, &MainWindow::filterClearAll); connect(ui->actionFirmware_Update, &QAction::triggered, this, &MainWindow::showFirmwareUploaderWindow); @@ -503,13 +504,15 @@ void MainWindow::updateFilterList() { if (model == nullptr) return; const QMap *filters = model->getFiltersReference(); - if (filters == nullptr) return; + const QMap *busFilters = model->getBusFiltersReference(); + if (filters == nullptr && busFilters == nullptr) return; qDebug() << "updateFilterList called on MainWindow"; inhibitFilterUpdate = true; ui->listFilters->clear(); + ui->listBusFilters->clear(); if (filters->isEmpty()) return; @@ -518,6 +521,13 @@ void MainWindow::updateFilterList() { /*QListWidgetItem *thisItem = */FilterUtility::createCheckableFilterItem(filterIter.key(), filterIter.value(), ui->listFilters); } + + if (busFilters->isEmpty()) return; + + for (filterIter = busFilters->begin(); filterIter != busFilters->end(); ++filterIter) + { + QListWidgetItem *thisItem = FilterUtility::createCheckableBusFilterItem(filterIter.key(), filterIter.value(), ui->listBusFilters); + } inhibitFilterUpdate = false; } @@ -534,6 +544,19 @@ void MainWindow::filterListItemChanged(QListWidgetItem *item) model->setFilterState(ID, isSet); } +void MainWindow::busFilterListItemChanged(QListWidgetItem *item) +{ + if (inhibitFilterUpdate) return; + //qDebug() << item->text(); + + // strip away possible filter label + int ID = FilterUtility::getIdAsInt(item); + bool isSet = false; + if (item->checkState() == Qt::Checked) isSet = true; + + model->setBusFilterState(ID, isSet); +} + void MainWindow::filterSetAll() { inhibitFilterUpdate = true; diff --git a/mainwindow.h b/mainwindow.h index 68b8cec..5505b51 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -94,11 +94,13 @@ private slots: void gridDoubleClicked(QModelIndex); void interpretToggled(bool); void overwriteToggled(bool); + void logReceivedFrame(CANConnection*, QVector); void tickGUIUpdate(); void toggleCapture(); void normalizeTiming(); void updateFilterList(); void filterListItemChanged(QListWidgetItem *item); + void busFilterListItemChanged(QListWidgetItem *item); void filterSetAll(); void filterClearAll(); void headerClicked (int logicalIndex); From 8e445b629fd253545711fe1e86da004d9b4bdb42 Mon Sep 17 00:00:00 2001 From: Bertrand Date: Tue, 23 Feb 2021 08:20:14 +0100 Subject: [PATCH 2/5] ignoring Qt user project files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 77754fd..66d90e6 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ build/ **/moc_* **/ui_*.h **/qrc_*.cpp +SavvyCAN.pro.user.* From 064a008dac121cf1889a7ce8f18163f356d4c575 Mon Sep 17 00:00:00 2001 From: Bertrand Date: Tue, 23 Feb 2021 08:32:20 +0100 Subject: [PATCH 3/5] adding bus filter to filter utility --- filterutility.cpp | 39 +++++++++++++++++++++++++++++++++++++-- filterutility.h | 6 ++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/filterutility.cpp b/filterutility.cpp index 72cc3ed..88151b2 100644 --- a/filterutility.cpp +++ b/filterutility.cpp @@ -37,7 +37,7 @@ uint32_t FilterUtility::getGMLanSenderId(int32_t id) return id & 0x1FFF; } -QListWidgetItem * FilterUtility::createCheckableFilterItem(int32_t id, bool checked, QListWidget* parent) +QListWidgetItem * FilterUtility::createCheckableFilterItem(uint32_t id, bool checked, QListWidget* parent) { QListWidgetItem * thisItem = createFilterItem(id,parent); thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); @@ -48,7 +48,19 @@ QListWidgetItem * FilterUtility::createCheckableFilterItem(int32_t id, bool chec return thisItem; } -QListWidgetItem * FilterUtility::createFilterItem(int32_t id, QListWidget* parent) +QListWidgetItem * FilterUtility::createCheckableBusFilterItem(uint32_t id, bool checked, QListWidget* parent) +{ + QListWidgetItem * thisItem = createBusFilterItem(id,parent); + thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable); + if (checked) + thisItem->setCheckState(Qt::Checked); + else + thisItem->setCheckState(Qt::Unchecked); + return thisItem; +} + + +QListWidgetItem * FilterUtility::createFilterItem(uint32_t id, QListWidget* parent) { QSettings settings; DBCHandler * dbcHandler = DBCHandler::getReference(); @@ -81,3 +93,26 @@ QListWidgetItem * FilterUtility::createFilterItem(int32_t id, QListWidget* paren thisItem->setText(filterItemName); return thisItem; } + +QListWidgetItem * FilterUtility::createBusFilterItem(uint32_t id, QListWidget* parent) +{ + QSettings settings; + DBCHandler * dbcHandler = DBCHandler::getReference(); + QListWidgetItem *thisItem = new QListWidgetItem(parent); + QString filterItemName = QStringLiteral("%1").arg(id); + + if (settings.value("Main/FilterLabeling", false).toBool()) + { + // Filter labeling (show interpreted frame names next to the CAN addr ID) + MatchingCriteria_t matchingCriteria; + DBC_MESSAGE *msg = dbcHandler->findMessageForFilter(id,&matchingCriteria); + if (msg != NULL) + { + filterItemName.append(" "); + filterItemName.append(msg->name); + } + } + + thisItem->setText(filterItemName); + return thisItem; +} diff --git a/filterutility.h b/filterutility.h index e346c31..14e8f56 100644 --- a/filterutility.h +++ b/filterutility.h @@ -8,8 +8,10 @@ class FilterUtility { public: - static QListWidgetItem * createFilterItem(int32_t id, QListWidget* parent=NULL); // if parent is given, add item automatically to listwidget - static QListWidgetItem * createCheckableFilterItem(int32_t id, bool checked, QListWidget* parent=NULL); + static QListWidgetItem * createFilterItem(uint32_t id, QListWidget* parent=NULL); // if parent is given, add item automatically to listwidget + static QListWidgetItem * createCheckableFilterItem(uint32_t id, bool checked, QListWidget* parent=NULL); + static QListWidgetItem * createBusFilterItem(uint32_t id, QListWidget* parent=NULL); // if parent is given, add item automatically to listwidget + static QListWidgetItem * createCheckableBusFilterItem(uint32_t id, bool checked, QListWidget* parent=NULL); static uint32_t getIdAsInt( QListWidgetItem * item ); static QString getId( QListWidgetItem * item ); From 311d705a230ef226879e6326df1dec50724e4e6f Mon Sep 17 00:00:00 2001 From: Bertrand Date: Tue, 23 Feb 2021 09:03:13 +0100 Subject: [PATCH 4/5] replacing mainwindow.ui with own version --- ui/mainwindow.ui | 80 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index c50a4ae..a532e93 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -79,6 +79,12 @@ 50 + + + 50 + false + + 8 @@ -92,6 +98,43 @@ + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + + + 120 + 120 + 120 + + + + + + 11 @@ -230,20 +273,45 @@ - - - Qt::Horizontal + + + Bus Filtering: + + + Qt::AlignCenter - + + + + + 0 + 0 + + + + + 175 + 40 + + + + QListView::LeftToRight + + + + Frame Filtering: + + Qt::AlignCenter + - + @@ -293,7 +361,7 @@ 0 0 800 - 23 + 21 From 9166c5ff44845f95f8ba883930eafe30824a2cbf Mon Sep 17 00:00:00 2001 From: Bertrand Date: Tue, 23 Feb 2021 09:20:53 +0100 Subject: [PATCH 5/5] commenting reference to not (yet) implemented function --- mainwindow.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mainwindow.h b/mainwindow.h index 5505b51..ce4adf5 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -94,7 +94,7 @@ private slots: void gridDoubleClicked(QModelIndex); void interpretToggled(bool); void overwriteToggled(bool); - void logReceivedFrame(CANConnection*, QVector); + //void logReceivedFrame(CANConnection*, QVector); void tickGUIUpdate(); void toggleCapture(); void normalizeTiming();