lib/fusuma/plugin/detectors/hold_detector.rb in fusuma-2.5.1 vs lib/fusuma/plugin/detectors/hold_detector.rb in fusuma-3.0.0
- old
+ new
@@ -1,17 +1,19 @@
# frozen_string_literal: true
require_relative "./detector"
+require_relative "../inputs/timer_input"
module Fusuma
module Plugin
module Detectors
# Detect Hold gesture
class HoldDetector < Detector
SOURCES = %w[gesture timer].freeze
BUFFER_TYPE = "gesture"
GESTURE_RECORD_TYPE = "hold"
+ Timer = Inputs::TimerInput.instance
BASE_THERESHOLD = 0.7
# @param buffers [Array<Buffers::Buffer>]
# @return [Events::Event] if event is detected
@@ -19,20 +21,19 @@
# @return [NilClass] if event is NOT detected
def detect(buffers)
hold_buffer = find_hold_buffer(buffers)
return if hold_buffer.empty?
- hold_events = hold_buffer.events
+ last_hold = hold_buffer.events.last
timer_buffer = buffers.find { |b| b.type == "timer" }
- timer_events = timer_buffer.events
+ last_timer = timer_buffer.events.last
finger = hold_buffer.finger
- holding_time = calc_holding_time(hold_events: hold_events, timer_events: timer_events)
+ holding_time = calc_holding_time(hold_events: hold_buffer.events, last_timer: last_timer)
- @timeout ||= nil
- status = case hold_events.last.record.status
+ status = case last_hold.record.status
when "begin"
if holding_time.zero?
"begin"
else
"timer"
@@ -40,20 +41,23 @@
when "cancelled"
"cancelled"
when "end"
"end"
else
- last_record = hold_events.last.record.status
+ last_record = last_hold.record.status
raise "Unexpected Status:#{last_record.status} in #{last_record}"
end
repeat_index = create_repeat_index(finger: finger, status: status)
oneshot_index = create_oneshot_index(finger: finger)
- @timeout = nil if status == "begin"
-
- if status == "timer"
+ if status == "begin" then
+ @timeout = nil
+ if threshold(index: oneshot_index) < Timer.interval then
+ Timer.wake_early(Time.now + threshold(index: oneshot_index))
+ end
+ elsif status == "timer"
return if @timeout
return unless enough?(index: oneshot_index, holding_time: holding_time)
@timeout = holding_time
@@ -95,23 +99,29 @@
# @param buffers [Array<Buffers::Buffer>]
# @return [Buffers::GestureBuffer]
def find_hold_buffer(buffers)
buffers.find { |b| b.type == BUFFER_TYPE }
.select_from_last_begin
- .select_by_events { |e| e.record.gesture == GESTURE_RECORD_TYPE }
+ .select_by_type(GESTURE_RECORD_TYPE)
end
- def calc_holding_time(hold_events:, timer_events:)
- last_time = if !timer_events.empty? && (hold_events.last.time < timer_events.last.time)
- timer_events.last.time
+ def calc_holding_time(hold_events:, last_timer:)
+ last_time = if last_timer && (hold_events.last.time < last_timer.time)
+ last_timer.time
else
hold_events.last.time
end
last_time - hold_events.first.time
end
def enough?(index:, holding_time:)
- holding_time > threshold(index: index)
+ diff = threshold(index: index) - holding_time
+ if diff < 0 then
+ true
+ elsif diff < Timer.interval
+ Timer.wake_early(Time.now + diff)
+ false
+ end
end
def threshold(index:)
@threshold ||= {}
@threshold[index.cache_key] ||= begin