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 
140  unsigned long currentDuration() const;
141 
142 
150  unsigned long previousDuration() const;
151 
152 protected:
153  void begin();
154  virtual bool readCurrentState() =0;
155  unsigned long previous_millis;
156  uint16_t interval_millis;
157  uint8_t state;
158  unsigned long stateChangeLastTime;
159  unsigned long durationOfPreviousState;
160 
161 };
162 
163 
168 class Bounce : public Debouncer
169 {
170 
171 
172 public:
173 
184  Bounce();
185 
186 
195  void attach(int pin, int mode);
196 
200  void attach(int pin);
201 
202  Bounce(uint8_t pin, unsigned long interval_millis ) : Bounce() {
203  attach(pin);
204  interval(interval_millis);
205  }
206 
207 
213  inline int getPin() const {
214  return this->pin;
215  };
216 
218  // Deprecated //
220 
224  bool risingEdge() const { return rose(); }
228  bool fallingEdge() const { return fell(); }
234 protected:
235 
236 
237  uint8_t pin;
238 
239  virtual bool readCurrentState() { return digitalRead(pin); }
240  virtual void setPinMode(int pin, int mode) {
241 #if defined(ARDUINO_ARCH_STM32F1)
242  pinMode(pin, (WiringPinMode)mode);
243 #else
244  pinMode(pin, mode);
245 #endif
246  }
247 
248 
249 
250 };
251 
255 namespace Bounce2 {
256  // code declarations
257 
258 class Button : public Bounce{
259 protected:
260  bool stateForPressed = 1; //
261  public:
272  Button(){ }
273 
281  void setPressedState(bool state){
282  stateForPressed = state;
283  }
284 
288  inline bool getPressedState() const {
289  return stateForPressed;
290  };
291 
295  inline bool isPressed() const {
296  return read() == getPressedState();
297  };
298 
302  inline bool pressed() const {
303  return changed() && isPressed();
304  };
305 
309  inline bool released() const {
310  return changed() && !isPressed();
311  };
312 
313 };
314 };
315 
316 #endif
Bounce2::Button
Definition: Bounce2.h:258
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:288
Bounce::Bounce
Bounce()
Create an instance of the Bounce class.
Definition: Bounce2.cpp:138
Bounce::fallingEdge
bool fallingEdge() const
Deprecated (i.e. do not use). Included for partial compatibility for programs written with Bounce ver...
Definition: Bounce2.h:228
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:237
Bounce2::Button::pressed
bool pressed() const
Returns true if the button was physically pressed
Definition: Bounce2.h:302
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:272
Bounce
The Debouncer:Bounce class. Links the Deboucing class to a hardware pin. This class is odly named,...
Definition: Bounce2.h:168
Bounce::getPin
int getPin() const
Return pin that this Bounce is attached to.
Definition: Bounce2.h:213
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:281
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:309
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:295
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:224
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:255
Debouncer::Debouncer
Debouncer()
Create an instance of the Debounce class.
Definition: Bounce2.cpp:10