Button class with auto repeat function.

Committer:
vargham
Date:
Sat May 13 18:15:11 2017 +0000
Revision:
3:03aea89f2a5c
Parent:
2:97ef12e06605
Child:
4:d54859273629
Added Callback.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vargham 3:03aea89f2a5c 1 /**
vargham 3:03aea89f2a5c 2 * @file Button.h
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 #ifndef BUTTON_H_INCLUDED
vargham 0:a39041955963 22 #define BUTTON_H_INCLUDED
vargham 0:a39041955963 23
vargham 0:a39041955963 24 #include "mbed.h"
vargham 0:a39041955963 25
vargham 0:a39041955963 26 enum ButtonEvent
vargham 0:a39041955963 27 {
vargham 2:97ef12e06605 28 BUTTON_UNKNOWN = 0, BUTTON_DOWN, BUTTON_UP, BUTTON_PRESS, BUTTON_LONG_PRESS
vargham 0:a39041955963 29 };
vargham 0:a39041955963 30
vargham 0:a39041955963 31 class Button
vargham 0:a39041955963 32 {
vargham 0:a39041955963 33 public:
vargham 3:03aea89f2a5c 34 Button(PinName pinName, PinMode pinMode, int activeState, Callback<void(ButtonEvent, PinName)> onButtonEvent = 0, uint16_t autoRepeatTime = 0, uint16_t longPressTime = 600, uint16_t shortPressTime = 30)
vargham 0:a39041955963 35 : _pinName(pinName)
vargham 0:a39041955963 36 , _in(pinName)
vargham 0:a39041955963 37 , _shortPressTime(shortPressTime)
vargham 0:a39041955963 38 , _longPressTime(longPressTime)
vargham 0:a39041955963 39 , _autoRepeatTime(autoRepeatTime)
vargham 0:a39041955963 40 , _activeState(activeState)
vargham 0:a39041955963 41 , _prevState(0)
vargham 0:a39041955963 42 , _fireUpDown(false)
vargham 0:a39041955963 43 , _onButtonEvent(onButtonEvent)
vargham 0:a39041955963 44 {
vargham 0:a39041955963 45 _in.mode(pinMode);
vargham 0:a39041955963 46 _in.rise(Callback<void()>(this, &Button::isrRise));
vargham 0:a39041955963 47 _in.fall(Callback<void()>(this, &Button::isrFall));
vargham 0:a39041955963 48 };
vargham 1:3385a1ea4a7d 49 inline void setAutoRepeatTime_ms(uint16_t autoRepeatTime)
vargham 0:a39041955963 50 {
vargham 0:a39041955963 51 _autoRepeatTime = autoRepeatTime;
vargham 0:a39041955963 52 };
vargham 1:3385a1ea4a7d 53 inline uint16_t getAutoRepeatTime_ms() const
vargham 0:a39041955963 54 {
vargham 0:a39041955963 55 return _autoRepeatTime;
vargham 0:a39041955963 56 }
vargham 0:a39041955963 57 inline int read()
vargham 0:a39041955963 58 {
vargham 0:a39041955963 59 return _in.read() == _activeState;
vargham 0:a39041955963 60 };
vargham 0:a39041955963 61 operator int()
vargham 0:a39041955963 62 {
vargham 0:a39041955963 63 return read();
vargham 0:a39041955963 64 };
vargham 0:a39041955963 65 void setFireUpDown(bool fire)
vargham 0:a39041955963 66 {
vargham 0:a39041955963 67 _fireUpDown = fire;
vargham 0:a39041955963 68 };
vargham 1:3385a1ea4a7d 69 inline bool isFireUpDown() const
vargham 1:3385a1ea4a7d 70 {
vargham 1:3385a1ea4a7d 71 return _fireUpDown;
vargham 1:3385a1ea4a7d 72 };
vargham 1:3385a1ea4a7d 73 void setShortPressTime_ms(uint16_t time_ms)
vargham 1:3385a1ea4a7d 74 {
vargham 1:3385a1ea4a7d 75 _shortPressTime = time_ms;
vargham 1:3385a1ea4a7d 76 };
vargham 1:3385a1ea4a7d 77 inline uint16_t getShortPressTime_ms() const
vargham 1:3385a1ea4a7d 78 {
vargham 1:3385a1ea4a7d 79 return _shortPressTime;
vargham 1:3385a1ea4a7d 80 };
vargham 1:3385a1ea4a7d 81 void setLongPressTime_ms(uint16_t time_ms)
vargham 1:3385a1ea4a7d 82 {
vargham 1:3385a1ea4a7d 83 _longPressTime = time_ms;
vargham 1:3385a1ea4a7d 84 };
vargham 1:3385a1ea4a7d 85 inline uint16_t getLongPressTime_ms() const
vargham 1:3385a1ea4a7d 86 {
vargham 1:3385a1ea4a7d 87 return _longPressTime;
vargham 1:3385a1ea4a7d 88 };
vargham 3:03aea89f2a5c 89 void attach(Callback<void(ButtonEvent, PinName)> onButtonEvent)
vargham 1:3385a1ea4a7d 90 {
vargham 1:3385a1ea4a7d 91 _onButtonEvent = onButtonEvent;
vargham 1:3385a1ea4a7d 92 };
vargham 1:3385a1ea4a7d 93 void detach()
vargham 1:3385a1ea4a7d 94 {
vargham 3:03aea89f2a5c 95 _onButtonEvent = 0;
vargham 1:3385a1ea4a7d 96 };
vargham 0:a39041955963 97 private:
vargham 0:a39041955963 98 PinName _pinName;
vargham 0:a39041955963 99 InterruptIn _in;
vargham 0:a39041955963 100 Timer _timer;
vargham 0:a39041955963 101 Ticker _tickerAutoRepeat;
vargham 0:a39041955963 102 Timeout _autoRepeatStarter;
vargham 0:a39041955963 103 uint16_t _shortPressTime;
vargham 0:a39041955963 104 uint16_t _longPressTime;
vargham 1:3385a1ea4a7d 105 uint16_t _autoRepeatTime;
vargham 0:a39041955963 106 int _activeState;
vargham 0:a39041955963 107 int _prevState;
vargham 0:a39041955963 108 bool _fireUpDown;
vargham 3:03aea89f2a5c 109 Callback<void(ButtonEvent, PinName)> _onButtonEvent;
vargham 0:a39041955963 110 void isrFall(void);
vargham 0:a39041955963 111 void isrRise(void);
vargham 0:a39041955963 112 void onPress(void);
vargham 0:a39041955963 113 void onRelease(void);
vargham 0:a39041955963 114 void autoRepeat(void);
vargham 0:a39041955963 115 void startAutoRepeat(void);
vargham 0:a39041955963 116 };
vargham 0:a39041955963 117
vargham 0:a39041955963 118 #endif /* BUTTON_H_INCLUDED */