supla-device
Loading...
Searching...
No Matches
io.h
1/*
2 Copyright (C) AC SOFTWARE SP. Z O.O.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15*/
16
17#ifndef SRC_SUPLA_IO_H_
18#define SRC_SUPLA_IO_H_
19
20#include <stdint.h>
21
22#include "definitions.h"
23
24namespace Supla {
25// This class can be used to override digitalRead and digitalWrite methods.
26// If you want to add custom behavior i.e. during read/write from some
27// digital pin, you can inherit from Supla::Io::Base class, implement your
28// own customDigitalRead and customDigitalWrite methods and create instance
29// of this class. It will automatically register and SuplaDevice will use it.
30//
31// Example use: implement some additional logic, when relay state is
32// changed.
33namespace Io {
34
35class Base {
36 public:
37 static Base *ioInstance;
38
39 explicit Base(bool useAsSingleton = true);
40 virtual ~Base();
41 virtual bool isReady() const;
42
43 virtual void customPinMode(int channelNumber, uint8_t pin, uint8_t mode);
44 virtual int customDigitalRead(int channelNumber, uint8_t pin);
45 virtual unsigned int customPulseIn(int channelNumber,
46 uint8_t pin,
47 uint8_t value,
48 uint64_t timeoutMicro);
49 virtual void customDigitalWrite(int channelNumber, uint8_t pin, uint8_t val);
50 virtual void customAnalogWrite(int channelNumber, uint8_t pin, int val);
51 virtual void customSetPwmResolutionBits(uint8_t resolutionBits);
52 virtual void customConfigureAnalogOutput(int channelNumber,
53 uint8_t pin,
54 bool outputInvert = false);
55 virtual void customSetPwmFrequency(uint16_t pwmFrequency);
56 virtual uint8_t customAnalogWriteResolutionBits() const;
57 virtual uint32_t customAnalogWriteMaxValue() const;
58 virtual int customAnalogRead(int channelNumber, uint8_t pin);
59 virtual void customAttachInterrupt(uint8_t pin, void (*func)(void), int mode);
60 virtual void customDetachInterrupt(uint8_t pin);
61 virtual uint8_t customPinToInterrupt(uint8_t pin);
62
63 private:
64 bool useAsSingleton = true;
65};
66
67struct IoPin {
68 enum Flag : uint8_t {
69 IsSet = 1 << 0,
70 PullUp = 1 << 1,
71 ActiveHigh = 1 << 2,
72 };
73
74 uint8_t pin = 0;
75 uint8_t flags = ActiveHigh;
76 uint8_t mode = 0;
77 mutable uint8_t analogWriteResolutionBitsValue = 0;
78 Base *io = nullptr;
79
80 IoPin() = default;
81 explicit IoPin(int pin, Base *io = nullptr) : io(io) { setPin(pin); }
82
83 bool isSet() const { return (flags & IsSet) != 0; }
84 void setIsSet(bool value) {
85 if (value) {
86 flags |= IsSet;
87 } else {
88 flags &= ~IsSet;
89 }
90 }
91
92 int getPin() const { return isSet() ? static_cast<int>(pin) : -1; }
93 void setPin(int value) {
94 if (value < 0) {
95 pin = 0;
96 setIsSet(false);
97 } else {
98 pin = static_cast<uint8_t>(value);
99 setIsSet(true);
100 }
101 }
102
103 bool isPullUp() const { return (flags & PullUp) != 0; }
104 void setPullUp(bool value) {
105 if (value) {
106 flags |= PullUp;
107 } else {
108 flags &= ~PullUp;
109 }
110 }
111
112 bool isActiveHigh() const { return (flags & ActiveHigh) != 0; }
113 void setActiveHigh(bool value) {
114 if (value) {
115 flags |= ActiveHigh;
116 } else {
117 flags &= ~ActiveHigh;
118 }
119 }
120
121 void setMode(uint8_t value) { mode = value; }
122 uint8_t getMode() const { return mode; }
123
124 void setAnalogOutputResolutionBits(uint8_t resolutionBits);
125 void setAnalogOutputFrequency(uint32_t frequencyHz);
126 void configureAnalogOutput(int channelNumber = -1) const;
127 void pinMode(int channelNumber = -1) const;
128 int digitalRead(int channelNumber = -1) const;
129 void digitalWrite(uint8_t value, int channelNumber = -1) const;
130 void analogWrite(int value, int channelNumber = -1) const;
131 uint8_t analogWriteResolutionBits() const;
132 uint32_t analogWriteMaxValue() const;
133 void writeActive(int channelNumber = -1) const;
134 void writeInactive(int channelNumber = -1) const;
135 bool readActive(int channelNumber = -1) const;
136};
137
138void pinMode(uint8_t pin, uint8_t mode, Supla::Io::Base *io = Base::ioInstance);
139int digitalRead(uint8_t pin, Supla::Io::Base *io = Base::ioInstance);
140void digitalWrite(uint8_t pin,
141 uint8_t val,
142 Supla::Io::Base *io = Base::ioInstance);
143void analogWrite(uint8_t pin,
144 int value,
145 Supla::Io::Base *io = Base::ioInstance);
146int analogRead(uint8_t pin, Supla::Io::Base *io = Base::ioInstance);
147unsigned int pulseIn(uint8_t pin,
148 uint8_t value,
149 uint64_t timeoutMicro,
150 Supla::Io::Base *io = Base::ioInstance);
151
152void pinMode(int channelNumber,
153 uint8_t pin,
154 uint8_t mode,
155 Supla::Io::Base *io = Base::ioInstance);
156int digitalRead(int channelNumber,
157 uint8_t pin,
158 Supla::Io::Base *io = Base::ioInstance);
159void digitalWrite(int channelNumber,
160 uint8_t pin,
161 uint8_t val,
162 Supla::Io::Base *io = Base::ioInstance);
163void analogWrite(int channelNumber,
164 uint8_t pin,
165 int value,
166 Supla::Io::Base *io = Base::ioInstance);
167int analogRead(int channelNumber,
168 uint8_t pin,
169 Supla::Io::Base *io = Base::ioInstance);
170unsigned int pulseIn(int channelNumber,
171 uint8_t pin,
172 uint8_t value,
173 uint64_t timeoutMicro,
174 Supla::Io::Base *io = Base::ioInstance);
175
176void attachInterrupt(uint8_t pin,
177 void (*func)(void),
178 int mode,
179 Io::Base *io = Base::ioInstance);
180void detachInterrupt(uint8_t pin, Io::Base *io = Base::ioInstance);
181uint8_t pinToInterrupt(uint8_t pin, Io::Base *io = Base::ioInstance);
182} // namespace Io
183}; // namespace Supla
184
185#endif // SRC_SUPLA_IO_H_
Definition io.h:35