Modified version to work with EventQueue (outside of ISR)

Files at this revision

API Documentation at this revision

Comitter:
peekpt
Date:
Fri Apr 17 22:33:15 2020 +0000
Parent:
7:7d56935ba84d
Commit message:
clean code

Changed in this revision

MultiClick.cpp Show annotated file Show diff for this revision Revisions of this file
MultiClick.h Show annotated file Show diff for this revision Revisions of this file
--- a/MultiClick.cpp	Thu Jun 16 01:29:43 2016 +0000
+++ b/MultiClick.cpp	Fri Apr 17 22:33:15 2020 +0000
@@ -9,7 +9,8 @@
 
 The MIT License (MIT)
 
-Copyright (c) 2016 Uematsu Electric Co.,Ltd. Toru OHTSUKA <t-ohtsuka@jupiter.ocn.ne.jp>
+Copyright (c) 2016 Uematsu Electric Co.,Ltd. Toru OHTSUKA
+<t-ohtsuka@jupiter.ocn.ne.jp>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -30,126 +31,130 @@
 THE SOFTWARE.
 */
 
+/*
+     * Modified version to work with an EventQueue
+     * Removed deprecated code
+ */
+
 #include "MultiClick.h"
 
-MultiClick::MultiClick(PinName p, PinMode m)
-{
-    _iin = new InterruptIn(p);
-    _mode = m;
-    
-    _iin->mode(_mode);
+MultiClick::MultiClick(PinName p, PinMode m, EventQueue *q) {
+  _iin = new InterruptIn(p);
+  _mode = m;
+
+  _iin->mode(_mode);
+
+  _queue = q;
+
+  if (_mode == PullUp) {
+
+    _iin->fall(callback(this, &MultiClick::isr_pressed));
+  } else {
 
-    if(_mode == PullUp) {
-         DBG_PRINT("isr fall.\r\n");
-        _iin->fall(this, &MultiClick::isr_pressed);
-    } else {
-         DBG_PRINT("isr rise.\r\n");
-        _iin->rise(this, &MultiClick::isr_pressed);
-    }
-    
-    _click_detect_timeout = new Timeout();
-    _press_check = new Ticker();
+    _iin->rise(callback(this, &MultiClick::isr_pressed));
+  }
+
+  _click_detect_timeout = new Timeout();
+  _press_check = new Ticker();
 
-    _press_check_interval_us = 25*1000;
-    _shortpress_num = 1;
-    _longpress_num = 20;
-    _click_interval_us = 300*1000;
-    
-    _pressed_count = 0;
-    _longpressed = false;
+  _press_check_interval_us = 25 * 1000;
+  _shortpress_num = 1;
+  _longpress_num = 20;
+  _click_interval_us = 300 * 1000;
+
+  _pressed_count = 0;
+  _longpressed = false;
 }
 
-void MultiClick::isr_pressed( void )
-{
-    DBG_PRINT("isr_pressed called:\r\n");
-    fflush(stdout);
+void MultiClick::isr_pressed(void) {
 
-    if(_pressed_count > 0) { // 「プレス中のプレス」
-        DBG_PRINT("_[%d]", _pressed_count);
-        press_check_func();
-    } else { // 通常時
-        // プレス判定処理開始
-        _pressed_count = 0;
-        _press_check->detach();
-        _press_check->attach_us(this, &MultiClick::press_check_func, _press_check_interval_us );
-        
-        _longpressed = false;
-    }
+  if (_pressed_count > 0) {
+    press_check_func();
+  } else {
+    _pressed_count = 0;
+    _press_check->detach();
+    _press_check->attach_us(callback(this, &MultiClick::press_check_func),
+                            _press_check_interval_us);
+
+    _longpressed = false;
+  }
 }
 
-void MultiClick::press_check_func( void )
-{
-    int curr_state;
-    curr_state = _iin->read();
-    
-    if(curr_state == 0) { // 押されている場合
-        DBG_PRINT(".");
-        _pressed_count++;
-        // 長押しチェック
-        if(_pressed_count > _longpress_num) {
-            if(_longpressed != true) {
-                if(_c_callback_longpressed != 0) {
-                    (*_c_callback_longpressed)();
-                }
-                _longpressed = true;
-            }
+void MultiClick::press_check_func(void) {
+  int curr_state;
+  curr_state = _iin->read();
+
+  if (curr_state == 0) {
+
+    _pressed_count++;
+
+    if (_pressed_count > _longpress_num) {
+      if (_longpressed != true) {
+        if (_c_callback_longpressed != 0) {
+          _queue->call(*_c_callback_longpressed);
         }
-    } else { // 押されていない場合
-        DBG_PRINT("# _pressed_count=%d\r\n", _pressed_count);
-        
-        if(_pressed_count >= _shortpress_num) {
-            _click_times++;
-        }
-        DBG_PRINT("# _click_times=%d\r\n", _click_times);
-        
-        _press_check->detach();    //  プレスチェックを停止
-        _pressed_count = 0;
+        _longpressed = true;
+      }
+    }
+  } else {
 
-        _click_detect_timeout->detach(); // マルチクリック検出用タイマーを設定
-        _click_detect_timeout->attach_us(this, &MultiClick::click_detect_timeout, _click_interval_us );
-        
+    if (_pressed_count >= _shortpress_num) {
+      _click_times++;
     }
-    
+
+    _press_check->detach();
+    _pressed_count = 0;
+
+    _click_detect_timeout->detach();
+    _click_detect_timeout->attach_us(
+        callback(this, &MultiClick::click_detect_timeout), _click_interval_us);
+  }
 }
 
-void MultiClick::click_detect_timeout( void )
-{
-    DBG_PRINT("-> click_detect T.O.\r\n");
+void MultiClick::click_detect_timeout(void) {
+
+  if (_longpressed) {
+
+  } else {
+    switch (_click_times) {
+    case 0:
+
+      break;
 
-    if(_longpressed) { // 長押し時は何もしない
-        DBG_PRINT("-> skip n click C.B. \r\n");
-    } else { // クリックイベントを通知
-        switch( _click_times ) {
-        case 0:
-            DBG_PRINT("error! 0 click\r\n");
-            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);
-            }
-        }
+    case 1:
+      if (_c_callback_clicked != 0) {
+        _queue->call(*_c_callback_clicked);
+      }
+      break;
+
+    case 2:
+      if (_c_callback_doubleclicked != 0) {
+        _queue->call(*_c_callback_doubleclicked);
+      }
+      break;
+    default:
+      if (_c_callback_n_clicked != 0) {
+        _queue->call(*_c_callback_n_clicked, (_click_times));
+      }
     }
-    
-    _click_times = 0;
-    _pressed_count = 0;
+  }
+
+  _click_times = 0;
+  _pressed_count = 0;
 }
 
-void MultiClick::attach_clicked(void (*function)(void) = 0) { _c_callback_clicked = function; }
+void MultiClick::attach_clicked(void (*function)(void) = 0) {
+  _c_callback_clicked = function;
+}
 
-void MultiClick::attach_doubleclicked(void (*function)(void) = 0) { _c_callback_doubleclicked = function; }
+void MultiClick::attach_doubleclicked(void (*function)(void) = 0) {
+  _c_callback_doubleclicked = function;
+}
 
-void MultiClick::attach_n_clicked(void (*function)(int) = 0) { _c_callback_n_clicked = function; }
+void MultiClick::attach_n_clicked(void (*function)(int) = 0) {
+  _c_callback_n_clicked = function;
+}
 
-void MultiClick::attach_longpressed(void (*function)(void) = 0) { _c_callback_longpressed = function; }
+void MultiClick::attach_longpressed(void (*function)(void) = 0) {
+  _c_callback_longpressed = function;
+}
--- a/MultiClick.h	Thu Jun 16 01:29:43 2016 +0000
+++ b/MultiClick.h	Fri Apr 17 22:33:15 2020 +0000
@@ -9,7 +9,8 @@
 
 The MIT License (MIT)
 
-Copyright (c) 2016 Uematsu Electric Co.,Ltd. Toru OHTSUKA <t-ohtsuka@jupiter.ocn.ne.jp>
+Copyright (c) 2016 Uematsu Electric Co.,Ltd. Toru OHTSUKA
+<t-ohtsuka@jupiter.ocn.ne.jp>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -30,49 +31,47 @@
 THE SOFTWARE.
 */
 
+/*
+ * Modified version to work with an EventQueue
+ * Removed deprecated code
+ */
+
 #include "mbed.h"
 
-//#define DEBUG
-
-#ifdef DEBUG
-#define DBG_PRINT(...) printf(__VA_ARGS__)
-#else
-#define DBG_PRINT(...)
-#endif
+class MultiClick {
+public:
+  MultiClick(PinName pin, EventQueue *q);
+  MultiClick(PinName pin, PinMode m, EventQueue *q);
+  void attach_clicked(void (*function)(void));
+  void attach_doubleclicked(void (*function)(void));
+  void attach_n_clicked(void (*function)(int));
+  void attach_longpressed(void (*function)(void));
 
-class MultiClick
-{
-public:
-    MultiClick(PinName pin);
-    MultiClick(PinName pin, PinMode m);
-    void attach_clicked(void (*function)(void));
-    void attach_doubleclicked(void (*function)(void));
-    void attach_n_clicked(void (*function)(int));
-    void attach_longpressed(void (*function)(void));
-    
 private:
-    void isr_pressed(void);
-    void click_detect_timeout( void );
-    void press_check_func( void );
+  void isr_pressed(void);
+  void click_detect_timeout(void);
+  void press_check_func(void);
 
-    InterruptIn *_iin;
-    PinMode _mode;
+  InterruptIn *_iin;
+  PinMode _mode;
 
-    Ticker *_press_check;
-    Timeout *_click_detect_timeout;
-    
-    int _shortpress_num;
-    int _longpress_num;
+  Ticker *_press_check;
+  Timeout *_click_detect_timeout;
+
+  int _shortpress_num;
+  int _longpress_num;
 
-    int _press_check_interval_us;
-    int _click_interval_us;
-    int _click_times;
-    
-    int _pressed_count;
-    bool _longpressed;
-    
-    void (*_c_callback_clicked)(void);
-    void (*_c_callback_doubleclicked)(void);
-    void (*_c_callback_n_clicked)(int);
-    void (*_c_callback_longpressed)(void);
+  int _press_check_interval_us;
+  int _click_interval_us;
+  int _click_times;
+
+  int _pressed_count;
+  bool _longpressed;
+
+  EventQueue *_queue;
+
+  void (*_c_callback_clicked)(void);
+  void (*_c_callback_doubleclicked)(void);
+  void (*_c_callback_n_clicked)(int);
+  void (*_c_callback_longpressed)(void);
 };