ESPHome 2025.9.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}
25bool MCP23016::digital_read(uint8_t pin) {
26 uint8_t bit = pin % 8;
27 uint8_t reg_addr = pin < 8 ? MCP23016_GP0 : MCP23016_GP1;
28 uint8_t value = 0;
29 this->read_reg_(reg_addr, &value);
30 return value & (1 << bit);
31}
32void MCP23016::digital_write(uint8_t pin, bool value) {
33 uint8_t reg_addr = pin < 8 ? MCP23016_OLAT0 : MCP23016_OLAT1;
34 this->update_reg_(pin, value, reg_addr);
35}
36void MCP23016::pin_mode(uint8_t pin, gpio::Flags flags) {
37 uint8_t iodir = pin < 8 ? MCP23016_IODIR0 : MCP23016_IODIR1;
38 if (flags == gpio::FLAG_INPUT) {
39 this->update_reg_(pin, true, iodir);
40 } else if (flags == gpio::FLAG_OUTPUT) {
41 this->update_reg_(pin, false, iodir);
42 }
43}
45bool MCP23016::read_reg_(uint8_t reg, uint8_t *value) {
46 if (this->is_failed())
47 return false;
48
49 return this->read_byte(reg, value);
50}
51bool MCP23016::write_reg_(uint8_t reg, uint8_t value) {
52 if (this->is_failed())
53 return false;
54
55 return this->write_byte(reg, value);
56}
57void MCP23016::update_reg_(uint8_t pin, bool pin_value, uint8_t reg_addr) {
58 uint8_t bit = pin % 8;
59 uint8_t reg_value = 0;
60 if (reg_addr == MCP23016_OLAT0) {
61 reg_value = this->olat_0_;
62 } else if (reg_addr == MCP23016_OLAT1) {
63 reg_value = this->olat_1_;
64 } else {
65 this->read_reg_(reg_addr, &reg_value);
66 }
67
68 if (pin_value) {
69 reg_value |= 1 << bit;
70 } else {
71 reg_value &= ~(1 << bit);
72 }
73
74 this->write_reg_(reg_addr, reg_value);
75
76 if (reg_addr == MCP23016_OLAT0) {
77 this->olat_0_ = reg_value;
78 } else if (reg_addr == MCP23016_OLAT1) {
79 this->olat_1_ = reg_value;
80 }
81}
82
84void MCP23016GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); }
85bool MCP23016GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
86void MCP23016GPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
87std::string MCP23016GPIOPin::dump_summary() const {
88 char buffer[32];
89 snprintf(buffer, sizeof(buffer), "%u via MCP23016", pin_);
90 return buffer;
91}
92
93} // namespace mcp23016
94} // namespace esphome
virtual void mark_failed()
Mark this component as failed.
bool is_failed() const
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
Definition i2c.h:266
bool read_byte(uint8_t a_register, uint8_t *data, bool stop=true)
Definition i2c.h:239
void pin_mode(gpio::Flags flags) override
Definition mcp23016.cpp:84
std::string dump_summary() const override
Definition mcp23016.cpp:87
void digital_write(bool value) override
Definition mcp23016.cpp:86
bool read_reg_(uint8_t reg, uint8_t *value)
Definition mcp23016.cpp:45
void digital_write(uint8_t pin, bool value)
Definition mcp23016.cpp:32
bool write_reg_(uint8_t reg, uint8_t value)
Definition mcp23016.cpp:51
void pin_mode(uint8_t pin, gpio::Flags flags)
Definition mcp23016.cpp:36
void update_reg_(uint8_t pin, bool pin_value, uint8_t reg_a)
Definition mcp23016.cpp:57
float get_setup_priority() const override
Definition mcp23016.cpp:44
bool digital_read(uint8_t pin)
Definition mcp23016.cpp:25
@ 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:49
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7