From d43d62561063c4d3f8b10b08d7bde9ed8bd0f395 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Fri, 26 Mar 2021 14:53:12 +0100 Subject: [PATCH] Cache prime/points widget (#20497) * cache prime status on homescreen * use stacked widget * add caching and clear on 404 --- common/params_pyx.pyx | 2 ++ selfdrive/ui/qt/api.cc | 10 ++++++---- selfdrive/ui/qt/api.hpp | 1 + selfdrive/ui/qt/widgets/setup.cc | 23 ++++++++++++++++++----- selfdrive/ui/qt/widgets/setup.hpp | 5 +++-- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/common/params_pyx.pyx b/common/params_pyx.pyx index 81368a401a..499e6ea6e7 100755 --- a/common/params_pyx.pyx +++ b/common/params_pyx.pyx @@ -16,6 +16,8 @@ cdef enum TxType: keys = { b"AccessToken": [TxType.CLEAR_ON_MANAGER_START], b"ApiCache_DriveStats": [TxType.PERSISTENT], + b"ApiCache_Device": [TxType.PERSISTENT], + b"ApiCache_Owner": [TxType.PERSISTENT], b"AthenadPid": [TxType.PERSISTENT], b"CalibrationParams": [TxType.PERSISTENT], b"CarBatteryCapacity": [TxType.PERSISTENT], diff --git a/selfdrive/ui/qt/api.cc b/selfdrive/ui/qt/api.cc index c20a68872a..5522705c4f 100644 --- a/selfdrive/ui/qt/api.cc +++ b/selfdrive/ui/qt/api.cc @@ -133,16 +133,18 @@ void RequestRepeater::requestFinished(){ QString response = reply->readAll(); if (reply->error() == QNetworkReply::NoError) { // save to cache - if (!cache_key.isEmpty()) { - Params().write_db_value(cache_key.toStdString(), response.toStdString()); + if (!cache_key.isEmpty()) { + Params().write_db_value(cache_key.toStdString(), response.toStdString()); } emit receivedResponse(response); } else { - qDebug() << reply->errorString(); + if (!cache_key.isEmpty()) { + Params().delete_db_value(cache_key.toStdString()); + } emit failedResponse(reply->errorString()); } } else { - emit failedResponse("network timeout"); + emit timeoutResponse("timeout"); } reply->deleteLater(); reply = NULL; diff --git a/selfdrive/ui/qt/api.hpp b/selfdrive/ui/qt/api.hpp index 408adcac99..3772727be9 100644 --- a/selfdrive/ui/qt/api.hpp +++ b/selfdrive/ui/qt/api.hpp @@ -51,4 +51,5 @@ private slots: signals: void receivedResponse(QString response); void failedResponse(QString errorString); + void timeoutResponse(QString errorString); }; diff --git a/selfdrive/ui/qt/widgets/setup.cc b/selfdrive/ui/qt/widgets/setup.cc index 64a2f68265..32e14f20dd 100644 --- a/selfdrive/ui/qt/widgets/setup.cc +++ b/selfdrive/ui/qt/widgets/setup.cc @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -107,7 +107,7 @@ PrimeUserWidget::PrimeUserWidget(QWidget* parent) : QWidget(parent) { // TODO: only send the request when widget is shown QString url = "https://api.commadotai.com/v1/devices/" + dongleId + "/owner"; - RequestRepeater* repeater = new RequestRepeater(this, url, 6); + RequestRepeater* repeater = new RequestRepeater(this, url, 6, "ApiCache_Owner"); QObject::connect(repeater, SIGNAL(receivedResponse(QString)), this, SLOT(replyFinished(QString))); } @@ -156,7 +156,7 @@ PrimeAdWidget::PrimeAdWidget(QWidget* parent) : QWidget(parent) { SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { - mainLayout = new QStackedLayout; + mainLayout = new QStackedWidget; // Unpaired, registration prompt layout @@ -214,7 +214,12 @@ SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { primeUser = new PrimeUserWidget; mainLayout->addWidget(primeUser); - setLayout(mainLayout); + mainLayout->setCurrentWidget(primeAd); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(mainLayout); + setLayout(layout); + setStyleSheet(R"( SetupWidget { background-color: #292929; @@ -226,16 +231,23 @@ SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { } )"); + // Retain size while hidden + QSizePolicy sp_retain = sizePolicy(); + sp_retain.setRetainSizeWhenHidden(true); + setSizePolicy(sp_retain); + // set up API requests QString dongleId = QString::fromStdString(Params().get("DongleId")); QString url = "https://api.commadotai.com/v1.1/devices/" + dongleId + "/"; - RequestRepeater* repeater = new RequestRepeater(this, url, 5); + RequestRepeater* repeater = new RequestRepeater(this, url, 5, "ApiCache_Device"); QObject::connect(repeater, SIGNAL(receivedResponse(QString)), this, SLOT(replyFinished(QString))); QObject::connect(repeater, SIGNAL(failedResponse(QString)), this, SLOT(parseError(QString))); + hide(); // Only show when first request comes back } void SetupWidget::parseError(QString response) { + show(); showQr = false; mainLayout->setCurrentIndex(0); } @@ -246,6 +258,7 @@ void SetupWidget::showQrCode(){ } void SetupWidget::replyFinished(QString response) { + show(); QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); if (doc.isNull()) { qDebug() << "JSON Parse failed on getting pairing and prime status"; diff --git a/selfdrive/ui/qt/widgets/setup.hpp b/selfdrive/ui/qt/widgets/setup.hpp index 6cd18b1bc7..0479db8f95 100644 --- a/selfdrive/ui/qt/widgets/setup.hpp +++ b/selfdrive/ui/qt/widgets/setup.hpp @@ -1,7 +1,8 @@ #pragma once #include -#include +#include +#include #include #include "api.hpp" @@ -48,7 +49,7 @@ public: explicit SetupWidget(QWidget* parent = 0); private: - QStackedLayout* mainLayout; + QStackedWidget* mainLayout; CommaApi* api; PrimeAdWidget *primeAd; PrimeUserWidget *primeUser;