AskSin++
PCF8574.h
1 //- -----------------------------------------------------------------------------------------------------------------------
2 // AskSin++
3 // 2018-11-01 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
4 // 2018-11-01 jp112sdl Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
5 //- -----------------------------------------------------------------------------------------------------------------------
6 
7 #ifndef __PCF8574Output_H__
8 #define __PCF8574Output_H__
9 
10 #include <Arduino.h>
11 #include <Wire.h>
12 
13 namespace as {
14 
15 struct PCF8574Buffer { uint8_t data, mode; };
16 
17 template <byte ADDRESS=0x38>
19  static PCF8574Buffer& getBuffer();
20  private:
21  static void writeWire(uint8_t buffer) {
22  Wire.beginTransmission(ADDRESS);
23  Wire.write(buffer);
24  Wire.endTransmission();
25  }
26  public:
27  inline static void setOutput (uint8_t pin) {
28  getBuffer().mode |= bit(pin);
29  }
30  inline static void setInput (uint8_t pin) {
31  getBuffer().mode &= ~bit(pin);
32  }
33  inline static void setHigh (uint8_t pin) {
34  getBuffer().data |= bit(pin);
35  writeWire((getBuffer().data & getBuffer().mode));
36  }
37  inline static void setLow (uint8_t pin) {
38  getBuffer().data &= ~bit(pin);
39  writeWire((getBuffer().data & getBuffer().mode));
40  }
41  inline static uint8_t getState (uint8_t pin) {
42  return ((getBuffer().data & bit(pin)) == 0) ? LOW : HIGH;
43  }
44  inline static void dump () {
45  DPRINT("Address: "); DHEX(ADDRESS);
46  DPRINT(" Mode: "); DHEX(getBuffer().mode);
47  DPRINT(" Data: "); DHEXLN(getBuffer().data);
48  }
49 
50  inline static void init () {
51  Wire.begin();
52  }
53  };
54 
55  template<>
57  static PCF8574Buffer b;
58  return b;
59  }
60  template<>
61  inline PCF8574Buffer& PCF8574Output<0x21>::getBuffer () {
62  static PCF8574Buffer b;
63  return b;
64  }
65  template<>
66  inline PCF8574Buffer& PCF8574Output<0x22>::getBuffer () {
67  static PCF8574Buffer b;
68  return b;
69  }
70  template<>
71  inline PCF8574Buffer& PCF8574Output<0x23>::getBuffer () {
72  static PCF8574Buffer b;
73  return b;
74  }
75  template<>
76  inline PCF8574Buffer& PCF8574Output<0x24>::getBuffer () {
77  static PCF8574Buffer b;
78  return b;
79  }
80  template<>
81  inline PCF8574Buffer& PCF8574Output<0x25>::getBuffer () {
82  static PCF8574Buffer b;
83  return b;
84  }
85  template<>
86  inline PCF8574Buffer& PCF8574Output<0x26>::getBuffer () {
87  static PCF8574Buffer b;
88  return b;
89  }
90  template<>
91  inline PCF8574Buffer& PCF8574Output<0x27>::getBuffer () {
92  static PCF8574Buffer b;
93  return b;
94  }
95 
96  template<>
97  inline PCF8574Buffer& PCF8574Output<0x38>::getBuffer () {
98  static PCF8574Buffer b;
99  return b;
100  }
101  template<>
102  inline PCF8574Buffer& PCF8574Output<0x39>::getBuffer () {
103  static PCF8574Buffer b;
104  return b;
105  }
106  template<>
107  inline PCF8574Buffer& PCF8574Output<0x3A>::getBuffer () {
108  static PCF8574Buffer b;
109  return b;
110  }
111  template<>
112  inline PCF8574Buffer& PCF8574Output<0x3B>::getBuffer () {
113  static PCF8574Buffer b;
114  return b;
115  }
116  template<>
117  inline PCF8574Buffer& PCF8574Output<0x3C>::getBuffer () {
118  static PCF8574Buffer b;
119  return b;
120  }
121  template<>
122  inline PCF8574Buffer& PCF8574Output<0x3D>::getBuffer () {
123  static PCF8574Buffer b;
124  return b;
125  }
126  template<>
127  inline PCF8574Buffer& PCF8574Output<0x3E>::getBuffer () {
128  static PCF8574Buffer b;
129  return b;
130  }
131  template<>
132  inline PCF8574Buffer& PCF8574Output<0x3F>::getBuffer () {
133  static PCF8574Buffer b;
134  return b;
135  }
136 }
137 
138 #endif
as::PCF8574Output
Definition: PCF8574.h:18
as::PCF8574Buffer
Definition: PCF8574.h:15