You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

62 lines
1.8 KiB

#pragma once
#include "../common.h"
#include "../light_hal.h"
#include "color_handler_chain.h"
#include "esphome/components/light/light_transformer.h"
#include "esphome/components/light/light_color_values.h"
namespace esphome {
namespace xiaomi {
namespace bslamp2 {
/**
* A LightTransitionTransformer class for the Xiaomi Mijia Bedside Lamp 2.
*/
class XiaomiBslamp2LightTransitionTransformer : public light::LightTransitionTransformer {
public:
explicit XiaomiBslamp2LightTransitionTransformer(LightHAL *light) : light_(light) { }
bool is_finished() override {
return force_finish_ || get_progress_() >= 1.0f;
}
void start() override {
// Compute the GPIO outputs to use for the end point.
// This light transition transformer will then transition linearly between
// the current GPIO outputs and the target ones.
light_->copy_to(start_);
end_->set_light_color_values(target_values_);
}
optional<light::LightColorValues> apply() override {
if (end_->light_mode == "night") {
light_->set_state(end_);
force_finish_ = true;
}
else {
auto smoothed = light::LightTransitionTransformer::smoothed_progress(get_progress_());
light_->set_rgbw(
esphome::lerp(smoothed, start_->red, end_->red),
esphome::lerp(smoothed, start_->green, end_->green),
esphome::lerp(smoothed, start_->blue, end_->blue),
esphome::lerp(smoothed, start_->white, end_->white));
}
if (is_finished()) {
return target_values_;
} else {
return {};
}
}
protected:
LightHAL *light_;
bool force_finish_ = false;
GPIOOutputValues *start_ = new GPIOOutputValues();
ColorHandler *end_ = new ColorHandlerChain();
};
} // namespace bslamp2
} // namespace xiaomi
} // namespace esphome