38 explicit MCP23017(uint8_t address = 0x20,
40 TwoWire *wire = &Wire,
43 if (!mcp_.begin(pullUp)) {
44 SUPLA_LOG_ERROR(
"Unable to find MCP23017 at address: 0x%x", address);
46 SUPLA_LOG_DEBUG(
"MCP23017 is connected at address: 0x%x", address);
53 lastOutState_ = inState_;
56 void customPinMode(
int channelNumber, uint8_t pin, uint8_t mode)
override {
57 if (mutex_) mutex_->lock();
58 if (mcp_.isConnected()) {
59 mcp_.pinMode1(pin, mode);
61 if (mutex_) mutex_->unlock();
64 void customDigitalWrite(
int channelNumber, uint8_t pin,
65 uint8_t val)
override {
67 SUPLA_LOG_WARNING(
"[MCP23017] can't write, pin %d out of range", pin);
71 outState_ |= (1 << pin);
73 outState_ &= ~(1 << pin);
77 int customDigitalRead(
int channelNumber, uint8_t pin)
override {
79 SUPLA_LOG_WARNING(
"[MCP23017] can't read, pin %d out of range", pin);
82 return (inState_ >> pin) & 0x01;
85 unsigned int customPulseIn(
int channelNumber, uint8_t pin, uint8_t value,
86 uint64_t timeoutMicro)
override {
90 void customAnalogWrite(
int channelNumber, uint8_t pin,
int val)
override {}
92 int customAnalogRead(
int channelNumber, uint8_t pin)
override {
101 void read16FromMCP() {
102 if (mutex_) mutex_->lock();
103 if (mcp_.isConnected()) {
104 uint16_t data = mcp_.read16();
105 inState_ = (data >> 8) | (data << 8);
107 if (mutex_) mutex_->unlock();
110 void write16ToMCP() {
111 if (mutex_) mutex_->lock();
112 if (mcp_.isConnected() && outState_ != lastOutState_) {
113 uint16_t data = (outState_ >> 8) | (outState_ << 8);
115 lastOutState_ = outState_;
117 if (mutex_) mutex_->unlock();
122 uint16_t outState_ = 0;
123 uint16_t inState_ = 0;
124 uint16_t lastOutState_ = 0;
125 Supla::Mutex *mutex_ =
nullptr;