Fixed qr code

This commit is contained in:
CommanderRedYT
2021-12-18 02:17:30 +01:00
parent 55d9f432d7
commit 56b3e8cdd1
11 changed files with 130 additions and 58 deletions

3
.gitmodules vendored
View File

@ -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

View File

@ -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
)

15
main/actions/qraction.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "qraction.h"
#include <actioninterface.h>
#include <string>
#include <screenmanager.h>
#include "displays/qrdisplay.h"
using namespace espgui;
SwitchQrDisplayAction::SwitchQrDisplayAction(qraction::QrMenu qrmenu) : m_msg{qrmenu.message}, m_ver{qrmenu.ver} {}
void SwitchQrDisplayAction::triggered()
{
switchScreen<QrDisplay>(m_msg, m_ver);
}

24
main/actions/qraction.h Normal file
View File

@ -0,0 +1,24 @@
#pragma once
#include <actioninterface.h>
#include <string>
#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;
};

View File

@ -1,49 +1,21 @@
#include "greenpassmenu.h"
#include <actioninterface.h>
// 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<makeComponent<MenuItem, StaticText<TEXT_SHOWCERT>, ShowCertAction>>();
constructMenuItem<makeComponentArgs<MenuItem, SwitchQrDisplayAction, StaticText<TEXT_SHOWCERT>>>(qraction::QrMenu{.message="CORONA_PASS", .ver=15});
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, 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<MainMenu>();
switchScreen<MainMenu>();
}

View File

@ -6,10 +6,6 @@
#include "menudisplay.h"
#include "texts.h"
namespace greenpassmenu {
extern bool showingQRCode;
} // namespace
class GreenPassMenu :
public espgui::MenuDisplay,
public espgui::StaticText<TEXT_GREENPASS>
@ -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{};
};
};

View File

@ -1,6 +1,7 @@
#include "qrcodedebug.h"
#include <fmt/core.h>
#include <tftinstance.h>
#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);
}
}
}
}

View File

@ -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;
};

View File

@ -0,0 +1,46 @@
#include "qrdisplay.h"
// 3rd party libs
#include <tftinstance.h>
#include <screenmanager.h>
// 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<GreenPassMenu>();
}
void QrDisplay::confirm()
{
switchScreen<GreenPassMenu>();
}

18
main/displays/qrdisplay.h Normal file
View File

@ -0,0 +1,18 @@
#pragma once
// 3rd party includes
#include <display.h>
#include <qrcode.h>
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;
};