Library for detecting button clicks, doubleclicks and long press pattern on a single button. Updated to use Callback class when mbed lib >= 122 is used. Then also member functions can be used as callbacks.

Dependents:   ECH_V004

Fork of OneButton by Zibin Zheng

Committer:
JojoS
Date:
Thu Sep 22 21:46:37 2016 +0000
Revision:
3:48a593e2d4cf
Parent:
2:26960fb1d783
reverted to original state machine behaviour by mh. This works better for detecting click / double click events.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jaup 1:fdf67f893a5c 1 // Modifyed to support mbed environment, rewrite the state machine.
jaup 1:fdf67f893a5c 2 // by Zibin Zheng <znbin@qq.com>
jaup 1:fdf67f893a5c 3
jaup 0:62d614796022 4 // -----
jaup 0:62d614796022 5 // OneButton.h - Library for detecting button clicks, doubleclicks and long press pattern on a single button.
jaup 0:62d614796022 6 // This class is implemented for use with the Arduino environment.
jaup 0:62d614796022 7 // Copyright (c) by Matthias Hertel, http://www.mathertel.de
jaup 0:62d614796022 8 // This work is licensed under a BSD style license. See http://www.mathertel.de/License.aspx
jaup 0:62d614796022 9 // More information on: http://www.mathertel.de/Arduino
jaup 0:62d614796022 10 // -----
jaup 1:fdf67f893a5c 11
jaup 0:62d614796022 12
jaup 0:62d614796022 13 #ifndef OneButton_h
jaup 0:62d614796022 14 #define OneButton_h
jaup 0:62d614796022 15
jaup 0:62d614796022 16 #include "mbed.h"
jaup 1:fdf67f893a5c 17
jaup 1:fdf67f893a5c 18 /**
jaup 1:fdf67f893a5c 19 * Example:
jaup 1:fdf67f893a5c 20 * @code
jaup 1:fdf67f893a5c 21
jaup 1:fdf67f893a5c 22 #include "mbed.h"
jaup 1:fdf67f893a5c 23 #include "OneButton.h"
jaup 1:fdf67f893a5c 24
jaup 1:fdf67f893a5c 25 Serial pc(SERIAL_TX, SERIAL_RX);
jaup 1:fdf67f893a5c 26
jaup 1:fdf67f893a5c 27 OneButton btn1(PC_13);
jaup 1:fdf67f893a5c 28
jaup 1:fdf67f893a5c 29 void pressed() {
jaup 1:fdf67f893a5c 30 pc.printf("pressed\r\n");
jaup 1:fdf67f893a5c 31 }
jaup 1:fdf67f893a5c 32
jaup 1:fdf67f893a5c 33 void click() {
jaup 1:fdf67f893a5c 34 pc.printf("click\r\n");
jaup 1:fdf67f893a5c 35 }
jaup 1:fdf67f893a5c 36
jaup 1:fdf67f893a5c 37 void double_click() {
jaup 1:fdf67f893a5c 38 pc.printf("double_click\r\n");
jaup 1:fdf67f893a5c 39 }
jaup 0:62d614796022 40
jaup 1:fdf67f893a5c 41 void long_start() {
jaup 1:fdf67f893a5c 42 pc.printf("long_start\r\n");
jaup 1:fdf67f893a5c 43 }
jaup 1:fdf67f893a5c 44
jaup 1:fdf67f893a5c 45 void long_hold() {
jaup 1:fdf67f893a5c 46 pc.printf("long_hold\r\n");
jaup 1:fdf67f893a5c 47 }
jaup 1:fdf67f893a5c 48
jaup 1:fdf67f893a5c 49 void long_stop() {
jaup 1:fdf67f893a5c 50 pc.printf("long_stop\r\n");
jaup 1:fdf67f893a5c 51 }
jaup 1:fdf67f893a5c 52
jaup 1:fdf67f893a5c 53 int main() {
jaup 1:fdf67f893a5c 54
jaup 1:fdf67f893a5c 55 btn1.attachClick(&click);
jaup 1:fdf67f893a5c 56 btn1.attachPress(&pressed);
jaup 1:fdf67f893a5c 57 btn1.attachDoubleClick(&double_click);
jaup 1:fdf67f893a5c 58 btn1.attachLongPressStart(&long_start);
jaup 1:fdf67f893a5c 59 btn1.attachDuringLongPress(&long_hold);
jaup 1:fdf67f893a5c 60 btn1.attachLongPressStop(&long_stop);
jaup 1:fdf67f893a5c 61
jaup 1:fdf67f893a5c 62 while(1) {
jaup 1:fdf67f893a5c 63
jaup 1:fdf67f893a5c 64 btn1.tick(); //loop
jaup 1:fdf67f893a5c 65 }
jaup 1:fdf67f893a5c 66 }
jaup 1:fdf67f893a5c 67
jaup 1:fdf67f893a5c 68 */
jaup 1:fdf67f893a5c 69
jaup 0:62d614796022 70
JojoS 2:26960fb1d783 71 #if (MBED_LIBRARY_VERSION < 122)
jaup 0:62d614796022 72 // ----- Callback function types -----
jaup 0:62d614796022 73
jaup 0:62d614796022 74 extern "C" {
jaup 0:62d614796022 75 typedef void (*callbackFunction)(void);
jaup 0:62d614796022 76 }
JojoS 2:26960fb1d783 77 #endif
jaup 0:62d614796022 78
jaup 0:62d614796022 79 class OneButton
jaup 0:62d614796022 80 {
jaup 0:62d614796022 81 public:
jaup 1:fdf67f893a5c 82
jaup 0:62d614796022 83 // ----- Constructor -----
jaup 1:fdf67f893a5c 84 OneButton(PinName pin, bool active_level = 0);
jaup 0:62d614796022 85
jaup 0:62d614796022 86 // ----- Set runtime parameters -----
jaup 0:62d614796022 87
jaup 0:62d614796022 88 // set # millisec after single click is assumed.
jaup 0:62d614796022 89 void setClickTicks(int ticks);
jaup 0:62d614796022 90
jaup 0:62d614796022 91 // set # millisec after press is assumed.
jaup 0:62d614796022 92 void setPressTicks(int ticks);
jaup 0:62d614796022 93
jaup 0:62d614796022 94 // attach functions that will be called when button was pressed in the specified way.
JojoS 2:26960fb1d783 95
JojoS 2:26960fb1d783 96 #if (MBED_LIBRARY_VERSION < 122)
jaup 0:62d614796022 97 void attachClick(callbackFunction newFunction);
jaup 0:62d614796022 98 void attachDoubleClick(callbackFunction newFunction);
jaup 0:62d614796022 99 void attachPress(callbackFunction newFunction); // DEPRECATED, replaced by longPressStart, longPressStop and duringLongPress
jaup 0:62d614796022 100 void attachLongPressStart(callbackFunction newFunction);
jaup 0:62d614796022 101 void attachLongPressStop(callbackFunction newFunction);
jaup 0:62d614796022 102 void attachDuringLongPress(callbackFunction newFunction);
JojoS 2:26960fb1d783 103 #else
JojoS 2:26960fb1d783 104 // click function
JojoS 2:26960fb1d783 105 void attachClick(Callback<void()> func){
JojoS 2:26960fb1d783 106 clickFn.attach(func);
JojoS 2:26960fb1d783 107 };
jaup 0:62d614796022 108
JojoS 2:26960fb1d783 109 // doubleClick function
JojoS 2:26960fb1d783 110 void attachDoubleClick(Callback<void()> func){
JojoS 2:26960fb1d783 111 doubleClickFn.attach(func);
JojoS 2:26960fb1d783 112 };
JojoS 2:26960fb1d783 113
JojoS 2:26960fb1d783 114 // press function
JojoS 2:26960fb1d783 115 void attachPress(Callback<void()> func){
JojoS 2:26960fb1d783 116 pressFn.attach(func);
JojoS 2:26960fb1d783 117 };
JojoS 2:26960fb1d783 118
JojoS 2:26960fb1d783 119 // long press start function
JojoS 2:26960fb1d783 120 void attachLongPressStart(Callback<void()> func){
JojoS 2:26960fb1d783 121 longPressStartFn.attach(func);
JojoS 2:26960fb1d783 122 };
JojoS 2:26960fb1d783 123
JojoS 2:26960fb1d783 124 // long press stop function
JojoS 2:26960fb1d783 125 void attachLongPressStop(Callback<void()> func){
JojoS 2:26960fb1d783 126 longPressStopFn.attach(func);
JojoS 2:26960fb1d783 127 };
JojoS 2:26960fb1d783 128
JojoS 2:26960fb1d783 129 // during long press function
JojoS 2:26960fb1d783 130 void attachDuringLongPress(Callback<void()> func){
JojoS 2:26960fb1d783 131 duringLongPressFn.attach(func);
JojoS 2:26960fb1d783 132 };
JojoS 2:26960fb1d783 133
JojoS 2:26960fb1d783 134 Callback<void()> clickFn;
JojoS 2:26960fb1d783 135 Callback<void()> doubleClickFn;
JojoS 2:26960fb1d783 136 Callback<void()> pressFn;
JojoS 2:26960fb1d783 137 Callback<void()> longPressStartFn;
JojoS 2:26960fb1d783 138 Callback<void()> longPressStopFn;
JojoS 2:26960fb1d783 139 Callback<void()> duringLongPressFn;
JojoS 2:26960fb1d783 140
JojoS 2:26960fb1d783 141 #endif
jaup 0:62d614796022 142 // ----- State machine functions -----
jaup 0:62d614796022 143
jaup 0:62d614796022 144 // call this function every some milliseconds for handling button events.
jaup 0:62d614796022 145 void tick(void);
jaup 0:62d614796022 146 bool isLongPressed();
jaup 0:62d614796022 147
jaup 0:62d614796022 148 private:
jaup 0:62d614796022 149 int _clickTicks; // number of ticks that have to pass by before a click is detected
jaup 0:62d614796022 150 int _pressTicks; // number of ticks that have to pass by before a long button press is detected
jaup 0:62d614796022 151
jaup 0:62d614796022 152 int _buttonReleased;
jaup 0:62d614796022 153 int _buttonPressed;
jaup 0:62d614796022 154 bool _isLongPressed;
jaup 0:62d614796022 155
jaup 0:62d614796022 156 // These variables will hold functions acting as event source.
JojoS 2:26960fb1d783 157 // mbed lib < 122 will use a simple function pointer,
JojoS 2:26960fb1d783 158 // for libs >= 122 we can use the new Callback template to avoid compiler warnings
jaup 0:62d614796022 159
JojoS 2:26960fb1d783 160 #if (MBED_LIBRARY_VERSION < 122)
JojoS 2:26960fb1d783 161 callbackFunction clickFn;
JojoS 2:26960fb1d783 162 callbackFunction doubleClickFn;
JojoS 2:26960fb1d783 163 callbackFunction pressFn;
JojoS 2:26960fb1d783 164 callbackFunction longPressStartFn;
JojoS 2:26960fb1d783 165 callbackFunction longPressStopFn;
JojoS 2:26960fb1d783 166 callbackFunction duringLongPressFn;
JojoS 2:26960fb1d783 167 #endif
jaup 0:62d614796022 168 // These variables that hold information across the upcoming tick calls.
jaup 0:62d614796022 169 // They are initialized once on program start and are updated every time the tick function is called.
jaup 1:fdf67f893a5c 170
JojoS 2:26960fb1d783 171 int ticks;
jaup 1:fdf67f893a5c 172 uint8_t _state;
jaup 1:fdf67f893a5c 173 uint8_t _debounce_cnt;
jaup 1:fdf67f893a5c 174 uint8_t _debounceTicks; // number of ticks for debounce times.
jaup 1:fdf67f893a5c 175 bool button_level;
jaup 1:fdf67f893a5c 176 bool active;
jaup 0:62d614796022 177
jaup 0:62d614796022 178 DigitalIn* btn_pin;
jaup 1:fdf67f893a5c 179 Timer *timer;
jaup 0:62d614796022 180 };
jaup 0:62d614796022 181
jaup 0:62d614796022 182 #endif
jaup 0:62d614796022 183
jaup 0:62d614796022 184