Added nvs saving
This commit is contained in:
@ -4,6 +4,7 @@
|
||||
#include <string>
|
||||
#include <screenmanager.h>
|
||||
#include "displays/qrdisplay.h"
|
||||
#include "displays/qrimportdisplay.h"
|
||||
|
||||
using namespace espgui;
|
||||
|
||||
@ -13,3 +14,10 @@ void SwitchQrDisplayAction::triggered()
|
||||
{
|
||||
switchScreen<QrDisplay>(m_msg, m_ver);
|
||||
}
|
||||
|
||||
SwitchQrImportDisplayAction::SwitchQrImportDisplayAction(std::string nvskey) : m_nvskey{nvskey} {}
|
||||
|
||||
void SwitchQrImportDisplayAction::triggered()
|
||||
{
|
||||
switchScreen<QrImportDisplay>(m_nvskey);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -1,19 +1,69 @@
|
||||
#include "greenpassmenu.h"
|
||||
|
||||
// 3rd party includes
|
||||
#include <esp_err.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
// 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<QrDisplay>(m_qrmenu.message, m_qrmenu.ver); }
|
||||
private:
|
||||
qraction::QrMenu m_qrmenu;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
GreenPassMenu::GreenPassMenu()
|
||||
{
|
||||
constructMenuItem<makeComponentArgs<MenuItem, SwitchQrDisplayAction, StaticText<TEXT_SHOWCERT>>>(qraction::QrMenu{.message="CORONA_PASS", .ver=15});
|
||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ADDCERT>, SwitchScreenAction<QrImportDisplay>>>();
|
||||
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<CertMenuItem>(qraction::QrMenu{.message=*certTxt, .text=nvs_key , .ver=15});
|
||||
}
|
||||
else
|
||||
{
|
||||
auto &menuitem = constructMenuItem<ErrorMenuItem>();
|
||||
menuitem.setText(esp_err_to_name(certTxt.error()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
constructMenuItem<makeComponentArgs<MenuItem, SwitchQrImportDisplayAction, StaticText<TEXT_ADDCERT>>>(nvs_key);
|
||||
}
|
||||
}
|
||||
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
|
||||
}
|
||||
|
||||
|
@ -14,4 +14,6 @@ class GreenPassMenu :
|
||||
public:
|
||||
GreenPassMenu();
|
||||
void back() override;
|
||||
private:
|
||||
bool m_deleteMode;
|
||||
};
|
||||
|
@ -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<GreenPassMenu>();
|
||||
}
|
||||
}
|
||||
|
||||
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<GreenPassMenu>();
|
||||
}
|
||||
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<GreenPassMenu>();
|
||||
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<GreenPassMenu>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -71,6 +80,6 @@ void QrImportDisplay::redraw()
|
||||
}
|
||||
else
|
||||
{
|
||||
m_statuslabel.redraw(fmt::format("Request not running."));
|
||||
m_statuslabel.redraw("Request not running");
|
||||
}
|
||||
}
|
||||
|
@ -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<std::string, std::string> m_expected;
|
||||
std::string m_nvs_key;
|
||||
};
|
||||
|
@ -123,6 +123,7 @@ tl::expected<std::string, std::string> check_request()
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGI(TAG, "%.*s", http_request->buffer().size(), http_request->buffer().data());
|
||||
return http_request->takeBuffer();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -543,7 +543,6 @@ extern char TEXT_QRCODE_DEBUG[];
|
||||
|
||||
//GreenPassMenu
|
||||
extern char TEXT_GREENPASS[];
|
||||
extern char TEXT_SHOWCERT[];
|
||||
extern char TEXT_ADDCERT[];
|
||||
|
||||
//EspNowMenu
|
||||
|
Reference in New Issue
Block a user