Modified version to work with EventQueue (outside of ISR)
Diff: MultiClick.cpp
- 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; }