From 4db0c4a563f55201628ad7dce64f7634d74f3eb6 Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Thu, 15 Oct 2020 15:12:27 +0800 Subject: [PATCH] Make screen code resolution agnostic. Look better on big TFT/eink screens --- src/graphics/EInkDisplay.cpp | 11 ++++++----- src/graphics/Screen.cpp | 23 ++++++++++++++++++----- src/graphics/TFTDisplay.cpp | 9 ++++----- src/graphics/configs.h | 2 -- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/graphics/EInkDisplay.cpp b/src/graphics/EInkDisplay.cpp index 7a6e02df0..a731b3ef3 100644 --- a/src/graphics/EInkDisplay.cpp +++ b/src/graphics/EInkDisplay.cpp @@ -46,8 +46,9 @@ void updateDisplay(uint8_t *blackFrame = framePtr) EInkDisplay::EInkDisplay(uint8_t address, int sda, int scl) { - setGeometry(GEOMETRY_128_64); // FIXME - currently we lie and claim 128x64 because I'm not yet sure other resolutions will - // work ie GEOMETRY_RAWMODE + setGeometry(GEOMETRY_RAWMODE, EPD_WIDTH, EPD_HEIGHT); + // setGeometry(GEOMETRY_RAWMODE, 128, 64); // old resolution + // setGeometry(GEOMETRY_128_64); // We originally used this because I wasn't sure if rawmode worked - it does } // FIXME quick hack to limit drawing to a very slow rate @@ -67,11 +68,11 @@ void EInkDisplay::display(void) // FIXME - only draw bits have changed (use backbuf similar to the other displays) // tft.drawBitmap(0, 0, buffer, 128, 64, TFT_YELLOW, TFT_BLACK); - for (uint8_t y = 0; y < SCREEN_HEIGHT; y++) { - for (uint8_t x = 0; x < SCREEN_WIDTH; x++) { + for (uint8_t y = 0; y < displayHeight; y++) { + for (uint8_t x = 0; x < displayWidth; x++) { // get src pixel in the page based ordering the OLED lib uses FIXME, super inefficent - auto b = buffer[x + (y / 8) * SCREEN_WIDTH]; + auto b = buffer[x + (y / 8) * displayWidth]; auto isset = b & (1 << (y & 7)); frame.drawPixel(x, y, isset ? INK : PAPER); } diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 9e35b4f12..cba5648c2 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -58,6 +58,15 @@ static char ourId[5]; static bool heartbeat = false; #endif +// We used to use constants for this - now we pull from the device at startup +//#define SCREEN_WIDTH 128 +//#define SCREEN_HEIGHT 64 + +static uint16_t displayWidth, displayHeight; + +#define SCREEN_WIDTH displayWidth +#define SCREEN_HEIGHT displayHeight + static void drawBootScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // draw an xbm image. @@ -236,7 +245,7 @@ static void drawGPS(OLEDDisplay *display, int16_t x, int16_t y, const GPSStatus display->drawFastImage(x + 24, y, 8, 8, imgSatellite); // Draw the number of satellites - sprintf(satsString, "%d", gps->getNumSatellites()); + sprintf(satsString, "%lu", gps->getNumSatellites()); display->drawString(x + 34, y - 2, satsString); } } @@ -489,11 +498,11 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_ uint32_t agoSecs = sinceLastSeen(node); static char lastStr[20]; if (agoSecs < 120) // last 2 mins? - snprintf(lastStr, sizeof(lastStr), "%u seconds ago", agoSecs); + snprintf(lastStr, sizeof(lastStr), "%lu seconds ago", agoSecs); else if (agoSecs < 120 * 60) // last 2 hrs - snprintf(lastStr, sizeof(lastStr), "%u minutes ago", agoSecs / 60); + snprintf(lastStr, sizeof(lastStr), "%lu minutes ago", agoSecs / 60); else - snprintf(lastStr, sizeof(lastStr), "%u hours ago", agoSecs / 60 / 60); + snprintf(lastStr, sizeof(lastStr), "%lu hours ago", agoSecs / 60 / 60); static char distStr[20]; strcpy(distStr, "? km"); // might not have location data @@ -596,6 +605,10 @@ void Screen::setup() // Initialising the UI will init the display too. ui.init(); + + displayWidth = dispdev.width(); + displayHeight = dispdev.height(); + ui.setTimePerTransition(300); // msecs ui.setIndicatorPosition(BOTTOM); // Defines where the first frame is located in the bar. @@ -794,7 +807,7 @@ void Screen::handleStartBluetoothPinScreen(uint32_t pin) static FrameCallback btFrames[] = {drawFrameBluetooth}; - snprintf(btPIN, sizeof(btPIN), "%06u", pin); + snprintf(btPIN, sizeof(btPIN), "%06lu", pin); ui.disableAllIndicators(); ui.setFrames(btFrames, 1); diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index b9484b9d6..f12582914 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -11,8 +11,7 @@ static TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup. TFTDisplay::TFTDisplay(uint8_t address, int sda, int scl) { - setGeometry(GEOMETRY_128_64); // FIXME - currently we lie and claim 128x64 because I'm not yet sure other resolutions will - // work ie GEOMETRY_RAWMODE + setGeometry(GEOMETRY_RAWMODE, 160, 80); } // Write the buffer to the display memory @@ -22,11 +21,11 @@ void TFTDisplay::display(void) // FIXME - only draw bits have changed (use backbuf similar to the other displays) // tft.drawBitmap(0, 0, buffer, 128, 64, TFT_YELLOW, TFT_BLACK); - for (uint8_t y = 0; y < SCREEN_HEIGHT; y++) { - for (uint8_t x = 0; x < SCREEN_WIDTH; x++) { + for (uint8_t y = 0; y < displayHeight; y++) { + for (uint8_t x = 0; x < displayWidth; x++) { // get src pixel in the page based ordering the OLED lib uses FIXME, super inefficent - auto b = buffer[x + (y / 8) * SCREEN_WIDTH]; + auto b = buffer[x + (y / 8) * displayWidth]; auto isset = b & (1 << (y & 7)); tft.drawPixel(x, y, isset ? TFT_WHITE : TFT_BLACK); } diff --git a/src/graphics/configs.h b/src/graphics/configs.h index c7698f898..78b25e21b 100644 --- a/src/graphics/configs.h +++ b/src/graphics/configs.h @@ -5,8 +5,6 @@ #define FONT_HEIGHT 14 // actually 13 for "Arial 10" but want a little extra space #define FONT_HEIGHT_16 (ArialMT_Plain_16[1] + 1) // This means the *visible* area (sh1106 can address 132, but shows 128 for example) -#define SCREEN_WIDTH 128 -#define SCREEN_HEIGHT 64 #define TRANSITION_FRAMERATE 30 // fps #define IDLE_FRAMERATE 1 // in fps #define COMPASS_DIAM 44