23 explicit MCP23017(uint8_t address = 0x20,
25 TwoWire *wire = &Wire,
28 if (!mcp_.begin(pullUp)) {
29 SUPLA_LOG_ERROR(
"Unable to find MCP23017 at address: 0x%x", address);
31 SUPLA_LOG_DEBUG(
"MCP23017 is connected at address: 0x%x", address);
38 lastOutState_ = inState_;
41 void customPinMode(
int channelNumber, uint8_t pin, uint8_t mode)
override {
42 if (mutex_) mutex_->lock();
43 if (mcp_.isConnected()) {
44 mcp_.pinMode1(pin, mode);
46 if (mutex_) mutex_->unlock();
49 void customDigitalWrite(
int channelNumber, uint8_t pin,
50 uint8_t val)
override {
52 SUPLA_LOG_WARNING(
"[MCP23017] can't write, pin %d out of range", pin);
56 outState_ |= (1 << pin);
58 outState_ &= ~(1 << pin);
62 int customDigitalRead(
int channelNumber, uint8_t pin)
override {
64 SUPLA_LOG_WARNING(
"[MCP23017] can't read, pin %d out of range", pin);
67 return (inState_ >> pin) & 0x01;
70 unsigned int customPulseIn(
int channelNumber, uint8_t pin, uint8_t value,
71 uint64_t timeoutMicro)
override {
75 void customAnalogWrite(
int channelNumber, uint8_t pin,
int val)
override {}
77 int customAnalogRead(
int channelNumber, uint8_t pin)
override {
86 void read16FromMCP() {
87 if (mutex_) mutex_->lock();
88 if (mcp_.isConnected()) {
89 uint16_t data = mcp_.read16();
90 inState_ = (data >> 8) | (data << 8);
92 if (mutex_) mutex_->unlock();
96 if (mutex_) mutex_->lock();
97 if (mcp_.isConnected() && outState_ != lastOutState_) {
98 uint16_t data = (outState_ >> 8) | (outState_ << 8);
100 lastOutState_ = outState_;
102 if (mutex_) mutex_->unlock();
107 uint16_t outState_ = 0;
108 uint16_t inState_ = 0;
109 uint16_t lastOutState_ = 0;