From 8c3ec9dd31b33efd1b7e58d9cfae2e80544e7610 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sun, 11 Apr 2021 06:06:16 +0800 Subject: [PATCH] Faster spinner, reduce cpu usage (#20618) * Faster spinenr * correct path * remove binary * 30 fps Co-authored-by: Comma Device --- selfdrive/ui/qt/spinner.cc | 69 +++++++++++++++++++++++-------------- selfdrive/ui/qt/spinner.hpp | 21 +++++++---- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/selfdrive/ui/qt/spinner.cc b/selfdrive/ui/qt/spinner.cc index c3bf5a3f3b..087e13402f 100644 --- a/selfdrive/ui/qt/spinner.cc +++ b/selfdrive/ui/qt/spinner.cc @@ -6,35 +6,58 @@ #include #include #include - +#include #include "spinner.hpp" #include "qt_window.hpp" -Spinner::Spinner(QWidget *parent) { - QGridLayout *main_layout = new QGridLayout(); - main_layout->setSpacing(0); - main_layout->setContentsMargins(200, 200, 200, 200); +// TrackWidget - comma = new QLabel(); - comma->setPixmap(QPixmap("../assets/img_spinner_comma.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation)); - comma->setFixedSize(spinner_size); - main_layout->addWidget(comma, 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); +TrackWidget::TrackWidget(QWidget *parent) { + setFixedSize(spinner_size); + setAutoFillBackground(false); - track = new QLabel(); - track->setFixedSize(spinner_size); - main_layout->addWidget(track, 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); + comma_img = QPixmap("../assets/img_spinner_comma.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); // pre-compute all the track imgs. make this a gif instead? - track_idx = 0; QTransform transform; QPixmap track_img = QPixmap("../assets/img_spinner_track.png").scaled(spinner_size, Qt::KeepAspectRatio, Qt::SmoothTransformation); for (auto &img : track_imgs) { - QPixmap r = track_img.transformed(transform.rotate(360/spinner_fps), Qt::SmoothTransformation); - int x = (r.width() - track->width()) / 2; - int y = (r.height() - track->height()) / 2; - img = r.copy(x, y, track->width(), track->height()); + img = track_img.transformed(transform.rotate(360/spinner_fps), Qt::SmoothTransformation); } + m_anim.setDuration(1000); + m_anim.setStartValue(0); + m_anim.setEndValue(int(track_imgs.size() -1)); + m_anim.setLoopCount(-1); + m_anim.start(); + connect(&m_anim, SIGNAL(valueChanged(QVariant)), SLOT(update())); +} + +void TrackWidget::paintEvent(QPaintEvent *event) { + QPainter painter(this); + QRect bg(0, 0, painter.device()->width(), painter.device()->height()); + QBrush bgBrush("#000000"); + painter.fillRect(bg, bgBrush); + + int track_idx = m_anim.currentValue().toInt(); + QRect rect(track_imgs[track_idx].rect()); + rect.moveCenter(bg.center()); + painter.drawPixmap(rect.topLeft(), track_imgs[track_idx]); + + rect = comma_img.rect(); + rect.moveCenter(bg.center()); + painter.drawPixmap(rect.topLeft(), comma_img); +} + +// Spinner + +Spinner::Spinner(QWidget *parent) { + QGridLayout *main_layout = new QGridLayout(); + main_layout->setSpacing(0); + main_layout->setMargin(200); + + main_layout->addWidget(new TrackWidget(), 0, 0, Qt::AlignHCenter | Qt::AlignVCenter); + text = new QLabel(); text->setVisible(false); main_layout->addWidget(text, 1, 0, Qt::AlignHCenter); @@ -51,6 +74,9 @@ Spinner::Spinner(QWidget *parent) { Spinner { background-color: black; } + * { + background-color: transparent; + } QLabel { color: white; font-size: 80px; @@ -67,19 +93,10 @@ Spinner::Spinner(QWidget *parent) { } )"); - rotate_timer = new QTimer(this); - rotate_timer->start(1000./spinner_fps); - QObject::connect(rotate_timer, SIGNAL(timeout()), this, SLOT(rotate())); - notifier = new QSocketNotifier(fileno(stdin), QSocketNotifier::Read); QObject::connect(notifier, SIGNAL(activated(int)), this, SLOT(update(int))); }; -void Spinner::rotate() { - track_idx = (track_idx+1) % track_imgs.size(); - track->setPixmap(track_imgs[track_idx]); -}; - void Spinner::update(int n) { std::string line; std::getline(std::cin, line); diff --git a/selfdrive/ui/qt/spinner.hpp b/selfdrive/ui/qt/spinner.hpp index 8bdd13a3d2..c66481cf02 100644 --- a/selfdrive/ui/qt/spinner.hpp +++ b/selfdrive/ui/qt/spinner.hpp @@ -1,15 +1,28 @@ #include -#include #include #include #include #include #include +#include +#include constexpr int spinner_fps = 30; constexpr QSize spinner_size = QSize(360, 360); +class TrackWidget : public QOpenGLWidget { + Q_OBJECT +public: + TrackWidget(QWidget *parent = nullptr); + +private: + void paintEvent(QPaintEvent *event) override; + std::array track_imgs; + QPixmap comma_img; + QVariantAnimation m_anim; +}; + class Spinner : public QWidget { Q_OBJECT @@ -17,16 +30,10 @@ public: explicit Spinner(QWidget *parent = 0); private: - int track_idx; - QLabel *comma, *track; QLabel *text; QProgressBar *progress_bar; - std::array track_imgs; - - QTimer *rotate_timer; QSocketNotifier *notifier; public slots: - void rotate(); void update(int n); };