ESPHome 2025.10.0-dev
Loading...
Searching...
No Matches
mcp23016.cpp
Go to the documentation of this file.
1#include "mcp23016.h"
2#include "esphome/core/log.h"
3#include <cstdio>
4
5namespace esphome {
6namespace mcp23016 {
7
8static const char *const TAG = "mcp23016";
9
11 uint8_t iocon;
12 if (!this->read_reg_(MCP23016_IOCON0, &iocon)) {
13 this->mark_failed();
14 return;
15 }
16
17 // Read current output register state
18 this->read_reg_(MCP23016_OLAT0, &this->olat_0_);
19 this->read_reg_(MCP23016_OLAT1, &this->olat_1_);
20
21 // all pins input
22 this->write_reg_(MCP23016_IODIR0, 0xFF);
23 this->write_reg_(MCP23016_IODIR1, 0xFF);
24}
25
27 // Invalidate cache at the start of each loop
28 this->reset_pin_cache_();
29}
30bool MCP23016::digital_read_hw(uint8_t pin) {
31 uint8_t reg_addr = pin < 8 ? MCP23016_GP0 : MCP23016_GP1;
32 uint8_t value = 0;
33 if (!this->read_reg_(reg_addr, &value)) {
34 return false;
35 }
36
37 // Update the appropriate part of input_mask_
38 if (pin < 8) {
39 this->input_mask_ = (this->input_mask_ & 0xFF00) | value;
40 } else {
41 this->input_mask_ = (this->input_mask_ & 0x00FF) | (uint16_t(value) << 8);
42 }
43 return true;
44}
45
46bool MCP23016::digital_read_cache(uint8_t pin) { return this->input_mask_ & (1 << pin); }
47void MCP23016::digital_write_hw(uint8_t pin, bool value) {
48 uint8_t reg_addr = pin < 8 ? MCP23016_OLAT0 : MCP23016_OLAT1;
49 this->update_reg_(pin, value, reg_addr);
50}
52 uint8_t iodir = pin < 8 ? MCP23016_IODIR0 : MCP23016_IODIR1;
53 if (flags == gpio::FLAG_INPUT) {
54 this->update_reg_(pin, true, iodir);
55 } else if (flags == gpio::FLAG_OUTPUT) {
56 this->update_reg_(pin, false, iodir);
57 }
58}
60bool MCP23016::read_reg_(uint8_t reg, uint8_t *value) {
61 if (this->is_failed())
62 return false;
63
64 return this->read_byte(reg, value);
65}
66bool MCP23016::write_reg_(uint8_t reg, uint8_t value) {
67 if (this->is_failed())
68 return false;
69
70 return this->write_byte(reg, value);
71}
72void MCP23016::update_reg_(uint8_t pin, bool pin_value, uint8_t reg_addr) {
73 uint8_t bit = pin % 8;
74 uint8_t reg_value = 0;
75 if (reg_addr == MCP23016_OLAT0) {
76 reg_value = this->olat_0_;
77 } else if (reg_addr == MCP23016_OLAT1) {
78 reg_value = this->olat_1_;
79 } else {
80 this->read_reg_(reg_addr, &reg_value);
81 }
82
83 if (pin_value) {
84 reg_value |= 1 << bit;
85 } else {
86 reg_value &= ~(1 << bit);
87 }
88
89 this->write_reg_(reg_addr, reg_value);
90
91 if (reg_addr == MCP23016_OLAT0) {
92 this->olat_0_ = reg_value;
93 } else if (reg_addr == MCP23016_OLAT1) {
94 this->olat_1_ = reg_value;
95 }
96}
97
100bool MCP23016GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
101void MCP23016GPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
102std::string MCP23016GPIOPin::dump_summary() const {
103 char buffer[32];
104 snprintf(buffer, sizeof(buffer), "%u via MCP23016", pin_);
105 return buffer;
106}
107
108} // namespace mcp23016
109} // namespace esphome
virtual void mark_failed()
Mark this component as failed.
bool is_failed() const
bool digital_read(P pin)
Read the state of the given pin.
Definition cached_gpio.h:34
bool write_byte(uint8_t a_register, uint8_t data) const
Definition i2c.h:266
bool read_byte(uint8_t a_register, uint8_t *data)
Definition i2c.h:241
void pin_mode(gpio::Flags flags) override
Definition mcp23016.cpp:99
std::string dump_summary() const override
Definition mcp23016.cpp:102
void digital_write(bool value) override
Definition mcp23016.cpp:101
bool read_reg_(uint8_t reg, uint8_t *value)
Definition mcp23016.cpp:60
bool write_reg_(uint8_t reg, uint8_t value)
Definition mcp23016.cpp:66
void pin_mode(uint8_t pin, gpio::Flags flags)
Definition mcp23016.cpp:51
bool digital_read_cache(uint8_t pin) override
Definition mcp23016.cpp:46
void digital_write_hw(uint8_t pin, bool value) override
Definition mcp23016.cpp:47
bool digital_read_hw(uint8_t pin) override
Definition mcp23016.cpp:30
void update_reg_(uint8_t pin, bool pin_value, uint8_t reg_a)
Definition mcp23016.cpp:72
float get_setup_priority() const override
Definition mcp23016.cpp:59
uint16_t flags
@ FLAG_OUTPUT
Definition gpio.h:19
@ FLAG_INPUT
Definition gpio.h:18
const float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.cpp:48
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7