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:
4:8d6883cdc3c8
Parent:
3:c7f97bebf2f7
Child:
5:cb4d45f41e17
--- a/MultiClick.cpp	Mon Jun 13 10:15:15 2016 +0000
+++ b/MultiClick.cpp	Wed Jun 15 05:17:19 2016 +0000
@@ -26,18 +26,29 @@
     _click_interval_us = 300*1000;
     _debounce_ignore_us = 100*1000;
     _longpress_us = 1000*1000;
+    
     _debounce_ignore = false;
     _longpressed = false;
 }
 
 void MultiClick::isr_pressed( void )
 {
-    
+#if 0
+    // チャタリングチェック1
+    if(_pressed == true) {
+        DBG_PRINT("isr_pressed: illigal press, ignore.");
+        fflush(stdout);
+        return;
+    } else {
+        _pressed = true;  
+    }
+#endif
+
     // --- 長押し検出用タイマーを停止
     _longpress_timeout->detach();
     _longpressed = false;
     
-    // --- チャタリング(debounce)チェック ------------------------------------------------
+    // --- チャタリング(debounce)チェック2 ------------------------------------------------                
     if(_debounce_ignore == true) {
         DBG_PRINT("isr_pressed: bounce. ");
         fflush(stdout);
@@ -53,6 +64,16 @@
 
 void MultiClick::isr_released( void )
 {
+#if 0
+    if( _pressed == false) {
+        DBG_PRINT("isr_released: illigal release, ignore.");
+        fflush(stdout);
+        return;
+    } else {
+        _pressed = false;  
+    }
+#endif
+    
     // 長押し検出用タイマーを停止    
     _longpress_timeout->detach();
     
@@ -67,6 +88,7 @@
         fflush(stdout);
 
         _longpressed = false;
+
         return;
     } else {
         DBG_PRINT("isr_released called:\r\n");
@@ -75,27 +97,6 @@
     
     // クリック認定
     _click_times++;
-    switch( _click_times ) {
-    case 0:
-        DBG_PRINT("error!");
-        break;
-    
-    case 1:
-        if(_c_callback_clicked != 0) {
-            (*_c_callback_clicked)();
-        }
-        break;
-
-    case 2:
-        if(_c_callback_doubleclicked != 0) {
-            (*_c_callback_doubleclicked)();
-        }
-        break;
-    default:
-        if(_c_callback_n_clicked != 0) {
-            (*_c_callback_n_clicked)(_click_times);
-        }
-    }
     
     // チャタリングチェック期間を開始する設定(初回、押し下げ後一定時間は、押し下げを無視)
     _debounce_ignore = true;
@@ -118,6 +119,30 @@
 void MultiClick::click_timeout( void )
 {
     DBG_PRINT("===== multiclick T.O.\r\n\r\n");
+
+    // クリックイベントを通知
+    switch( _click_times ) {
+    case 0:
+        DBG_PRINT("error!");
+        break;
+    
+    case 1:
+        if(_c_callback_clicked != 0) {
+            (*_c_callback_clicked)();
+        }
+        break;
+
+    case 2:
+        if(_c_callback_doubleclicked != 0) {
+            (*_c_callback_doubleclicked)();
+        }
+        break;
+    default:
+        if(_c_callback_n_clicked != 0) {
+            (*_c_callback_n_clicked)(_click_times);
+        }
+    }
+
     _click_times = 0;    
 }
 
@@ -129,6 +154,7 @@
         (*_c_callback_longpressed)();
     }
 
+    _click_times = 0;
     _longpressed = true;    
 }