Class: Fusuma::Plugin::Detectors::TapDetector
- Inherits:
-
Detector
- Object
- Detector
- Fusuma::Plugin::Detectors::TapDetector
- Defined in:
- lib/fusuma/plugin/detectors/tap_detector.rb
Overview
Detect tap event
Constant Summary collapse
- BUFFER_TYPE =
'tap'
- GESTURE_RECORD_TYPE =
'tap'
- BASE_INTERVAL =
0.5
- BASE_HOLDING_TIME =
0.1
- BASE_TAP_TIME =
0.4
Instance Method Summary collapse
- #create_index(finger:, direction:) ⇒ Config::Index
- #detect(buffers) ⇒ Event, NilClass
- #hold?(buffer, holding_time) ⇒ TrueClass, FalseClass
- #moved?(tap_buffer:, gesture_buffer:) ⇒ TrueClass, FalseClass
- #released_all?(buffer) ⇒ TrueClass, FalseClass
- #tap?(buffer, holding_time) ⇒ TrueClass, FalseClass
Instance Method Details
#create_index(finger:, direction:) ⇒ Config::Index
48 49 50 51 52 53 54 55 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 48 def create_index(finger:, direction:) Config::Index.new( [ Config::Index::Key.new(direction), Config::Index::Key.new(finger.to_i) ] ) end |
#detect(buffers) ⇒ Event, NilClass
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 20 def detect(buffers) buffer = buffers.find { |b| b.type == BUFFER_TYPE } gesture_buffer = buffers.find { |b| b.type == 'gesture' } return if buffer.empty? || moved?(tap_buffer: buffer, gesture_buffer: gesture_buffer) holding_time = buffer.events.last.time - buffer.events.first.time direction = if hold?(buffer, holding_time) 'hold' elsif tap?(buffer, holding_time) 'tap' end return if direction.nil? finger = buffer.finger buffer.clear index = create_index(finger: finger, direction: direction) return unless enough?(index: index, direction: direction) create_event(record: Events::Records::IndexRecord.new(index: index)) end |
#hold?(buffer, holding_time) ⇒ TrueClass, FalseClass
58 59 60 61 62 63 64 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 58 def hold?(buffer, holding_time) return false if holding_time < 0.7 return true if buffer.finger == 4 true if buffer.events.any? { |e| e.record.status == 'hold' } end |
#moved?(tap_buffer:, gesture_buffer:) ⇒ TrueClass, FalseClass
74 75 76 77 78 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 74 def moved?(tap_buffer:, gesture_buffer:) tap_buffer.events.any? { |e| e.record.status == 'move' } || # FIXME: Find good parameter for ignoring gesture_buffer.events.count { |e| tap_buffer.events.first.time < e.time } > 5 end |
#released_all?(buffer) ⇒ TrueClass, FalseClass
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 81 def released_all?(buffer) touch_num = buffer.events.count { |e| (e.record.status =~ /begin|touch/) } release_num = buffer.events.count { |e| e.record.status =~ /release|end/ } MultiLogger.debug(touch_num: touch_num, release_num: release_num) case buffer.finger when 1 touch_num == release_num when 2 touch_num == release_num + 1 when 3 touch_num == release_num + 1 when 4 touch_num > 0 && release_num > 0 else false end end |
#tap?(buffer, holding_time) ⇒ TrueClass, FalseClass
67 68 69 70 71 |
# File 'lib/fusuma/plugin/detectors/tap_detector.rb', line 67 def tap?(buffer, holding_time) return false if holding_time > 0.15 released_all?(buffer) end |