diff --git a/button.cpp b/button.cpp index 4787e80..a9813f8 100644 --- a/button.cpp +++ b/button.cpp @@ -1,11 +1,11 @@ /*----------------------------------------------------------------------* - * Button.cpp -- 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, or at least * - * very frequently. * + * Arduino Button Library v1.0 * + * Jack Christensen Mar 2012 * * * - * Jack Christensen 11May2011 * + * 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, * @@ -13,23 +13,30 @@ * letter to Creative Commons, 171 Second Street, Suite 300, * * San Francisco, California, 94105, USA. * *----------------------------------------------------------------------*/ -#include "button.h" -//the constructor button(pin, puEnabled, invert, dbTime) instantiates a button object. -//pin is the Arduino pin the button is connected to. -//puEnabled enables the AVR internal pullup resistor if != 0 (can use true or false). -//invert = 0 interprets a high state as pressed, low as released. -//invert != 0 interprets a high state as released, low as pressed (can use true or false). -//dbTime is the debounce time in milliseconds. -//note that invert cannot be implied from puEnabled since an external pullup could be used. -button::button(uint8_t pin, uint8_t puEnabled, uint8_t invert, uint32_t dbTime) +#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; - _puEnabled = puEnabled; + _puEnable = puEnable; _invert = invert; _dbTime = dbTime; pinMode(_pin, INPUT); - if (_puEnabled != 0) + if (_puEnable != 0) digitalWrite(_pin, HIGH); //enable pullup resistor _state = digitalRead(_pin); if (_invert != 0) _state = !_state; @@ -40,9 +47,11 @@ button::button(uint8_t pin, uint8_t puEnabled, uint8_t invert, uint32_t dbTime) _lastChange = _time; } -//read() returns the state of the button 1 (pressed), or 0 (released), -//does debouncing, and also captures and maintains times, previous states, etc. -uint8_t button::read(void) +/*----------------------------------------------------------------------* + * 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; @@ -72,47 +81,58 @@ uint8_t button::read(void) } } -//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) +/*----------------------------------------------------------------------* + * 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) +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) +/*----------------------------------------------------------------------* + * 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) +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. Returns false (0) or true (1) accordingly. -//These functions do not cause the button to be read. -uint8_t button::pressedFor(uint32_t ms) +/*----------------------------------------------------------------------* + * 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) +uint8_t Button::releasedFor(uint32_t ms) { return (_state == 0 && _time - _lastChange >= ms) ? 1 : 0; } -//lastChange() returns the time of the last state change in milliseconds. -uint32_t button::lastChange(void) +/*----------------------------------------------------------------------* + * 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 index 1836065..bcfa088 100644 --- a/button.h +++ b/button.h @@ -1,8 +1,8 @@ /*----------------------------------------------------------------------* - * button.h -- Library for reading momentary contact switches like * - * tactile button switches. * - * * - * Jack Christensen 11 May 2011 * + * button.h -- Library for reading momentary contact switches like * + * tactile button switches. * + * * + * Jack Christensen 11 May 2011 * * * * This work is licensed under the Creative Commons Attribution- * * ShareAlike 3.0 Unported License. To view a copy of this license, * @@ -10,31 +10,36 @@ * letter to Creative Commons, 171 Second Street, Suite 300, * * San Francisco, California, 94105, USA. * *----------------------------------------------------------------------*/ -#ifndef button_h -#define button_h -#include "WProgram.h" -class button +#ifndef Button_h +#define Button_h +#if ARDUINO >= 100 +#include +#else +#include +#endif +class Button { - public: - button(uint8_t pin, uint8_t puEnabled, 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 _puEnabled; //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 + 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 diff --git a/keywords.txt b/keywords.txt index 3e2c026..1f85580 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,9 +1,9 @@ -button KEYWORD1 -read KEYWORD2 -isPressed KEYWORD2 -isReleased KEYWORD2 -wasPressed KEYWORD2 -wasReleased KEYWORD2 -pressedFor KEYWORD2 -releasedFor KEYWORD2 -lastChange KEYWORD2 \ No newline at end of file +Button KEYWORD1 +read KEYWORD2 +isPressed KEYWORD2 +isReleased KEYWORD2 +wasPressed KEYWORD2 +wasReleased KEYWORD2 +pressedFor KEYWORD2 +releasedFor KEYWORD2 +lastChange KEYWORD2 \ No newline at end of file