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 09:11:53 2016 +0000
Revision:
2:6af39916a4a2
Parent:
1:67d677ad73e7
Child:
3:c7f97bebf2f7
clink detection timing changed pressed to released.

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 1:67d677ad73e7 22 _t = new Timer();
ohtsuka 1:67d677ad73e7 23 _t->start();
ohtsuka 0:9c5c674dcaea 24
ohtsuka 1:67d677ad73e7 25 _click_interval_us = 300*1000;
ohtsuka 1:67d677ad73e7 26 _debounce_ignore_us =100*1000;
ohtsuka 1:67d677ad73e7 27 _debounce_ignore = false;
ohtsuka 0:9c5c674dcaea 28 }
ohtsuka 0:9c5c674dcaea 29
ohtsuka 1:67d677ad73e7 30 void MultiClick::isr_pressed( void )
ohtsuka 0:9c5c674dcaea 31 {
ohtsuka 1:67d677ad73e7 32 // --- チャタリング(debounce)チェック ------------------------------------------------
ohtsuka 1:67d677ad73e7 33 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 34 DBG_PRINT("isr_pressed: bounce. ");
ohtsuka 1:67d677ad73e7 35 fflush(stdout);
ohtsuka 1:67d677ad73e7 36
ohtsuka 1:67d677ad73e7 37 return;
ohtsuka 1:67d677ad73e7 38 } else {
ohtsuka 1:67d677ad73e7 39 DBG_PRINT("isr_pressed called:\r\n");
ohtsuka 1:67d677ad73e7 40 fflush(stdout);
ohtsuka 1:67d677ad73e7 41 }
ohtsuka 2:6af39916a4a2 42
ohtsuka 2:6af39916a4a2 43 }
ohtsuka 2:6af39916a4a2 44
ohtsuka 2:6af39916a4a2 45 void MultiClick::isr_released( void )
ohtsuka 2:6af39916a4a2 46 {
ohtsuka 2:6af39916a4a2 47 // --- チャタリング(debounce)チェック ------------------------------------------------
ohtsuka 2:6af39916a4a2 48 if(_debounce_ignore == true) {
ohtsuka 2:6af39916a4a2 49 DBG_PRINT("isr_released: bounce. ");
ohtsuka 2:6af39916a4a2 50 fflush(stdout);
ohtsuka 2:6af39916a4a2 51
ohtsuka 2:6af39916a4a2 52 return;
ohtsuka 2:6af39916a4a2 53 } else {
ohtsuka 2:6af39916a4a2 54 DBG_PRINT("isr_released called:\r\n");
ohtsuka 2:6af39916a4a2 55 fflush(stdout);
ohtsuka 2:6af39916a4a2 56 }
ohtsuka 1:67d677ad73e7 57
ohtsuka 1:67d677ad73e7 58 // クリック認定
ohtsuka 0:9c5c674dcaea 59 _click_times++;
ohtsuka 0:9c5c674dcaea 60 switch( _click_times ) {
ohtsuka 0:9c5c674dcaea 61 case 0:
ohtsuka 1:67d677ad73e7 62 DBG_PRINT("error!");
ohtsuka 0:9c5c674dcaea 63 break;
ohtsuka 0:9c5c674dcaea 64
ohtsuka 0:9c5c674dcaea 65 case 1:
ohtsuka 0:9c5c674dcaea 66 if(_c_callback_clicked != 0) {
ohtsuka 0:9c5c674dcaea 67 (*_c_callback_clicked)();
ohtsuka 0:9c5c674dcaea 68 }
ohtsuka 0:9c5c674dcaea 69 break;
ohtsuka 0:9c5c674dcaea 70
ohtsuka 0:9c5c674dcaea 71 case 2:
ohtsuka 0:9c5c674dcaea 72 if(_c_callback_doubleclicked != 0) {
ohtsuka 0:9c5c674dcaea 73 (*_c_callback_doubleclicked)();
ohtsuka 0:9c5c674dcaea 74 }
ohtsuka 0:9c5c674dcaea 75 break;
ohtsuka 0:9c5c674dcaea 76 default:
ohtsuka 0:9c5c674dcaea 77 if(_c_callback_n_clicked != 0) {
ohtsuka 0:9c5c674dcaea 78 (*_c_callback_n_clicked)(_click_times);
ohtsuka 0:9c5c674dcaea 79 }
ohtsuka 0:9c5c674dcaea 80 }
ohtsuka 0:9c5c674dcaea 81
ohtsuka 1:67d677ad73e7 82 // チャタリングチェック期間を開始する設定(初回、押し下げ後一定時間は、押し下げを無視)
ohtsuka 1:67d677ad73e7 83 _debounce_ignore = true;
ohtsuka 1:67d677ad73e7 84 _debounce_timeout->detach();
ohtsuka 1:67d677ad73e7 85 _debounce_timeout->attach_us(this, &MultiClick::debounce_timeout, _debounce_ignore_us );
ohtsuka 1:67d677ad73e7 86
ohtsuka 1:67d677ad73e7 87 // マルチクリック検出用タイマーを設定
ohtsuka 1:67d677ad73e7 88 _timeout->detach();
ohtsuka 1:67d677ad73e7 89 _timeout->attach_us(this, &MultiClick::click_timeout, _click_interval_us );
ohtsuka 1:67d677ad73e7 90
ohtsuka 1:67d677ad73e7 91
ohtsuka 1:67d677ad73e7 92 }
ohtsuka 1:67d677ad73e7 93
ohtsuka 1:67d677ad73e7 94 void MultiClick::debounce_timeout( void )
ohtsuka 1:67d677ad73e7 95 {
ohtsuka 1:67d677ad73e7 96 DBG_PRINT("--- debounce T.O.\r\n");
ohtsuka 1:67d677ad73e7 97 _debounce_ignore = false;
ohtsuka 0:9c5c674dcaea 98 }
ohtsuka 0:9c5c674dcaea 99
ohtsuka 0:9c5c674dcaea 100 void MultiClick::click_timeout( void )
ohtsuka 0:9c5c674dcaea 101 {
ohtsuka 1:67d677ad73e7 102 DBG_PRINT("===== multiclick T.O.\r\n\r\n");
ohtsuka 0:9c5c674dcaea 103 _click_times = 0;
ohtsuka 0:9c5c674dcaea 104 }
ohtsuka 0:9c5c674dcaea 105
ohtsuka 1:67d677ad73e7 106
ohtsuka 0:9c5c674dcaea 107 void MultiClick::attach_clicked(void (*function)(void)) { _c_callback_clicked = function; }
ohtsuka 0:9c5c674dcaea 108
ohtsuka 0:9c5c674dcaea 109 void MultiClick::attach_doubleclicked(void (*function)(void) = 0) { _c_callback_doubleclicked = function; }
ohtsuka 0:9c5c674dcaea 110
ohtsuka 0:9c5c674dcaea 111 void MultiClick::attach_n_clicked(void (*function)(int) = 0) { _c_callback_n_clicked = function; }