ESPHome 2025.5.0
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 ESP_LOGCONFIG(TAG, "Setting up MCP23016...");
12 uint8_t iocon;
13 if (!this->read_reg_(MCP23016_IOCON0, &iocon)) {
14 this->mark_failed();
15 return;
16 }
17
18 // Read current output register state
19 this->read_reg_(MCP23016_OLAT0, &this->olat_0_);
20 this->read_reg_(MCP23016_OLAT1, &this->olat_1_);
21
22 // all pins input
23 this->write_reg_(MCP23016_IODIR0, 0xFF);
24 this->write_reg_(MCP23016_IODIR1, 0xFF);
25}
26bool MCP23016::digital_read(uint8_t pin) {
27 uint8_t bit = pin % 8;
28 uint8_t reg_addr = pin < 8 ? MCP23016_GP0 : MCP23016_GP1;
29 uint8_t value = 0;
30 this->read_reg_(reg_addr, &value);
31 return value & (1 << bit);
32}
33void MCP23016::digital_write(uint8_t pin, bool value) {
34 uint8_t reg_addr = pin < 8 ? MCP23016_OLAT0 : MCP23016_OLAT1;
35 this->update_reg_(pin, value, reg_addr);
36}
37void MCP23016::pin_mode(uint8_t pin, gpio::Flags flags) {
38 uint8_t iodir = pin < 8 ? MCP23016_IODIR0 : MCP23016_IODIR1;
39 if (flags == gpio::FLAG_INPUT) {
40 this->update_reg_(pin, true, iodir);
41 } else if (flags == gpio::FLAG_OUTPUT) {
42 this->update_reg_(pin, false, iodir);
43 }
44}
46bool MCP23016::read_reg_(uint8_t reg, uint8_t *value) {
47 if (this->is_failed())
48 return false;
49
50 return this->read_byte(reg, value);
51}
52bool MCP23016::write_reg_(uint8_t reg, uint8_t value) {
53 if (this->is_failed())
54 return false;
55
56 return this->write_byte(reg, value);
57}
58void MCP23016::update_reg_(uint8_t pin, bool pin_value, uint8_t reg_addr) {
59 uint8_t bit = pin % 8;
60 uint8_t reg_value = 0;
61 if (reg_addr == MCP23016_OLAT0) {
62 reg_value = this->olat_0_;
63 } else if (reg_addr == MCP23016_OLAT1) {
64 reg_value = this->olat_1_;
65 } else {
66 this->read_reg_(reg_addr, &reg_value);
67 }
68
69 if (pin_value) {
70 reg_value |= 1 << bit;
71 } else {
72 reg_value &= ~(1 << bit);
73 }
74
75 this->write_reg_(reg_addr, reg_value);
76
77 if (reg_addr == MCP23016_OLAT0) {
78 this->olat_0_ = reg_value;
79 } else if (reg_addr == MCP23016_OLAT1) {
80 this->olat_1_ = reg_value;
81 }
82}
83
85void MCP23016GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); }
86bool MCP23016GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
87void MCP23016GPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
88std::string MCP23016GPIOPin::dump_summary() const {
89 char buffer[32];
90 snprintf(buffer, sizeof(buffer), "%u via MCP23016", pin_);
91 return buffer;
92}
93
94} // namespace mcp23016
95} // 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:85
std::string dump_summary() const override
Definition mcp23016.cpp:88
void digital_write(bool value) override
Definition mcp23016.cpp:87
bool read_reg_(uint8_t reg, uint8_t *value)
Definition mcp23016.cpp:46
void digital_write(uint8_t pin, bool value)
Definition mcp23016.cpp:33
bool write_reg_(uint8_t reg, uint8_t value)
Definition mcp23016.cpp:52
void pin_mode(uint8_t pin, gpio::Flags flags)
Definition mcp23016.cpp:37
void update_reg_(uint8_t pin, bool pin_value, uint8_t reg_a)
Definition mcp23016.cpp:58
float get_setup_priority() const override
Definition mcp23016.cpp:45
bool digital_read(uint8_t pin)
Definition mcp23016.cpp:26
@ 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:18
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7