#pragma once #include "BoardConfig.h" // ═══════════════════════════════════════════════════════════════════ // Display driver abstraction // // TFT_eSPI path: zero-cost typedefs — compiles identically to before // Arduino_GFX path: adapter classes providing TFT_eSPI-compatible API // ═══════════════════════════════════════════════════════════════════ #if USE_TFT_ESPI // ───────────────────────────────────────────────────────────────── // TFT_eSPI — straight typedefs, zero overhead // ───────────────────────────────────────────────────────────────── #include using Gfx = TFT_eSPI; using GfxSprite = TFT_eSprite; #elif USE_ARDUINO_GFX // ───────────────────────────────────────────────────────────────── // Arduino_GFX — adapter wrapping Arduino_GFX with a // TFT_eSPI-compatible interface for Dashboard / DisplayManager // ───────────────────────────────────────────────────────────────── #include // Text datum constants (matching TFT_eSPI definitions) #ifndef MC_DATUM #define TL_DATUM 0 #define TC_DATUM 1 #define TR_DATUM 2 #define ML_DATUM 3 #define CL_DATUM 3 #define MC_DATUM 4 #define CC_DATUM 4 #define MR_DATUM 5 #define CR_DATUM 5 #define BL_DATUM 6 #define BC_DATUM 7 #define BR_DATUM 8 #endif class Gfx; // forward declaration for GfxSprite // ── Sprite adapter ────────────────────────────────────────────── class GfxSprite { public: explicit GfxSprite(Gfx* parent); void createSprite(int16_t w, int16_t h); void deleteSprite(); void fillSprite(uint16_t color); void fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint16_t color); void drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint16_t color); void setTextColor(uint16_t fg, uint16_t bg); void setTextFont(uint8_t font); void setTextSize(uint8_t size); void setTextDatum(uint8_t datum); void drawString(const char* str, int32_t x, int32_t y); void pushSprite(int32_t x, int32_t y); private: Gfx* _parent; int16_t _w = 0; int16_t _h = 0; int32_t _pushX = 0; int32_t _pushY = 0; uint8_t _textDatum = TL_DATUM; uint8_t _textSize = 1; uint16_t _textFg = 0xFFFF; uint16_t _textBg = 0x0000; }; // ── Display adapter ───────────────────────────────────────────── class Gfx { public: Gfx(); void init(); void setRotation(uint8_t r); // Drawing primitives void fillScreen(uint16_t color); void fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color); void fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint16_t color); void drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint16_t color); void drawFastVLine(int32_t x, int32_t y, int32_t h, uint16_t color); // Text (datum-based API matching TFT_eSPI) void setTextColor(uint16_t fg, uint16_t bg); void setTextFont(uint8_t font); void setTextSize(uint8_t size); void setTextDatum(uint8_t datum); void drawString(const char* str, int32_t x, int32_t y); int16_t textWidth(const char* str); void setCursor(int32_t x, int32_t y); void print(const char* str); // Escape hatch for direct Arduino_GFX access Arduino_GFX* raw() { return _gfx; } private: Arduino_GFX* _gfx = nullptr; uint8_t _textDatum = TL_DATUM; uint8_t _textSize = 1; uint16_t _textFg = 0xFFFF; uint16_t _textBg = 0x0000; }; #else #error "No display driver selected — check BoardConfig.h" #endif