You can use multiple clicks event with one button. This library supports follow events, Single click, Double click, over 3 times click, Long press.

Dependents:   multiclick_test

Committer:
ohtsuka
Date:
Wed Jun 15 05:17:19 2016 +0000
Revision:
4:8d6883cdc3c8
Parent:
3:c7f97bebf2f7
Child:
5:cb4d45f41e17
??????????????????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohtsuka 0:9c5c674dcaea 1 #include "MultiClick.h"
ohtsuka 0:9c5c674dcaea 2
ohtsuka 0:9c5c674dcaea 3 MultiClick::MultiClick(PinName p, PinMode m)
ohtsuka 0:9c5c674dcaea 4 {
ohtsuka 0:9c5c674dcaea 5 _iin = new InterruptIn(p);
ohtsuka 0:9c5c674dcaea 6 _mode = m;
ohtsuka 0:9c5c674dcaea 7
ohtsuka 0:9c5c674dcaea 8 _iin->mode(_mode);
ohtsuka 1:67d677ad73e7 9
ohtsuka 0:9c5c674dcaea 10 if(_mode == PullUp) {
ohtsuka 1:67d677ad73e7 11 DBG_PRINT("isr fall.\r\n");
ohtsuka 1:67d677ad73e7 12 _iin->fall(this, &MultiClick::isr_pressed);
ohtsuka 1:67d677ad73e7 13 _iin->rise(this, &MultiClick::isr_released);
ohtsuka 0:9c5c674dcaea 14 } else {
ohtsuka 1:67d677ad73e7 15 DBG_PRINT("isr rise.\r\n");
ohtsuka 1:67d677ad73e7 16 _iin->fall(this, &MultiClick::isr_released);
ohtsuka 1:67d677ad73e7 17 _iin->rise(this, &MultiClick::isr_pressed);
ohtsuka 0:9c5c674dcaea 18 }
ohtsuka 0:9c5c674dcaea 19
ohtsuka 0:9c5c674dcaea 20 _timeout = new Timeout();
ohtsuka 1:67d677ad73e7 21 _debounce_timeout = new Timeout();
ohtsuka 3:c7f97bebf2f7 22 _longpress_timeout = new Timeout();
ohtsuka 1:67d677ad73e7 23 _t = new Timer();
ohtsuka 1:67d677ad73e7 24 _t->start();
ohtsuka 0:9c5c674dcaea 25
ohtsuka 1:67d677ad73e7 26 _click_interval_us = 300*1000;
ohtsuka 3:c7f97bebf2f7 27 _debounce_ignore_us = 100*1000;
ohtsuka 3:c7f97bebf2f7 28 _longpress_us = 1000*1000;
ohtsuka 4:8d6883cdc3c8 29
ohtsuka 1:67d677ad73e7 30 _debounce_ignore = false;
ohtsuka 3:c7f97bebf2f7 31 _longpressed = false;
ohtsuka 0:9c5c674dcaea 32 }
ohtsuka 0:9c5c674dcaea 33
ohtsuka 1:67d677ad73e7 34 void MultiClick::isr_pressed( void )
ohtsuka 0:9c5c674dcaea 35 {
ohtsuka 4:8d6883cdc3c8 36 #if 0
ohtsuka 4:8d6883cdc3c8 37 // チャタリングチェック1
ohtsuka 4:8d6883cdc3c8 38 if(_pressed == true) {
ohtsuka 4:8d6883cdc3c8 39 DBG_PRINT("isr_pressed: illigal press, ignore.");
ohtsuka 4:8d6883cdc3c8 40 fflush(stdout);
ohtsuka 4:8d6883cdc3c8 41 return;
ohtsuka 4:8d6883cdc3c8 42 } else {
ohtsuka 4:8d6883cdc3c8 43 _pressed = true;
ohtsuka 4:8d6883cdc3c8 44 }
ohtsuka 4:8d6883cdc3c8 45 #endif
ohtsuka 4:8d6883cdc3c8 46
ohtsuka 3:c7f97bebf2f7 47 // --- 長押し検出用タイマーを停止
ohtsuka 3:c7f97bebf2f7 48 _longpress_timeout->detach();
ohtsuka 3:c7f97bebf2f7 49 _longpressed = false;
ohtsuka 3:c7f97bebf2f7 50
ohtsuka 4:8d6883cdc3c8 51 // --- チャタリング(debounce)チェック2 ------------------------------------------------
ohtsuka 1:67d677ad73e7 52 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 53 DBG_PRINT("isr_pressed: bounce. ");
ohtsuka 1:67d677ad73e7 54 fflush(stdout);
ohtsuka 1:67d677ad73e7 55 } else {
ohtsuka 1:67d677ad73e7 56 DBG_PRINT("isr_pressed called:\r\n");
ohtsuka 1:67d677ad73e7 57 fflush(stdout);
ohtsuka 3:c7f97bebf2f7 58
ohtsuka 3:c7f97bebf2f7 59 // 長押し検出用タイマー開始
ohtsuka 3:c7f97bebf2f7 60 _longpress_timeout->attach_us(this, &MultiClick::longpress_timeout, _longpress_us );
ohtsuka 3:c7f97bebf2f7 61 }
ohtsuka 2:6af39916a4a2 62
ohtsuka 2:6af39916a4a2 63 }
ohtsuka 2:6af39916a4a2 64
ohtsuka 2:6af39916a4a2 65 void MultiClick::isr_released( void )
ohtsuka 2:6af39916a4a2 66 {
ohtsuka 4:8d6883cdc3c8 67 #if 0
ohtsuka 4:8d6883cdc3c8 68 if( _pressed == false) {
ohtsuka 4:8d6883cdc3c8 69 DBG_PRINT("isr_released: illigal release, ignore.");
ohtsuka 4:8d6883cdc3c8 70 fflush(stdout);
ohtsuka 4:8d6883cdc3c8 71 return;
ohtsuka 4:8d6883cdc3c8 72 } else {
ohtsuka 4:8d6883cdc3c8 73 _pressed = false;
ohtsuka 4:8d6883cdc3c8 74 }
ohtsuka 4:8d6883cdc3c8 75 #endif
ohtsuka 4:8d6883cdc3c8 76
ohtsuka 3:c7f97bebf2f7 77 // 長押し検出用タイマーを停止
ohtsuka 3:c7f97bebf2f7 78 _longpress_timeout->detach();
ohtsuka 3:c7f97bebf2f7 79
ohtsuka 2:6af39916a4a2 80 // --- チャタリング(debounce)チェック ------------------------------------------------
ohtsuka 2:6af39916a4a2 81 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 82 DBG_PRINT("isr_released: bounce. ");
ohtsuka 2:6af39916a4a2 83 fflush(stdout);
ohtsuka 2:6af39916a4a2 84
ohtsuka 2:6af39916a4a2 85 return;
ohtsuka 3:c7f97bebf2f7 86 } else if(_longpressed == true) { // 長押しチェック
ohtsuka 3:c7f97bebf2f7 87 DBG_PRINT("isr_released: _longpressed. ");
ohtsuka 3:c7f97bebf2f7 88 fflush(stdout);
ohtsuka 3:c7f97bebf2f7 89
ohtsuka 3:c7f97bebf2f7 90 _longpressed = false;
ohtsuka 4:8d6883cdc3c8 91
ohtsuka 3:c7f97bebf2f7 92 return;
ohtsuka 2:6af39916a4a2 93 } else {
ohtsuka 2:6af39916a4a2 94 DBG_PRINT("isr_released called:\r\n");
ohtsuka 2:6af39916a4a2 95 fflush(stdout);
ohtsuka 2:6af39916a4a2 96 }
ohtsuka 1:67d677ad73e7 97
ohtsuka 1:67d677ad73e7 98 // クリック認定
ohtsuka 0:9c5c674dcaea 99 _click_times++;
ohtsuka 0:9c5c674dcaea 100
ohtsuka 1:67d677ad73e7 101 // チャタリングチェック期間を開始する設定(初回、押し下げ後一定時間は、押し下げを無視)
ohtsuka 1:67d677ad73e7 102 _debounce_ignore = true;
ohtsuka 1:67d677ad73e7 103 _debounce_timeout->detach();
ohtsuka 1:67d677ad73e7 104 _debounce_timeout->attach_us(this, &MultiClick::debounce_timeout, _debounce_ignore_us );
ohtsuka 1:67d677ad73e7 105
ohtsuka 1:67d677ad73e7 106 // マルチクリック検出用タイマーを設定
ohtsuka 1:67d677ad73e7 107 _timeout->detach();
ohtsuka 1:67d677ad73e7 108 _timeout->attach_us(this, &MultiClick::click_timeout, _click_interval_us );
ohtsuka 1:67d677ad73e7 109
ohtsuka 1:67d677ad73e7 110
ohtsuka 1:67d677ad73e7 111 }
ohtsuka 1:67d677ad73e7 112
ohtsuka 1:67d677ad73e7 113 void MultiClick::debounce_timeout( void )
ohtsuka 1:67d677ad73e7 114 {
ohtsuka 1:67d677ad73e7 115 DBG_PRINT("--- debounce T.O.\r\n");
ohtsuka 1:67d677ad73e7 116 _debounce_ignore = false;
ohtsuka 0:9c5c674dcaea 117 }
ohtsuka 0:9c5c674dcaea 118
ohtsuka 0:9c5c674dcaea 119 void MultiClick::click_timeout( void )
ohtsuka 0:9c5c674dcaea 120 {
ohtsuka 1:67d677ad73e7 121 DBG_PRINT("===== multiclick T.O.\r\n\r\n");
ohtsuka 4:8d6883cdc3c8 122
ohtsuka 4:8d6883cdc3c8 123 // クリックイベントを通知
ohtsuka 4:8d6883cdc3c8 124 switch( _click_times ) {
ohtsuka 4:8d6883cdc3c8 125 case 0:
ohtsuka 4:8d6883cdc3c8 126 DBG_PRINT("error!");
ohtsuka 4:8d6883cdc3c8 127 break;
ohtsuka 4:8d6883cdc3c8 128
ohtsuka 4:8d6883cdc3c8 129 case 1:
ohtsuka 4:8d6883cdc3c8 130 if(_c_callback_clicked != 0) {
ohtsuka 4:8d6883cdc3c8 131 (*_c_callback_clicked)();
ohtsuka 4:8d6883cdc3c8 132 }
ohtsuka 4:8d6883cdc3c8 133 break;
ohtsuka 4:8d6883cdc3c8 134
ohtsuka 4:8d6883cdc3c8 135 case 2:
ohtsuka 4:8d6883cdc3c8 136 if(_c_callback_doubleclicked != 0) {
ohtsuka 4:8d6883cdc3c8 137 (*_c_callback_doubleclicked)();
ohtsuka 4:8d6883cdc3c8 138 }
ohtsuka 4:8d6883cdc3c8 139 break;
ohtsuka 4:8d6883cdc3c8 140 default:
ohtsuka 4:8d6883cdc3c8 141 if(_c_callback_n_clicked != 0) {
ohtsuka 4:8d6883cdc3c8 142 (*_c_callback_n_clicked)(_click_times);
ohtsuka 4:8d6883cdc3c8 143 }
ohtsuka 4:8d6883cdc3c8 144 }
ohtsuka 4:8d6883cdc3c8 145
ohtsuka 0:9c5c674dcaea 146 _click_times = 0;
ohtsuka 0:9c5c674dcaea 147 }
ohtsuka 0:9c5c674dcaea 148
ohtsuka 3:c7f97bebf2f7 149 void MultiClick::longpress_timeout( void )
ohtsuka 3:c7f97bebf2f7 150 {
ohtsuka 3:c7f97bebf2f7 151 DBG_PRINT("===== longpress T.O.\r\n\r\n");
ohtsuka 1:67d677ad73e7 152
ohtsuka 3:c7f97bebf2f7 153 if(_c_callback_longpressed != 0) {
ohtsuka 3:c7f97bebf2f7 154 (*_c_callback_longpressed)();
ohtsuka 3:c7f97bebf2f7 155 }
ohtsuka 3:c7f97bebf2f7 156
ohtsuka 4:8d6883cdc3c8 157 _click_times = 0;
ohtsuka 3:c7f97bebf2f7 158 _longpressed = true;
ohtsuka 3:c7f97bebf2f7 159 }
ohtsuka 3:c7f97bebf2f7 160
ohtsuka 3:c7f97bebf2f7 161
ohtsuka 3:c7f97bebf2f7 162 void MultiClick::attach_clicked(void (*function)(void) = 0) { _c_callback_clicked = function; }
ohtsuka 0:9c5c674dcaea 163
ohtsuka 0:9c5c674dcaea 164 void MultiClick::attach_doubleclicked(void (*function)(void) = 0) { _c_callback_doubleclicked = function; }
ohtsuka 0:9c5c674dcaea 165
ohtsuka 0:9c5c674dcaea 166 void MultiClick::attach_n_clicked(void (*function)(int) = 0) { _c_callback_n_clicked = function; }
ohtsuka 3:c7f97bebf2f7 167
ohtsuka 3:c7f97bebf2f7 168 void MultiClick::attach_longpressed(void (*function)(void) = 0) { _c_callback_longpressed = function; }