Button class with auto repeat function.
Button.cpp@5:faff91d60ae3, 2017-07-14 (annotated)
- Committer:
- vargham
- Date:
- Fri Jul 14 18:38:31 2017 +0000
- Revision:
- 5:faff91d60ae3
- Parent:
- 4:d54859273629
Auto enable interrupt.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
vargham | 3:03aea89f2a5c | 1 | /** |
vargham | 3:03aea89f2a5c | 2 | * @file Button.cpp |
vargham | 3:03aea89f2a5c | 3 | * @brief Button library |
vargham | 3:03aea89f2a5c | 4 | * @author Mark Peter Vargha, vmp@varghamarkpeter.hu |
vargham | 3:03aea89f2a5c | 5 | * |
vargham | 3:03aea89f2a5c | 6 | * Copyright (c) 2017 |
vargham | 3:03aea89f2a5c | 7 | * |
vargham | 3:03aea89f2a5c | 8 | * Licensed under the Apache License, Version 2.0 (the "License"); |
vargham | 3:03aea89f2a5c | 9 | * you may not use this file except in compliance with the License. |
vargham | 3:03aea89f2a5c | 10 | * You may obtain a copy of the License at |
vargham | 3:03aea89f2a5c | 11 | * |
vargham | 3:03aea89f2a5c | 12 | * http://www.apache.org/licenses/LICENSE-2.0 |
vargham | 3:03aea89f2a5c | 13 | * |
vargham | 3:03aea89f2a5c | 14 | * Unless required by applicable law or agreed to in writing, software |
vargham | 3:03aea89f2a5c | 15 | * distributed under the License is distributed on an "AS IS" BASIS, |
vargham | 3:03aea89f2a5c | 16 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
vargham | 3:03aea89f2a5c | 17 | * See the License for the specific language governing permissions and |
vargham | 3:03aea89f2a5c | 18 | * limitations under the License. |
vargham | 3:03aea89f2a5c | 19 | */ |
vargham | 3:03aea89f2a5c | 20 | |
vargham | 0:a39041955963 | 21 | #include "Button.h" |
vargham | 0:a39041955963 | 22 | |
vargham | 4:d54859273629 | 23 | void Button::startInterrupt() |
vargham | 4:d54859273629 | 24 | { |
vargham | 4:d54859273629 | 25 | _in.rise(Callback<void()>(this, &Button::isrRise)); |
vargham | 4:d54859273629 | 26 | _in.fall(Callback<void()>(this, &Button::isrFall)); |
vargham | 4:d54859273629 | 27 | } |
vargham | 4:d54859273629 | 28 | |
vargham | 4:d54859273629 | 29 | void Button::stopInterrupt() |
vargham | 4:d54859273629 | 30 | { |
vargham | 4:d54859273629 | 31 | _in.rise(NULL); |
vargham | 4:d54859273629 | 32 | _in.fall(NULL); |
vargham | 4:d54859273629 | 33 | } |
vargham | 4:d54859273629 | 34 | |
vargham | 0:a39041955963 | 35 | void Button::isrFall(void) |
vargham | 0:a39041955963 | 36 | { |
vargham | 0:a39041955963 | 37 | if (_activeState == 0) onPress(); |
vargham | 0:a39041955963 | 38 | else onRelease(); |
vargham | 0:a39041955963 | 39 | } |
vargham | 0:a39041955963 | 40 | |
vargham | 0:a39041955963 | 41 | void Button::isrRise(void) |
vargham | 0:a39041955963 | 42 | { |
vargham | 0:a39041955963 | 43 | if (_activeState == 0) onRelease(); |
vargham | 0:a39041955963 | 44 | else onPress(); |
vargham | 0:a39041955963 | 45 | } |
vargham | 0:a39041955963 | 46 | |
vargham | 0:a39041955963 | 47 | void Button::onPress(void) |
vargham | 0:a39041955963 | 48 | { |
vargham | 0:a39041955963 | 49 | _timer.reset(); |
vargham | 0:a39041955963 | 50 | if (_prevState == 0) //First |
vargham | 0:a39041955963 | 51 | { |
vargham | 0:a39041955963 | 52 | _timer.start(); |
vargham | 3:03aea89f2a5c | 53 | if (_fireUpDown && _onButtonEvent) _onButtonEvent(BUTTON_DOWN, _pinName); |
vargham | 0:a39041955963 | 54 | } |
vargham | 0:a39041955963 | 55 | _autoRepeatStarter.detach(); |
vargham | 0:a39041955963 | 56 | if (_autoRepeatTime > 0) _autoRepeatStarter.attach(Callback<void()>(this, &Button::startAutoRepeat), (_longPressTime / 1000.0f)); |
vargham | 0:a39041955963 | 57 | _prevState = 1; |
vargham | 0:a39041955963 | 58 | } |
vargham | 0:a39041955963 | 59 | |
vargham | 0:a39041955963 | 60 | void Button::onRelease(void) |
vargham | 0:a39041955963 | 61 | { |
vargham | 0:a39041955963 | 62 | _timer.stop(); |
vargham | 0:a39041955963 | 63 | _tickerAutoRepeat.detach(); |
vargham | 0:a39041955963 | 64 | _autoRepeatStarter.detach(); |
vargham | 3:03aea89f2a5c | 65 | if (_fireUpDown && _onButtonEvent) _onButtonEvent(BUTTON_UP, _pinName); |
vargham | 3:03aea89f2a5c | 66 | if (_prevState == 1 && _onButtonEvent) |
vargham | 0:a39041955963 | 67 | { |
vargham | 0:a39041955963 | 68 | if (_timer.read_ms() >= _longPressTime) //Long press |
vargham | 0:a39041955963 | 69 | { |
vargham | 0:a39041955963 | 70 | _onButtonEvent(BUTTON_LONG_PRESS, _pinName); |
vargham | 0:a39041955963 | 71 | } |
vargham | 0:a39041955963 | 72 | else if (_timer.read_ms() >= _shortPressTime) //Short press |
vargham | 0:a39041955963 | 73 | { |
vargham | 0:a39041955963 | 74 | _onButtonEvent(BUTTON_PRESS, _pinName); |
vargham | 0:a39041955963 | 75 | } |
vargham | 0:a39041955963 | 76 | } |
vargham | 0:a39041955963 | 77 | _prevState = 0; |
vargham | 0:a39041955963 | 78 | _timer.reset(); |
vargham | 0:a39041955963 | 79 | } |
vargham | 0:a39041955963 | 80 | |
vargham | 0:a39041955963 | 81 | void Button::startAutoRepeat(void) |
vargham | 0:a39041955963 | 82 | { |
vargham | 0:a39041955963 | 83 | _tickerAutoRepeat.detach(); |
vargham | 1:3385a1ea4a7d | 84 | if (_autoRepeatTime > 0) _tickerAutoRepeat.attach(Callback<void()>(this, &Button::autoRepeat), (_autoRepeatTime / 1000.0f)); |
vargham | 0:a39041955963 | 85 | } |
vargham | 0:a39041955963 | 86 | |
vargham | 0:a39041955963 | 87 | void Button::autoRepeat(void) |
vargham | 0:a39041955963 | 88 | { |
vargham | 3:03aea89f2a5c | 89 | if (_onButtonEvent) _onButtonEvent(BUTTON_PRESS, _pinName); |
vargham | 0:a39041955963 | 90 | } |