libepaper 2.0.0
A C++23 library for controlling Waveshare e-paper displays on Raspberry Pi, featuring transparent sleep/wake management and a fluent builder API.
Loading...
Searching...
No Matches
/mnt/nas/libepaper/include/epaper/drivers/capabilities.hpp

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:

Why Exact Match for Color Modes? Color modes are hardware-specific and mutually exclusive:

Rationale:

Template Parameters
DriverDriver type to query (must satisfy DriverTraits)
Parameters
modeDisplay mode to check
Returns
true if driver supports the mode, false otherwise
// Compile-time mode validation
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 assertion for required mode
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>
namespace epaper {
template <typename Driver> struct driver_traits;
// Base template is empty/undefined to force specialization
// Or we can leave it undefined so it fails instantiation if not specialized.
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>
[[nodiscard]] constexpr auto supports_display_mode(DisplayMode mode) noexcept -> bool {
// Always support single-bit BW
if (mode == DisplayMode::BlackWhite) {
return true;
}
// Grayscale support is explicit
if (mode == DisplayMode::Grayscale4) {
return driver_traits<Driver>::supports_grayscale;
}
// For color modes (BWR, BWY, Spectra6), strict matching is required.
// Inequality (<=) is unsafe because modes like BWR(2) and BWY(3) are mutually exclusive,
// not hierarchical. A Spectra6(5) driver might not support legacy BWR(2) commands.
return mode == driver_traits<Driver>::max_mode;
}
} // namespace epaper
Definition color.hpp:5
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