cabana: fix messages not updated correctly after `seekto()` (#30351)

fix messages not updated correctly after seekto
pull/30358/head
Dean Lee 2 years ago committed by GitHub
parent c04e019af4
commit bf5a45ed98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      tools/cabana/messageswidget.cc
  2. 7
      tools/cabana/messageswidget.h

@ -186,20 +186,21 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const {
}; };
const auto &item = items_[index.row()]; const auto &item = items_[index.row()];
const auto &data = can->lastMessage(item.id);
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
switch (index.column()) { switch (index.column()) {
case Column::NAME: return item.name; case Column::NAME: return item.name;
case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A"; case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A";
case Column::ADDRESS: return QString::number(item.id.address, 16); case Column::ADDRESS: return QString::number(item.id.address, 16);
case Column::NODE: return item.node; case Column::NODE: return item.node;
case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(*item.data) : "N/A"; case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data) : "N/A";
case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(item.data->count) : "N/A"; case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A";
case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A"; case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A";
} }
} else if (role == ColorsRole) { } else if (role == ColorsRole) {
return QVariant::fromValue((void*)(&item.data->colors)); return QVariant::fromValue((void*)(&data.colors));
} else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) { } else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) {
return QVariant::fromValue((void*)(&item.data->dat)); return QVariant::fromValue((void*)(&data.dat));
} else if (role == Qt::ToolTipRole && index.column() == Column::NAME) { } else if (role == Qt::ToolTipRole && index.column() == Column::NAME) {
auto msg = dbc()->msg(item.id); auto msg = dbc()->msg(item.id);
auto tooltip = item.name; auto tooltip = item.name;
@ -219,7 +220,7 @@ void MessageListModel::dbcModified() {
for (const auto &[_, m] : dbc()->getMessages(-1)) { for (const auto &[_, m] : dbc()->getMessages(-1)) {
dbc_messages_.insert(MessageId{.source = INVALID_SOURCE, .address = m.address}); dbc_messages_.insert(MessageId{.source = INVALID_SOURCE, .address = m.address});
} }
filterAndSort(true); filterAndSort();
} }
void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) { void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) {
@ -233,8 +234,8 @@ void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) {
case Column::SOURCE: do_sort(items, [](auto &item) { return std::tie(item.id.source, item.id); }); break; case Column::SOURCE: do_sort(items, [](auto &item) { return std::tie(item.id.source, item.id); }); break;
case Column::ADDRESS: do_sort(items, [](auto &item) { return std::tie(item.id.address, item.id);}); break; case Column::ADDRESS: do_sort(items, [](auto &item) { return std::tie(item.id.address, item.id);}); break;
case Column::NODE: do_sort(items, [](auto &item) { return std::tie(item.node, item.id);}); break; case Column::NODE: do_sort(items, [](auto &item) { return std::tie(item.node, item.id);}); break;
case Column::FREQ: do_sort(items, [](auto &item) { return std::tie(item.data->freq, item.id); }); break; case Column::FREQ: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).freq, item.id); }); break;
case Column::COUNT: do_sort(items, [](auto &item) { return std::tie(item.data->count, item.id); }); break; case Column::COUNT: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).count, item.id); }); break;
} }
} }
@ -258,6 +259,7 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
return true; return true;
bool match = true; bool match = true;
const auto &data = can->lastMessage(item.id);
for (auto it = filters_.cbegin(); it != filters_.cend() && match; ++it) { for (auto it = filters_.cbegin(); it != filters_.cend() && match; ++it) {
const QString &txt = it.value(); const QString &txt = it.value();
switch (it.key()) { switch (it.key()) {
@ -282,20 +284,20 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
break; break;
case Column::FREQ: case Column::FREQ:
// TODO: Hide stale messages? // TODO: Hide stale messages?
match = parseRange(txt, item.data->freq); match = parseRange(txt, data.freq);
break; break;
case Column::COUNT: case Column::COUNT:
match = parseRange(txt, item.data->count); match = parseRange(txt, data.count);
break; break;
case Column::DATA: case Column::DATA:
match = utils::toHex(item.data->dat).contains(txt, Qt::CaseInsensitive); match = utils::toHex(data.dat).contains(txt, Qt::CaseInsensitive);
break; break;
} }
} }
return match; return match;
} }
void MessageListModel::filterAndSort(bool force_reset) { void MessageListModel::filterAndSort() {
// merge CAN and DBC messages // merge CAN and DBC messages
std::vector<MessageId> all_messages; std::vector<MessageId> all_messages;
all_messages.reserve(can->lastMessages().size() + dbc_messages_.size()); all_messages.reserve(can->lastMessages().size() + dbc_messages_.size());
@ -304,7 +306,7 @@ void MessageListModel::filterAndSort(bool force_reset) {
all_messages.push_back(id); all_messages.push_back(id);
dbc_msgs.erase(MessageId{.source = INVALID_SOURCE, .address = id.address}); dbc_msgs.erase(MessageId{.source = INVALID_SOURCE, .address = id.address});
} }
std::copy(dbc_msgs.begin(), dbc_msgs.end(), std::back_inserter(all_messages)); all_messages.insert(all_messages.end(), dbc_msgs.begin(), dbc_msgs.end());
// filter and sort // filter and sort
std::vector<Item> items; std::vector<Item> items;
@ -312,14 +314,13 @@ void MessageListModel::filterAndSort(bool force_reset) {
auto msg = dbc()->msg(id); auto msg = dbc()->msg(id);
Item item = {.id = id, Item item = {.id = id,
.name = msg ? msg->name : UNTITLED, .name = msg ? msg->name : UNTITLED,
.node = msg ? msg->transmitter : QString(), .node = msg ? msg->transmitter : QString()};
.data = &can->lastMessage(id)};
if (match(item)) if (match(item))
items.emplace_back(item); items.emplace_back(item);
} }
sortItems(items); sortItems(items);
if (force_reset || items_ != items) { if (items_ != items) {
beginResetModel(); beginResetModel();
items_ = std::move(items); items_ = std::move(items);
endResetModel(); endResetModel();

@ -38,15 +38,16 @@ public:
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
void setFilterStrings(const QMap<int, QString> &filters); void setFilterStrings(const QMap<int, QString> &filters);
void msgsReceived(const std::set<MessageId> *new_msgs, bool has_new_ids); void msgsReceived(const std::set<MessageId> *new_msgs, bool has_new_ids);
void filterAndSort(bool force_reset = false); void filterAndSort();
void dbcModified(); void dbcModified();
struct Item { struct Item {
MessageId id; MessageId id;
QString name; QString name;
QString node; QString node;
const CanData *data; bool operator==(const Item &other) const {
bool operator==(const Item &other) const { return id == other.id; } return id == other.id && name == other.name && node == other.node;
}
}; };
std::vector<Item> items_; std::vector<Item> items_;

Loading…
Cancel
Save