Button class with auto repeat function.
Button.h
- Committer:
- vargham
- Date:
- 2017-02-14
- Revision:
- 0:a39041955963
- Child:
- 1:3385a1ea4a7d
File content as of revision 0:a39041955963:
#ifndef BUTTON_H_INCLUDED #define BUTTON_H_INCLUDED #include "mbed.h" enum ButtonEvent { BUTTON_DOWN = 0, BUTTON_UP, BUTTON_PRESS, BUTTON_LONG_PRESS }; class Button { public: Button(PinName pinName, PinMode pinMode, int activeState, void(*onButtonEvent)(ButtonEvent event, PinName pinName), float autoRepeatTime = 0, uint16_t longPressTime = 600, uint16_t shortPressTime = 30) : _pinName(pinName) , _in(pinName) , _shortPressTime(shortPressTime) , _longPressTime(longPressTime) , _autoRepeatTime(autoRepeatTime) , _activeState(activeState) , _prevState(0) , _fireUpDown(false) , _onButtonEvent(onButtonEvent) { _in.mode(pinMode); _in.rise(Callback<void()>(this, &Button::isrRise)); _in.fall(Callback<void()>(this, &Button::isrFall)); }; inline void setAutoRepeat(float autoRepeatTime) { _autoRepeatTime = autoRepeatTime; }; inline float getAutoRepeat() const { return _autoRepeatTime; } inline int read() { return _in.read() == _activeState; }; operator int() { return read(); }; void setFireUpDown(bool fire) { _fireUpDown = fire; }; private: PinName _pinName; InterruptIn _in; Timer _timer; Ticker _tickerAutoRepeat; Timeout _autoRepeatStarter; uint16_t _shortPressTime; uint16_t _longPressTime; float _autoRepeatTime; int _activeState; int _prevState; bool _fireUpDown; void(*_onButtonEvent)(ButtonEvent event, PinName pinName); void isrFall(void); void isrRise(void); void onPress(void); void onRelease(void); void autoRepeat(void); void startAutoRepeat(void); }; #endif /* BUTTON_H_INCLUDED */