2#ifdef USE_BINARY_SENSOR
18static const uint8_t BQ25186_CONFIG_MASKS[BQ25186_CONFIG_REGISTER_COUNT] PROGMEM = {
19 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xEF, 0xFF, 0xF0,
24 ESP_LOGW(TAG,
"Failed to write register 0x%02X",
reg);
33 ESP_LOGW(TAG,
"Failed to read register 0x%02X",
reg);
36 reg_value = (reg_value & ~mask) | (value & mask);
41 uint8_t value = this->
regs_[index];
42#ifdef USE_BQ25186_PG_GPO
44 value |= BQ25186_VBAT_CTRL_PG_MODE;
50 for (uint8_t
reg = BQ25186_REG_VBAT_CTRL;
reg <= BQ25186_REG_MASK_ID;
reg++) {
51 const size_t index =
reg - BQ25186_REG_VBAT_CTRL;
62 ESP_LOGW(TAG,
"Not applying configuration, setup has not succeeded");
67 for (
size_t i = 0; i < regs.size(); i++) {
68 const uint8_t
reg = BQ25186_REG_VBAT_CTRL + i;
83 if (!this->
read_byte(BQ25186_REG_MASK_ID, &mask_id)) {
89 const uint8_t device_id = mask_id & 0x0F;
90 if (device_id != 0x01) {
91 ESP_LOGE(TAG,
"Unexpected device id 0x%X (expected 0x1)", device_id);
100#ifdef USE_BQ25186_PG_GPO
104 if (initial.has_value())
112#ifdef USE_BQ25186_PG_GPO
117 if ((status[BQ25186_REG_VBAT_CTRL] & BQ25186_VBAT_CTRL_PG_MODE) == 0 &&
118 !this->
update_register_(BQ25186_REG_VBAT_CTRL, BQ25186_VBAT_CTRL_PG_MODE, BQ25186_VBAT_CTRL_PG_MODE)) {
122 const bool level = (
status[BQ25186_REG_SYS_REG] & BQ25186_SYS_REG_PG_GPO_LEVEL) != 0;
125 }
else if (level != this->
pg_gpo_switch_->
state && !this->write_pg_gpo_level(this->pg_gpo_switch_->state)) {
140 bool pending =
false;
144 ESP_LOGW(TAG,
"Configuration registers differ from the values applied, writing them again");
146 status[BQ25186_REG_VBAT_CTRL] |= BQ25186_VBAT_CTRL_PG_MODE;
151#ifdef USE_BQ25186_PG_GPO
156#ifdef BQ25186_BINARY_SENSOR_COUNT
158 sensor->on_status(
status);
160#ifdef BQ25186_TEXT_SENSOR_COUNT
162 sensor->on_status(
status);
167 ESP_LOGCONFIG(TAG,
"BQ25186:");
168 LOG_I2C_DEVICE(
this);
169 LOG_UPDATE_INTERVAL(
this);
170#ifdef USE_BQ25186_PG_GPO
void mark_failed()
Mark this component as failed.
void status_set_warning()
void status_clear_warning()
StaticVector< BQ25186TextSensor *, BQ25186_TEXT_SENSOR_COUNT > text_sensors_
BQ25186ConfigRegisters regs_
void check_pg_gpo_(const BQ25186StatusRegisters &status, bool &pending)
switch_::Switch * pg_gpo_switch_
StaticVector< BQ25186BinarySensor *, BQ25186_BINARY_SENSOR_COUNT > binary_sensors_
bool write_register_(uint8_t reg, uint8_t value)
bool config_matches_(const BQ25186StatusRegisters ®s) const
bool apply_config(const BQ25186ConfigRegisters ®s)
uint8_t expected_register_(size_t index) const
bool update_register_(uint8_t reg, uint8_t mask, uint8_t value)
void dump_config() override
bool write_byte(uint8_t a_register, uint8_t data) const
bool read_byte(uint8_t a_register, uint8_t *data)
I2CRegister reg(uint8_t a_register)
calls the I2CRegister constructor
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len)
Compat APIs All methods below have been added for compatibility reasons.
bool state
The current reported state of the binary sensor.
void publish_state(bool state)
Publish a state to the front-end from the back-end.
optional< bool > get_initial_state_with_restore_mode()
Returns the initial state of the switch, after applying restore mode rules.
ESPHOME_LOG_TAG(TAG, "bq25186")
std::array< uint8_t, BQ25186_CONFIG_REGISTER_COUNT > BQ25186ConfigRegisters
std::array< uint8_t, BQ25186_STATUS_REGISTER_COUNT > BQ25186StatusRegisters
uint8_t progmem_read_byte(const uint8_t *addr)