Cabana: display overlapping bits warning (#26219)

display overlapping bits warning
old-commit-hash: 87e0a5dd1a
taco
Dean Lee 3 years ago committed by GitHub
parent bc7b437266
commit bd98b9b80c
  1. 14
      tools/cabana/binaryview.cc
  2. 2
      tools/cabana/binaryview.h
  3. 21
      tools/cabana/detailwidget.cc

@ -132,6 +132,20 @@ const Signal *BinaryView::getResizingSignal() const {
return nullptr; return nullptr;
} }
QSet<const Signal *> BinaryView::getOverlappingSignals() const {
QSet<const Signal *> 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 // BinaryViewModel
void BinaryViewModel::setMessage(const QString &message_id) { void BinaryViewModel::setMessage(const QString &message_id) {

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <QList> #include <QList>
#include <QSet>
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
#include <QTableView> #include <QTableView>
@ -59,6 +60,7 @@ public:
void updateState(); void updateState();
void highlight(const Signal *sig); void highlight(const Signal *sig);
const Signal *hoveredSignal() const { return hovered_sig; } const Signal *hoveredSignal() const { return hovered_sig; }
QSet<const Signal*> getOverlappingSignals() const;
signals: signals:
void signalHovered(const Signal *sig); void signalHovered(const Signal *sig);

@ -49,7 +49,7 @@ DetailWidget::DetailWidget(QWidget *parent) : QWidget(parent) {
QHBoxLayout *warning_hlayout = new QHBoxLayout(warning_widget); QHBoxLayout *warning_hlayout = new QHBoxLayout(warning_widget);
QLabel *warning_icon = new QLabel(this); QLabel *warning_icon = new QLabel(this);
warning_icon->setPixmap(style()->standardPixmap(QStyle::SP_MessageBoxWarning)); 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_label = new QLabel(this);
warning_hlayout->addWidget(warning_label, 1, Qt::AlignLeft); warning_hlayout->addWidget(warning_label, 1, Qt::AlignLeft);
warning_widget->hide(); warning_widget->hide();
@ -107,6 +107,8 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
if (msg_id.isEmpty()) return; if (msg_id.isEmpty()) return;
warning_widget->hide(); warning_widget->hide();
QStringList warnings;
clearLayout(signals_container->layout()); clearLayout(signals_container->layout());
QString msg_name = tr("untitled"); QString msg_name = tr("untitled");
if (auto msg = dbc()->msg(msg_id)) { if (auto msg = dbc()->msg(msg_id)) {
@ -124,16 +126,25 @@ void DetailWidget::dbcMsgChanged(int show_form_idx) {
} }
} }
msg_name = msg->name.c_str(); msg_name = msg->name.c_str();
if (msg->size != can->lastMessage(msg_id).dat.size()) { if (msg->size != can->lastMessage(msg_id).dat.size())
warning_label->setText(tr("Message size (%1) is incorrect!").arg(msg->size)); warnings.push_back(tr("Message size (%1) is incorrect.").arg(msg->size));
warning_widget->show();
}
} }
edit_btn->setVisible(true); edit_btn->setVisible(true);
name_label->setText(msg_name); name_label->setText(msg_name);
binary_view->setMessage(msg_id); binary_view->setMessage(msg_id);
history_log->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() { void DetailWidget::updateState() {

Loading…
Cancel
Save