Modified version to work with EventQueue (outside of ISR)
Revision 8:633350efee38, committed 2020-04-17
- 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); };