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:
Mon Jun 13 10:15:15 2016 +0000
Revision:
3:c7f97bebf2f7
Parent:
2:6af39916a4a2
Child:
4:8d6883cdc3c8
longpress supported.

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 1:67d677ad73e7 29 _debounce_ignore = false;
ohtsuka 3:c7f97bebf2f7 30 _longpressed = false;
ohtsuka 0:9c5c674dcaea 31 }
ohtsuka 0:9c5c674dcaea 32
ohtsuka 1:67d677ad73e7 33 void MultiClick::isr_pressed( void )
ohtsuka 0:9c5c674dcaea 34 {
ohtsuka 3:c7f97bebf2f7 35
ohtsuka 3:c7f97bebf2f7 36 // --- 長押し検出用タイマーを停止
ohtsuka 3:c7f97bebf2f7 37 _longpress_timeout->detach();
ohtsuka 3:c7f97bebf2f7 38 _longpressed = false;
ohtsuka 3:c7f97bebf2f7 39
ohtsuka 1:67d677ad73e7 40 // --- チャタリング(debounce)チェック ------------------------------------------------
ohtsuka 1:67d677ad73e7 41 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 42 DBG_PRINT("isr_pressed: bounce. ");
ohtsuka 1:67d677ad73e7 43 fflush(stdout);
ohtsuka 1:67d677ad73e7 44 } else {
ohtsuka 1:67d677ad73e7 45 DBG_PRINT("isr_pressed called:\r\n");
ohtsuka 1:67d677ad73e7 46 fflush(stdout);
ohtsuka 3:c7f97bebf2f7 47
ohtsuka 3:c7f97bebf2f7 48 // 長押し検出用タイマー開始
ohtsuka 3:c7f97bebf2f7 49 _longpress_timeout->attach_us(this, &MultiClick::longpress_timeout, _longpress_us );
ohtsuka 3:c7f97bebf2f7 50 }
ohtsuka 2:6af39916a4a2 51
ohtsuka 2:6af39916a4a2 52 }
ohtsuka 2:6af39916a4a2 53
ohtsuka 2:6af39916a4a2 54 void MultiClick::isr_released( void )
ohtsuka 2:6af39916a4a2 55 {
ohtsuka 3:c7f97bebf2f7 56 // 長押し検出用タイマーを停止
ohtsuka 3:c7f97bebf2f7 57 _longpress_timeout->detach();
ohtsuka 3:c7f97bebf2f7 58
ohtsuka 2:6af39916a4a2 59 // --- チャタリング(debounce)チェック ------------------------------------------------
ohtsuka 2:6af39916a4a2 60 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 61 DBG_PRINT("isr_released: bounce. ");
ohtsuka 2:6af39916a4a2 62 fflush(stdout);
ohtsuka 2:6af39916a4a2 63
ohtsuka 2:6af39916a4a2 64 return;
ohtsuka 3:c7f97bebf2f7 65 } else if(_longpressed == true) { // 長押しチェック
ohtsuka 3:c7f97bebf2f7 66 DBG_PRINT("isr_released: _longpressed. ");
ohtsuka 3:c7f97bebf2f7 67 fflush(stdout);
ohtsuka 3:c7f97bebf2f7 68
ohtsuka 3:c7f97bebf2f7 69 _longpressed = false;
ohtsuka 3:c7f97bebf2f7 70 return;
ohtsuka 2:6af39916a4a2 71 } else {
ohtsuka 2:6af39916a4a2 72 DBG_PRINT("isr_released called:\r\n");
ohtsuka 2:6af39916a4a2 73 fflush(stdout);
ohtsuka 2:6af39916a4a2 74 }
ohtsuka 1:67d677ad73e7 75
ohtsuka 1:67d677ad73e7 76 // クリック認定
ohtsuka 0:9c5c674dcaea 77 _click_times++;
ohtsuka 0:9c5c674dcaea 78 switch( _click_times ) {
ohtsuka 0:9c5c674dcaea 79 case 0:
ohtsuka 1:67d677ad73e7 80 DBG_PRINT("error!");
ohtsuka 0:9c5c674dcaea 81 break;
ohtsuka 0:9c5c674dcaea 82
ohtsuka 0:9c5c674dcaea 83 case 1:
ohtsuka 0:9c5c674dcaea 84 if(_c_callback_clicked != 0) {
ohtsuka 0:9c5c674dcaea 85 (*_c_callback_clicked)();
ohtsuka 0:9c5c674dcaea 86 }
ohtsuka 0:9c5c674dcaea 87 break;
ohtsuka 0:9c5c674dcaea 88
ohtsuka 0:9c5c674dcaea 89 case 2:
ohtsuka 0:9c5c674dcaea 90 if(_c_callback_doubleclicked != 0) {
ohtsuka 0:9c5c674dcaea 91 (*_c_callback_doubleclicked)();
ohtsuka 0:9c5c674dcaea 92 }
ohtsuka 0:9c5c674dcaea 93 break;
ohtsuka 0:9c5c674dcaea 94 default:
ohtsuka 0:9c5c674dcaea 95 if(_c_callback_n_clicked != 0) {
ohtsuka 0:9c5c674dcaea 96 (*_c_callback_n_clicked)(_click_times);
ohtsuka 0:9c5c674dcaea 97 }
ohtsuka 0:9c5c674dcaea 98 }
ohtsuka 0:9c5c674dcaea 99
ohtsuka 1:67d677ad73e7 100 // チャタリングチェック期間を開始する設定(初回、押し下げ後一定時間は、押し下げを無視)
ohtsuka 1:67d677ad73e7 101 _debounce_ignore = true;
ohtsuka 1:67d677ad73e7 102 _debounce_timeout->detach();
ohtsuka 1:67d677ad73e7 103 _debounce_timeout->attach_us(this, &MultiClick::debounce_timeout, _debounce_ignore_us );
ohtsuka 1:67d677ad73e7 104
ohtsuka 1:67d677ad73e7 105 // マルチクリック検出用タイマーを設定
ohtsuka 1:67d677ad73e7 106 _timeout->detach();
ohtsuka 1:67d677ad73e7 107 _timeout->attach_us(this, &MultiClick::click_timeout, _click_interval_us );
ohtsuka 1:67d677ad73e7 108
ohtsuka 1:67d677ad73e7 109
ohtsuka 1:67d677ad73e7 110 }
ohtsuka 1:67d677ad73e7 111
ohtsuka 1:67d677ad73e7 112 void MultiClick::debounce_timeout( void )
ohtsuka 1:67d677ad73e7 113 {
ohtsuka 1:67d677ad73e7 114 DBG_PRINT("--- debounce T.O.\r\n");
ohtsuka 1:67d677ad73e7 115 _debounce_ignore = false;
ohtsuka 0:9c5c674dcaea 116 }
ohtsuka 0:9c5c674dcaea 117
ohtsuka 0:9c5c674dcaea 118 void MultiClick::click_timeout( void )
ohtsuka 0:9c5c674dcaea 119 {
ohtsuka 1:67d677ad73e7 120 DBG_PRINT("===== multiclick T.O.\r\n\r\n");
ohtsuka 0:9c5c674dcaea 121 _click_times = 0;
ohtsuka 0:9c5c674dcaea 122 }
ohtsuka 0:9c5c674dcaea 123
ohtsuka 3:c7f97bebf2f7 124 void MultiClick::longpress_timeout( void )
ohtsuka 3:c7f97bebf2f7 125 {
ohtsuka 3:c7f97bebf2f7 126 DBG_PRINT("===== longpress T.O.\r\n\r\n");
ohtsuka 1:67d677ad73e7 127
ohtsuka 3:c7f97bebf2f7 128 if(_c_callback_longpressed != 0) {
ohtsuka 3:c7f97bebf2f7 129 (*_c_callback_longpressed)();
ohtsuka 3:c7f97bebf2f7 130 }
ohtsuka 3:c7f97bebf2f7 131
ohtsuka 3:c7f97bebf2f7 132 _longpressed = true;
ohtsuka 3:c7f97bebf2f7 133 }
ohtsuka 3:c7f97bebf2f7 134
ohtsuka 3:c7f97bebf2f7 135
ohtsuka 3:c7f97bebf2f7 136 void MultiClick::attach_clicked(void (*function)(void) = 0) { _c_callback_clicked = function; }
ohtsuka 0:9c5c674dcaea 137
ohtsuka 0:9c5c674dcaea 138 void MultiClick::attach_doubleclicked(void (*function)(void) = 0) { _c_callback_doubleclicked = function; }
ohtsuka 0:9c5c674dcaea 139
ohtsuka 0:9c5c674dcaea 140 void MultiClick::attach_n_clicked(void (*function)(int) = 0) { _c_callback_n_clicked = function; }
ohtsuka 3:c7f97bebf2f7 141
ohtsuka 3:c7f97bebf2f7 142 void MultiClick::attach_longpressed(void (*function)(void) = 0) { _c_callback_longpressed = function; }