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

Revision:
0:8b9a6e8ca865
--- /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;
+}
+