#pragma once #include #include // Forward declarations class FsFile; class CrossPointSettings { private: // Private constructor for singleton CrossPointSettings() = default; // Static instance static CrossPointSettings instance; public: // Delete copy constructor and assignment CrossPointSettings(const CrossPointSettings&) = delete; CrossPointSettings& operator=(const CrossPointSettings&) = delete; enum SLEEP_SCREEN_MODE { DARK = 0, LIGHT = 1, CUSTOM = 2, COVER = 3, BLANK = 4, COVER_CUSTOM = 5, SLEEP_SCREEN_MODE_COUNT }; enum SLEEP_SCREEN_COVER_MODE { FIT = 0, CROP = 1, SLEEP_SCREEN_COVER_MODE_COUNT }; enum SLEEP_SCREEN_COVER_FILTER { NO_FILTER = 0, BLACK_AND_WHITE = 1, INVERTED_BLACK_AND_WHITE = 2, SLEEP_SCREEN_COVER_FILTER_COUNT }; enum SLEEP_SCREEN_LETTERBOX_FILL { LETTERBOX_DITHERED = 0, LETTERBOX_SOLID = 1, LETTERBOX_NONE = 2, SLEEP_SCREEN_LETTERBOX_FILL_COUNT }; // Status bar display type enum enum STATUS_BAR_MODE { NONE = 0, NO_PROGRESS = 1, FULL = 2, BOOK_PROGRESS_BAR = 3, ONLY_BOOK_PROGRESS_BAR = 4, CHAPTER_PROGRESS_BAR = 5, STATUS_BAR_MODE_COUNT }; enum INDEXING_DISPLAY { INDEXING_POPUP = 0, INDEXING_STATUS_TEXT = 1, INDEXING_STATUS_ICON = 2, INDEXING_DISPLAY_COUNT }; enum ORIENTATION { PORTRAIT = 0, // 480x800 logical coordinates (current default) LANDSCAPE_CW = 1, // 800x480 logical coordinates, rotated 180° (swap top/bottom) INVERTED = 2, // 480x800 logical coordinates, inverted LANDSCAPE_CCW = 3, // 800x480 logical coordinates, native panel orientation ORIENTATION_COUNT }; // Front button layout options (legacy) // Default: Back, Confirm, Left, Right // Swapped: Left, Right, Back, Confirm enum FRONT_BUTTON_LAYOUT { BACK_CONFIRM_LEFT_RIGHT = 0, LEFT_RIGHT_BACK_CONFIRM = 1, LEFT_BACK_CONFIRM_RIGHT = 2, BACK_CONFIRM_RIGHT_LEFT = 3, FRONT_BUTTON_LAYOUT_COUNT }; // Front button hardware identifiers (for remapping) enum FRONT_BUTTON_HARDWARE { FRONT_HW_BACK = 0, FRONT_HW_CONFIRM = 1, FRONT_HW_LEFT = 2, FRONT_HW_RIGHT = 3, FRONT_BUTTON_HARDWARE_COUNT }; // Side button layout options // Default: Previous, Next // Swapped: Next, Previous enum SIDE_BUTTON_LAYOUT { PREV_NEXT = 0, NEXT_PREV = 1, SIDE_BUTTON_LAYOUT_COUNT }; // Font family options enum FONT_FAMILY { BOOKERLY = 0, NOTOSANS = 1, OPENDYSLEXIC = 2, FONT_FAMILY_COUNT }; // Font size options enum FONT_SIZE { SMALL = 0, MEDIUM = 1, LARGE = 2, EXTRA_LARGE = 3, FONT_SIZE_COUNT }; enum LINE_COMPRESSION { TIGHT = 0, NORMAL = 1, WIDE = 2, LINE_COMPRESSION_COUNT }; enum PARAGRAPH_ALIGNMENT { JUSTIFIED = 0, LEFT_ALIGN = 1, CENTER_ALIGN = 2, RIGHT_ALIGN = 3, BOOK_STYLE = 4, PARAGRAPH_ALIGNMENT_COUNT }; // Auto-sleep timeout options (in minutes) enum SLEEP_TIMEOUT { SLEEP_1_MIN = 0, SLEEP_5_MIN = 1, SLEEP_10_MIN = 2, SLEEP_15_MIN = 3, SLEEP_30_MIN = 4, SLEEP_TIMEOUT_COUNT }; // E-ink refresh frequency (pages between full refreshes) enum REFRESH_FREQUENCY { REFRESH_1 = 0, REFRESH_5 = 1, REFRESH_10 = 2, REFRESH_15 = 3, REFRESH_30 = 4, REFRESH_FREQUENCY_COUNT }; // Short power button press actions enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, SHORT_PWRBTN_COUNT }; // Hide battery percentage enum HIDE_BATTERY_PERCENTAGE { HIDE_NEVER = 0, HIDE_READER = 1, HIDE_ALWAYS = 2, HIDE_BATTERY_PERCENTAGE_COUNT }; // UI Theme enum UI_THEME { CLASSIC = 0, LYRA = 1 }; // Home screen clock format enum CLOCK_FORMAT { CLOCK_OFF = 0, CLOCK_AMPM = 1, CLOCK_24H = 2, CLOCK_FORMAT_COUNT }; // Clock size enum CLOCK_SIZE { CLOCK_SIZE_SMALL = 0, CLOCK_SIZE_MEDIUM = 1, CLOCK_SIZE_LARGE = 2, CLOCK_SIZE_COUNT }; // Timezone presets enum TIMEZONE { TZ_UTC = 0, TZ_EASTERN = 1, TZ_CENTRAL = 2, TZ_MOUNTAIN = 3, TZ_PACIFIC = 4, TZ_ALASKA = 5, TZ_HAWAII = 6, TZ_CUSTOM = 7, TZ_COUNT }; // Sleep screen settings uint8_t sleepScreen = DARK; // Sleep screen cover mode settings uint8_t sleepScreenCoverMode = FIT; // Sleep screen cover filter uint8_t sleepScreenCoverFilter = NO_FILTER; // Sleep screen letterbox fill mode (Dithered / Solid / None) uint8_t sleepScreenLetterboxFill = LETTERBOX_DITHERED; // Status bar settings uint8_t statusBar = FULL; // Indexing feedback display mode (popup, status bar text, status bar icon) uint8_t indexingDisplay = INDEXING_POPUP; // Text rendering settings uint8_t extraParagraphSpacing = 1; uint8_t textAntiAliasing = 1; // Short power button click behaviour uint8_t shortPwrBtn = IGNORE; // EPUB reading orientation settings // 0 = portrait (default), 1 = landscape clockwise, 2 = inverted, 3 = landscape counter-clockwise uint8_t orientation = PORTRAIT; // Button layouts (front layout retained for migration only) uint8_t frontButtonLayout = BACK_CONFIRM_LEFT_RIGHT; uint8_t sideButtonLayout = PREV_NEXT; // Front button remap (logical -> hardware) // Used by MappedInputManager to translate logical buttons into physical front buttons. uint8_t frontButtonBack = FRONT_HW_BACK; uint8_t frontButtonConfirm = FRONT_HW_CONFIRM; uint8_t frontButtonLeft = FRONT_HW_LEFT; uint8_t frontButtonRight = FRONT_HW_RIGHT; // Reader font settings uint8_t fontFamily = BOOKERLY; uint8_t fontSize = MEDIUM; uint8_t lineSpacing = NORMAL; uint8_t paragraphAlignment = JUSTIFIED; // Auto-sleep timeout setting (default 10 minutes) uint8_t sleepTimeout = SLEEP_10_MIN; // E-ink refresh frequency (default 15 pages) uint8_t refreshFrequency = REFRESH_15; uint8_t hyphenationEnabled = 0; // Reader screen margin settings uint8_t screenMargin = 5; // OPDS browser settings char opdsServerUrl[128] = ""; char opdsUsername[64] = ""; char opdsPassword[64] = ""; // Hide battery percentage uint8_t hideBatteryPercentage = HIDE_NEVER; // Long-press chapter skip on side buttons uint8_t longPressChapterSkip = 1; // UI Theme uint8_t uiTheme = LYRA; // Sunlight fading compensation uint8_t fadingFix = 0; // Use book's embedded CSS styles for EPUB rendering (1 = enabled, 0 = disabled) uint8_t embeddedStyle = 1; // Preferred orientations for the portrait/landscape toggle in the reader menu. // preferredPortrait: PORTRAIT (0) or INVERTED (2) // preferredLandscape: LANDSCAPE_CW (1) or LANDSCAPE_CCW (3) uint8_t preferredPortrait = PORTRAIT; uint8_t preferredLandscape = LANDSCAPE_CW; // Clock display format (OFF by default) uint8_t clockFormat = CLOCK_OFF; // Clock display size uint8_t clockSize = CLOCK_SIZE_SMALL; // Timezone setting uint8_t timezone = TZ_UTC; // Custom timezone offset in hours from UTC (-12 to +14) int8_t timezoneOffsetHours = 0; ~CrossPointSettings() = default; // Get singleton instance static CrossPointSettings& getInstance() { return instance; } uint16_t getPowerButtonDuration() const { return (shortPwrBtn == CrossPointSettings::SHORT_PWRBTN::SLEEP) ? 10 : 400; } int getReaderFontId() const; // If count_only is true, returns the number of settings items that would be written. uint8_t writeSettings(FsFile& file, bool count_only = false) const; bool saveToFile() const; bool loadFromFile(); float getReaderLineCompression() const; unsigned long getSleepTimeoutMs() const; int getRefreshFrequency() const; const char* getTimezonePosixStr() const; }; // Helper macro to access settings #define SETTINGS CrossPointSettings::getInstance()