cabana: fix Incorrect Y-Axis Scale (#26018)

pull/26012/head
Dean Lee 3 years ago committed by GitHub
parent 2e7fa330b3
commit 2ed82387a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 33
      tools/cabana/chartswidget.cc
  2. 1
      tools/cabana/chartswidget.h

@ -194,8 +194,6 @@ ChartWidget::ChartWidget(const QString &id, const QString &sig_name, QWidget *pa
void ChartWidget::updateState() { void ChartWidget::updateState() {
auto chart = chart_view->chart(); auto chart = chart_view->chart();
auto axis_x = dynamic_cast<QValueAxis *>(chart->axisX()); auto axis_x = dynamic_cast<QValueAxis *>(chart->axisX());
if (axis_x->max() <= axis_x->min()) return;
int x = chart->plotArea().left() + chart->plotArea().width() * (parser->currentSec() - axis_x->min()) / (axis_x->max() - axis_x->min()); int x = chart->plotArea().left() + chart->plotArea().width() * (parser->currentSec() - axis_x->min()) / (axis_x->max() - axis_x->min());
if (line_marker_x != x) { if (line_marker_x != x) {
line_marker->setX(x); line_marker->setX(x);
@ -214,7 +212,6 @@ void ChartWidget::updateSeries() {
vals.clear(); vals.clear();
vals.reserve(3 * 60 * 100); vals.reserve(3 * 60 * 100);
double min_y = 0, max_y = 0;
uint64_t route_start_time = parser->replay->routeStartTime(); uint64_t route_start_time = parser->replay->routeStartTime();
for (auto &evt : *events) { for (auto &evt : *events) {
if (evt->which == cereal::Event::Which::CAN) { if (evt->which == cereal::Event::Which::CAN) {
@ -226,9 +223,6 @@ void ChartWidget::updateSeries() {
val -= ((val >> (sig->size - 1)) & 0x1) ? (1ULL << sig->size) : 0; val -= ((val >> (sig->size - 1)) & 0x1) ? (1ULL << sig->size) : 0;
} }
double value = val * sig->factor + sig->offset; double value = val * sig->factor + sig->offset;
if (value < min_y) min_y = value;
if (value > max_y) max_y = value;
double ts = (evt->mono_time - route_start_time) / (double)1e9; // seconds double ts = (evt->mono_time - route_start_time) / (double)1e9; // seconds
vals.push_back({ts, value}); vals.push_back({ts, value});
} }
@ -239,7 +233,7 @@ void ChartWidget::updateSeries() {
series->replace(vals); series->replace(vals);
auto [begin, end] = parser->range(); auto [begin, end] = parser->range();
chart_view->chart()->axisX()->setRange(begin, end); chart_view->chart()->axisX()->setRange(begin, end);
chart_view->chart()->axisY()->setRange(min_y * 0.95, max_y * 1.05); updateAxisY();
} }
void ChartWidget::rangeChanged(qreal min, qreal max) { void ChartWidget::rangeChanged(qreal min, qreal max) {
@ -247,17 +241,20 @@ void ChartWidget::rangeChanged(qreal min, qreal max) {
if (axis_x->min() != min || axis_x->max() != max) { if (axis_x->min() != min || axis_x->max() != max) {
axis_x->setRange(min, max); axis_x->setRange(min, max);
} }
// auto zoom on yaxis updateAxisY();
double min_y = 0, max_y = 0; }
for (auto &p : vals) {
if (p.x() > max) break; // auto zoom on yaxis
void ChartWidget::updateAxisY() {
if (p.x() >= min) { const auto axis_x = dynamic_cast<QValueAxis *>(chart_view->chart()->axisX());
if (p.y() < min_y) min_y = p.y(); // vals is a sorted list
if (p.y() > max_y) max_y = p.y(); auto begin = std::lower_bound(vals.begin(), vals.end(), axis_x->min(), [](auto &p, double x) { return p.x() < x; });
} if (begin == vals.end())
} return;
chart_view->chart()->axisY()->setRange(min_y * 0.95, max_y * 1.05);
auto end = std::upper_bound(vals.begin(), vals.end(), axis_x->max(), [](double x, auto &p) { return x < p.x(); });
const auto [min, max] = std::minmax_element(begin, end, [](auto &p1, auto &p2) { return p1.y() < p2.y(); });
chart_view->chart()->axisY()->setRange(min->y(), max->y());
} }
// LineMarker // LineMarker

@ -37,6 +37,7 @@ private:
void addData(const CanData &can_data, const Signal &sig); void addData(const CanData &can_data, const Signal &sig);
void updateSeries(); void updateSeries();
void rangeChanged(qreal min, qreal max); void rangeChanged(qreal min, qreal max);
void updateAxisY();
QString id; QString id;
QString sig_name; QString sig_name;

Loading…
Cancel
Save