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

Revision:
1:67d677ad73e7
Parent:
0:9c5c674dcaea
Child:
2:6af39916a4a2
--- a/MultiClick.cpp	Fri Jun 10 08:09:22 2016 +0000
+++ b/MultiClick.cpp	Mon Jun 13 08:30:29 2016 +0000
@@ -6,32 +6,45 @@
     _mode = m;
     
     _iin->mode(_mode);
- 
+
     if(_mode == PullUp) {
-         printf("isr fall.\r\n");
-        _iin->fall(this, &MultiClick::isr);
+         DBG_PRINT("isr fall.\r\n");
+        _iin->fall(this, &MultiClick::isr_pressed);
+        _iin->rise(this, &MultiClick::isr_released);
     } else {
-         printf("isr rise.\r\n");
-        _iin->rise(this, &MultiClick::isr);
+         DBG_PRINT("isr rise.\r\n");
+        _iin->fall(this, &MultiClick::isr_released);
+        _iin->rise(this, &MultiClick::isr_pressed);
     }
     
     _timeout = new Timeout();
+    _debounce_timeout = new Timeout();
+    _t = new Timer();
+    _t->start();
 
-    _click_interval = 0.5;
-
+    _click_interval_us = 300*1000;
+    _debounce_ignore_us =100*1000;
+    _debounce_ignore = false;
 }
 
-void MultiClick::isr( void )
+void MultiClick::isr_pressed( void )
 {
+    // --- チャタリング(debounce)チェック ------------------------------------------------
+    if(_debounce_ignore == true) {
+        DBG_PRINT("bounce. ");
+        fflush(stdout);
+        
+        return;
+    } else {
+        DBG_PRINT("isr_pressed called:\r\n");
+        fflush(stdout);
+    }    
+    
+    // クリック認定
     _click_times++;
-    printf("isr called:%d\r\n", _click_times);
-    fflush(stdout);
-    
-    _timeout->detach();
-
     switch( _click_times ) {
     case 0:
-        printf("error!");
+        DBG_PRINT("error!");
         break;
     
     case 1:
@@ -51,15 +64,35 @@
         }
     }
     
-    _timeout->attach(this, &MultiClick::click_timeout, _click_interval );
+    // チャタリングチェック期間を開始する設定(初回、押し下げ後一定時間は、押し下げを無視)
+    _debounce_ignore = true;
+    _debounce_timeout->detach();
+    _debounce_timeout->attach_us(this, &MultiClick::debounce_timeout, _debounce_ignore_us );
+
+    // マルチクリック検出用タイマーを設定
+    _timeout->detach();
+    _timeout->attach_us(this, &MultiClick::click_timeout, _click_interval_us );
+
+}
+
+void MultiClick::isr_released( void )
+{
+
+}
+
+void MultiClick::debounce_timeout( void )
+{
+    DBG_PRINT("--- debounce T.O.\r\n");
+    _debounce_ignore = false;
 }
 
 void MultiClick::click_timeout( void )
 {
-    printf("click time_out.\r\n");
+    DBG_PRINT("===== multiclick T.O.\r\n\r\n");
     _click_times = 0;    
 }
 
+
 void MultiClick::attach_clicked(void (*function)(void)) { _c_callback_clicked = function; }
 
 void MultiClick::attach_doubleclicked(void (*function)(void) = 0) { _c_callback_doubleclicked = function; }