Button class with auto repeat function.

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?

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 5:faff91d60ae3 46 startInterrupt();
vargham 0:a39041955963 47 };
vargham 4:d54859273629 48 void startInterrupt();
vargham 4:d54859273629 49 void stopInterrupt();
vargham 1:3385a1ea4a7d 50 inline void setAutoRepeatTime_ms(uint16_t autoRepeatTime)
vargham 0:a39041955963 51 {
vargham 0:a39041955963 52 _autoRepeatTime = autoRepeatTime;
vargham 0:a39041955963 53 };
vargham 1:3385a1ea4a7d 54 inline uint16_t getAutoRepeatTime_ms() const
vargham 0:a39041955963 55 {
vargham 0:a39041955963 56 return _autoRepeatTime;
vargham 0:a39041955963 57 }
vargham 0:a39041955963 58 inline int read()
vargham 0:a39041955963 59 {
vargham 0:a39041955963 60 return _in.read() == _activeState;
vargham 0:a39041955963 61 };
vargham 0:a39041955963 62 operator int()
vargham 0:a39041955963 63 {
vargham 0:a39041955963 64 return read();
vargham 0:a39041955963 65 };
vargham 0:a39041955963 66 void setFireUpDown(bool fire)
vargham 0:a39041955963 67 {
vargham 0:a39041955963 68 _fireUpDown = fire;
vargham 0:a39041955963 69 };
vargham 1:3385a1ea4a7d 70 inline bool isFireUpDown() const
vargham 1:3385a1ea4a7d 71 {
vargham 1:3385a1ea4a7d 72 return _fireUpDown;
vargham 1:3385a1ea4a7d 73 };
vargham 1:3385a1ea4a7d 74 void setShortPressTime_ms(uint16_t time_ms)
vargham 1:3385a1ea4a7d 75 {
vargham 1:3385a1ea4a7d 76 _shortPressTime = time_ms;
vargham 1:3385a1ea4a7d 77 };
vargham 1:3385a1ea4a7d 78 inline uint16_t getShortPressTime_ms() const
vargham 1:3385a1ea4a7d 79 {
vargham 1:3385a1ea4a7d 80 return _shortPressTime;
vargham 1:3385a1ea4a7d 81 };
vargham 1:3385a1ea4a7d 82 void setLongPressTime_ms(uint16_t time_ms)
vargham 1:3385a1ea4a7d 83 {
vargham 1:3385a1ea4a7d 84 _longPressTime = time_ms;
vargham 1:3385a1ea4a7d 85 };
vargham 1:3385a1ea4a7d 86 inline uint16_t getLongPressTime_ms() const
vargham 1:3385a1ea4a7d 87 {
vargham 1:3385a1ea4a7d 88 return _longPressTime;
vargham 1:3385a1ea4a7d 89 };
vargham 3:03aea89f2a5c 90 void attach(Callback<void(ButtonEvent, PinName)> onButtonEvent)
vargham 1:3385a1ea4a7d 91 {
vargham 1:3385a1ea4a7d 92 _onButtonEvent = onButtonEvent;
vargham 1:3385a1ea4a7d 93 };
vargham 1:3385a1ea4a7d 94 void detach()
vargham 1:3385a1ea4a7d 95 {
vargham 3:03aea89f2a5c 96 _onButtonEvent = 0;
vargham 1:3385a1ea4a7d 97 };
vargham 0:a39041955963 98 private:
vargham 0:a39041955963 99 PinName _pinName;
vargham 0:a39041955963 100 InterruptIn _in;
vargham 0:a39041955963 101 Timer _timer;
vargham 0:a39041955963 102 Ticker _tickerAutoRepeat;
vargham 0:a39041955963 103 Timeout _autoRepeatStarter;
vargham 0:a39041955963 104 uint16_t _shortPressTime;
vargham 0:a39041955963 105 uint16_t _longPressTime;
vargham 1:3385a1ea4a7d 106 uint16_t _autoRepeatTime;
vargham 0:a39041955963 107 int _activeState;
vargham 0:a39041955963 108 int _prevState;
vargham 0:a39041955963 109 bool _fireUpDown;
vargham 3:03aea89f2a5c 110 Callback<void(ButtonEvent, PinName)> _onButtonEvent;
vargham 0:a39041955963 111 void isrFall(void);
vargham 0:a39041955963 112 void isrRise(void);
vargham 0:a39041955963 113 void onPress(void);
vargham 0:a39041955963 114 void onRelease(void);
vargham 0:a39041955963 115 void autoRepeat(void);
vargham 0:a39041955963 116 void startAutoRepeat(void);
vargham 0:a39041955963 117 };
vargham 0:a39041955963 118
vargham 0:a39041955963 119 #endif /* BUTTON_H_INCLUDED */