diff --git a/.gitmodules b/.gitmodules index c0aedd7..627b6bc 100644 --- a/.gitmodules +++ b/.gitmodules @@ -58,3 +58,6 @@ [submodule "components/espconfiglib"] path = components/espconfiglib url = ../../0xFEEDC0DE64/espconfiglib.git +[submodule "components/QRCode-esp32"] + path = components/QRCode-esp32 + url = git@github.com:bobbycar-graz/QRCode-esp32.git diff --git a/components/QRCode-esp32 b/components/QRCode-esp32 new file mode 160000 index 0000000..f06816a --- /dev/null +++ b/components/QRCode-esp32 @@ -0,0 +1 @@ +Subproject commit f06816a3627eb18a2b3ec7fc59b3e8d33fd9a3f5 diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 24a7120..1e37b56 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -20,6 +20,7 @@ set(headers actions/loadsettingsaction.h actions/modesettingsaction.h actions/multiaction.h + actions/qraction.h actions/rebootaction.h actions/savesettingsaction.h actions/switchprofileaction.h @@ -51,6 +52,7 @@ set(headers displays/bmsdisplay.h displays/calibratedisplay.h displays/calibratevoltagedisplay.h + displays/qrdisplay.h displays/dpad5wire2outdebugdisplay.h displays/dpad5wiredebugdisplay.h displays/dpad6wiredebugdisplay.h @@ -228,6 +230,7 @@ set(sources actions/loadsettingsaction.cpp actions/modesettingsaction.cpp actions/multiaction.cpp + actions/qraction.cpp actions/rebootaction.cpp actions/savesettingsaction.cpp actions/switchprofileaction.cpp @@ -259,6 +262,7 @@ set(sources displays/bmsdisplay.cpp displays/calibratedisplay.cpp displays/calibratevoltagedisplay.cpp + displays/qrdisplay.cpp displays/dpad5wire2outdebugdisplay.cpp displays/dpad5wiredebugdisplay.cpp displays/dpad6wiredebugdisplay.cpp @@ -417,7 +421,7 @@ set(sources set(dependencies libsodium freertos nvs_flash esp_http_server esp_https_ota mdns app_update esp_system esp_websocket_client driver - arduino-esp32 ArduinoJson esp-nimble-cpp FastLED-idf TFT_eSPI TFT_eSPI_QRcode + arduino-esp32 ArduinoJson esp-nimble-cpp FastLED-idf TFT_eSPI QRCode-esp32 bobbycar-protocol cpputils cxx-ring-buffer date espasynchttpreq espasyncota espchrono espcpputils espconfiglib esp-gui-lib esphttpdutils espwifistack expected fmt ) diff --git a/main/actions/qraction.cpp b/main/actions/qraction.cpp new file mode 100644 index 0000000..eebbeea --- /dev/null +++ b/main/actions/qraction.cpp @@ -0,0 +1,15 @@ +#include "qraction.h" + +#include +#include +#include +#include "displays/qrdisplay.h" + +using namespace espgui; + +SwitchQrDisplayAction::SwitchQrDisplayAction(qraction::QrMenu qrmenu) : m_msg{qrmenu.message}, m_ver{qrmenu.ver} {} + +void SwitchQrDisplayAction::triggered() +{ + switchScreen(m_msg, m_ver); +} diff --git a/main/actions/qraction.h b/main/actions/qraction.h new file mode 100644 index 0000000..ec28ef7 --- /dev/null +++ b/main/actions/qraction.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "actions/qraction.h" + +namespace qraction { +struct QrMenu { + std::string_view message; + uint8_t ver; +}; +} // namespace + +class SwitchQrDisplayAction : public virtual espgui::ActionInterface +{ +public: + SwitchQrDisplayAction(qraction::QrMenu qrmenu); + + void triggered() override; +private: + std::string_view m_msg; + uint8_t m_ver; +}; diff --git a/main/displays/menus/greenpassmenu.cpp b/main/displays/menus/greenpassmenu.cpp index df66874..304ec20 100644 --- a/main/displays/menus/greenpassmenu.cpp +++ b/main/displays/menus/greenpassmenu.cpp @@ -1,49 +1,21 @@ #include "greenpassmenu.h" -#include - // local includes #include "actions/switchscreenaction.h" +#include "actions/qraction.h" #include "displays/menus/mainmenu.h" +#include "displays/qrdisplay.h" #include "icons/back.h" using namespace espgui; -namespace greenpassmenu { -bool showingQRCode{false}; -} // namespace - -void GreenPassMenu::ShowCertAction::triggered() { - greenpassmenu::showingQRCode = true; - m_qrcode.init(); - m_qrcode.createScaleToFit(""); -} - GreenPassMenu::GreenPassMenu() { - constructMenuItem, ShowCertAction>>(); + constructMenuItem>>(qraction::QrMenu{.message="CORONA_PASS", .ver=15}); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } -void GreenPassMenu::initScreen() -{ - Base::initScreen(); - greenpassmenu::showingQRCode = false; -} - -void GreenPassMenu::rotate(int offset) -{ - if (greenpassmenu::showingQRCode) - GreenPassMenu::initScreen(); - Base::rotate(offset); -} - void GreenPassMenu::back() { - if (greenpassmenu::showingQRCode) - { - GreenPassMenu::initScreen(); - } - else - switchScreen(); + switchScreen(); } diff --git a/main/displays/menus/greenpassmenu.h b/main/displays/menus/greenpassmenu.h index a024dc3..76a262d 100644 --- a/main/displays/menus/greenpassmenu.h +++ b/main/displays/menus/greenpassmenu.h @@ -6,10 +6,6 @@ #include "menudisplay.h" #include "texts.h" -namespace greenpassmenu { -extern bool showingQRCode; -} // namespace - class GreenPassMenu : public espgui::MenuDisplay, public espgui::StaticText @@ -18,13 +14,4 @@ class GreenPassMenu : public: GreenPassMenu(); void back() override; - void rotate(int offset) override; - void initScreen() override; - - class ShowCertAction : public virtual espgui::ActionInterface { - public: - void triggered() override; - private: - qrcode::QRcode m_qrcode{}; - }; }; diff --git a/main/displays/qrcodedebug.cpp b/main/displays/qrcodedebug.cpp index f59a3fc..5aa2107 100644 --- a/main/displays/qrcodedebug.cpp +++ b/main/displays/qrcodedebug.cpp @@ -1,6 +1,7 @@ #include "qrcodedebug.h" #include +#include #include "displays/menus/debugmenu.h" #include "globals.h" @@ -20,17 +21,21 @@ void QrCodeDebugDisplay::back() void QrCodeDebugDisplay::initScreen() { Base::initScreen(); - m_qrcode.init(); } void QrCodeDebugDisplay::confirm() { - m_qrcode.createScaleToFit(fmt::format("WIFI:T:WPA;S:{};P:{};", deviceName, stringSettings.ap_password)); -} + uint8_t qrcodeBytes[qrcode_getBufferSize(7)]; + qrcode_initText(&m_qrcode, qrcodeBytes, 7, ECC_MEDIUM, fmt::format("WIFI:T:WPA;S:{};P:{};", deviceName, stringSettings.ap_password).c_str()); -void QrCodeDebugDisplay::rotate(int offset) -{ - m_mult += offset; - m_qrcode.setMultiply(m_mult); - m_qrcode.create("Hello World!"); + for (uint8_t y = 0; y < m_qrcode.size; y++) { + for (uint8_t x = 0; x < m_qrcode.size; x++) { + if (qrcode_getModule(&m_qrcode, x, y)) + { + tft.drawPixel(x+2,y+2, TFT_BLACK); + } else { + tft.drawPixel(x+2,y+2, TFT_WHITE); + } + } + } } diff --git a/main/displays/qrcodedebug.h b/main/displays/qrcodedebug.h index 84ff09e..7a6305d 100644 --- a/main/displays/qrcodedebug.h +++ b/main/displays/qrcodedebug.h @@ -10,12 +10,9 @@ class QrCodeDebugDisplay : using Base = espgui::Display; public: QrCodeDebugDisplay(); - // std::string text() const override; void initScreen() override; void confirm() override; void back() override; - void rotate(int offset) override; private: - qrcode::QRcode m_qrcode{}; - uint8_t m_mult{2}; + QRCode m_qrcode; }; diff --git a/main/displays/qrdisplay.cpp b/main/displays/qrdisplay.cpp new file mode 100644 index 0000000..2f75d99 --- /dev/null +++ b/main/displays/qrdisplay.cpp @@ -0,0 +1,46 @@ +#include "qrdisplay.h" + +// 3rd party libs +#include +#include + +// local includes +#include "displays/menus/greenpassmenu.h" + +using namespace espgui; + +QrDisplay::QrDisplay(std::string_view msg, uint8_t ver) : m_msg{msg}, m_ver{ver} {} + +void QrDisplay::initScreen() +{ + QRCode qrcode; + uint8_t qrcodeBytes[qrcode_getBufferSize(m_ver)]; + qrcode_initText(&qrcode, qrcodeBytes, m_ver, ECC_MEDIUM, m_msg.data()); + + const uint8_t multiplier = (tft.width() - 9) / qrcode.size; + const uint8_t x_offset = (tft.width() - qrcode.size * multiplier) / 2; + const uint8_t y_offset = (tft.height() - qrcode.size * multiplier) / 2; + + tft.fillScreen(TFT_WHITE); + + for (uint8_t y = 0; y < qrcode.size; y++) { + for (uint8_t x = 0; x < qrcode.size; x++) { + if (qrcode_getModule(&qrcode, x, y)) + { + tft.fillRect(x*multiplier+x_offset,y*multiplier+y_offset, multiplier, multiplier, TFT_BLACK); + } else { + tft.fillRect(x*multiplier+x_offset,y*multiplier+y_offset, multiplier, multiplier, TFT_WHITE); + } + } + } +} + +void QrDisplay::back() +{ + switchScreen(); +} + +void QrDisplay::confirm() +{ + switchScreen(); +} diff --git a/main/displays/qrdisplay.h b/main/displays/qrdisplay.h new file mode 100644 index 0000000..3ed9598 --- /dev/null +++ b/main/displays/qrdisplay.h @@ -0,0 +1,18 @@ +#pragma once + +// 3rd party includes +#include +#include + +class QrDisplay : + public espgui::Display +{ +public: + QrDisplay(std::string_view msg, uint8_t ver); + void initScreen() override; + void confirm() override; + void back() override; +private: + std::string_view m_msg; + uint8_t m_ver; +};