From 03dbb8add68d8b361b434462d7deb9b84731aa76 Mon Sep 17 00:00:00 2001 From: Djuri Baars Date: Sat, 21 Dec 2024 00:50:57 +0100 Subject: [PATCH] Small improvements for epd --- src/lib/epd.cpp | 141 ++++++++++++++---------------------------------- 1 file changed, 40 insertions(+), 101 deletions(-) diff --git a/src/lib/epd.cpp b/src/lib/epd.cpp index 260f772..9b5bfd1 100644 --- a/src/lib/epd.cpp +++ b/src/lib/epd.cpp @@ -138,6 +138,9 @@ uint8_t qrcode[800]; #define EPD_TASK_STACK_SIZE 2048 #endif +#define BUSY_TIMEOUT_COUNT 200 +#define BUSY_RETRY_DELAY pdMS_TO_TICKS(10) + void forceFullRefresh() { for (uint i = 0; i < NUM_SCREENS; i++) @@ -417,89 +420,36 @@ void splitText(const uint dispNum, const String &top, const String &bottom, displays[dispNum].print(bottom); } -// void showChars(const uint dispNum, const String &chars, bool partial, -// const GFXfont *font) -// { -// displays[dispNum].setRotation(2); -// displays[dispNum].setFont(font); -// displays[dispNum].setTextColor(getFgColor()); -// int16_t tbx, tby; -// uint16_t tbw, tbh; +// Consolidate common display setup code into a helper function +void setupDisplay(const uint dispNum, const GFXfont *font) { + displays[dispNum].setRotation(2); + displays[dispNum].setFont(font); + displays[dispNum].setTextColor(getFgColor()); + displays[dispNum].fillScreen(getBgColor()); +} -// displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh); +void showDigit(const uint dispNum, char chr, bool partial, const GFXfont *font) { + String str(chr); + if (chr == '.') { + str = "!"; + } + + setupDisplay(dispNum, font); + + int16_t tbx, tby; + uint16_t tbw, tbh; + displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh); -// // center the bounding box by transposition of the origin: -// uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx; -// uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby; + uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx; + uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby; -// displays[dispNum].fillScreen(getBgColor()); + displays[dispNum].setCursor(x, y); + displays[dispNum].print(str); -// displays[dispNum].setCursor(x, y); -// displays[dispNum].print(chars); - -// // displays[dispNum].setCursor(10, 3); -// // displays[dispNum].setFont(&FONT_SMALL); -// // displays[dispNum].setTextColor(getFgColor()); -// // displays[dispNum].println("Y = " + y); -// } - -void showDigit(const uint dispNum, char chr, bool partial, - const GFXfont *font) -{ - String str(chr); - - if (chr == '.') - { - str = "!"; - } - displays[dispNum].setRotation(2); - displays[dispNum].setFont(font); - displays[dispNum].setTextColor(getFgColor()); - int16_t tbx, tby; - uint16_t tbw, tbh; - - displays[dispNum].getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh); - - // center the bounding box by transposition of the origin: - uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx; - uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby; - - // if (str.equals(".")) - // { - // // int16_t yAdvance = font->yAdvance; - // // uint8_t charIndex = 46 - font->first; - // // GFXglyph *glyph = (&font->glyph)[charIndex]; - // int16_t tbx2, tby2; - // uint16_t tbw2, tbh2; - // displays[dispNum].getTextBounds(".!", 0, 0, &tbx2, &tby2, &tbw2, &tbh2); - - // y = ((displays[dispNum].height() - tbh2) / 2) - tby2; - // // Serial.print("yAdvance"); - // // Serial.println(yAdvance); - // // if (glyph != nullptr) { - // // Serial.print("height"); - // // Serial.println(glyph->height); - // // Serial.print("yOffset"); - // // Serial.println(glyph->yOffset); - // // } - - // // y = 250-99+18+19; - // } - - displays[dispNum].fillScreen(getBgColor()); - - displays[dispNum].setCursor(x, y); - displays[dispNum].print(str); - - if (chr == '.') - { - displays[dispNum].fillRect(x, y, displays[dispNum].width(), round(displays[dispNum].height() * 0.9), getBgColor()); - } - - // displays[dispNum].setCursor(10, 3); - // displays[dispNum].setFont(&FONT_SMALL); - // displays[dispNum].setTextColor(getFgColor()); - // displays[dispNum].println("Y = " + y); + if (chr == '.') { + displays[dispNum].fillRect(x, y, displays[dispNum].width(), + round(displays[dispNum].height() * 0.9), getBgColor()); + } } int16_t calculateDescent(const GFXfont *font) { @@ -517,21 +467,16 @@ int16_t calculateDescent(const GFXfont *font) { void showChars(const uint dispNum, const String &chars, bool partial, const GFXfont *font) { - displays[dispNum].setRotation(2); - displays[dispNum].setFont(font); - displays[dispNum].setTextColor(getFgColor()); + setupDisplay(dispNum, font); + + int16_t tbx, tby; uint16_t tbw, tbh; displays[dispNum].getTextBounds(chars, 0, 0, &tbx, &tby, &tbw, &tbh); - int16_t descent = calculateDescent(font); - // center the bounding box by transposition of the origin: uint16_t x = ((displays[dispNum].width() - tbw) / 2) - tbx; uint16_t y = ((displays[dispNum].height() - tbh) / 2) - tby; - displays[dispNum].fillScreen(getBgColor()); - // displays[dispNum].setCursor(x, y); - // displays[dispNum].print(chars); for (int i = 0; i < chars.length(); i++) { char c = chars[i]; @@ -603,8 +548,8 @@ bool renderIcon(const uint dispNum, const String &text, bool partial) displays[dispNum].setPartialWindow(0, 0, displays[dispNum].width(), displays[dispNum].height()); - displays[dispNum].fillScreen(getBgColor()); - displays[dispNum].setTextColor(getFgColor()); + displays[dispNum].fillScreen(getBgColor()); + displays[dispNum].setTextColor(getFgColor()); uint iconIndex = 0; uint width = 122; @@ -649,9 +594,6 @@ bool renderIcon(const uint dispNum, const String &text, bool partial) } - - - void renderQr(const uint dispNum, const String &text, bool partial) { #ifdef USE_QR @@ -695,15 +637,12 @@ void waitUntilNoneBusy() while (EPD_BUSY[i].digitalRead()) { count++; - vTaskDelay(10); - if (count == 200) - { - // displays[i].init(0, false); - vTaskDelay(100); - } - else if (count > 205) - { - Serial.printf("Busy timeout %d", i); + vTaskDelay(BUSY_RETRY_DELAY); + + if (count == BUSY_TIMEOUT_COUNT) { + vTaskDelay(pdMS_TO_TICKS(100)); + } else if (count > BUSY_TIMEOUT_COUNT + 5) { + log_e("Display %d busy timeout", i); break; } }