Button class with auto repeat function.
Button.h@2:97ef12e06605, 2017-03-16 (annotated)
- Committer:
- vargham
- Date:
- Thu Mar 16 13:49:03 2017 +0000
- Revision:
- 2:97ef12e06605
- Parent:
- 1:3385a1ea4a7d
- Child:
- 3:03aea89f2a5c
Added BUTTON_UNKNOWN = 0 event type.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vargham | 0:a39041955963 | 1 | #ifndef BUTTON_H_INCLUDED |
vargham | 0:a39041955963 | 2 | #define BUTTON_H_INCLUDED |
vargham | 0:a39041955963 | 3 | |
vargham | 0:a39041955963 | 4 | #include "mbed.h" |
vargham | 0:a39041955963 | 5 | |
vargham | 0:a39041955963 | 6 | enum ButtonEvent |
vargham | 0:a39041955963 | 7 | { |
vargham | 2:97ef12e06605 | 8 | BUTTON_UNKNOWN = 0, BUTTON_DOWN, BUTTON_UP, BUTTON_PRESS, BUTTON_LONG_PRESS |
vargham | 0:a39041955963 | 9 | }; |
vargham | 0:a39041955963 | 10 | |
vargham | 0:a39041955963 | 11 | class Button |
vargham | 0:a39041955963 | 12 | { |
vargham | 0:a39041955963 | 13 | public: |
vargham | 1:3385a1ea4a7d | 14 | Button(PinName pinName, PinMode pinMode, int activeState, void(*onButtonEvent)(ButtonEvent event, PinName pinName) = NULL, uint16_t autoRepeatTime = 0, uint16_t longPressTime = 600, uint16_t shortPressTime = 30) |
vargham | 0:a39041955963 | 15 | : _pinName(pinName) |
vargham | 0:a39041955963 | 16 | , _in(pinName) |
vargham | 0:a39041955963 | 17 | , _shortPressTime(shortPressTime) |
vargham | 0:a39041955963 | 18 | , _longPressTime(longPressTime) |
vargham | 0:a39041955963 | 19 | , _autoRepeatTime(autoRepeatTime) |
vargham | 0:a39041955963 | 20 | , _activeState(activeState) |
vargham | 0:a39041955963 | 21 | , _prevState(0) |
vargham | 0:a39041955963 | 22 | , _fireUpDown(false) |
vargham | 0:a39041955963 | 23 | , _onButtonEvent(onButtonEvent) |
vargham | 0:a39041955963 | 24 | { |
vargham | 0:a39041955963 | 25 | _in.mode(pinMode); |
vargham | 0:a39041955963 | 26 | _in.rise(Callback<void()>(this, &Button::isrRise)); |
vargham | 0:a39041955963 | 27 | _in.fall(Callback<void()>(this, &Button::isrFall)); |
vargham | 0:a39041955963 | 28 | }; |
vargham | 1:3385a1ea4a7d | 29 | inline void setAutoRepeatTime_ms(uint16_t autoRepeatTime) |
vargham | 0:a39041955963 | 30 | { |
vargham | 0:a39041955963 | 31 | _autoRepeatTime = autoRepeatTime; |
vargham | 0:a39041955963 | 32 | }; |
vargham | 1:3385a1ea4a7d | 33 | inline uint16_t getAutoRepeatTime_ms() const |
vargham | 0:a39041955963 | 34 | { |
vargham | 0:a39041955963 | 35 | return _autoRepeatTime; |
vargham | 0:a39041955963 | 36 | } |
vargham | 0:a39041955963 | 37 | inline int read() |
vargham | 0:a39041955963 | 38 | { |
vargham | 0:a39041955963 | 39 | return _in.read() == _activeState; |
vargham | 0:a39041955963 | 40 | }; |
vargham | 0:a39041955963 | 41 | operator int() |
vargham | 0:a39041955963 | 42 | { |
vargham | 0:a39041955963 | 43 | return read(); |
vargham | 0:a39041955963 | 44 | }; |
vargham | 0:a39041955963 | 45 | void setFireUpDown(bool fire) |
vargham | 0:a39041955963 | 46 | { |
vargham | 0:a39041955963 | 47 | _fireUpDown = fire; |
vargham | 0:a39041955963 | 48 | }; |
vargham | 1:3385a1ea4a7d | 49 | inline bool isFireUpDown() const |
vargham | 1:3385a1ea4a7d | 50 | { |
vargham | 1:3385a1ea4a7d | 51 | return _fireUpDown; |
vargham | 1:3385a1ea4a7d | 52 | }; |
vargham | 1:3385a1ea4a7d | 53 | void setShortPressTime_ms(uint16_t time_ms) |
vargham | 1:3385a1ea4a7d | 54 | { |
vargham | 1:3385a1ea4a7d | 55 | _shortPressTime = time_ms; |
vargham | 1:3385a1ea4a7d | 56 | }; |
vargham | 1:3385a1ea4a7d | 57 | inline uint16_t getShortPressTime_ms() const |
vargham | 1:3385a1ea4a7d | 58 | { |
vargham | 1:3385a1ea4a7d | 59 | return _shortPressTime; |
vargham | 1:3385a1ea4a7d | 60 | }; |
vargham | 1:3385a1ea4a7d | 61 | void setLongPressTime_ms(uint16_t time_ms) |
vargham | 1:3385a1ea4a7d | 62 | { |
vargham | 1:3385a1ea4a7d | 63 | _longPressTime = time_ms; |
vargham | 1:3385a1ea4a7d | 64 | }; |
vargham | 1:3385a1ea4a7d | 65 | inline uint16_t getLongPressTime_ms() const |
vargham | 1:3385a1ea4a7d | 66 | { |
vargham | 1:3385a1ea4a7d | 67 | return _longPressTime; |
vargham | 1:3385a1ea4a7d | 68 | }; |
vargham | 1:3385a1ea4a7d | 69 | void attach(void(*onButtonEvent)(ButtonEvent event, PinName pinName)) |
vargham | 1:3385a1ea4a7d | 70 | { |
vargham | 1:3385a1ea4a7d | 71 | _onButtonEvent = onButtonEvent; |
vargham | 1:3385a1ea4a7d | 72 | }; |
vargham | 1:3385a1ea4a7d | 73 | void detach() |
vargham | 1:3385a1ea4a7d | 74 | { |
vargham | 1:3385a1ea4a7d | 75 | _onButtonEvent = NULL; |
vargham | 1:3385a1ea4a7d | 76 | }; |
vargham | 0:a39041955963 | 77 | private: |
vargham | 0:a39041955963 | 78 | PinName _pinName; |
vargham | 0:a39041955963 | 79 | InterruptIn _in; |
vargham | 0:a39041955963 | 80 | Timer _timer; |
vargham | 0:a39041955963 | 81 | Ticker _tickerAutoRepeat; |
vargham | 0:a39041955963 | 82 | Timeout _autoRepeatStarter; |
vargham | 0:a39041955963 | 83 | uint16_t _shortPressTime; |
vargham | 0:a39041955963 | 84 | uint16_t _longPressTime; |
vargham | 1:3385a1ea4a7d | 85 | uint16_t _autoRepeatTime; |
vargham | 0:a39041955963 | 86 | int _activeState; |
vargham | 0:a39041955963 | 87 | int _prevState; |
vargham | 0:a39041955963 | 88 | bool _fireUpDown; |
vargham | 0:a39041955963 | 89 | void(*_onButtonEvent)(ButtonEvent event, PinName pinName); |
vargham | 0:a39041955963 | 90 | void isrFall(void); |
vargham | 0:a39041955963 | 91 | void isrRise(void); |
vargham | 0:a39041955963 | 92 | void onPress(void); |
vargham | 0:a39041955963 | 93 | void onRelease(void); |
vargham | 0:a39041955963 | 94 | void autoRepeat(void); |
vargham | 0:a39041955963 | 95 | void startAutoRepeat(void); |
vargham | 0:a39041955963 | 96 | }; |
vargham | 0:a39041955963 | 97 | |
vargham | 0:a39041955963 | 98 | #endif /* BUTTON_H_INCLUDED */ |