#pragma once // Build-time feature flags derived from board defines. Two flavours: // // FEAT_* preprocessor macros — for conditional compilation of struct // members, enum entries, and class fields where the preprocessor must // run. Use `#if FEAT_X` instead of `#ifdef EINK_DISPLAY_MODEL`; the // name documents *what* the flag toggles rather than *why* it's bound // to e-ink. // // Features::* constexpr values — for runtime-shape decisions (booleans, // timings, defaults). Compiler dead-branch-eliminates on the constexpr, // so cost is identical to a preprocessor branch but the code stays // reachable to tooling. #if defined(EINK_DISPLAY_MODEL) // E-ink build: slow refresh, rotatable panel, no per-second redraws #define FEAT_BRIGHTNESS_SETTING 0 #define FEAT_CLOCK_SECONDS_SETTING 0 #define FEAT_DISPLAY_ROTATION_SETTING 1 #define FEAT_JOYSTICK_ROTATION_SETTING 1 #define FEAT_FULL_REFRESH_SETTING 1 #else // OLED build: fast refresh, fixed orientation #define FEAT_BRIGHTNESS_SETTING 1 #define FEAT_CLOCK_SECONDS_SETTING 1 #define FEAT_DISPLAY_ROTATION_SETTING 0 #define FEAT_JOYSTICK_ROTATION_SETTING 0 #define FEAT_FULL_REFRESH_SETTING 0 #endif namespace Features { #if defined(EINK_DISPLAY_MODEL) static constexpr bool IS_EINK = true; static constexpr bool BLINK_INDICATORS = false; // e-ink avoids high-rate redraws static constexpr bool CLOCK_HIDE_SECONDS_DEFAULT = true; // pref starting value static constexpr unsigned HOME_REFRESH_MS = 30000; // slow display polls less static constexpr unsigned LOCKSCREEN_REFRESH_MS = 30000; #else static constexpr bool IS_EINK = false; static constexpr bool BLINK_INDICATORS = true; static constexpr bool CLOCK_HIDE_SECONDS_DEFAULT = false; static constexpr unsigned HOME_REFRESH_MS = 1000; static constexpr unsigned LOCKSCREEN_REFRESH_MS = 1000; #endif } // namespace Features