Bounce2
Bounce2.h
1 /*
2  The MIT License (MIT)
3 
4  Copyright (c) 2013 thomasfredericks
5 
6  Permission is hereby granted, free of charge, to any person obtaining a copy of
7  this software and associated documentation files (the "Software"), to deal in
8  the Software without restriction, including without limitation the rights to
9  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
10  the Software, and to permit persons to whom the Software is furnished to do so,
11  subject to the following conditions:
12 
13  The above copyright notice and this permission notice shall be included in all
14  copies or substantial portions of the Software.
15 
16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23 
24 /* * * * * * * * * * * * * * * * * * * * * * * * * * * *
25  Main code by Thomas O Fredericks (tof@t-o-f.info)
26  Previous contributions by Eric Lowry, Jim Schimpf and Tom Harkaway
27  * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
28 
29 
30 #ifndef Bounce2_h
31 #define Bounce2_h
32 
33 #if defined(ARDUINO) && ARDUINO >= 100
34 #include "Arduino.h"
35 #else
36 #include "WProgram.h"
37 #endif
38 
39 // Uncomment the following line for "LOCK-OUT" debounce method
40 //#define BOUNCE_LOCK_OUT
41 
42 // Uncomment the following line for "BOUNCE_WITH_PROMPT_DETECTION" debounce method
43 //#define BOUNCE_WITH_PROMPT_DETECTION
44 
45 #include <inttypes.h>
46 
62 class Debouncer
63 {
64  // Note : this is private as it migh change in the futur
65 private:
66  static const uint8_t DEBOUNCED_STATE = 0b00000001; // Final returned calculated debounced state
67  static const uint8_t UNSTABLE_STATE = 0b00000010; // Actual last state value behind the scene
68  static const uint8_t CHANGED_STATE = 0b00000100; // The DEBOUNCED_STATE has changed since last update()
69 
70 // Note : this is private as it migh change in the futur
71 private:
72  inline void changeState();
73  inline void setStateFlag(const uint8_t flag) {state |= flag;}
74  inline void unsetStateFlag(const uint8_t flag) {state &= ~flag;}
75  inline void toggleStateFlag(const uint8_t flag) {state ^= flag;}
76  inline bool getStateFlag(const uint8_t flag) const {return((state & flag) != 0);}
77 
78 public:
84  Debouncer();
85 
93  void interval(uint16_t interval_millis);
94 
103  bool update();
104 
110  bool read() const;
111 
115  bool fell() const;
116 
120  bool rose() const;
121 
122 
123 
124 public:
130  bool changed( ) const { return getStateFlag(CHANGED_STATE); }
131 
132 
133 
134 
143  unsigned long currentDuration() const;
144 
145 
153  unsigned long previousDuration() const;
154 
163  [[deprecated]]
164  unsigned long duration() {
165  return currentDuration();
166  };
167 
168 protected:
169  void begin();
170  virtual bool readCurrentState() =0;
171  unsigned long previous_millis;
172  uint16_t interval_millis;
173  uint8_t state;
174  unsigned long stateChangeLastTime;
175  unsigned long durationOfPreviousState;
176 
177 };
178 
179 
184 class Bounce : public Debouncer
185 {
186 
187 
188 public:
189 
200  Bounce();
201 
202 
211  void attach(int pin, int mode);
212 
216  void attach(int pin);
217 
218  Bounce(uint8_t pin, unsigned long interval_millis ) : Bounce() {
219  attach(pin);
220  interval(interval_millis);
221  }
222 
223 
229  inline int getPin() const {
230  return this->pin;
231  };
232 
234  // Deprecated //
236 
240  [[deprecated]]
241  bool risingEdge() const { return rose(); }
245  [[deprecated]]
246  bool fallingEdge() const { return fell(); }
252 protected:
253 
254 
255  uint8_t pin;
256 
257  virtual bool readCurrentState() { return digitalRead(pin); }
258  virtual void setPinMode(int pin, int mode) {
259 #if defined(ARDUINO_ARCH_STM32F1)
260  pinMode(pin, (WiringPinMode)mode);
261 #else
262  pinMode(pin, mode);
263 #endif
264  }
265 
266 
267 
268 };
269 
273 namespace Bounce2 {
274  // code declarations
275 
276 class Button : public Bounce{
277 protected:
278  bool stateForPressed = 1; //
279  public:
290  Button(){ }
291 
299  void setPressedState(bool state){
300  stateForPressed = state;
301  }
302 
306  inline bool getPressedState() const {
307  return stateForPressed;
308  };
309 
313  inline bool isPressed() const {
314  return read() == getPressedState();
315  };
316 
320  inline bool pressed() const {
321  return changed() && isPressed();
322  };
323 
327  inline bool released() const {
328  return changed() && !isPressed();
329  };
330 
331 };
332 };
333 
334 #endif
Bounce2::Button
Definition: Bounce2.h:276
Debouncer::interval
void interval(uint16_t interval_millis)
Sets the debounce interval in milliseconds.
Definition: Bounce2.cpp:14
Debouncer::previousDuration
unsigned long previousDuration() const
Returns the duration in milliseconds of the previous state.
Definition: Bounce2.cpp:103
Bounce2::Button::getPressedState
bool getPressedState() const
Get the electrical state (HIGH/LOW) that corresponds to a physical press.
Definition: Bounce2.h:306
Bounce::Bounce
Bounce()
Create an instance of the Bounce class.
Definition: Bounce2.cpp:138
Debouncer::duration
unsigned long duration()
DEPRECATED (i.e. do not use). Renamed currentDuration().
Definition: Bounce2.h:164
Bounce::fallingEdge
bool fallingEdge() const
Deprecated (i.e. do not use). Included for partial compatibility for programs written with Bounce ver...
Definition: Bounce2.h:246
Debouncer::rose
bool rose() const
Returns true if pin signal transitions from low to high.
Definition: Bounce2.cpp:123
Bounce::pin
uint8_t pin
Deprecated (i.e. do not use). Included for partial compatibility for programs written with Bounce ver...
Definition: Bounce2.h:255
Bounce2::Button::pressed
bool pressed() const
Returns true if the button was physically pressed
Definition: Bounce2.h:320
Debouncer::currentDuration
unsigned long currentDuration() const
Returns the duration in milliseconds of the current state.
Definition: Bounce2.cpp:107
Debouncer::update
bool update()
Updates the pin's state.
Definition: Bounce2.cpp:32
Bounce2::Button::Button
Button()
Create an instance of the Button class. By default, the pressed state is matched to a HIGH electrical...
Definition: Bounce2.h:290
Bounce
The Debouncer:Bounce class. Links the Deboucing class to a hardware pin. This class is odly named,...
Definition: Bounce2.h:184
Bounce::getPin
int getPin() const
Return pin that this Bounce is attached to.
Definition: Bounce2.h:229
Debouncer
The Debouce class. Just the deboucing code separated from all harware.
Definition: Bounce2.h:62
Bounce2::Button::setPressedState
void setPressedState(bool state)
Set the electrical state (HIGH/LOW) that corresponds to a physical press. By default,...
Definition: Bounce2.h:299
Debouncer::fell
bool fell() const
Returns true if pin signal transitions from high to low.
Definition: Bounce2.cpp:128
Bounce2::Button::released
bool released() const
Returns true if the button was physically released
Definition: Bounce2.h:327
Bounce::attach
void attach(int pin, int mode)
Attach to a pin and sets that pin's mode (INPUT, INPUT_PULLUP or OUTPUT).
Definition: Bounce2.cpp:149
Bounce2::Button::isPressed
bool isPressed() const
Returns true if the button is currently physically pressed.
Definition: Bounce2.h:313
Debouncer::read
bool read() const
Returns the pin's state (HIGH or LOW).
Definition: Bounce2.cpp:118
Bounce::risingEdge
bool risingEdge() const
Deprecated (i.e. do not use). Included for partial compatibility for programs written with Bounce ver...
Definition: Bounce2.h:241
Debouncer::changed
bool changed() const
Returns true if the state changed on last update.
Definition: Bounce2.h:130
Bounce2
The Debouncer:Bounce:Button class. The Button class matches an electrical state to a physical action.
Definition: Bounce2.h:273
Debouncer::Debouncer
Debouncer()
Create an instance of the Debounce class.
Definition: Bounce2.cpp:10