ESPHome 2025.12.3
Loading...
Searching...
No Matches
color_mode.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
5
6namespace esphome::light {
7
9enum class ColorCapability : uint8_t {
11 ON_OFF = 1 << 0,
13 BRIGHTNESS = 1 << 1,
15 WHITE = 1 << 2,
17 COLOR_TEMPERATURE = 1 << 3,
19 COLD_WARM_WHITE = 1 << 4,
21 RGB = 1 << 5
22};
23
26 public:
28 constexpr operator ColorCapability() const { return val_; }
29 constexpr operator uint8_t() const { return static_cast<uint8_t>(val_); }
30 constexpr operator bool() const { return static_cast<uint8_t>(val_) != 0; }
31
32 protected:
34};
36 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
37}
39 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
40}
42 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
43}
45 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
46}
47
76
79 public:
81 constexpr operator ColorMode() const { return val_; }
82 constexpr operator uint8_t() const { return static_cast<uint8_t>(val_); }
83 constexpr operator bool() const { return static_cast<uint8_t>(val_) != 0; }
84
85 protected:
87};
89 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
90}
92 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
93}
95 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
96}
98 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
99}
101 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
102}
104 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
105}
106
107// Type alias for raw color mode bitmask values
108using color_mode_bitmask_t = uint16_t;
109
110// Lookup table for ColorMode bit mapping
111// This array defines the canonical order of color modes (bit 0-9)
113 ColorMode::UNKNOWN, // bit 0
114 ColorMode::ON_OFF, // bit 1
115 ColorMode::BRIGHTNESS, // bit 2
116 ColorMode::WHITE, // bit 3
119 ColorMode::RGB, // bit 6
120 ColorMode::RGB_WHITE, // bit 7
123};
124
128 using mask_t = uint16_t; // 10 bits requires uint16_t
129 static constexpr int MAX_BITS = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
130
131 static constexpr unsigned to_bit(ColorMode mode) {
132 // Linear search through lookup table
133 // Compiler optimizes this to efficient code since array is constexpr
134 for (int i = 0; i < MAX_BITS; ++i) {
135 if (COLOR_MODE_LOOKUP[i] == mode)
136 return i;
137 }
138 return 0;
139 }
140
141 static constexpr ColorMode from_bit(unsigned bit) {
142 return (bit < MAX_BITS) ? COLOR_MODE_LOOKUP[bit] : ColorMode::UNKNOWN;
143 }
144};
145
146// Type alias for ColorMode bitmask using policy-based design
148
149// Number of ColorCapability enum values
150constexpr int COLOR_CAPABILITY_COUNT = 6;
151
153constexpr uint16_t compute_capability_bitmask(ColorCapability capability) {
154 uint16_t mask = 0;
155 uint8_t cap_bit = static_cast<uint8_t>(capability);
156
157 // Check each ColorMode to see if it has this capability
158 constexpr int color_mode_count = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
159 for (int bit = 0; bit < color_mode_count; ++bit) {
160 uint8_t mode_val = static_cast<uint8_t>(COLOR_MODE_LOOKUP[bit]);
161 if ((mode_val & cap_bit) != 0) {
162 mask |= (1 << bit);
163 }
164 }
165 return mask;
166}
167
178
189inline int capability_to_index(ColorCapability capability) {
190 uint8_t cap_val = static_cast<uint8_t>(capability);
191#if defined(__GNUC__) || defined(__clang__)
192 // Use compiler intrinsic for efficient bit position lookup (O(1) vs O(log n))
193 return __builtin_ctz(cap_val);
194#else
195 // Fallback for compilers without __builtin_ctz
196 int index = 0;
197 while (cap_val > 1) {
198 cap_val >>= 1;
199 ++index;
200 }
201 return index;
202#endif
203}
204
207inline bool has_capability(const ColorModeMask &mask, ColorCapability capability) {
208 // Lookup the pre-computed bitmask for this capability and check intersection with our mask
209 return (mask.get_mask() & CAPABILITY_BITMASKS[capability_to_index(capability)]) != 0;
210}
211
212} // namespace esphome::light
BedjetMode mode
BedJet operating mode.
constexpr bitmask_t get_mask() const
Get the raw bitmask value for optimized operations.
Helper class to allow bitwise operations on ColorCapability.
Definition color_mode.h:25
constexpr ColorCapabilityHelper(ColorCapability val)
Definition color_mode.h:27
Helper class to allow bitwise operations on ColorMode with ColorCapability.
Definition color_mode.h:78
constexpr ColorModeHelper(ColorMode val)
Definition color_mode.h:80
mopeka_std_values val[4]
constexpr ColorMode COLOR_MODE_LOOKUP[]
Definition color_mode.h:112
constexpr ColorCapabilityHelper operator|(ColorCapability lhs, ColorCapability rhs)
Definition color_mode.h:41
bool has_capability(const ColorModeMask &mask, ColorCapability capability)
Check if any mode in the bitmask has a specific capability Used for checking if a light supports a ca...
Definition color_mode.h:207
constexpr uint16_t compute_capability_bitmask(ColorCapability capability)
Helper to compute capability bitmask at compile time.
Definition color_mode.h:153
uint16_t color_mode_bitmask_t
Definition color_mode.h:108
constexpr int COLOR_CAPABILITY_COUNT
Definition color_mode.h:150
constexpr ColorCapabilityHelper operator&(ColorCapability lhs, ColorCapability rhs)
Definition color_mode.h:35
ColorMode
Color modes are a combination of color capabilities that can be used at the same time.
Definition color_mode.h:49
@ ON_OFF
Only on/off control.
@ RGB_COLD_WARM_WHITE
RGB color output, and separate cold and warm white outputs.
@ BRIGHTNESS
Dimmable light.
@ UNKNOWN
No color mode configured (cannot be a supported mode, only active when light is off).
@ RGB_WHITE
RGB color output and a separate white output.
@ RGB_COLOR_TEMPERATURE
RGB color output and a separate white output with controllable color temperature.
@ RGB
RGB color output.
@ COLOR_TEMPERATURE
Controllable color temperature output.
@ WHITE
White output only (use only if the light also has another color mode such as RGB).
@ COLD_WARM_WHITE
Cold and warm white output with individually controllable brightness.
int capability_to_index(ColorCapability capability)
Helper function to convert a power-of-2 ColorCapability value to an array index for CAPABILITY_BITMAS...
Definition color_mode.h:189
ColorCapability
Color capabilities are the various outputs that a light has and that can be independently controlled ...
Definition color_mode.h:9
@ ON_OFF
Light can be turned on/off.
@ BRIGHTNESS
Master brightness of the light can be controlled.
@ RGB
Color can be controlled using RGB format (includes a brightness control for the color).
@ COLOR_TEMPERATURE
Color temperature can be controlled.
@ WHITE
Brightness of white channel can be controlled separately from other channels.
@ COLD_WARM_WHITE
Brightness of cold and warm white output can be controlled.
constexpr uint16_t CAPABILITY_BITMASKS[]
Compile-time lookup table mapping ColorCapability to bitmask This array is computed at compile time u...
Definition color_mode.h:170
Bit mapping policy for ColorMode Uses lookup table for non-contiguous enum values.
Definition color_mode.h:127
static constexpr ColorMode from_bit(unsigned bit)
Definition color_mode.h:141
static constexpr unsigned to_bit(ColorMode mode)
Definition color_mode.h:131
static constexpr int MAX_BITS
Definition color_mode.h:129