diff --git a/tools/cabana/binaryview.cc b/tools/cabana/binaryview.cc index 5d191d2ca3..26fecd8c38 100644 --- a/tools/cabana/binaryview.cc +++ b/tools/cabana/binaryview.cc @@ -132,6 +132,20 @@ const Signal *BinaryView::getResizingSignal() const { return nullptr; } +QSet BinaryView::getOverlappingSignals() const { + QSet overlapping; + for (int i = 0; i < model->rowCount(); ++i) { + for (int j = 0; j < model->columnCount() - 1; ++j) { + auto item = (const BinaryViewModel::Item *)model->index(i, j).internalPointer(); + if (item && item->sigs.size() > 1) { + for (auto s : item->sigs) + overlapping.insert(s); + } + } + } + return overlapping; +} + // BinaryViewModel void BinaryViewModel::setMessage(const QString &message_id) { diff --git a/tools/cabana/binaryview.h b/tools/cabana/binaryview.h index e57033b797..0f58e9ed20 100644 --- a/tools/cabana/binaryview.h +++ b/tools/cabana/binaryview.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -59,6 +60,7 @@ public: void updateState(); void highlight(const Signal *sig); const Signal *hoveredSignal() const { return hovered_sig; } + QSet getOverlappingSignals() const; signals: void signalHovered(const Signal *sig); diff --git a/tools/cabana/detailwidget.cc b/tools/cabana/detailwidget.cc index 443b33b521..7290e4e6ff 100644 --- a/tools/cabana/detailwidget.cc +++ b/tools/cabana/detailwidget.cc @@ -49,7 +49,7 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) { QHBoxLayout *warning_hlayout = new QHBoxLayout(warning_widget); QLabel *warning_icon = new QLabel(this); warning_icon->setPixmap(style()->standardPixmap(QStyle::SP_MessageBoxWarning)); - warning_hlayout->addWidget(warning_icon); + warning_hlayout->addWidget(warning_icon, 0, Qt::AlignTop); warning_label = new QLabel(this); warning_hlayout->addWidget(warning_label, 1, Qt::AlignLeft); warning_widget->hide(); @@ -107,6 +107,8 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) { if (msg_id.isEmpty()) return; warning_widget->hide(); + QStringList warnings; + clearLayout(signals_container->layout()); QString msg_name = tr("untitled"); if (auto msg = dbc()->msg(msg_id)) { @@ -124,16 +126,25 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) { } } msg_name = msg->name.c_str(); - if (msg->size != can->lastMessage(msg_id).dat.size()) { - warning_label->setText(tr("Message size (%1) is incorrect!").arg(msg->size)); - warning_widget->show(); - } + if (msg->size != can->lastMessage(msg_id).dat.size()) + warnings.push_back(tr("Message size (%1) is incorrect.").arg(msg->size)); } edit_btn->setVisible(true); name_label->setText(msg_name); binary_view->setMessage(msg_id); history_log->setMessage(msg_id); + + // Check overlapping bits + if (auto overlapping = binary_view->getOverlappingSignals(); !overlapping.isEmpty()) { + for (auto s : overlapping) + warnings.push_back(tr("%1 has overlapping bits.").arg(s->name.c_str())); + } + + if (!warnings.isEmpty()) { + warning_label->setText(warnings.join('\n')); + warning_widget->show(); + } } void DetailWidget::updateState() {