#pragma once #include // Grid layout constants #define DASH_COLS 3 #define DASH_ROWS 2 #define DASH_MARGIN 8 #define DASH_TOP_BAR 40 // Tile dimensions (calculated for 480x320) #define TILE_W ((480 - (DASH_COLS + 1) * DASH_MARGIN) / DASH_COLS) // ~148 #define TILE_H ((320 - DASH_TOP_BAR - (DASH_ROWS + 1) * DASH_MARGIN) / DASH_ROWS) // ~128 // Tile IDs enum TileID : uint8_t { TILE_LAST_ALERT = 0, TILE_STATS, TILE_NETWORK, TILE_MUTE, TILE_HISTORY, TILE_SYSTEM, TILE_COUNT }; struct TileData { const char* icon; // emoji/symbol character const char* label; // tile name char value[32]; // dynamic value text char sub[32]; // secondary line uint16_t bgColor; uint16_t fgColor; bool dirty; // needs redraw }; class Dashboard { public: Dashboard(TFT_eSPI& tft); void begin(); void drawAll(); void drawTopBar(const char* time, int rssi, bool wifiOk); void updateTile(TileID id, const char* value, const char* sub = nullptr); int handleTouch(int x, int y); // returns TileID or -1 private: TFT_eSPI& _tft; TFT_eSprite _sprite; TileData _tiles[TILE_COUNT]; void drawTile(TileID id); void tilePosition(TileID id, int& x, int& y); };