-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathObjectIO.h
245 lines (180 loc) · 5.47 KB
/
ObjectIO.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
//
// Version 2
// Alternative Arduino IO manager, includes debounce class
// "technikker"
//
// ----------------------------------------------------------------------------
// Header Guard
#ifndef OBJECTIO_H
#define OBJECTIO_H
// ----------------------------------------------------------------------------
// Includes
#include "Arduino.h"
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Setup Defines
// #define ALTIO_INVERT_INPUT // - invert inputs globally
// #define ALTIO_INVERT_OUTPUT // - invert outputs globally
// #define ALTIO_RETAIN_OUTPUT_STATE // - when writing output store the written state to be retrieved by state() and extending functions
#define ALTIO_DEFAULT_DEBOUNCE 100
#define ALTIO_DEFAULT_PIN_MODE INPUT
#ifndef ALTIO_INVERT_INPUT
#define _ALTIO_INVERT_INPUT
#else
#define _ALTIO_INVERT_INPUT !
#endif
#ifndef ALTIO_INVERT_OUTPUT
#define _ALTIO_INVERT_OUTPUT
#else
#define _ALTIO_INVERT_OUTPUT !
#endif
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Defines
// using ATMega328
//#define _mcu_ _atmega328_
#define _atmega328_ _mcu_ // either one of these works
#define NUMBER_OF_IO_PINS 20
#define FORCE_INLINE __attribute__((always_inline))
#define STATUS_BIT_PIN 0
#define STATUS_MSK_PIN 63
#define STATUS_BIT_STATE 6
#define STATUS_MSK_STATE 64
#define STATUS_BIT_LASTSTATE 7
#define STATUS_MSK_LASTSTATE 128
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// MCU Class
class _mcu_
{
protected:
static inline uint8_t _read_pin(uint8_t arduino_pin) FORCE_INLINE ;
static inline void _write_pin_lo(uint8_t arduino_pin) FORCE_INLINE ;
static inline void _write_pin_hi(uint8_t arduino_pin) FORCE_INLINE ;
public:
static uint8_t read_pin(uint8_t arduino_pin) ;
static void write_pin_lo(uint8_t arduino_pin) ;
static void write_pin_hi(uint8_t arduino_pin) ;
};
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Main Class
class DigitalPin : public _mcu_
{
private:
// bit0 ... bit5 - pin
// bit6 - state
// bit7 - last state
uint8_t _status;
inline void _set_state(uint8_t new_state);
uint8_t _read();
void _lo();
void _hi();
public:
uint8_t _state();
uint8_t _last_state();
public:
DigitalPin(uint8_t arduino_pin, uint8_t pin_mode = ALTIO_DEFAULT_PIN_MODE);
void setup(uint8_t pin_mode);
uint8_t pin();
inline uint8_t read() FORCE_INLINE ;
inline void lo() FORCE_INLINE ;
inline void hi() FORCE_INLINE ;
inline void write(uint8_t value) FORCE_INLINE ;
// can not be used on io pins operating as outputs, with the execption of state() which
// may be used on output pins when ALTIO_RETAIN_OUTPUT_STATE is defined
inline uint8_t state() FORCE_INLINE ;
inline uint8_t last_state() FORCE_INLINE ;
bool change_state() ;
void update() ;
};
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Debounce Class
class Debouncer
{
private:
DigitalPin* _digital_io ;
uint8_t _status ;
uint16_t _t_debounce ;
uint32_t* _t_start = nullptr ;
inline void _toggle_timer() ;
uint8_t _state(uint8_t updates_elapsed) ;
uint8_t _state() ;
uint8_t _last_state() ;
public:
Debouncer(DigitalPin& digital_io, uint16_t debounce_len = ALTIO_DEFAULT_DEBOUNCE);
void setup(uint16_t debounce_len) ;
inline uint8_t state(uint8_t updates_elapsed) FORCE_INLINE ;
inline uint8_t state() FORCE_INLINE ;
inline uint8_t last_state() FORCE_INLINE ;
bool change_state() ;
void update() ;
};
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Main Class Inlines
#ifndef OBJECTIO_CPP
inline uint8_t DigitalPin::read()
{
return _ALTIO_INVERT_INPUT _read();
}
inline void DigitalPin::lo()
{
#ifndef ALTIO_INVERT_OUTPUT
_lo();
#else
_hi();
#endif
#ifdef ALTIO_RETAIN_OUTPUT_STATE
_set_state(_ALTIO_INVERT_INPUT false); // read functions only invert input
#endif
}
inline void DigitalPin::hi()
{
#ifndef ALTIO_INVERT_OUTPUT
_hi();
#else
_lo();
#endif
#ifdef ALTIO_RETAIN_OUTPUT_STATE
_set_state(_ALTIO_INVERT_INPUT true);
#endif
}
inline void DigitalPin::write(uint8_t value)
{
if(_ALTIO_INVERT_OUTPUT value) _hi();
else _lo();
#ifdef ALTIO_RETAIN_OUTPUT_STATE
_set_state(_ALTIO_INVERT_INPUT value);
#endif
}
inline uint8_t DigitalPin::state()
{
return _ALTIO_INVERT_INPUT _state();
}
inline uint8_t DigitalPin::last_state()
{
return _ALTIO_INVERT_INPUT _last_state();
}
#endif
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Debounce Class Inlines
#ifndef OBJECTIO_CPP
inline uint8_t Debouncer::state(uint8_t updates_elapsed)
{
return _ALTIO_INVERT_INPUT _state(updates_elapsed);
}
inline uint8_t Debouncer::state()
{
return _ALTIO_INVERT_INPUT _state();
}
inline uint8_t Debouncer::last_state()
{
return _ALTIO_INVERT_INPUT _last_state();
}
#endif
// --------------------------------------------------------------------------*/
//#include "./AlternateIO.cpp"
#endif //OBJECTIO_H