From a9798713ed746a64b8aa87c1b9b5c19ee7ad05f1 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 18 Dec 2021 20:09:25 +0100 Subject: [PATCH 1/8] Added qr import display --- main/CMakeLists.txt | 4 ++ main/displays/menus/greenpassmenu.cpp | 2 + main/displays/qrimportdisplay.cpp | 76 +++++++++++++++++++++++ main/displays/qrimportdisplay.h | 23 +++++++ main/qrimport.cpp | 86 +++++++++++++++++++++++++++ main/qrimport.h | 26 ++++++++ main/texts.cpp | 1 + main/texts.h | 1 + 8 files changed, 219 insertions(+) create mode 100644 main/displays/qrimportdisplay.cpp create mode 100644 main/displays/qrimportdisplay.h create mode 100644 main/qrimport.cpp create mode 100644 main/qrimport.h diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 1e37b56..8762632 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -123,6 +123,7 @@ set(headers displays/poweroffdisplay.h displays/powersupplydisplay.h displays/qrcodedebug.h + displays/qrimportdisplay.h displays/spirodisplay.h displays/starfielddisplay.h displays/statusdisplay.h @@ -179,6 +180,7 @@ set(headers newsettings.h ota.h presets.h + qrimport.h rotary.h screens.h serialhandler.h @@ -333,6 +335,7 @@ set(sources displays/poweroffdisplay.cpp displays/powersupplydisplay.cpp displays/qrcodedebug.cpp + displays/qrimportdisplay.cpp displays/spirodisplay.cpp displays/starfielddisplay.cpp displays/statusdisplay.cpp @@ -390,6 +393,7 @@ set(sources newsettings.cpp ota.cpp presets.cpp + qrimport.cpp rotary.cpp screens.cpp serialhandler.cpp diff --git a/main/displays/menus/greenpassmenu.cpp b/main/displays/menus/greenpassmenu.cpp index 304ec20..ee29258 100644 --- a/main/displays/menus/greenpassmenu.cpp +++ b/main/displays/menus/greenpassmenu.cpp @@ -5,6 +5,7 @@ #include "actions/qraction.h" #include "displays/menus/mainmenu.h" #include "displays/qrdisplay.h" +#include "displays/qrimportdisplay.h" #include "icons/back.h" using namespace espgui; @@ -12,6 +13,7 @@ using namespace espgui; GreenPassMenu::GreenPassMenu() { constructMenuItem>>(qraction::QrMenu{.message="CORONA_PASS", .ver=15}); + constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } diff --git a/main/displays/qrimportdisplay.cpp b/main/displays/qrimportdisplay.cpp new file mode 100644 index 0000000..ea3ec26 --- /dev/null +++ b/main/displays/qrimportdisplay.cpp @@ -0,0 +1,76 @@ +constexpr const char * const TAG = "qrimport"; +#include "qrimportdisplay.h" + +// 3rd party includes +#include +#include +#include + +// displays/menus includes +#include "displays/menus/greenpassmenu.h" + +// local includes +#include "qrimport.h" + +// m_statuslabel needs redraw + +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 +} + +void QrImportDisplay::start() +{ + m_statuslabel.start(); + qrimport::setup_request(); +} + +void QrImportDisplay::back() +{ + if (!m_backLocked) + switchScreen(); +} + +void QrImportDisplay::confirm() +{ + // start request + m_backLocked = true; + qrimport::start_qr_request(); +} + +void QrImportDisplay::update() +{ + m_expected = qrimport::check_request(); + if (m_expected) + { + ESP_LOGI(TAG, "%s", m_expected->c_str()); + m_backLocked = false; + switchScreen(); + } +} + +void QrImportDisplay::redraw() +{ + if (qrimport::get_request_running()) + { + if (!m_expected) + { + tft.setTextColor(TFT_RED); + m_statuslabel.redraw(*m_expected); + tft.setTextColor(TFT_WHITE); + } + } + else + { + m_statuslabel.redraw(fmt::format("Request not running.")); + } +} diff --git a/main/displays/qrimportdisplay.h b/main/displays/qrimportdisplay.h new file mode 100644 index 0000000..6cce8e9 --- /dev/null +++ b/main/displays/qrimportdisplay.h @@ -0,0 +1,23 @@ +#pragma once + +// 3rd party includes +#include +#include +#include +#include + +class QrImportDisplay : public espgui::Display +{ + using Base = espgui::Display; +public: + QrImportDisplay(); + void start() override; + void back() override; + void update() override; + void redraw() override; + void confirm() override; +private: + bool m_backLocked; + espgui::Label m_statuslabel{5,(espgui::tft.height() / 2)-espgui::tft.fontHeight(4)}; + tl::expected m_expected; +}; diff --git a/main/qrimport.cpp b/main/qrimport.cpp new file mode 100644 index 0000000..81b46d2 --- /dev/null +++ b/main/qrimport.cpp @@ -0,0 +1,86 @@ +#include "qrimport.h" + +// system includes + +// 3rd party includes +#include +#include +#include +#include + +// local includes + +namespace qrimport { + +namespace { +cpputils::DelayedConstruction http_request; +} // namespace + +// nvs +tl::expected get_qr_code(std::string_view key) +{ + return ""; +} + +tl::expected set_qr_code(std::string_view qrcode, std::string_view key) +{ + return{}; +} + +// web request +void setup_request() +{ + if (!http_request.constructed()) + { + http_request.construct("qr_request", espcpputils::CoreAffinity::Core0); + } +} + +tl::expected start_qr_request() +{ + if (!http_request.constructed()) + { + return tl::make_unexpected("request im oarsch"); + } + + if (const auto res = http_request->start(fmt::format("http://qr.bobbycar.cloud/{}.qr", OTA_USERNAME)); !res) + { + return res; + } + return{}; +} + +tl::expected check_request() +{ + if (!http_request.constructed()) + { + return tl::make_unexpected("request im oarsch"); + } + + if (!http_request->finished()) + { + return tl::make_unexpected("request has not finished"); + } + + const auto helper = cpputils::makeCleanupHelper([](){ http_request->clearFinished(); }); + + if (const auto result = http_request->result(); !result) + { + return tl::make_unexpected(result.error()); + } + else + { + return http_request->takeBuffer(); + } +} + +bool get_request_running() +{ + if (!http_request.constructed()) + { + return false; + } + + return http_request->finished(); +} +} // namespace diff --git a/main/qrimport.h b/main/qrimport.h new file mode 100644 index 0000000..57da4a1 --- /dev/null +++ b/main/qrimport.h @@ -0,0 +1,26 @@ +#pragma once +/* + * In this file there will be + * - a web-handler to get qr as plain text from http://qr.bobbycar.cloud/files/[OTA_NAME].qr that can be later triggered via in qrimportdisplay.h + * - getter and setter that use NVS + */ + +// system includes +#include + +// 3rd party includes +#include + +// local includes + +namespace qrimport { + // nvs + tl::expected get_qr_code(std::string_view key); + tl::expected set_qr_code(std::string_view qrcode, std::string_view key); + + // web request + void setup_request(); + tl::expected start_qr_request(); + tl::expected check_request(); + bool get_request_running(); +} // namespace diff --git a/main/texts.cpp b/main/texts.cpp index 71da3e8..8659caa 100644 --- a/main/texts.cpp +++ b/main/texts.cpp @@ -544,6 +544,7 @@ char TEXT_QRCODE_DEBUG[] = "QR Debug"; //GreenPassMenu char TEXT_GREENPASS[] = "Green Pass"; char TEXT_SHOWCERT[] = "Show cert"; +char TEXT_ADDCERT[] = "Add cert"; //EspNowMenu char TEXT_ESPNOW[] = "ESP-Now"; diff --git a/main/texts.h b/main/texts.h index 42d2bd4..18d40a3 100644 --- a/main/texts.h +++ b/main/texts.h @@ -544,6 +544,7 @@ extern char TEXT_QRCODE_DEBUG[]; //GreenPassMenu extern char TEXT_GREENPASS[]; extern char TEXT_SHOWCERT[]; +extern char TEXT_ADDCERT[]; //EspNowMenu extern char TEXT_ESPNOW[]; From 155f56863ee424a4beb631ea39aa6a58b764569e Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sat, 18 Dec 2021 22:21:55 +0100 Subject: [PATCH 2/8] Added new function --- main/qrimport.cpp | 18 +++++++++++++++--- main/qrimport.h | 6 ++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/main/qrimport.cpp b/main/qrimport.cpp index 81b46d2..6e84f7d 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -1,8 +1,8 @@ #include "qrimport.h" -// system includes // 3rd party includes +#include #include #include #include @@ -17,16 +17,28 @@ cpputils::DelayedConstruction http_request; } // namespace // nvs -tl::expected get_qr_code(std::string_view key) +tl::expected get_qr_code(std::string_view key) { return ""; } -tl::expected set_qr_code(std::string_view qrcode, std::string_view key) +tl::expected set_qr_code(std::string_view qrcode, std::string_view key) { return{}; } +bool has_qr_code(std::string_view key) +{ + if (const auto result = get_qr_code(key); !result) + { + return (result.error() == ESP_ERR_NVS_NOT_FOUND); + } + else + { + return true; + } +} + // web request void setup_request() { diff --git a/main/qrimport.h b/main/qrimport.h index 57da4a1..3bd0911 100644 --- a/main/qrimport.h +++ b/main/qrimport.h @@ -9,14 +9,16 @@ #include // 3rd party includes +#include #include // local includes namespace qrimport { // nvs - tl::expected get_qr_code(std::string_view key); - tl::expected set_qr_code(std::string_view qrcode, std::string_view key); + tl::expected get_qr_code(std::string_view key); + tl::expected set_qr_code(std::string_view qrcode, std::string_view key); + bool has_qr_code(std::string_view key); // web request void setup_request(); From db19e574c009b361ea02b63d5ec860f6f24df49c Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 18 Dec 2021 23:06:06 +0100 Subject: [PATCH 3/8] Implemented getter for qr codes --- main/qrimport.cpp | 62 ++++++++++++++++++++++++++++++---------- main/qrimport.h | 5 ++-- main/settingspersister.h | 2 ++ 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/main/qrimport.cpp b/main/qrimport.cpp index 6e84f7d..634558d 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -1,42 +1,74 @@ #include "qrimport.h" +// esp-idf includes +#include +#include // 3rd party includes -#include #include #include #include #include // local includes +#include "globals.h" namespace qrimport { namespace { +constexpr const char * const TAG = "QRIMPORT"; + cpputils::DelayedConstruction http_request; } // namespace // nvs -tl::expected get_qr_code(std::string_view key) -{ - return ""; -} - -tl::expected set_qr_code(std::string_view qrcode, std::string_view key) -{ - return{}; -} - bool has_qr_code(std::string_view key) { - if (const auto result = get_qr_code(key); !result) + const auto handle = settingsPersister.getCommonHandle(); + + size_t length; + if (const esp_err_t result = nvs_get_str(handle, key.data(), nullptr, &length); result != ESP_OK) { - return (result.error() == ESP_ERR_NVS_NOT_FOUND); + if (result != ESP_ERR_NVS_NOT_FOUND) + ESP_LOGW(TAG, "nvs_get_str() size-only for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + return false; } - else + + return length; +} + +tl::expected get_qr_code(std::string_view key) +{ + const auto handle = settingsPersister.getCommonHandle(); + + size_t length; + if (const esp_err_t result = nvs_get_str(handle, key.data(), nullptr, &length); result != ESP_OK) { - return true; + ESP_LOGW(TAG, "nvs_get_str() size-only for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + return tl::make_unexpected(result); } + + // empty string optimization + if (!length) + return {}; + + std::string buf; + buf.resize(length); + if (const esp_err_t result = nvs_get_str(handle, key.data(), buf.data(), &length); result != ESP_OK) + { + ESP_LOGW(TAG, "nvs_get_str() for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + return tl::make_unexpected(result); + } + + if (buf.back() == '\n') + buf.resize(buf.size() - 1); + + return buf; // no std::move needed as return is optimized +} + +tl::expected set_qr_code(std::string_view key, std::string_view qrcode) +{ + return{}; } // web request diff --git a/main/qrimport.h b/main/qrimport.h index 3bd0911..f941a2b 100644 --- a/main/qrimport.h +++ b/main/qrimport.h @@ -6,6 +6,7 @@ */ // system includes +//#include #include // 3rd party includes @@ -16,9 +17,9 @@ namespace qrimport { // nvs - tl::expected get_qr_code(std::string_view key); - tl::expected set_qr_code(std::string_view qrcode, std::string_view key); bool has_qr_code(std::string_view key); + tl::expected get_qr_code(std::string_view key); + tl::expected set_qr_code(std::string_view key, std::string_view qrcode); // web request void setup_request(); diff --git a/main/settingspersister.h b/main/settingspersister.h index 02dfe92..19f5254 100644 --- a/main/settingspersister.h +++ b/main/settingspersister.h @@ -22,6 +22,8 @@ public: std::optional currentlyOpenProfileIndex() const; + nvs_handle getCommonHandle() { return m_handle; } + private: // for common settings nvs_handle m_handle{}; From 6c9581bb787f61e26fa9c48fdae010300c04190f Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 18 Dec 2021 23:09:48 +0100 Subject: [PATCH 4/8] implemented qr code setter --- main/qrimport.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/main/qrimport.cpp b/main/qrimport.cpp index 634558d..70aa525 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -44,7 +44,8 @@ tl::expected get_qr_code(std::string_view key) size_t length; if (const esp_err_t result = nvs_get_str(handle, key.data(), nullptr, &length); result != ESP_OK) { - ESP_LOGW(TAG, "nvs_get_str() size-only for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + if (result != ESP_ERR_NVS_NOT_FOUND) + ESP_LOGW(TAG, "nvs_get_str() size-only for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); return tl::make_unexpected(result); } @@ -68,7 +69,15 @@ tl::expected get_qr_code(std::string_view key) tl::expected set_qr_code(std::string_view key, std::string_view qrcode) { - return{}; + const auto handle = settingsPersister.getCommonHandle(); + + if (const esp_err_t result = nvs_set_str(handle, key.data(), qrcode.data()); result != ESP_OK) + { + ESP_LOGW(TAG, "nvs_set_str() for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + return tl::make_unexpected(result); + } + + return {}; } // web request From d6198d5320a416f430510a56ae9ba15a6dccff32 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sun, 19 Dec 2021 01:55:30 +0100 Subject: [PATCH 5/8] Activated logging --- sdkconfig_comred | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdkconfig_comred b/sdkconfig_comred index fcdd9ef..29b69a5 100644 --- a/sdkconfig_comred +++ b/sdkconfig_comred @@ -842,7 +842,7 @@ CONFIG_LOG_DEFAULT_LEVEL_INFO=y # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_LOG_COLORS=y -# CONFIG_LOG_LOCATION is not set +CONFIG_LOG_LOCATION=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set # end of Log output From 13cef1a32d11e950d489bea20e6828fb3a49d313 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sun, 19 Dec 2021 01:55:43 +0100 Subject: [PATCH 6/8] 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 From f6c3e95f9d7213f51cff13bf07446531deacf3d3 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sun, 19 Dec 2021 02:03:07 +0100 Subject: [PATCH 7/8] Add delete methods --- main/qrimport.cpp | 13 +++++++++++++ main/qrimport.h | 1 + 2 files changed, 14 insertions(+) diff --git a/main/qrimport.cpp b/main/qrimport.cpp index 4d4315f..f81604c 100644 --- a/main/qrimport.cpp +++ b/main/qrimport.cpp @@ -80,6 +80,19 @@ tl::expected set_qr_code(std::string_view key, std::string_view return {}; } +tl::expected delete_qr_code(std::string_view key) +{ + const auto handle = settingsPersister.getCommonHandle(); + + if (const esp_err_t result = nvs_erase_key(handle, key.data()); result != ESP_OK) + { + ESP_LOGW(TAG, "nvs_erase_key() for key %.*s failed with %s", key.size(), key.data(), esp_err_to_name(result)); + return tl::make_unexpected(result); + } + + return {}; +} + // web request void setup_request() { diff --git a/main/qrimport.h b/main/qrimport.h index f941a2b..3220774 100644 --- a/main/qrimport.h +++ b/main/qrimport.h @@ -20,6 +20,7 @@ namespace qrimport { bool has_qr_code(std::string_view key); tl::expected get_qr_code(std::string_view key); tl::expected set_qr_code(std::string_view key, std::string_view qrcode); + tl::expected delete_qr_code(std::string_view key); // web request void setup_request(); From 599965f0bda08a9403a7ce70c7c90ebd77121ef1 Mon Sep 17 00:00:00 2001 From: CommanderRedYT Date: Sun, 19 Dec 2021 02:12:34 +0100 Subject: [PATCH 8/8] Added delete function --- main/displays/menus/greenpassmenu.cpp | 20 +++++++++++++++++++- main/displays/menus/greenpassmenu.h | 3 +-- main/texts.cpp | 1 + main/texts.h | 1 + 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/main/displays/menus/greenpassmenu.cpp b/main/displays/menus/greenpassmenu.cpp index 4550eb7..edd8cff 100644 --- a/main/displays/menus/greenpassmenu.cpp +++ b/main/displays/menus/greenpassmenu.cpp @@ -8,15 +8,21 @@ #include "actions/switchscreenaction.h" #include "actions/qraction.h" #include "actions/dummyaction.h" +#include "actions/toggleboolaction.h" #include "displays/menus/mainmenu.h" #include "displays/qrdisplay.h" #include "displays/qrimportdisplay.h" #include "icons/back.h" +#include "checkboxicon.h" #include "qrimport.h" using namespace espgui; namespace { + +bool deleteMode; +struct DeleteModeAccessor : espgui::RefAccessor { bool &getRef() const override { return deleteMode; } }; + class ErrorMenuItem : public espgui::MenuItem { public: @@ -34,7 +40,18 @@ 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); } + void triggered() override + { + if (deleteMode) + { + qrimport::delete_qr_code(m_qrmenu.text); + switchScreen(); + } + else + { + switchScreen(m_qrmenu.message, m_qrmenu.ver); + } + } private: qraction::QrMenu m_qrmenu; }; @@ -64,6 +81,7 @@ GreenPassMenu::GreenPassMenu() constructMenuItem>>(nvs_key); } } + constructMenuItem, ToggleBoolAction, CheckboxIcon, DeleteModeAccessor>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } diff --git a/main/displays/menus/greenpassmenu.h b/main/displays/menus/greenpassmenu.h index dad0ca4..b05edf7 100644 --- a/main/displays/menus/greenpassmenu.h +++ b/main/displays/menus/greenpassmenu.h @@ -3,6 +3,7 @@ #include // local includes +#include "accessorinterface.h" #include "menudisplay.h" #include "texts.h" @@ -14,6 +15,4 @@ class GreenPassMenu : public: GreenPassMenu(); void back() override; -private: - bool m_deleteMode; }; diff --git a/main/texts.cpp b/main/texts.cpp index 7cf594b..7e54aee 100644 --- a/main/texts.cpp +++ b/main/texts.cpp @@ -544,6 +544,7 @@ char TEXT_QRCODE_DEBUG[] = "QR Debug"; //GreenPassMenu char TEXT_GREENPASS[] = "Green Pass"; char TEXT_ADDCERT[] = "Add cert"; +char TEXT_DELCERT[] = "Delete cert mode"; //EspNowMenu char TEXT_ESPNOW[] = "ESP-Now"; diff --git a/main/texts.h b/main/texts.h index 20b316c..afa48d6 100644 --- a/main/texts.h +++ b/main/texts.h @@ -544,6 +544,7 @@ extern char TEXT_QRCODE_DEBUG[]; //GreenPassMenu extern char TEXT_GREENPASS[]; extern char TEXT_ADDCERT[]; +extern char TEXT_DELCERT[]; //EspNowMenu extern char TEXT_ESPNOW[];