#pragma once #include class TFT_eSPI; class Board { public: bool begin(); bool beginSd(); void setReadingContext(const String& bookTitle, const String& chapterTitle, uint32_t wordCount, uint8_t progressPercent); void drawWord(const String& word, uint16_t wpm, uint8_t styleFlags = 0); void drawChapterTitle(const String& chapter, uint16_t wpm); void drawTheEnd(uint16_t wpm); void drawMenu(uint8_t selectedOption); void drawPicker(const String& title, const String& value); void drawFontStylePicker(uint8_t style, uint8_t size); void drawFontSizePicker(uint8_t style, uint8_t size); void setBrightness(uint8_t level); void setPreferredBrightness(uint8_t level); void setFont(uint8_t style, uint8_t size); void displayOff(); void displayOn(); private: struct DrawBounds { int16_t x = 0; int16_t y = 0; int16_t width = 0; int16_t height = 0; bool valid = false; }; int batteryPercent() const; void setLandscape(); void setReaderFont(uint8_t style, uint8_t size, uint8_t styleFlags = 0); void setUiFont(uint8_t style); void drawStatus(uint16_t wpm); void drawFooter(); String ellipsize(const String& text, int16_t maximumWidth) const; TFT_eSPI* display_ = nullptr; uint8_t brightness_ = 0; uint8_t preferredBrightness_ = 5; uint8_t fontStyle_ = 0; uint8_t fontSize_ = 20; bool landscape_ = false; bool powerMonitorAvailable_ = false; bool statusDrawn_ = false; bool footerDrawn_ = false; uint16_t displayedWpm_ = 0; uint8_t displayedProgressPercent_ = 255; uint32_t lastStatusUpdateMs_ = 0; String bookTitle_; String chapterTitle_; String displayedChapterTitle_; uint32_t wordCount_ = 0; uint32_t displayedWordCount_ = 0; uint8_t progressPercent_ = 0; DrawBounds previousWordBounds_; };