183 lines
5.4 KiB
C++
183 lines
5.4 KiB
C++
#include "epaperdisplay.h"
|
|
#include "qrcode.h"
|
|
|
|
// *** for Waveshare ESP32 Driver board *** //
|
|
#if defined(ESP32) && defined(USE_HSPI_FOR_EPD)
|
|
SPIClass hspi(HSPI);
|
|
#endif
|
|
// *** end Waveshare ESP32 Driver board *** //
|
|
|
|
EpaperDisplay::EpaperDisplay(uint8_t DSPLY_PIN_CS, uint8_t DSPLY_PIN_DC, uint8_t DSPLY_PIN_RST, uint8_t DSPLY_PIN_BUSY)
|
|
{
|
|
epDisplay = new GxEPD2_DISPLAY_CLASS(GxEPD2_DRIVER_CLASS(DSPLY_PIN_CS, DSPLY_PIN_DC, DSPLY_PIN_RST, DSPLY_PIN_BUSY));
|
|
}
|
|
|
|
EpaperDisplay::~EpaperDisplay()
|
|
{
|
|
}
|
|
|
|
void EpaperDisplay::sleep()
|
|
{
|
|
epDisplay->hibernate();
|
|
}
|
|
|
|
void EpaperDisplay::init()
|
|
{
|
|
epDisplay->init(115200, true, 2, false);
|
|
// *** for Waveshare ESP32 Driver board *** //
|
|
#if defined(ESP32) && defined(USE_HSPI_FOR_EPD)
|
|
hspi.begin(13, 12, 14, 15); // remap hspi for EPD (swap pins)
|
|
epDisplay>epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0));
|
|
#endif
|
|
|
|
epDisplay->setRotation(1);
|
|
|
|
}
|
|
|
|
|
|
void EpaperDisplay::cleanScreen()
|
|
{
|
|
epDisplay->firstPage();
|
|
do{
|
|
epDisplay->clearScreen();
|
|
}
|
|
while(epDisplay->nextPage());
|
|
epDisplay->hibernate();
|
|
}
|
|
|
|
|
|
uint16_t EpaperDisplay::xCenterText(const char* text)
|
|
{
|
|
int16_t xul, yul;
|
|
uint16_t textWidth, textHeight;
|
|
epDisplay->getTextBounds(text, 0, 0, &xul, &yul, &textWidth, &textHeight);
|
|
xul = (epDisplay->width() - textWidth)/2;
|
|
if(xul < 0 )
|
|
{
|
|
xul = 0;
|
|
}
|
|
return xul;
|
|
}
|
|
|
|
void EpaperDisplay::drawText(const char* text, uint16_t x, uint16_t y)
|
|
{
|
|
epDisplay->setCursor(x, y);
|
|
epDisplay->printf(text);
|
|
}
|
|
|
|
void EpaperDisplay::drawText(const char* text, uint8_t textSize, uint16_t x, uint16_t y, uint16_t fgColor, uint16_t bgColor )
|
|
{
|
|
epDisplay->setTextSize(textSize);
|
|
epDisplay->setTextColor(fgColor, bgColor);
|
|
drawText(text, x, y);
|
|
}
|
|
|
|
void EpaperDisplay::drawXCenteredText(const char* text, uint8_t textSize, uint16_t y, uint16_t fgColor, uint16_t bgColor )
|
|
{
|
|
epDisplay->setTextSize(textSize);
|
|
epDisplay->setTextColor(fgColor, bgColor);
|
|
drawText(text, xCenterText(text), y);
|
|
}
|
|
|
|
void EpaperDisplay::updateText(const char* text, uint16_t x, uint16_t y)
|
|
{
|
|
int16_t xul, yul;
|
|
uint16_t textWidth, textHeight;
|
|
epDisplay->getTextBounds(text, x, y, &xul, &yul, &textWidth, &textHeight);
|
|
epDisplay->setPartialWindow(xul, yul, textWidth, textHeight);
|
|
epDisplay->firstPage();
|
|
do
|
|
{
|
|
epDisplay->setCursor(x, y);
|
|
epDisplay->printf(text);
|
|
} while (epDisplay->nextPage());
|
|
}
|
|
|
|
void EpaperDisplay::updateText(const char* text, uint8_t textSize, uint16_t x, uint16_t y, uint16_t fgColor, uint16_t bgColor)
|
|
{
|
|
epDisplay->setTextSize(textSize);
|
|
epDisplay->setTextColor(fgColor, bgColor);
|
|
updateText(text, x, y);
|
|
}
|
|
|
|
|
|
void EpaperDisplay::homeScreen()
|
|
{
|
|
epDisplay->setFullWindow();
|
|
epDisplay->firstPage();
|
|
do
|
|
{
|
|
drawText("Insert Euro coins\n on the right ->\n to start ATM\n", 2, 11, 20, GxEPD_BLACK, GxEPD_WHITE);
|
|
epDisplay->drawBitmap(172, 65, bitcoin_logo, 64, 64, GxEPD_BLACK);
|
|
drawText("Prepare Lightning enabled Bitcoin\n wallet before starting!\n Supported coins: 1 - 50 Cent, 1 - 2 Euro\n", 1, 12, 140, GxEPD_BLACK, GxEPD_WHITE);
|
|
} while (epDisplay->nextPage());
|
|
epDisplay->hibernate();
|
|
}
|
|
|
|
void EpaperDisplay::showInsertedAmount(const char* amount_in_euro)
|
|
{
|
|
epDisplay->setFullWindow();
|
|
epDisplay->firstPage();
|
|
do
|
|
{
|
|
drawText("Inserted amount:\n", 2, 11, 10, GxEPD_BLACK, GxEPD_WHITE);
|
|
drawText(amount_in_euro, 3, 20, 75, GxEPD_BLACK, GxEPD_WHITE);
|
|
drawText("Press button\n once finished.\n", 2, 11, 135, GxEPD_BLACK, GxEPD_WHITE);
|
|
} while (epDisplay->nextPage());
|
|
}
|
|
|
|
void EpaperDisplay::updateInsertedAmount(const char* amount_in_euro)
|
|
{
|
|
updateText(amount_in_euro, 3, 20, 75, GxEPD_BLACK, GxEPD_WHITE);
|
|
}
|
|
|
|
void EpaperDisplay::qrCode(const char* content)
|
|
{
|
|
QRCode qrcoded;
|
|
uint8_t qrcodeData[qrcode_getBufferSize(QR_VERSION)]; // 20 is "qr version"
|
|
t_qrdata qr;
|
|
uint16_t color = GxEPD_BLACK;
|
|
|
|
qrcode_initText(&qrcoded, qrcodeData, QR_VERSION, 0, content);
|
|
qr.module_size = 3;
|
|
qr.qr_size = qrcoded.size * qr.module_size;
|
|
Serial.printf("Qrcode size: %d, qrcoded.size %d\n", qr.qr_size, qrcoded.size);
|
|
qr.start_x = (epDisplay->width() - qr.qr_size) / 2;
|
|
qr.start_y = (epDisplay->height() - qr.qr_size) / 2;
|
|
|
|
epDisplay->setFullWindow();
|
|
epDisplay->firstPage();
|
|
|
|
do
|
|
{
|
|
|
|
for (qr.current_y = 0; qr.current_y < qrcoded.size; qr.current_y++)
|
|
{
|
|
for (qr.current_x = 0; qr.current_x < qrcoded.size; qr.current_x++)
|
|
{
|
|
if (qrcode_getModule(&qrcoded, qr.current_x, qr.current_y))
|
|
{
|
|
color = GxEPD_BLACK;
|
|
}
|
|
else
|
|
{
|
|
color = GxEPD_WHITE;
|
|
}
|
|
|
|
epDisplay->fillRect(qr.start_x + (qr.module_size * qr.current_x),
|
|
qr.start_y + (qr.module_size * qr.current_y), qr.module_size, qr.module_size, color);
|
|
}
|
|
}
|
|
|
|
uint16_t radius_px = 5;
|
|
epDisplay->drawRoundRect(qr.start_x - radius_px , qr.start_y - radius_px, qr.qr_size+(2*radius_px), qr.qr_size+(2*radius_px), radius_px, GxEPD_BLACK);
|
|
|
|
drawXCenteredText("Please scan the QR code!\n", 2, 10, GxEPD_BLACK, GxEPD_WHITE );
|
|
drawXCenteredText("This will transfer the paid value to your wallet.\n", 1, 30, GxEPD_BLACK, GxEPD_WHITE );
|
|
drawXCenteredText("Reset - press button\n", 2, epDisplay->height() - 20, GxEPD_BLACK, GxEPD_WHITE );
|
|
|
|
/* code */
|
|
} while (epDisplay->nextPage());
|
|
epDisplay->hibernate();
|
|
}
|
|
|