supla-device
Loading...
Searching...
No Matches
PCF8574.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6/*
7Dependency: https://github.com/RobTillaart/PCF8574
8Use library manager to install it
9*/
10
11#include <PCF8574.h>
12
13#include <supla/io.h>
14#include <supla/mutex.h>
15#include <supla/log_wrapper.h>
16
17namespace Supla {
18namespace Io {
19
20class PCF8574 : public Supla::Io::Base {
21 public:
22 explicit PCF8574(uint8_t address = 0x20,
23 Supla::Mutex *mutex = nullptr,
24 uint8_t initialPinState = 0xFF,
25 TwoWire *wire = &Wire)
26 : Supla::Io::Base(), pcf_(address, wire), mutex_(mutex) {
27 if (!pcf_.begin(initialPinState)) {
28 SUPLA_LOG_ERROR("Unable to find PCF8574 at address 0x%x", address);
29 } else {
30 SUPLA_LOG_DEBUG("PCF8574 is connected at address: 0x%x", address);
31 }
32 }
33
34 void customPinMode(int channelNumber, uint8_t pin, uint8_t mode) override {
35 if (mutex_) mutex_->lock();
36 if (mode == INPUT_PULLUP && pcf_.isConnected()) {
37 pcf_.write(pin, HIGH);
38 }
39 if (mutex_) mutex_->unlock();
40 }
41
42 void customDigitalWrite(int channelNumber, uint8_t pin,
43 uint8_t val) override {
44 if (mutex_) mutex_->lock();
45 if (pcf_.isConnected()) {
46 pcf_.write(pin, val);
47 }
48 if (mutex_) mutex_->unlock();
49 }
50
51 int customDigitalRead(int channelNumber, uint8_t pin) override {
52 uint8_t val;
53 if (mutex_) mutex_->lock();
54 val = pcf_.isConnected() ? pcf_.read(pin) : 0;
55 if (mutex_) mutex_->unlock();
56 return val;
57 }
58
59 unsigned int customPulseIn(int channelNumber, uint8_t pin, uint8_t value,
60 uint64_t timeoutMicro) override {
61 return 0;
62 }
63
64 void customAnalogWrite(int channelNumber, uint8_t pin, int val) override {}
65
66 int customAnalogRead(int channelNumber, uint8_t pin) override {
67 return 0;
68 }
69
70 protected:
71 ::PCF8574 pcf_;
72 Supla::Mutex *mutex_ = nullptr;
73};
74
75}; // namespace Io
76}; // namespace Supla
Definition io.h:23
Definition PCF8574.h:20
Definition mutex.h:9