Check if a driver supports a specific display mode at compile-time.
Check if a driver supports a specific display mode at compile-time.Uses driver_traits specialization to determine mode compatibility.
Support Logic:
- BlackWhite: Always supported (baseline mode for all e-paper)
- Grayscale4: Requires
driver_traits<Driver>::supports_grayscale == true
- BWR/BWY/Spectra6: Requires exact match with
driver_traits<Driver>::max_mode
Why Exact Match for Color Modes? Color modes are hardware-specific and mutually exclusive:
- BWR (Red) ≠ BWY (Yellow) - different ink formulations
- Spectra6 ≠ BWR - incompatible command sets Using
<= comparison would falsely suggest BWR(2) < Spectra6(4) implies compatibility.
Rationale:
- Prevents runtime mode validation errors
- Enables compile-time specialization (e.g.,
if constexpr)
- Clear error messages at template instantiation
- Template Parameters
-
| Driver | Driver type to query (must satisfy DriverTraits) |
- Parameters
-
| mode | Display mode to check |
- Returns
- true if driver supports the mode, false otherwise
if constexpr (supports_display_mode<EPD27>(DisplayMode::BWR)) {
auto display = create_display<EPD27>(device, DisplayMode::BWR);
} else {
auto display = create_display<EPD27>(device, DisplayMode::BlackWhite);
}
static_assert(supports_display_mode<MyDriver>(DisplayMode::Grayscale4),
"This app requires grayscale support");
- See also
- driver_traits, DisplayMode, create_display()
#pragma once
#include <concepts>
#include <cstddef>
template <typename Driver> struct driver_traits;
template <typename T>
concept DriverTraits = requires {
requires std::convertible_to<
decltype(driver_traits<T>::max_mode),
DisplayMode>;
requires std::convertible_to<decltype(driver_traits<T>::supports_grayscale), bool>;
requires std::convertible_to<decltype(driver_traits<T>::supports_partial_refresh), bool>;
requires std::convertible_to<decltype(driver_traits<T>::supports_power_control), bool>;
requires std::convertible_to<decltype(driver_traits<T>::supports_wake_from_sleep), bool>;
requires std::convertible_to<decltype(driver_traits<T>::max_width), std::size_t>;
requires std::convertible_to<decltype(driver_traits<T>::max_height), std::size_t>;
};
template <typename Driver>
requires DriverTraits<Driver>
return true;
}
return driver_traits<Driver>::supports_grayscale;
}
return mode == driver_traits<Driver>::max_mode;
}
}
constexpr auto supports_display_mode(DisplayMode mode) noexcept -> bool
Definition capabilities.hpp:173
DisplayMode
Definition driver.hpp:46
@ BlackWhite
1-bit black and white (2 colors)
@ Grayscale4
2-bit 4-level grayscale