Class: Fusuma::Plugin::Detectors::TapDetector

Inherits:
Detector
  • Object
show all
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

Instance Method Details

#create_index(finger:, direction:) ⇒ Config::Index

Returns:

  • (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

Parameters:

  • buffers (Array<Buffer>)

Returns:

  • (Event)

    if event is detected

  • (NilClass)

    if event is NOT detected



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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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