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.
 
 

127 lines
3.4 KiB

#pragma once
#include "esphome/components/gpio/output/gpio_binary_output.h"
#include "esphome/components/ledc/ledc_output.h"
#include "esphome/core/component.h"
namespace esphome {
namespace xiaomi {
namespace bslamp2 {
static const std::string LIGHT_MODE_UNKNOWN{"unknown"};
static const std::string LIGHT_MODE_OFF{"off"};
static const std::string LIGHT_MODE_RGB{"rgb"};
static const std::string LIGHT_MODE_WHITE{"white"};
static const std::string LIGHT_MODE_NIGHT{"night"};
class GPIOOutputValues {
public:
float red = 0.0f;
float green = 0.0f;
float blue = 0.0f;
float white = 0.0f;
std::string light_mode = LIGHT_MODE_OFF;
/**
* Copies the current output values to another GPIOOutputValues object.
*/
void copy_to(GPIOOutputValues *other) {
other->red = red;
other->green = green;
other->blue = blue;
other->white = white;
other->light_mode = light_mode;
}
void log(const char *prefix) { ESP_LOGD(TAG, "%s: RGB=[%f,%f,%f], white=%f", prefix, red, green, blue, white); }
};
class LightHAL : public Component, public GPIOOutputValues {
public:
void set_red_pin(ledc::LEDCOutput *pin) { red_pin_ = pin; }
void set_green_pin(ledc::LEDCOutput *pin) { green_pin_ = pin; }
void set_blue_pin(ledc::LEDCOutput *pin) { blue_pin_ = pin; }
void set_white_pin(ledc::LEDCOutput *pin) { white_pin_ = pin; }
void set_master1_pin(gpio::GPIOBinaryOutput *pin) { master1_pin_ = pin; }
void set_master2_pin(gpio::GPIOBinaryOutput *pin) { master2_pin_ = pin; }
void add_on_light_mode_callback(std::function<void(std::string)> &&callback) {
light_mode_callback_.add(std::move(callback));
}
void add_on_state_callback(std::function<void(light::LightColorValues)> &&callback) {
state_callback_.add(std::move(callback));
}
/**
* Turn on the master switch for the LEDs.
*/
void turn_on() {
master1_pin_->turn_on();
master2_pin_->turn_on();
is_on_ = true;
}
/**
* Turn off the master switch for the LEDs.
*/
void turn_off() {
master1_pin_->turn_off();
master2_pin_->turn_off();
is_on_ = false;
}
/**
* Check if the light is turned on.
*/
bool is_on() {
return is_on_;
}
void set_state(GPIOOutputValues *new_state) {
new_state->copy_to(this);
red_pin_->set_level(this->red);
green_pin_->set_level(this->green);
blue_pin_->set_level(this->blue);
white_pin_->set_level(this->white);
}
void set_rgbw(float r, float g, float b, float w) {
red_pin_->set_level(r);
green_pin_->set_level(g);
blue_pin_->set_level(b);
white_pin_->set_level(w);
this->red = r;
this->green = g;
this->blue = b;
this->white = w;
}
void set_light_mode(std::string light_mode) {
this->light_mode = light_mode;
}
void do_light_mode_callback(std::string light_mode) {
light_mode_callback_.call(light_mode);
}
void do_state_callback(light::LightColorValues values) {
state_callback_.call(values);
}
protected:
bool is_on_{false};
ledc::LEDCOutput *red_pin_;
ledc::LEDCOutput *green_pin_;
ledc::LEDCOutput *blue_pin_;
ledc::LEDCOutput *white_pin_;
gpio::GPIOBinaryOutput *master1_pin_;
gpio::GPIOBinaryOutput *master2_pin_;
CallbackManager<void(std::string)> light_mode_callback_{};
CallbackManager<void(light::LightColorValues)> state_callback_{};
};
} // namespace bslamp2
} // namespace xiaomi
} // namespace esphome