cabana: only update the colors of newly fetched messages in historylog (#27144)

only update new msgs color
old-commit-hash: d60aca8dd2
beeps
Dean Lee 2 years ago committed by GitHub
parent 423f22b51c
commit adfdbfac54
  1. 46
      tools/cabana/historylog.cc
  2. 1
      tools/cabana/historylog.h

@ -84,7 +84,6 @@ void HistoryLogModel::updateState() {
if ((has_more_data = !new_msgs.empty())) { if ((has_more_data = !new_msgs.empty())) {
beginInsertRows({}, 0, new_msgs.size() - 1); beginInsertRows({}, 0, new_msgs.size() - 1);
messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end())); messages.insert(messages.begin(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
updateColors();
endInsertRows(); endInsertRows();
} }
last_fetch_time = current_time; last_fetch_time = current_time;
@ -97,29 +96,11 @@ void HistoryLogModel::fetchMore(const QModelIndex &parent) {
if ((has_more_data = !new_msgs.empty())) { if ((has_more_data = !new_msgs.empty())) {
beginInsertRows({}, messages.size(), messages.size() + new_msgs.size() - 1); beginInsertRows({}, messages.size(), messages.size() + new_msgs.size() - 1);
messages.insert(messages.end(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end())); messages.insert(messages.end(), std::move_iterator(new_msgs.begin()), std::move_iterator(new_msgs.end()));
if (!dynamic_mode) {
updateColors();
}
endInsertRows(); endInsertRows();
} }
} }
} }
void HistoryLogModel::updateColors() {
if (!display_signals_mode || sigs.empty()) {
const auto freq = can->lastMessage(msg_id).freq;
if (dynamic_mode) {
for (auto it = messages.rbegin(); it != messages.rend(); ++it) {
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
}
} else {
for (auto it = messages.begin(); it != messages.end(); ++it) {
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
}
}
}
}
template <class InputIt> template <class InputIt>
std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(InputIt first, InputIt last, uint64_t min_time) { std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(InputIt first, InputIt last, uint64_t min_time) {
std::deque<HistoryLogModel::Message> msgs; std::deque<HistoryLogModel::Message> msgs;
@ -153,17 +134,28 @@ template std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData<>(std::
std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(uint64_t from_time, uint64_t min_time) { std::deque<HistoryLogModel::Message> HistoryLogModel::fetchData(uint64_t from_time, uint64_t min_time) {
auto events = can->events(); auto events = can->events();
const auto freq = can->lastMessage(msg_id).freq;
const bool update_colors = !display_signals_mode || sigs.empty();
if (dynamic_mode) { if (dynamic_mode) {
auto it = std::upper_bound(events->rbegin(), events->rend(), from_time, [=](uint64_t ts, auto &e) { auto first = std::upper_bound(events->rbegin(), events->rend(), from_time, [=](uint64_t ts, auto &e) { return e->mono_time < ts; });
return e->mono_time < ts; auto msgs = fetchData(first, events->rend(), min_time);
}); if (update_colors && min_time > 0) {
return fetchData(it, events->rend(), min_time); for (auto it = msgs.rbegin(); it != msgs.rend(); ++it) {
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
}
}
return msgs;
} else { } else {
assert(min_time == 0); assert(min_time == 0);
auto it = std::upper_bound(events->begin(), events->end(), from_time, [=](uint64_t ts, auto &e) { auto first = std::upper_bound(events->begin(), events->end(), from_time, [=](uint64_t ts, auto &e) { return ts < e->mono_time; });
return ts < e->mono_time; auto msgs = fetchData(first, events->end(), 0);
}); if (update_colors) {
return fetchData(it, events->end(), 0); for (auto it = msgs.rbegin(); it != msgs.rend(); ++it) {
it->colors = hex_colors.compute(it->data, it->mono_time / (double)1e9, freq);
}
}
return msgs;
} }
} }

@ -33,7 +33,6 @@ public:
int columnCount(const QModelIndex &parent = QModelIndex()) const override { int columnCount(const QModelIndex &parent = QModelIndex()) const override {
return display_signals_mode && !sigs.empty() ? sigs.size() + 1 : 2; return display_signals_mode && !sigs.empty() ? sigs.size() + 1 : 2;
} }
void updateColors();
void refresh(); void refresh();
public slots: public slots:

Loading…
Cancel
Save