Ported from Arduino Library - https://code.google.com/p/clickbutton/
ClickButton.cpp
- Committer:
- MobileWill
- Date:
- 2015-05-26
- Revision:
- 0:8b9a6e8ca865
File content as of revision 0:8b9a6e8ca865:
/* 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; }