From 13cef1a32d11e950d489bea20e6828fb3a49d313 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sun, 19 Dec 2021 01:55:43 +0100 Subject: [PATCH] Added nvs saving --- main/actions/qraction.cpp | 8 ++++ main/actions/qraction.h | 15 +++++++- main/displays/menus/greenpassmenu.cpp | 54 ++++++++++++++++++++++++++- main/displays/menus/greenpassmenu.h | 2 + main/displays/qrimportdisplay.cpp | 45 +++++++++++++--------- main/displays/qrimportdisplay.h | 5 ++- main/qrimport.cpp | 1 + main/texts.cpp | 1 - main/texts.h | 1 - 9 files changed, 106 insertions(+), 26 deletions(-) diff --git a/main/actions/qraction.cpp b/main/actions/qraction.cpp index eebbeea..00b7e5e 100644 --- a/main/actions/qraction.cpp +++ b/main/actions/qraction.cpp @@ -4,6 +4,7 @@ #include #include #include "displays/qrdisplay.h" +#include "displays/qrimportdisplay.h" using namespace espgui; @@ -13,3 +14,10 @@ void SwitchQrDisplayAction::triggered() { switchScreen(m_msg, m_ver); } + +SwitchQrImportDisplayAction::SwitchQrImportDisplayAction(std::string nvskey) : m_nvskey{nvskey} {} + +void SwitchQrImportDisplayAction::triggered() +{ + switchScreen(m_nvskey); +} diff --git a/main/actions/qraction.h b/main/actions/qraction.h index ec28ef7..0df9382 100644 --- a/main/actions/qraction.h +++ b/main/actions/qraction.h @@ -7,7 +7,8 @@ namespace qraction { struct QrMenu { - std::string_view message; + std::string message; + std::string text; uint8_t ver; }; } // namespace @@ -19,6 +20,16 @@ public: void triggered() override; private: - std::string_view m_msg; + std::string m_msg; uint8_t m_ver; }; + +class SwitchQrImportDisplayAction : public virtual espgui::ActionInterface +{ +public: + SwitchQrImportDisplayAction(std::string nvskey); + + void triggered() override; +private: + std::string m_nvskey; +}; diff --git a/main/displays/menus/greenpassmenu.cpp b/main/displays/menus/greenpassmenu.cpp index ee29258..4550eb7 100644 --- a/main/displays/menus/greenpassmenu.cpp +++ b/main/displays/menus/greenpassmenu.cpp @@ -1,19 +1,69 @@ #include "greenpassmenu.h" +// 3rd party includes +#include +#include + // local includes #include "actions/switchscreenaction.h" #include "actions/qraction.h" +#include "actions/dummyaction.h" #include "displays/menus/mainmenu.h" #include "displays/qrdisplay.h" #include "displays/qrimportdisplay.h" #include "icons/back.h" +#include "qrimport.h" using namespace espgui; +namespace { +class ErrorMenuItem : public espgui::MenuItem +{ +public: + std::string text() const override { return m_text; } + void setText(std::string &&text) { m_text = std::move(text); } + void setText(const std::string &text) { m_text = text; } + void triggered() override{} + int color() const override { return TFT_RED; } +private: + std::string m_text; +}; + +class CertMenuItem : public espgui::MenuItem +{ +public: + CertMenuItem(qraction::QrMenu qrmenu) : m_qrmenu{qrmenu} {} + std::string text() const override { return m_qrmenu.text; } + void triggered() override { switchScreen(m_qrmenu.message, m_qrmenu.ver); } +private: + qraction::QrMenu m_qrmenu; +}; + +} // namespace + GreenPassMenu::GreenPassMenu() { - constructMenuItem>>(qraction::QrMenu{.message="CORONA_PASS", .ver=15}); - constructMenuItem, SwitchScreenAction>>(); + for (uint8_t index = 0; index < 4; index++) + { + const 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)) + { + if (const auto certTxt = qrimport::get_qr_code(nvs_key); certTxt) + { + constructMenuItem(qraction::QrMenu{.message=*certTxt, .text=nvs_key , .ver=15}); + } + else + { + auto &menuitem = constructMenuItem(); + menuitem.setText(esp_err_to_name(certTxt.error())); + } + } + else + { + constructMenuItem>>(nvs_key); + } + } constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } diff --git a/main/displays/menus/greenpassmenu.h b/main/displays/menus/greenpassmenu.h index 76a262d..dad0ca4 100644 --- a/main/displays/menus/greenpassmenu.h +++ b/main/displays/menus/greenpassmenu.h @@ -14,4 +14,6 @@ class GreenPassMenu : public: GreenPassMenu(); void back() override; +private: + bool m_deleteMode; }; diff --git a/main/displays/qrimportdisplay.cpp b/main/displays/qrimportdisplay.cpp index ea3ec26..2a207d3 100644 --- a/main/displays/qrimportdisplay.cpp +++ b/main/displays/qrimportdisplay.cpp @@ -16,35 +16,35 @@ constexpr const char * const TAG = "qrimport"; using namespace espgui; -/* - * This display will be accessable via GreenPassMenu. If you click on it, it will ask if you want to download the qr code. - * If confirm is pressed, the display will lock the back action and send a request via qrimport.h. If an error occours, it will be displayed. - * If everything is okay, you will be redirected to GreenPassMenu. - * The update function will need to be overriden to check the web handler if it exists. - */ - -QrImportDisplay::QrImportDisplay() -{ - // constructor -} +QrImportDisplay::QrImportDisplay(std::string nvs_key) : m_nvs_key{nvs_key} {} void QrImportDisplay::start() { m_statuslabel.start(); qrimport::setup_request(); + m_statuslabel.redraw(fmt::format("Request not running.")); } void QrImportDisplay::back() { - if (!m_backLocked) + if (!qrimport::get_request_running()) + { switchScreen(); + } } void QrImportDisplay::confirm() { // start request - m_backLocked = true; - qrimport::start_qr_request(); + if (!m_confirmLocked) + { + if (const auto result = qrimport::start_qr_request(); !result) + { + switchScreen(); + } + else + m_confirmLocked = true; + } } void QrImportDisplay::update() @@ -52,9 +52,18 @@ void QrImportDisplay::update() m_expected = qrimport::check_request(); if (m_expected) { - ESP_LOGI(TAG, "%s", m_expected->c_str()); - m_backLocked = false; - switchScreen(); + 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(); + } } } @@ -71,6 +80,6 @@ void QrImportDisplay::redraw() } else { - m_statuslabel.redraw(fmt::format("Request not running.")); + m_statuslabel.redraw("Request not running"); } } diff --git a/main/displays/qrimportdisplay.h b/main/displays/qrimportdisplay.h index 6cce8e9..9f080d6 100644 --- a/main/displays/qrimportdisplay.h +++ b/main/displays/qrimportdisplay.h @@ -10,14 +10,15 @@ class QrImportDisplay : public espgui::Display { using Base = espgui::Display; public: - QrImportDisplay(); + QrImportDisplay(std::string nvs_key); void start() override; void back() override; void update() override; void redraw() override; void confirm() override; private: - bool m_backLocked; + bool m_confirmLocked{false}; espgui::Label m_statuslabel{5,(espgui::tft.height() / 2)-espgui::tft.fontHeight(4)}; tl::expected m_expected; + std::string m_nvs_key; }; diff --git a/main/qrimport.cpp b/main/qrimport.cpp index 70aa525..4d4315f 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -123,6 +123,7 @@ tl::expected check_request() } else { + ESP_LOGI(TAG, "%.*s", http_request->buffer().size(), http_request->buffer().data()); return http_request->takeBuffer(); } } diff --git a/main/texts.cpp b/main/texts.cpp index 8659caa..7cf594b 100644 --- a/main/texts.cpp +++ b/main/texts.cpp @@ -543,7 +543,6 @@ char TEXT_QRCODE_DEBUG[] = "QR Debug"; //GreenPassMenu char TEXT_GREENPASS[] = "Green Pass"; -char TEXT_SHOWCERT[] = "Show cert"; char TEXT_ADDCERT[] = "Add cert"; //EspNowMenu diff --git a/main/texts.h b/main/texts.h index 18d40a3..20b316c 100644 --- a/main/texts.h +++ b/main/texts.h @@ -543,7 +543,6 @@ extern char TEXT_QRCODE_DEBUG[]; //GreenPassMenu extern char TEXT_GREENPASS[]; -extern char TEXT_SHOWCERT[]; extern char TEXT_ADDCERT[]; //EspNowMenu