Files
klubhaus-doorbell/DisplayDriver.h
2026-02-16 19:08:47 -08:00

118 lines
4.5 KiB
C++

#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 <TFT_eSPI.h>
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 <Arduino_GFX_Library.h>
// 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