Ported from Arduino Library - https://code.google.com/p/clickbutton/

Files at this revision

API Documentation at this revision

Comitter:
MobileWill
Date:
Tue May 26 01:52:00 2015 +0000
Commit message:
Ported from Arduino Library. From https://code.google.com/p/clickbutton/

Changed in this revision

ClickButton.cpp Show annotated file Show diff for this revision Revisions of this file
ClickButton.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 8b9a6e8ca865 ClickButton.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ClickButton.cpp	Tue May 26 01:52:00 2015 +0000
@@ -0,0 +1,153 @@
+/*    ClickButton
+ 
+ Arduino library that decodes multiple clicks on one button.
+ Also copes with long clicks and click-and-hold.
+ 
+ Usage: ClickButton buttonObject(pin [LOW/HIGH, [CLICKBTN_PULLUP]]);
+ 
+  where LOW/HIGH denotes active LOW or HIGH button (default is LOW)
+  CLICKBTN_PULLUP is only possible with active low buttons.
+ 
+
+ Returned click counts:
+
+   A positive number denotes the number of (short) clicks after a released button
+   A negative number denotes the number of "long" clicks
+ 
+NOTE!
+ This is the OPPOSITE/negative of click codes from the last pre-2013 versions!
+ (this seemed more logical and simpler, so I finally changed it)
+
+ Based on the Debounce example at arduino playground site
+
+ 
+ Copyright (C) 2010,2012, 2013 raron
+
+  
+ GNU GPLv3 license
+ 
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ 
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+
+ Contact: raronzen@gmail.com
+
+ 
+ History:
+ 2015-01-04 - William Garrido - Ported to MBED and updated to use interrupts.
+ 2013.08.29 - Some small clean-up of code, more sensible variable names etc.
+                Added another example code for multiple buttons in an object array
+ 2013.04.23 - A "minor" debugging: active-high buttons now work (wops)!
+                Thanks goes to John F. H. for pointing that out!
+ 2013.02.17 - Some improvements, simplified click codes.
+				Added a LED fader example. Thanks to Tom K. for the idea.
+ 2012.01.31 - Tiny update for Arduino 1.0
+ 2010.06.15 - First version. Basically just a small OOP programming exercise.
+*/
+
+#include "ClickButton.h"
+
+//DigitalIn _din(PC_13);
+
+ClickButton::ClickButton(uint8_t buttonPin)
+{
+  _pin           = buttonPin;
+  _activeHigh    = 0;           // Assume active-low button
+  _btnState      = !_activeHigh;  // initial button state in active-high logic
+  _lastState     = _btnState;
+  _clickCount    = 0;
+  clicks         = 0;
+  depressed      = false;
+  _lastBounceTime= 0;
+  debounceTime   = 20;            // Debounce timer in ms
+  multiclickTime = 250;           // Time limit for multi clicks
+  longClickTime  = 1000;          // time until long clicks register
+  //_din(_pin); 
+}
+
+
+ClickButton::ClickButton(uint8_t buttonPin, bool activeType)
+{
+  _pin           = buttonPin;
+  _activeHigh    = activeType;
+  _btnState      = !_activeHigh;  // initial button state in active-high logic
+  _lastState     = _btnState;
+  _clickCount    = 0;
+  clicks         = 0;
+  depressed      = false;
+  _lastBounceTime= 0;
+  debounceTime   = 20;            // Debounce timer in ms
+  multiclickTime = 250;           // Time limit for multi clicks
+  longClickTime  = 1000;          // time until long clicks register
+  //_din = new DigitalIn(_pin); 
+}
+
+ClickButton::ClickButton(uint8_t buttonPin, bool activeType, bool internalPullup)
+{
+  _pin           = buttonPin;
+  _activeHigh    = activeType;
+  _btnState      = !_activeHigh;  // initial button state in active-high logic
+  _lastState     = _btnState;
+  _clickCount    = 0;
+  clicks         = 0;
+  depressed      = 0;
+  _lastBounceTime= 0;
+  debounceTime   = 20;            // Debounce timer in ms
+  multiclickTime = 250;           // Time limit for multi clicks
+  longClickTime  = 1000;          // time until "long" click register
+  //_din = new DigitalIn(_pin);
+  // Turn on internal pullup resistor if applicable
+  //if (_activeHigh == 0 && internalPullup == CLICKBTN_PULLUP) _din.mode(PullUp);;
+}
+
+
+
+void ClickButton::Update(unsigned long time, bool state)
+{
+  long now = time;      // get current time
+  _btnState = state;  // current appearant button state
+
+  // Make the button logic active-high in code
+  if (!_activeHigh) _btnState = !_btnState;
+
+  // If the switch changed, due to noise or a button press, reset the debounce timer
+  if (_btnState != _lastState) _lastBounceTime = now;
+
+
+  // debounce the button (Check if a stable, changed state has occured)
+  if (now - _lastBounceTime > debounceTime && _btnState != depressed)
+  {
+    depressed = _btnState;
+    if (depressed) _clickCount++;
+  }
+
+  // If the button released state is stable, report nr of clicks and start new cycle
+  if (!depressed && (now - _lastBounceTime) > multiclickTime)
+  {
+    // positive count for released buttons
+    clicks = _clickCount;
+    _clickCount = 0;
+  }
+
+  // Check for "long click"
+  if (depressed && (now - _lastBounceTime > longClickTime))
+  {
+    // negative count for long clicks
+    clicks = 0 - _clickCount;
+    _clickCount = 0;
+  }
+
+  _lastState = _btnState;
+}
+
diff -r 000000000000 -r 8b9a6e8ca865 ClickButton.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ClickButton.h	Tue May 26 01:52:00 2015 +0000
@@ -0,0 +1,30 @@
+#ifndef ClickButton_H
+#define ClickButton_H
+
+#include "mbed.h"
+
+#define CLICKBTN_PULLUP 1
+
+class ClickButton
+{
+  public:
+    ClickButton(uint8_t buttonPin);
+    ClickButton(uint8_t buttonPin, bool active);
+    ClickButton(uint8_t buttonPin, bool active, bool internalPullup);
+    void Update(unsigned long time, bool state);
+    int clicks;                   // button click counts to return
+    bool depressed;            // the currently debounced button (press) state (presumably it is not sad :)
+    long debounceTime;
+    long multiclickTime;
+    long longClickTime;
+  private:
+    uint8_t _pin;                 // Arduino pin connected to the button
+    bool _activeHigh;          // Type of button: Active-low = 0 or active-high = 1
+    bool _btnState;            // Current appearant button state
+    bool _lastState;           // previous button reading
+    int _clickCount;              // Number of button clicks within multiclickTime milliseconds
+    long _lastBounceTime;         // the last time the button input pin was toggled, due to noise or a press
+};
+
+#endif
+