From 2bad15978dbdfbe75df35d7324c3731edc453d0a Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Mon, 3 Jan 2022 20:41:23 +0100 Subject: [PATCH] Fixed qr import --- components/espasynchttpreq | 2 +- main/actions/qraction.cpp | 24 +++++++- main/actions/qraction.h | 6 +- main/displays/menus/greenpassmenu.cpp | 4 +- main/displays/qrimportdisplay.cpp | 87 ++++++++++++++------------- main/displays/qrimportdisplay.h | 8 ++- main/qrimport.cpp | 9 ++- 7 files changed, 87 insertions(+), 53 deletions(-) diff --git a/components/espasynchttpreq b/components/espasynchttpreq index 719d185..50487cf 160000 --- a/components/espasynchttpreq +++ b/components/espasynchttpreq @@ -1 +1 @@ -Subproject commit 719d1854ef48016ca824e227aea44820db385170 +Subproject commit 50487cf5640491fa889408af6192aab0decacbab diff --git a/main/actions/qraction.cpp b/main/actions/qraction.cpp index 00b7e5e..f2b788c 100644 --- a/main/actions/qraction.cpp +++ b/main/actions/qraction.cpp @@ -8,16 +8,34 @@ using namespace espgui; -SwitchQrDisplayAction::SwitchQrDisplayAction(qraction::QrMenu qrmenu) : m_msg{qrmenu.message}, m_ver{qrmenu.ver} {} +SwitchQrDisplayAction::SwitchQrDisplayAction(const qraction::QrMenu &qrmenu) : + m_msg{qrmenu.message}, + m_ver{qrmenu.ver} +{ +} + +SwitchQrDisplayAction::SwitchQrDisplayAction(qraction::QrMenu &&qrmenu) : + m_msg{std::move(qrmenu.message)}, + m_ver{qrmenu.ver} +{ +} void SwitchQrDisplayAction::triggered() { switchScreen(m_msg, m_ver); } -SwitchQrImportDisplayAction::SwitchQrImportDisplayAction(std::string nvskey) : m_nvskey{nvskey} {} +SwitchQrImportDisplayAction::SwitchQrImportDisplayAction(const std::string &nvskey) : + m_nvskey{nvskey} +{ +} + +SwitchQrImportDisplayAction::SwitchQrImportDisplayAction(std::string &&nvskey) : + m_nvskey{std::move(nvskey)} +{ +} void SwitchQrImportDisplayAction::triggered() { - switchScreen(m_nvskey); + switchScreen(std::move(m_nvskey)); } diff --git a/main/actions/qraction.h b/main/actions/qraction.h index 0df9382..ecd078b 100644 --- a/main/actions/qraction.h +++ b/main/actions/qraction.h @@ -16,7 +16,8 @@ struct QrMenu { class SwitchQrDisplayAction : public virtual espgui::ActionInterface { public: - SwitchQrDisplayAction(qraction::QrMenu qrmenu); + explicit SwitchQrDisplayAction(const qraction::QrMenu &qrmenu); + explicit SwitchQrDisplayAction(qraction::QrMenu &&qrmenu); void triggered() override; private: @@ -27,7 +28,8 @@ private: class SwitchQrImportDisplayAction : public virtual espgui::ActionInterface { public: - SwitchQrImportDisplayAction(std::string nvskey); + explicit SwitchQrImportDisplayAction(const std::string &nvskey); + explicit SwitchQrImportDisplayAction(std::string &&nvskey); void triggered() override; private: diff --git a/main/displays/menus/greenpassmenu.cpp b/main/displays/menus/greenpassmenu.cpp index 74fa34d..186d7e6 100644 --- a/main/displays/menus/greenpassmenu.cpp +++ b/main/displays/menus/greenpassmenu.cpp @@ -68,7 +68,7 @@ GreenPassMenu::GreenPassMenu() for (uint8_t index = 0; index < 4; index++) { - const std::string nvs_key = fmt::format("covidcert-{}", index); + std::string nvs_key = fmt::format("covidcert-{}", index); ESP_LOGI("greenpassmenu", "Checking key %s", nvs_key.c_str()); if (qrimport::has_qr_code(nvs_key)) { @@ -84,7 +84,7 @@ GreenPassMenu::GreenPassMenu() } else { - constructMenuItem>>(nvs_key); + constructMenuItem>>(std::move(nvs_key)); } } constructMenuItem, BobbyCheckbox, DeleteModeAccessor>>(); diff --git a/main/displays/qrimportdisplay.cpp b/main/displays/qrimportdisplay.cpp index f8c855a..9351610 100644 --- a/main/displays/qrimportdisplay.cpp +++ b/main/displays/qrimportdisplay.cpp @@ -12,62 +12,79 @@ constexpr const char * const TAG = "qrimport"; // local includes #include "qrimport.h" -// m_statuslabel needs redraw - using namespace espgui; -QrImportDisplay::QrImportDisplay(std::string nvs_key) : +QrImportDisplay::QrImportDisplay(const std::string &nvs_key) : m_nvs_key{nvs_key} { } +QrImportDisplay::QrImportDisplay(std::string &&nvs_key) : + m_nvs_key{std::move(nvs_key)} +{ +} + void QrImportDisplay::start() { Base::start(); m_statuslabel.start(); + qrimport::setup_request(); - m_statuslabel.redraw(fmt::format("Request not running.")); + + if (const auto result = qrimport::start_qr_request(); result) + { + ESP_LOGI(TAG, "started request, waiting for result"); + m_waitingForResult = true; + } + else + { + ESP_LOGE(TAG, "could not start request: %.*s", result.error().size(), result.error().data()); + m_result = tl::make_unexpected(std::move(result).error()); + } } void QrImportDisplay::update() { Base::update(); - m_expected = qrimport::check_request(); - if (m_expected) + if (!m_waitingForResult) + return; + + if (qrimport::get_request_running()) + return; + + m_waitingForResult = false; + + m_result = qrimport::check_request(); + if (m_result) { - ESP_LOGI(TAG, "%s", fmt::format("{} => {}", m_nvs_key, *m_expected).c_str()); - if (const auto result = qrimport::set_qr_code(m_nvs_key, *m_expected); !result) - { - tft.setTextColor(TFT_RED); - m_statuslabel.redraw(esp_err_to_name(result.error())); - tft.setTextColor(TFT_WHITE); - m_confirmLocked = true; - } - else - { - switchScreen(); - } + ESP_LOGI(TAG, "%.*s => %.*s", m_nvs_key.size(), m_nvs_key.data(), m_result->size(), m_result->data()); + if (const auto result = qrimport::set_qr_code(m_nvs_key, *m_result); !result) + m_result = tl::make_unexpected(fmt::format("saving qr failed: {}", esp_err_to_name(result.error()))); } + else + ESP_LOGW(TAG, "failed %.*s => %.*s", m_nvs_key.size(), m_nvs_key.data(), m_result.error().size(), m_result.error().data()); } void QrImportDisplay::redraw() { Base::redraw(); - if (qrimport::get_request_running()) + if (m_waitingForResult) { - if (!m_expected) - { - tft.setTextColor(TFT_RED); - m_statuslabel.redraw(*m_expected); - tft.setTextColor(TFT_WHITE); - } + tft.setTextColor(TFT_YELLOW, TFT_BLACK); + m_statuslabel.redraw("In progress"); + } + else if (!m_result) + { + tft.setTextColor(TFT_RED, TFT_BLACK); + m_statuslabel.redraw(m_result.error()); } else { - m_statuslabel.redraw("Request not running"); + tft.setTextColor(TFT_GREEN, TFT_BLACK); + m_statuslabel.redraw("OK"); } } @@ -79,22 +96,10 @@ void QrImportDisplay::buttonPressed(espgui::Button button) { using espgui::Button; case Button::Left: - if (!qrimport::get_request_running()) - { + if (!m_waitingForResult) switchScreen(); - } - break; - case Button::Right: - // start request - if (!m_confirmLocked) - { - if (const auto result = qrimport::start_qr_request(); !result) - { - switchScreen(); - } - else - m_confirmLocked = true; - } + else + ESP_LOGW(TAG, "tried to leave while waiting for result"); break; default:; } diff --git a/main/displays/qrimportdisplay.h b/main/displays/qrimportdisplay.h index c456ed1..d1b6ead 100644 --- a/main/displays/qrimportdisplay.h +++ b/main/displays/qrimportdisplay.h @@ -13,7 +13,8 @@ class QrImportDisplay : public BobbyDisplay using Base = BobbyDisplay; public: - QrImportDisplay(std::string nvs_key); + explicit QrImportDisplay(const std::string &nvs_key); + explicit QrImportDisplay(std::string &&nvs_key); void start() override; void update() override; @@ -22,8 +23,9 @@ public: void buttonPressed(espgui::Button button) override; private: - bool m_confirmLocked{false}; + bool m_waitingForResult{false}; espgui::Label m_statuslabel{5,(espgui::tft.height() / 2)-espgui::tft.fontHeight(4)}; - tl::expected m_expected; + + tl::expected m_result; std::string m_nvs_key; }; diff --git a/main/qrimport.cpp b/main/qrimport.cpp index dc8058f..743f5ae 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -135,6 +135,12 @@ tl::expected check_request() { return tl::make_unexpected(result.error()); } + else if (http_request->statusCode() != 200) + { + return tl::make_unexpected(fmt::format("unexpected response status: {} {}", + http_request->statusCode(), + http_request->takeBuffer())); + } else { ESP_LOGI(TAG, "%.*s", http_request->buffer().size(), http_request->buffer().data()); @@ -146,9 +152,10 @@ bool get_request_running() { if (!http_request.constructed()) { + ESP_LOGW(TAG, "not constructed"); return false; } - return http_request->finished(); + return !http_request->finished(); } } // namespace