Skip to content

Commit bf5a45e

Browse files
authored
cabana: fix messages not updated correctly after seekto() (commaai#30351)
fix messages not updated correctly after seekto
1 parent c04e019 commit bf5a45e

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

tools/cabana/messageswidget.cc

+16-15
Original file line numberDiff line numberDiff line change
@@ -186,20 +186,21 @@ QVariant MessageListModel::data(const QModelIndex &index, int role) const {
186186
};
187187

188188
const auto &item = items_[index.row()];
189+
const auto &data = can->lastMessage(item.id);
189190
if (role == Qt::DisplayRole) {
190191
switch (index.column()) {
191192
case Column::NAME: return item.name;
192193
case Column::SOURCE: return item.id.source != INVALID_SOURCE ? QString::number(item.id.source) : "N/A";
193194
case Column::ADDRESS: return QString::number(item.id.address, 16);
194195
case Column::NODE: return item.node;
195-
case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(*item.data) : "N/A";
196-
case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(item.data->count) : "N/A";
196+
case Column::FREQ: return item.id.source != INVALID_SOURCE ? getFreq(data) : "N/A";
197+
case Column::COUNT: return item.id.source != INVALID_SOURCE ? QString::number(data.count) : "N/A";
197198
case Column::DATA: return item.id.source != INVALID_SOURCE ? "" : "N/A";
198199
}
199200
} else if (role == ColorsRole) {
200-
return QVariant::fromValue((void*)(&item.data->colors));
201+
return QVariant::fromValue((void*)(&data.colors));
201202
} else if (role == BytesRole && index.column() == Column::DATA && item.id.source != INVALID_SOURCE) {
202-
return QVariant::fromValue((void*)(&item.data->dat));
203+
return QVariant::fromValue((void*)(&data.dat));
203204
} else if (role == Qt::ToolTipRole && index.column() == Column::NAME) {
204205
auto msg = dbc()->msg(item.id);
205206
auto tooltip = item.name;
@@ -219,7 +220,7 @@ void MessageListModel::dbcModified() {
219220
for (const auto &[_, m] : dbc()->getMessages(-1)) {
220221
dbc_messages_.insert(MessageId{.source = INVALID_SOURCE, .address = m.address});
221222
}
222-
filterAndSort(true);
223+
filterAndSort();
223224
}
224225

225226
void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) {
@@ -233,8 +234,8 @@ void MessageListModel::sortItems(std::vector<MessageListModel::Item> &items) {
233234
case Column::SOURCE: do_sort(items, [](auto &item) { return std::tie(item.id.source, item.id); }); break;
234235
case Column::ADDRESS: do_sort(items, [](auto &item) { return std::tie(item.id.address, item.id);}); break;
235236
case Column::NODE: do_sort(items, [](auto &item) { return std::tie(item.node, item.id);}); break;
236-
case Column::FREQ: do_sort(items, [](auto &item) { return std::tie(item.data->freq, item.id); }); break;
237-
case Column::COUNT: do_sort(items, [](auto &item) { return std::tie(item.data->count, item.id); }); break;
237+
case Column::FREQ: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).freq, item.id); }); break;
238+
case Column::COUNT: do_sort(items, [](auto &item) { return std::make_pair(can->lastMessage(item.id).count, item.id); }); break;
238239
}
239240
}
240241

@@ -258,6 +259,7 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
258259
return true;
259260

260261
bool match = true;
262+
const auto &data = can->lastMessage(item.id);
261263
for (auto it = filters_.cbegin(); it != filters_.cend() && match; ++it) {
262264
const QString &txt = it.value();
263265
switch (it.key()) {
@@ -282,20 +284,20 @@ bool MessageListModel::match(const MessageListModel::Item &item) {
282284
break;
283285
case Column::FREQ:
284286
// TODO: Hide stale messages?
285-
match = parseRange(txt, item.data->freq);
287+
match = parseRange(txt, data.freq);
286288
break;
287289
case Column::COUNT:
288-
match = parseRange(txt, item.data->count);
290+
match = parseRange(txt, data.count);
289291
break;
290292
case Column::DATA:
291-
match = utils::toHex(item.data->dat).contains(txt, Qt::CaseInsensitive);
293+
match = utils::toHex(data.dat).contains(txt, Qt::CaseInsensitive);
292294
break;
293295
}
294296
}
295297
return match;
296298
}
297299

298-
void MessageListModel::filterAndSort(bool force_reset) {
300+
void MessageListModel::filterAndSort() {
299301
// merge CAN and DBC messages
300302
std::vector<MessageId> all_messages;
301303
all_messages.reserve(can->lastMessages().size() + dbc_messages_.size());
@@ -304,22 +306,21 @@ void MessageListModel::filterAndSort(bool force_reset) {
304306
all_messages.push_back(id);
305307
dbc_msgs.erase(MessageId{.source = INVALID_SOURCE, .address = id.address});
306308
}
307-
std::copy(dbc_msgs.begin(), dbc_msgs.end(), std::back_inserter(all_messages));
309+
all_messages.insert(all_messages.end(), dbc_msgs.begin(), dbc_msgs.end());
308310

309311
// filter and sort
310312
std::vector<Item> items;
311313
for (const auto &id : all_messages) {
312314
auto msg = dbc()->msg(id);
313315
Item item = {.id = id,
314316
.name = msg ? msg->name : UNTITLED,
315-
.node = msg ? msg->transmitter : QString(),
316-
.data = &can->lastMessage(id)};
317+
.node = msg ? msg->transmitter : QString()};
317318
if (match(item))
318319
items.emplace_back(item);
319320
}
320321
sortItems(items);
321322

322-
if (force_reset || items_ != items) {
323+
if (items_ != items) {
323324
beginResetModel();
324325
items_ = std::move(items);
325326
endResetModel();

tools/cabana/messageswidget.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,16 @@ Q_OBJECT
3838
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
3939
void setFilterStrings(const QMap<int, QString> &filters);
4040
void msgsReceived(const std::set<MessageId> *new_msgs, bool has_new_ids);
41-
void filterAndSort(bool force_reset = false);
41+
void filterAndSort();
4242
void dbcModified();
4343

4444
struct Item {
4545
MessageId id;
4646
QString name;
4747
QString node;
48-
const CanData *data;
49-
bool operator==(const Item &other) const { return id == other.id; }
48+
bool operator==(const Item &other) const {
49+
return id == other.id && name == other.name && node == other.node;
50+
}
5051
};
5152
std::vector<Item> items_;
5253

0 commit comments

Comments
 (0)