Modified version to work with EventQueue (outside of ISR)
Diff: MultiClick.cpp
- Revision:
- 4:8d6883cdc3c8
- Parent:
- 3:c7f97bebf2f7
- Child:
- 5:cb4d45f41e17
diff -r c7f97bebf2f7 -r 8d6883cdc3c8 MultiClick.cpp --- 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; }