From bc98c94c539ebe96a511086521386c9674a3dbf4 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Fri, 23 Mar 2012 17:02:31 -0400 Subject: [PATCH] sync filenames case --- Button.cpp | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Button.h | 43 +++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 Button.cpp create mode 100644 Button.h diff --git a/Button.cpp b/Button.cpp new file mode 100644 index 0000000..98df134 --- /dev/null +++ b/Button.cpp @@ -0,0 +1,138 @@ +/*----------------------------------------------------------------------* + * Arduino Button Library v1.0 * + * Jack Christensen May 2011, published Mar 2012 * + * * + * Library for reading momentary contact switches like tactile button * + * switches. Intended for use in state machine constructs. * + * Use the read() function to read all buttons in the main loop, * + * which should execute as fast as possible. * + * * + * This work is licensed under the Creative Commons Attribution- * + * ShareAlike 3.0 Unported License. To view a copy of this license, * + * visit http://creativecommons.org/licenses/by-sa/3.0/ or send a * + * letter to Creative Commons, 171 Second Street, Suite 300, * + * San Francisco, California, 94105, USA. * + *----------------------------------------------------------------------*/ + +#include "Button.h" + +/*----------------------------------------------------------------------* + * Button(pin, puEnable, invert, dbTime) instantiates a button object. * + * pin Is the Arduino pin the button is connected to. * + * puEnable Enables the AVR internal pullup resistor if != 0 (can also * + * use true or false). * + * invert If invert == 0, interprets a high state as pressed, low as * + * released. If invert != 0, interprets a high state as * + * released, low as pressed (can also use true or false). * + * dbTime Is the debounce time in milliseconds. * + * * + * (Note that invert cannot be implied from puEnable since an external * + * pullup could be used.) * + *----------------------------------------------------------------------*/ +Button::Button(uint8_t pin, uint8_t puEnable, uint8_t invert, uint32_t dbTime) +{ + _pin = pin; + _puEnable = puEnable; + _invert = invert; + _dbTime = dbTime; + pinMode(_pin, INPUT); + if (_puEnable != 0) + digitalWrite(_pin, HIGH); //enable pullup resistor + _state = digitalRead(_pin); + if (_invert != 0) _state = !_state; + _time = millis(); + _lastState = _state; + _changed = 0; + _lastTime = _time; + _lastChange = _time; +} + +/*----------------------------------------------------------------------* + * read() returns the state of the button, 1==pressed, 0==released, * + * does debouncing, captures and maintains times, previous states, etc. * + *----------------------------------------------------------------------*/ +uint8_t Button::read(void) +{ + static uint32_t ms; + static uint8_t pinVal; + + ms = millis(); + pinVal = digitalRead(_pin); + if (_invert != 0) pinVal = !pinVal; + if (ms < _lastChange + _dbTime) { + _lastTime = _time; + _time = ms; + _changed = 0; + return _state; + } + else { + _lastTime = _time; + _lastState = _state; + _state = pinVal; + _time = ms; + if (_state != _lastState) { + _lastChange = ms; + _changed = 1; + } + else { + _changed = 0; + } + return _state; + } +} + +/*----------------------------------------------------------------------* + * isPressed() and isReleased() check the button state when it was last * + * read, and return false (0) or true (!=0) accordingly. * + * These functions do not cause the button to be read. * + *----------------------------------------------------------------------*/ +uint8_t Button::isPressed(void) +{ + return _state == 0 ? 0 : 1; +} + +uint8_t Button::isReleased(void) +{ + return _state == 0 ? 1 : 0; +} + +/*----------------------------------------------------------------------* + * wasPressed() and wasReleased() check the button state to see if it * + * changed between the last two reads and return false (0) or * + * true (!=0) accordingly. * + * These functions do not cause the button to be read. * + *----------------------------------------------------------------------*/ +uint8_t Button::wasPressed(void) +{ + return _state && _changed; +} + +uint8_t Button::wasReleased(void) +{ + return !_state && _changed; +} + +/*----------------------------------------------------------------------* + * pressedFor(ms) and releasedFor(ms) check to see if the button is * + * pressed (or released), and has been in that state for the specified * + * time in milliseconds. Returns false (0) or true (1) accordingly. * + * These functions do not cause the button to be read. * + *----------------------------------------------------------------------*/ +uint8_t Button::pressedFor(uint32_t ms) +{ + return (_state == 1 && _time - _lastChange >= ms) ? 1 : 0; +} + +uint8_t Button::releasedFor(uint32_t ms) +{ + return (_state == 0 && _time - _lastChange >= ms) ? 1 : 0; +} + +/*----------------------------------------------------------------------* + * lastChange() returns the time the button last changed state, * + * in milliseconds. * + *----------------------------------------------------------------------*/ +uint32_t Button::lastChange(void) +{ + return _lastChange; +} diff --git a/Button.h b/Button.h new file mode 100644 index 0000000..0eb8687 --- /dev/null +++ b/Button.h @@ -0,0 +1,43 @@ +/*----------------------------------------------------------------------* + * Arduino Button Library v1.0 * + * Jack Christensen Mar 2012 * + * * + * This work is licensed under the Creative Commons Attribution- * + * ShareAlike 3.0 Unported License. To view a copy of this license, * + * visit http://creativecommons.org/licenses/by-sa/3.0/ or send a * + * letter to Creative Commons, 171 Second Street, Suite 300, * + * San Francisco, California, 94105, USA. * + *----------------------------------------------------------------------*/ +#ifndef Button_h +#define Button_h +#if ARDUINO >= 100 +#include +#else +#include +#endif +class Button +{ + public: + Button(uint8_t pin, uint8_t puEnable, uint8_t invert, uint32_t dbTime); + uint8_t read(); + uint8_t isPressed(); + uint8_t isReleased(); + uint8_t wasPressed(); + uint8_t wasReleased(); + uint8_t pressedFor(uint32_t ms); + uint8_t releasedFor(uint32_t ms); + uint32_t lastChange(); + + private: + uint8_t _pin; //arduino pin number + uint8_t _puEnable; //internal pullup resistor enabled + uint8_t _invert; //if 0, interpret high state as pressed, else interpret low state as pressed + uint8_t _state; //current button state + uint8_t _lastState; //previous button state + uint8_t _changed; //state changed since last read + uint32_t _time; //time of current state (all times are in ms) + uint32_t _lastTime; //time of previous state + uint32_t _lastChange; //time of last state change + uint32_t _dbTime; //debounce time +}; +#endif \ No newline at end of file