From 78a2c19d0b4bea97c44baba8eb2412f7cadff69a Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 17 Nov 2022 07:43:49 +0800 Subject: [PATCH] Cabana: sort signal by start bit and keep cursor position after save (#26529) sort signals by start bit and keep cursor position after save old-commit-hash: e3c913bfa1d8c534f351d6ead5c2156ee4ee4ffa --- tools/cabana/binaryview.cc | 14 +++++++------- tools/cabana/dbcmanager.cc | 9 +++++++++ tools/cabana/dbcmanager.h | 1 + tools/cabana/detailwidget.cc | 6 +++--- tools/cabana/signaledit.cc | 11 +++++++++-- tools/cabana/signaledit.h | 2 ++ 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/tools/cabana/binaryview.cc b/tools/cabana/binaryview.cc index bcd2b88a81..7707316877 100644 --- a/tools/cabana/binaryview.cc +++ b/tools/cabana/binaryview.cc @@ -166,19 +166,19 @@ void BinaryViewModel::setMessage(const QString &message_id) { row_count = dbc_msg->size; items.resize(row_count * column_count); int i = 0; - for (auto &[name, sig] : dbc_msg->sigs) { - auto [start, end] = getSignalRange(&sig); + for (auto sig : dbc_msg->getSignals()) { + auto [start, end] = getSignalRange(sig); for (int j = start; j <= end; ++j) { - int bit_index = sig.is_little_endian ? bigEndianBitIndex(j) : j; + int bit_index = sig->is_little_endian ? bigEndianBitIndex(j) : j; int idx = column_count * (bit_index / 8) + bit_index % 8; if (idx >= items.size()) { - qWarning() << "signal " << name << "out of bounds.start_bit:" << sig.start_bit << "size:" << sig.size; + qWarning() << "signal " << sig->name.c_str() << "out of bounds.start_bit:" << sig->start_bit << "size:" << sig->size; break; } - if (j == start) sig.is_little_endian ? items[idx].is_lsb = true : items[idx].is_msb = true; - if (j == end) sig.is_little_endian ? items[idx].is_msb = true : items[idx].is_lsb = true; + if (j == start) sig->is_little_endian ? items[idx].is_lsb = true : items[idx].is_msb = true; + if (j == end) sig->is_little_endian ? items[idx].is_msb = true : items[idx].is_lsb = true; items[idx].bg_color = getColor(i); - items[idx].sigs.push_back(&sig); + items[idx].sigs.push_back(sig); } ++i; } diff --git a/tools/cabana/dbcmanager.cc b/tools/cabana/dbcmanager.cc index 18f103d34c..e7d3ead9c6 100644 --- a/tools/cabana/dbcmanager.cc +++ b/tools/cabana/dbcmanager.cc @@ -107,6 +107,15 @@ DBCManager *dbc() { return &dbc_manager; } +// DBCMsg + +std::vector DBCMsg::getSignals() const { + std::vector ret; + for (auto &[name, sig] : sigs) ret.push_back(&sig); + std::sort(ret.begin(), ret.end(), [](auto l, auto r) { return l->start_bit < r->start_bit; }); + return ret; +} + // helper functions static QVector BIG_ENDIAN_START_BITS = []() { diff --git a/tools/cabana/dbcmanager.h b/tools/cabana/dbcmanager.h index b1d2082969..4e0bc91069 100644 --- a/tools/cabana/dbcmanager.h +++ b/tools/cabana/dbcmanager.h @@ -9,6 +9,7 @@ struct DBCMsg { QString name; uint32_t size; std::map sigs; + std::vector getSignals() const; }; class DBCManager : public QObject { diff --git a/tools/cabana/detailwidget.cc b/tools/cabana/detailwidget.cc index 8a221ed9db..99cf45f5fa 100644 --- a/tools/cabana/detailwidget.cc +++ b/tools/cabana/detailwidget.cc @@ -149,7 +149,7 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) { QStringList warnings; const DBCMsg *msg = dbc()->msg(msg_id); if (msg) { - for (auto &[name, sig] : msg->sigs) { + for (auto sig : msg->getSignals()) { SignalEdit *form = i < signal_list.size() ? signal_list[i] : nullptr; if (!form) { form = new SignalEdit(i); @@ -162,8 +162,8 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) { signals_layout->addWidget(form); signal_list.push_back(form); } - form->setSignal(msg_id, &sig); - form->setChartOpened(charts->isChartOpened(msg_id, &sig)); + form->setSignal(msg_id, sig); + form->setChartOpened(charts->isChartOpened(msg_id, sig)); ++i; } if (msg->size != can->lastMessage(msg_id).dat.size()) diff --git a/tools/cabana/signaledit.cc b/tools/cabana/signaledit.cc index eb22b78d5a..6e4cf2a83a 100644 --- a/tools/cabana/signaledit.cc +++ b/tools/cabana/signaledit.cc @@ -116,11 +116,16 @@ SignalEdit::SignalEdit(int index, QWidget *parent) : form_idx(index), QWidget(pa hline->setFrameShadow(QFrame::Sunken); main_layout->addWidget(hline); + save_timer = new QTimer(this); + save_timer->setInterval(300); + save_timer->setSingleShot(true); + save_timer->callOnTimeout(this, &SignalEdit::saveSignal); + QObject::connect(title, &ElidedLabel::clicked, this, &SignalEdit::showFormClicked); QObject::connect(plot_btn, &QToolButton::clicked, [this](bool checked) { emit showChart(msg_id, sig, checked); }); QObject::connect(seek_btn, &QToolButton::clicked, [this]() { SignalFindDlg(msg_id, sig, this).exec(); }); QObject::connect(remove_btn, &QToolButton::clicked, [this]() { emit remove(sig); }); - QObject::connect(form, &SignalForm::changed, this, &SignalEdit::saveSignal); + QObject::connect(form, &SignalForm::changed, [this]() { save_timer->start(); }); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); } @@ -174,7 +179,9 @@ void SignalEdit::setChartOpened(bool opened) { void SignalEdit::updateForm(bool visible) { if (visible && sig) { form->changed_by_user = false; - form->name->setText(sig->name.c_str()); + if (form->name->text() != sig->name.c_str()) { + form->name->setText(sig->name.c_str()); + } form->endianness->setCurrentIndex(sig->is_little_endian ? 0 : 1); form->sign->setCurrentIndex(sig->is_signed ? 0 : 1); form->factor->setText(QString::number(sig->factor)); diff --git a/tools/cabana/signaledit.h b/tools/cabana/signaledit.h index da0b9758c7..f889a9c096 100644 --- a/tools/cabana/signaledit.h +++ b/tools/cabana/signaledit.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "selfdrive/ui/qt/widgets/controls.h" @@ -57,6 +58,7 @@ protected: QLabel *icon; int form_idx = 0; QToolButton *plot_btn; + QTimer *save_timer; }; class SignalFindDlg : public QDialog {