pull/27806/head
Justin Newberry 2 years ago
parent 231e9a950d
commit 415c93a6f8
  1. 2
      .gitignore
  2. 2
      SConstruct
  3. 2
      tools/cabana/SConscript
  4. 6
      tools/cabana/mainwin.cc
  5. 2
      tools/cabana/mainwin.h
  6. 115
      tools/cabana/tools/search.cc
  7. 28
      tools/cabana/tools/search.h

2
.gitignore vendored

@ -83,3 +83,5 @@ build/
!**/.gitkeep !**/.gitkeep
poetry.toml poetry.toml
sandbox/

@ -176,7 +176,7 @@ env = Environment(
"-g", "-g",
"-fPIC", "-fPIC",
"-O2", "-O2",
"-Wunused", #"-Wunused",
"-Werror", "-Werror",
"-Wshadow", "-Wshadow",
"-Wno-unknown-warning-option", "-Wno-unknown-warning-option",

@ -28,7 +28,7 @@ cabana_env.Depends(assets, Glob('/assets/*', exclude=[assets, assets_src, "asset
prev_moc_path = cabana_env['QT_MOCHPREFIX'] prev_moc_path = cabana_env['QT_MOCHPREFIX']
cabana_env['QT_MOCHPREFIX'] = os.path.dirname(prev_moc_path) + '/cabana/moc_' 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) '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) cabana_env.Program('_cabana', ['cabana.cc', cabana_lib, assets], LIBS=cabana_libs, FRAMEWORKS=base_frameworks)

@ -133,6 +133,7 @@ void MainWindow::createActions() {
QMenu *tools_menu = menuBar()->addMenu(tr("&Tools")); QMenu *tools_menu = menuBar()->addMenu(tr("&Tools"));
tools_menu->addAction(tr("Find &Similar Bits"), this, &MainWindow::findSimilarBits); 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")); QMenu *help_menu = menuBar()->addMenu(tr("&Help"));
help_menu->addAction(tr("Help"), this, &MainWindow::onlineHelp)->setShortcuts(QKeySequence::HelpContents); help_menu->addAction(tr("Help"), this, &MainWindow::onlineHelp)->setShortcuts(QKeySequence::HelpContents);
@ -473,6 +474,11 @@ void MainWindow::findSimilarBits() {
dlg->show(); dlg->show();
} }
void MainWindow::searchDlg() {
SearchDlg *dlg = new SearchDlg(this);
dlg->show();
}
void MainWindow::onlineHelp() { void MainWindow::onlineHelp() {
if (auto help = findChild<HelpOverlay*>()) { if (auto help = findChild<HelpOverlay*>()) {
help->close(); help->close();

@ -12,6 +12,7 @@
#include "tools/cabana/messageswidget.h" #include "tools/cabana/messageswidget.h"
#include "tools/cabana/videowidget.h" #include "tools/cabana/videowidget.h"
#include "tools/cabana/tools/findsimilarbits.h" #include "tools/cabana/tools/findsimilarbits.h"
#include "tools/cabana/tools/search.h"
class MainWindow : public QMainWindow { class MainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
@ -53,6 +54,7 @@ protected:
void updateDownloadProgress(uint64_t cur, uint64_t total, bool success); void updateDownloadProgress(uint64_t cur, uint64_t total, bool success);
void setOption(); void setOption();
void findSimilarBits(); void findSimilarBits();
void searchDlg();
void undoStackCleanChanged(bool clean); void undoStackCleanChanged(bool clean);
void undoStackIndexChanged(int index); void undoStackIndexChanged(int index);
void onlineHelp(); void onlineHelp();

@ -0,0 +1,115 @@
#include "tools/cabana/tools/search.h"
#include <iostream>
#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<int>(&QSpinBox::valueChanged), [=](int value) { scan_bits_range_min=value; });
QObject::connect(bits_max, qOverload<int>(&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<Sig> getAllPossibleSignals(int bits_min, int bits_max){
std::vector<Sig> 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<Sig> allPossibleValues = getAllPossibleSignals(scan_bits_range_min, scan_bits_range_max);
std::cout << allPossibleValues.size() << std::endl;
std::vector<Sig> 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(){
}

@ -0,0 +1,28 @@
#pragma once
#include <QDialog>
#include <QPushButton>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QDoubleValidator>
#include <QComboBox>
#include <QSpinBox>
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;
};
Loading…
Cancel
Save