From 415c93a6f8ae8bd6856ee93719fc7a730d3ad34e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 29 Mar 2023 03:07:07 +0000 Subject: [PATCH] wip --- .gitignore | 2 + SConstruct | 2 +- tools/cabana/SConscript | 2 +- tools/cabana/mainwin.cc | 6 ++ tools/cabana/mainwin.h | 2 + tools/cabana/tools/search.cc | 115 +++++++++++++++++++++++++++++++++++ tools/cabana/tools/search.h | 28 +++++++++ 7 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 tools/cabana/tools/search.cc create mode 100644 tools/cabana/tools/search.h diff --git a/.gitignore b/.gitignore index be6629f212..d714957431 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,5 @@ build/ !**/.gitkeep poetry.toml + +sandbox/ diff --git a/SConstruct b/SConstruct index ba2b377e68..b7873fed71 100644 --- a/SConstruct +++ b/SConstruct @@ -176,7 +176,7 @@ env = Environment( "-g", "-fPIC", "-O2", - "-Wunused", + #"-Wunused", "-Werror", "-Wshadow", "-Wno-unknown-warning-option", diff --git a/tools/cabana/SConscript b/tools/cabana/SConscript index ddd6208c07..cd0ed693d8 100644 --- a/tools/cabana/SConscript +++ b/tools/cabana/SConscript @@ -28,7 +28,7 @@ cabana_env.Depends(assets, Glob('/assets/*', exclude=[assets, assets_src, "asset prev_moc_path = cabana_env['QT_MOCHPREFIX'] cabana_env['QT_MOCHPREFIX'] = os.path.dirname(prev_moc_path) + '/cabana/moc_' -cabana_lib = cabana_env.Library("cabana_lib", ['mainwin.cc', 'streams/livestream.cc', 'streams/abstractstream.cc', 'streams/replaystream.cc', 'binaryview.cc', 'chartswidget.cc', 'historylog.cc', 'videowidget.cc', 'signaledit.cc', 'dbcmanager.cc', +cabana_lib = cabana_env.Library("cabana_lib", ['mainwin.cc', 'streams/livestream.cc', 'streams/abstractstream.cc', 'streams/replaystream.cc', 'binaryview.cc', 'chartswidget.cc', 'historylog.cc', 'tools/search.cc', 'videowidget.cc', 'signaledit.cc', 'dbcmanager.cc', 'commands.cc', 'messageswidget.cc', 'route.cc', 'settings.cc', 'util.cc', 'detailwidget.cc', 'tools/findsimilarbits.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks) cabana_env.Program('_cabana', ['cabana.cc', cabana_lib, assets], LIBS=cabana_libs, FRAMEWORKS=base_frameworks) diff --git a/tools/cabana/mainwin.cc b/tools/cabana/mainwin.cc index abcb4948a9..fab6507e70 100644 --- a/tools/cabana/mainwin.cc +++ b/tools/cabana/mainwin.cc @@ -133,6 +133,7 @@ void MainWindow::createActions() { QMenu *tools_menu = menuBar()->addMenu(tr("&Tools")); tools_menu->addAction(tr("Find &Similar Bits"), this, &MainWindow::findSimilarBits); + tools_menu->addAction(tr("Search"), this, &MainWindow::searchDlg); QMenu *help_menu = menuBar()->addMenu(tr("&Help")); help_menu->addAction(tr("Help"), this, &MainWindow::onlineHelp)->setShortcuts(QKeySequence::HelpContents); @@ -473,6 +474,11 @@ void MainWindow::findSimilarBits() { dlg->show(); } +void MainWindow::searchDlg() { + SearchDlg *dlg = new SearchDlg(this); + dlg->show(); +} + void MainWindow::onlineHelp() { if (auto help = findChild()) { help->close(); diff --git a/tools/cabana/mainwin.h b/tools/cabana/mainwin.h index 1c21d69370..d463bc69b9 100644 --- a/tools/cabana/mainwin.h +++ b/tools/cabana/mainwin.h @@ -12,6 +12,7 @@ #include "tools/cabana/messageswidget.h" #include "tools/cabana/videowidget.h" #include "tools/cabana/tools/findsimilarbits.h" +#include "tools/cabana/tools/search.h" class MainWindow : public QMainWindow { Q_OBJECT @@ -53,6 +54,7 @@ protected: void updateDownloadProgress(uint64_t cur, uint64_t total, bool success); void setOption(); void findSimilarBits(); + void searchDlg(); void undoStackCleanChanged(bool clean); void undoStackIndexChanged(int index); void onlineHelp(); diff --git a/tools/cabana/tools/search.cc b/tools/cabana/tools/search.cc new file mode 100644 index 0000000000..3dba8cddac --- /dev/null +++ b/tools/cabana/tools/search.cc @@ -0,0 +1,115 @@ +#include "tools/cabana/tools/search.h" + +#include + +#include "tools/cabana/dbcmanager.h" +#include "tools/cabana/streams/abstractstream.h" + +SearchDlg::SearchDlg(QWidget *parent) : QDialog(parent) { + setWindowTitle(tr("Search")); + setAttribute(Qt::WA_DeleteOnClose); + + QVBoxLayout *main_layout = new QVBoxLayout(this); + + QHBoxLayout *scan_button_layout = new QHBoxLayout(); + + QPushButton *first_scan_button = new QPushButton(QString("First Scan"), this); + QPushButton *next_scan_button = new QPushButton(QString("Next Scan"), this); + QPushButton *undo_scan_button = new QPushButton(QString("Undo Scan"), this); + + QObject::connect(first_scan_button, &QPushButton::clicked, [=]() { firstScan(); }); + QObject::connect(next_scan_button, &QPushButton::clicked, [=]() { nextScan(); }); + QObject::connect(undo_scan_button, &QPushButton::clicked, [=]() { undoScan(); }); + + scan_button_layout->addWidget(first_scan_button); + scan_button_layout->addWidget(next_scan_button); + scan_button_layout->addWidget(undo_scan_button); + + QVBoxLayout *search_parameters_layout = new QVBoxLayout(); + + QLineEdit *value_box = new QLineEdit(); + value_box->setValidator( new QIntValidator(this) ); + + QObject::connect(value_box, &QLineEdit::textChanged, [=](QString value) { scan_value = value.toInt(); }); + + QComboBox *scan_type = new QComboBox(); + scan_type->addItem(QString("Exact Value")); + + QHBoxLayout *bits_min_max_layout = new QHBoxLayout(); + + QSpinBox *bits_min = new QSpinBox(); + bits_min->setRange(1,32); + bits_min->setValue(scan_bits_range_min); + + QSpinBox *bits_max = new QSpinBox(); + bits_max->setRange(1,32); + bits_max->setValue(scan_bits_range_max); + + QObject::connect(bits_min, qOverload(&QSpinBox::valueChanged), [=](int value) { scan_bits_range_min=value; }); + QObject::connect(bits_max, qOverload(&QSpinBox::valueChanged), [=](int value) { scan_bits_range_max=value; }); + + bits_min_max_layout->addWidget(bits_min); + bits_min_max_layout->addWidget(bits_max); + + search_parameters_layout->addWidget(value_box); + search_parameters_layout->addLayout(bits_min_max_layout); + + main_layout->addLayout(scan_button_layout); + main_layout->addLayout(search_parameters_layout); +} + +uint64_t getBitValue(uint64_t val, int offset, int size){ + return (((1 << size) - 1) & (val >> (offset - 1))); +} + +class Sig { + public: + Sig(MessageId _messageID, int _offset, int _size) : messageID(_messageID), offset(_offset), size(_size) {} + + MessageId messageID; + size_t offset; + size_t size; + + uint64_t getValue(){ + auto msg = can->can_msgs[messageID]; + uint64_t* data = (uint64_t*)(msg.dat.data()); + return getBitValue(*data, offset, size); + } +}; + +std::vector getAllPossibleSignals(int bits_min, int bits_max){ + std::vector ret; + + for(auto msg_id : can->can_msgs.keys()) { + for(int i = bits_min; i < bits_max+1; i++) { + for(int j = 0; j < 64 - i; j++) { + ret.push_back(Sig(msg_id, j, i)); + } + } + } + + return ret; +} + +void SearchDlg::firstScan(){ + std::cout << scan_bits_range_min << " " << scan_bits_range_max << " " << scan_value << std::endl; + + std::vector allPossibleValues = getAllPossibleSignals(scan_bits_range_min, scan_bits_range_max); + + std::cout << allPossibleValues.size() << std::endl; + + std::vector filteredValues; + std::copy_if(allPossibleValues.begin(), allPossibleValues.end(), std::back_inserter(filteredValues), [=](Sig i) { + return i.getValue() == scan_value; + }); + + std::cout << filteredValues.size() << std::endl; +} + +void SearchDlg::nextScan(){ + +} + +void SearchDlg::undoScan(){ + +} \ No newline at end of file diff --git a/tools/cabana/tools/search.h b/tools/cabana/tools/search.h new file mode 100644 index 0000000000..7d529e7c42 --- /dev/null +++ b/tools/cabana/tools/search.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + + +class SearchDlg : public QDialog { + Q_OBJECT + +public: + SearchDlg(QWidget *parent); + +private: + void firstScan(); + void nextScan(); + void undoScan(); + + uint32_t scan_bits_range_min = 1; + uint32_t scan_bits_range_max = 32; + + uint64_t scan_value = 0; +}; \ No newline at end of file