diff --git a/tools/cabana/binaryview.cc b/tools/cabana/binaryview.cc index 9ec479ead9..3a03ee0b70 100644 --- a/tools/cabana/binaryview.cc +++ b/tools/cabana/binaryview.cc @@ -239,7 +239,19 @@ std::tuple BinaryView::getSelection(QModelIndex index) { if (index.column() == 8) { index = model->index(index.row(), 7); } - bool is_lb = (resize_sig && resize_sig->is_little_endian) || (!resize_sig && index < anchor_index); + bool is_lb = true; + if (resize_sig) { + is_lb = resize_sig->is_little_endian; + } else if (settings.drag_direction == Settings::DragDirection::MsbFirst) { + is_lb = index < anchor_index; + } else if (settings.drag_direction == Settings::DragDirection::LsbFirst) { + is_lb = !(index < anchor_index); + } else if (settings.drag_direction == Settings::DragDirection::AlwaysLE) { + is_lb = true; + } else if (settings.drag_direction == Settings::DragDirection::AlwaysBE) { + is_lb = false; + } + int cur_bit_idx = get_bit_index(index, is_lb); int anchor_bit_idx = get_bit_index(anchor_index, is_lb); auto [start_bit, end_bit] = std::minmax(cur_bit_idx, anchor_bit_idx); diff --git a/tools/cabana/settings.cc b/tools/cabana/settings.cc index 62c0af10a9..07fb312c3b 100644 --- a/tools/cabana/settings.cc +++ b/tools/cabana/settings.cc @@ -37,6 +37,7 @@ void Settings::save() { s.setValue("multiple_lines_bytes", multiple_lines_bytes); s.setValue("log_livestream", log_livestream); s.setValue("log_path", log_path); + s.setValue("drag_direction", drag_direction); } void Settings::load() { @@ -59,6 +60,7 @@ void Settings::load() { multiple_lines_bytes = s.value("multiple_lines_bytes", true).toBool(); log_livestream = s.value("log_livestream", true).toBool(); log_path = s.value("log_path").toString(); + drag_direction = (Settings::DragDirection)s.value("drag_direction", 0).toInt(); if (log_path.isEmpty()) { log_path = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/cabana_live_stream/"; } @@ -91,6 +93,14 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { form_layout->addRow(tr("Max Cached Minutes"), cached_minutes); main_layout->addWidget(groupbox); + groupbox = new QGroupBox("New Signal Settings"); + form_layout = new QFormLayout(groupbox); + drag_direction = new QComboBox(this); + drag_direction->addItems({tr("MSB First"), tr("LSB First"), tr("Always Little Endian"), tr("Always Big Endian")}); + drag_direction->setCurrentIndex(settings.drag_direction); + form_layout->addRow(tr("Drag Direction"), drag_direction); + main_layout->addWidget(groupbox); + groupbox = new QGroupBox("Chart"); form_layout = new QFormLayout(groupbox); chart_series_type = new QComboBox(this); @@ -114,6 +124,7 @@ SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { path_layout->addWidget(browse_btn); main_layout->addWidget(log_livestream); + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply); main_layout->addWidget(buttonBox); main_layout->addStretch(1); @@ -151,6 +162,7 @@ void SettingsDlg::save() { settings.chart_height = chart_height->value(); settings.log_livestream = log_livestream->isChecked(); settings.log_path = log_path->text(); + settings.drag_direction = (Settings::DragDirection)drag_direction->currentIndex(); settings.save(); emit settings.changed(); } diff --git a/tools/cabana/settings.h b/tools/cabana/settings.h index 07aafe1682..11548ef5cc 100644 --- a/tools/cabana/settings.h +++ b/tools/cabana/settings.h @@ -15,6 +15,13 @@ class Settings : public QObject { Q_OBJECT public: + enum DragDirection { + MsbFirst, + LsbFirst, + AlwaysLE, + AlwaysBE, + }; + Settings(); void save(); void load(); @@ -37,6 +44,7 @@ public: QByteArray window_state; QStringList recent_files; QByteArray message_header_state; + DragDirection drag_direction; signals: void changed(); @@ -55,6 +63,7 @@ public: QComboBox *theme; QGroupBox *log_livestream; QLineEdit *log_path; + QComboBox *drag_direction; }; extern Settings settings;