ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
color_mode.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
5#include "esphome/core/hal.h"
6
7namespace esphome::light {
8
10enum class ColorCapability : uint8_t {
12 ON_OFF = 1 << 0,
14 BRIGHTNESS = 1 << 1,
16 WHITE = 1 << 2,
18 COLOR_TEMPERATURE = 1 << 3,
20 COLD_WARM_WHITE = 1 << 4,
22 RGB = 1 << 5
23};
24
27 public:
29 constexpr operator ColorCapability() const { return val_; }
30 constexpr operator uint8_t() const { return static_cast<uint8_t>(val_); }
31 constexpr operator bool() const { return static_cast<uint8_t>(val_) != 0; }
32
33 protected:
35};
37 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
38}
40 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
41}
43 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
44}
46 return static_cast<ColorCapability>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
47}
48
77
80 public:
82 constexpr operator ColorMode() const { return val_; }
83 constexpr operator uint8_t() const { return static_cast<uint8_t>(val_); }
84 constexpr operator bool() const { return static_cast<uint8_t>(val_) != 0; }
85
86 protected:
88};
90 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
91}
93 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
94}
96 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) & static_cast<uint8_t>(rhs));
97}
99 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
100}
102 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
103}
105 return static_cast<ColorMode>(static_cast<uint8_t>(lhs) | static_cast<uint8_t>(rhs));
106}
107
108// Type alias for raw color mode bitmask values
109using color_mode_bitmask_t = uint16_t;
110
111// Lookup table for ColorMode bit mapping
112// This array defines the canonical order of color modes (bit 0-9). One shared copy in flash; read it at run time
113// through color_mode_at().
114inline constexpr ColorMode COLOR_MODE_LOOKUP[] PROGMEM = {
115 ColorMode::UNKNOWN, // bit 0
116 ColorMode::ON_OFF, // bit 1
117 ColorMode::BRIGHTNESS, // bit 2
118 ColorMode::WHITE, // bit 3
121 ColorMode::RGB, // bit 6
122 ColorMode::RGB_WHITE, // bit 7
125};
126
127constexpr ColorMode color_mode_at(unsigned bit) {
128 if (__builtin_is_constant_evaluated())
129 return COLOR_MODE_LOOKUP[bit];
130 return static_cast<ColorMode>(progmem_read_byte(reinterpret_cast<const uint8_t *>(&COLOR_MODE_LOOKUP[bit])));
131}
132
136 using mask_t = uint16_t; // 10 bits requires uint16_t
137 static constexpr int MAX_BITS = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
138
139 static constexpr unsigned to_bit(ColorMode mode) {
140 for (int i = 0; i < MAX_BITS; ++i) {
141 if (color_mode_at(i) == mode)
142 return i;
143 }
144 return 0;
145 }
146
147 static constexpr ColorMode from_bit(unsigned bit) {
148 return (bit < MAX_BITS) ? color_mode_at(bit) : ColorMode::UNKNOWN;
149 }
150};
151
152// Type alias for ColorMode bitmask using policy-based design
154
155// Number of ColorCapability enum values
156constexpr int COLOR_CAPABILITY_COUNT = 6;
157
159constexpr uint16_t compute_capability_bitmask(ColorCapability capability) {
160 uint16_t mask = 0;
161 uint8_t cap_bit = static_cast<uint8_t>(capability);
162
163 // Check each ColorMode to see if it has this capability
164 constexpr int color_mode_count = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
165 for (int bit = 0; bit < color_mode_count; ++bit) {
166 uint8_t mode_val = static_cast<uint8_t>(color_mode_at(bit));
167 if ((mode_val & cap_bit) != 0) {
168 mask |= (1 << bit);
169 }
170 }
171 return mask;
172}
173
184
195inline int capability_to_index(ColorCapability capability) {
196 uint8_t cap_val = static_cast<uint8_t>(capability);
197#if defined(__GNUC__) || defined(__clang__)
198 // Use compiler intrinsic for efficient bit position lookup (O(1) vs O(log n))
199 return __builtin_ctz(cap_val);
200#else
201 // Fallback for compilers without __builtin_ctz
202 int index = 0;
203 while (cap_val > 1) {
204 cap_val >>= 1;
205 ++index;
206 }
207 return index;
208#endif
209}
210
213inline bool has_capability(const ColorModeMask &mask, ColorCapability capability) {
214 // Lookup the pre-computed bitmask for this capability and check intersection with our mask
215 return (mask.get_mask() & CAPABILITY_BITMASKS[capability_to_index(capability)]) != 0;
216}
217
218} // 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:26
constexpr ColorCapabilityHelper(ColorCapability val)
Definition color_mode.h:28
Helper class to allow bitwise operations on ColorMode with ColorCapability.
Definition color_mode.h:79
constexpr ColorModeHelper(ColorMode val)
Definition color_mode.h:81
mopeka_std_values val[3]
constexpr ColorCapabilityHelper operator|(ColorCapability lhs, ColorCapability rhs)
Definition color_mode.h:42
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:213
constexpr ColorMode COLOR_MODE_LOOKUP[] PROGMEM
Definition color_mode.h:114
constexpr uint16_t compute_capability_bitmask(ColorCapability capability)
Helper to compute capability bitmask at compile time.
Definition color_mode.h:159
uint16_t color_mode_bitmask_t
Definition color_mode.h:109
constexpr ColorMode color_mode_at(unsigned bit)
Definition color_mode.h:127
constexpr int COLOR_CAPABILITY_COUNT
Definition color_mode.h:156
constexpr ColorCapabilityHelper operator&(ColorCapability lhs, ColorCapability rhs)
Definition color_mode.h:36
ColorMode
Color modes are a combination of color capabilities that can be used at the same time.
Definition color_mode.h:50
@ 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:195
ColorCapability
Color capabilities are the various outputs that a light has and that can be independently controlled ...
Definition color_mode.h:10
@ 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:176
uint8_t progmem_read_byte(const uint8_t *addr)
Definition hal.h:51
Bit mapping policy for ColorMode Uses lookup table for non-contiguous enum values.
Definition color_mode.h:135
static constexpr ColorMode from_bit(unsigned bit)
Definition color_mode.h:147
static constexpr unsigned to_bit(ColorMode mode)
Definition color_mode.h:139
static constexpr int MAX_BITS
Definition color_mode.h:137