ESPHome 2025.12.0-dev
Loading...
Searching...
No Matches
color_mode.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
5
6namespace esphome {
7namespace 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)
114 ColorMode::UNKNOWN, // bit 0
115 ColorMode::ON_OFF, // bit 1
116 ColorMode::BRIGHTNESS, // bit 2
117 ColorMode::WHITE, // bit 3
120 ColorMode::RGB, // bit 6
121 ColorMode::RGB_WHITE, // bit 7
124};
125
129 using mask_t = uint16_t; // 10 bits requires uint16_t
130 static constexpr int MAX_BITS = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
131
132 static constexpr unsigned to_bit(ColorMode mode) {
133 // Linear search through lookup table
134 // Compiler optimizes this to efficient code since array is constexpr
135 for (int i = 0; i < MAX_BITS; ++i) {
136 if (COLOR_MODE_LOOKUP[i] == mode)
137 return i;
138 }
139 return 0;
140 }
141
142 static constexpr ColorMode from_bit(unsigned bit) {
143 return (bit < MAX_BITS) ? COLOR_MODE_LOOKUP[bit] : ColorMode::UNKNOWN;
144 }
145};
146
147// Type alias for ColorMode bitmask using policy-based design
149
150// Number of ColorCapability enum values
151constexpr int COLOR_CAPABILITY_COUNT = 6;
152
154constexpr uint16_t compute_capability_bitmask(ColorCapability capability) {
155 uint16_t mask = 0;
156 uint8_t cap_bit = static_cast<uint8_t>(capability);
157
158 // Check each ColorMode to see if it has this capability
159 constexpr int color_mode_count = sizeof(COLOR_MODE_LOOKUP) / sizeof(COLOR_MODE_LOOKUP[0]);
160 for (int bit = 0; bit < color_mode_count; ++bit) {
161 uint8_t mode_val = static_cast<uint8_t>(COLOR_MODE_LOOKUP[bit]);
162 if ((mode_val & cap_bit) != 0) {
163 mask |= (1 << bit);
164 }
165 }
166 return mask;
167}
168
179
190inline int capability_to_index(ColorCapability capability) {
191 uint8_t cap_val = static_cast<uint8_t>(capability);
192#if defined(__GNUC__) || defined(__clang__)
193 // Use compiler intrinsic for efficient bit position lookup (O(1) vs O(log n))
194 return __builtin_ctz(cap_val);
195#else
196 // Fallback for compilers without __builtin_ctz
197 int index = 0;
198 while (cap_val > 1) {
199 cap_val >>= 1;
200 ++index;
201 }
202 return index;
203#endif
204}
205
208inline bool has_capability(const ColorModeMask &mask, ColorCapability capability) {
209 // Lookup the pre-computed bitmask for this capability and check intersection with our mask
210 return (mask.get_mask() & CAPABILITY_BITMASKS[capability_to_index(capability)]) != 0;
211}
212
213} // namespace light
214} // namespace esphome
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[4]
constexpr ColorMode COLOR_MODE_LOOKUP[]
Definition color_mode.h:113
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:208
constexpr uint16_t compute_capability_bitmask(ColorCapability capability)
Helper to compute capability bitmask at compile time.
Definition color_mode.h:154
uint16_t color_mode_bitmask_t
Definition color_mode.h:109
constexpr int COLOR_CAPABILITY_COUNT
Definition color_mode.h:151
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:190
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:171
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
Bit mapping policy for ColorMode Uses lookup table for non-contiguous enum values.
Definition color_mode.h:128
static constexpr ColorMode from_bit(unsigned bit)
Definition color_mode.h:142
static constexpr unsigned to_bit(ColorMode mode)
Definition color_mode.h:132
static constexpr int MAX_BITS
Definition color_mode.h:130