Ported from Arduino Library - https://code.google.com/p/clickbutton/
Revision 0:8b9a6e8ca865, committed 2015-05-26
- 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 +