diff --git a/lib/obp60task/OBP60Extensions.h b/lib/obp60task/OBP60Extensions.h index db86a46..f799788 100644 --- a/lib/obp60task/OBP60Extensions.h +++ b/lib/obp60task/OBP60Extensions.h @@ -105,8 +105,8 @@ public: cfg.pin_busy = -1; cfg.panel_width = 320; // Native width resolution cfg.panel_height = 480; // Native hight resolution - cfg.offset_x = 10; // Display output 400x300 pix to housing center adjusted - cfg.offset_y = -20; // Display output 400x300 pix to housing center adjusted + cfg.offset_x = 0; // No panel offset: full framebuffer mapping + cfg.offset_y = 0; // No panel offset: full framebuffer mapping cfg.offset_rotation = 3; // Rotate display content conter clock wise 90 deg cfg.dummy_read_pixel = 8; cfg.dummy_read_bits = 1; @@ -260,6 +260,20 @@ public: // E-Ink interface compatibility void setFullWindow() { /* no-op on TFT */ } + // Runtime panel offset control (ST7796) + void setPanelOffset(int16_t x, int16_t y) { + auto cfg = _panel_instance.config(); + cfg.offset_x = x; + cfg.offset_y = y; + _panel_instance.config(cfg); + } + + void getPanelOffset(int16_t &x, int16_t &y) { + auto cfg = _panel_instance.config(); + x = cfg.offset_x; + y = cfg.offset_y; + } + private: lgfx::GFXfont _adfFontBridge { nullptr, nullptr, 0, 0, 0 }; lgfx::GFXglyph* _adfGlyphBridge = nullptr; @@ -494,7 +508,7 @@ inline void displayFirstPage() { inline void displayNextPage() { #ifdef DISPLAY_ST7796 if (initDisplayShadowBuffer()) { - getdisplay().pushSprite(0, 0); + getdisplay().pushSprite((480 - GxEPD_WIDTH) / 2, (320 - GxEPD_HEIGHT) / 2); } #else getdisplay().nextPage(); diff --git a/lib/obp60task/OBP60Hardware.h b/lib/obp60task/OBP60Hardware.h index 5aec5ac..416c81c 100644 --- a/lib/obp60task/OBP60Hardware.h +++ b/lib/obp60task/OBP60Hardware.h @@ -41,6 +41,8 @@ #define OBP_SPI_BUSY 42 #define OBP_SPI_CLK 38 #define OBP_SPI_DIN 48 + #define OBP_TFT_OFFSET_X 10 // ST7796 operating x-offset for centered 400x300 content + #define OBP_TFT_OFFSET_Y -20 // ST7796 operating y-offset for centered 400x300 content #define SHOW_TIME 6000 // Show time in [ms] for logo and WiFi QR code #define FULL_REFRESH_TIME 600 // Refresh cycle time in [s][600...3600] for full display update (very important healcy function) #define GxEPD_WIDTH 400 // Display width diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 9758c87..b26afca 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -391,7 +391,9 @@ void OBP60Task(GwApi *api){ #ifdef DISPLAY_ST7796 getpaneldisplay().setRotation(0); // Set display orientation (horizontal) + getpaneldisplay().setPanelOffset(0, 0); // Use full native framebuffer coordinates getpaneldisplay().fillScreen(0x0000); // Initialize full TFT screen to black (native RGB565) + getpaneldisplay().setPanelOffset(OBP_TFT_OFFSET_X, OBP_TFT_OFFSET_Y); // Restore centered 400x300 operating offset #else getdisplay().setRotation(0); // Set display orientation (horizontal) #endif