@ -2,8 +2,9 @@
# include "../common.h"
# include "../common.h"
# include "../light_hal.h"
# include "../light_hal.h"
# include "color_instant_handler.h"
# include "color_transition_handler.h"
# include "color_handler_chain.h"
# include "light_transformer.h"
# include "esphome/core/component.h"
# include "esphome/components/ledc/ledc_output.h"
# include "esphome/components/ledc/ledc_output.h"
namespace esphome {
namespace esphome {
@ -28,20 +29,16 @@ class XiaomiBslamp2LightOutput : public Component, public light::LightOutput {
*/
*/
light : : LightTraits get_traits ( ) override {
light : : LightTraits get_traits ( ) override {
auto traits = light : : LightTraits ( ) ;
auto traits = light : : LightTraits ( ) ;
# ifdef HAS_COLOR_MODES
traits . set_supported_color_modes ( { light : : ColorMode : : RGB , light : : ColorMode : : COLOR_TEMPERATURE } ) ;
traits . set_supported_color_modes ( { light : : ColorMode : : RGB , light : : ColorMode : : COLOR_TEMPERATURE } ) ;
# else
traits . set_supports_rgb ( true ) ;
traits . set_supports_color_temperature ( true ) ;
traits . set_supports_brightness ( true ) ;
traits . set_supports_rgb_white_value ( false ) ;
traits . set_supports_color_interlock ( true ) ;
# endif
traits . set_min_mireds ( MIRED_MIN ) ;
traits . set_min_mireds ( MIRED_MIN ) ;
traits . set_max_mireds ( MIRED_MAX ) ;
traits . set_max_mireds ( MIRED_MAX ) ;
return traits ;
return traits ;
}
}
std : : unique_ptr < light : : LightTransformer > create_default_transition ( ) override {
return make_unique < XiaomiBslamp2LightTransitionTransformer > ( light_ ) ;
}
void add_on_light_mode_callback ( std : : function < void ( std : : string ) > & & callback ) {
void add_on_light_mode_callback ( std : : function < void ( std : : string ) > & & callback ) {
light_mode_callback_ . add ( std : : move ( callback ) ) ;
light_mode_callback_ . add ( std : : move ( callback ) ) ;
}
}
@ -56,21 +53,9 @@ class XiaomiBslamp2LightOutput : public Component, public light::LightOutput {
void write_state ( light : : LightState * state ) {
void write_state ( light : : LightState * state ) {
auto values = state - > current_values ;
auto values = state - > current_values ;
/ / The color must either be set instantly , or the color is
/ / transitioning to an end color . The transition handler will do its
/ / own inspection to see if a transition is currently active or not .
/ / Based on the outcome , use either the instant or transition handler .
GPIOOutputs * delegate ;
if ( transition_handler_ - > set_light_color_values ( values ) ) {
delegate = transition_handler_ ;
light_mode_callback_ . call ( delegate - > light_mode ) ;
state_callback_ . call ( transition_handler_ - > get_end_values ( ) ) ;
} else {
instant_handler_ - > set_light_color_values ( values ) ;
delegate = instant_handler_ ;
light_mode_callback_ . call ( delegate - > light_mode ) ;
state_callback_ . call ( values ) ;
}
color_handler_chain - > set_light_color_values ( values ) ;
light_mode_callback_ . call ( color_handler_chain - > light_mode ) ;
state_callback_ . call ( values ) ;
/ / Note : one might think that it is more logical to turn on the LED
/ / Note : one might think that it is more logical to turn on the LED
/ / circuitry master switch after setting the individual channels ,
/ / circuitry master switch after setting the individual channels ,
@ -80,8 +65,8 @@ class XiaomiBslamp2LightOutput : public Component, public light::LightOutput {
if ( values . get_state ( ) ! = 0 )
if ( values . get_state ( ) ! = 0 )
light_ - > turn_on ( ) ;
light_ - > turn_on ( ) ;
/ / Apply the current GPIO output levels from the selected handler .
light_ - > set_rgbw ( delegate - > red , delegate - > green , delegate - > blue , delegate - > white ) ;
/ / Apply the GPIO output levels as defined by the color handler .
light_ - > set_state ( color_handler_chain ) ;
if ( values . get_state ( ) = = 0 )
if ( values . get_state ( ) = = 0 )
light_ - > turn_off ( ) ;
light_ - > turn_off ( ) ;
@ -89,21 +74,9 @@ class XiaomiBslamp2LightOutput : public Component, public light::LightOutput {
protected :
protected :
LightHAL * light_ ;
LightHAL * light_ ;
ColorTransitionHandler * transition_handler_ ;
ColorInstantHandler * instant_handler_ = new ColorInstantHandler ( ) ;
ColorHandler * color_handler_chain = new ColorHandlerChain ( ) ;
CallbackManager < void ( std : : string ) > light_mode_callback_ { } ;
CallbackManager < void ( std : : string ) > light_mode_callback_ { } ;
CallbackManager < void ( light : : LightColorValues ) > state_callback_ { } ;
CallbackManager < void ( light : : LightColorValues ) > state_callback_ { } ;
friend class XiaomiBslamp2LightState ;
/**
* Called by the XiaomiBslamp2LightState class , to set the object that can be
* used to access the protected LightTransformer data from the LightState
* object .
*/
void set_transformer_inspector ( LightStateTransformerInspector * exposer ) {
transition_handler_ = new ColorTransitionHandler ( exposer ) ;
}
} ;
} ;
} / / namespace bslamp2
} / / namespace bslamp2