module Flic::Client::Features::Ping

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/flic/client/features/ping.rb, line 9
def initialize(*)
  @ping_id_callback_semaphore = Mutex.new
  @ping_id_callback = {}

  super
end

Public Instance Methods

ping(callback = Proc.new) click to toggle source
# File lib/flic/client/features/ping.rb, line 16
def ping(callback = Proc.new)
  ping_id = alloc_ping_id_with_callback(callback)

  send_command Protocol::Commands::Ping.new(ping_id: ping_id)
end

Private Instance Methods

alloc_ping_id_with_callback(callback) click to toggle source
# File lib/flic/client/features/ping.rb, line 24
def alloc_ping_id_with_callback(callback)
  @ping_id_callback_semaphore.synchronize do
    ping_id = nil

    loop do
      ping_id = rand(2**32)

      break unless @ping_id_callback.has_key?(ping_id)
    end

    @ping_id_callback[ping_id] = callback

    ping_id
  end
end
handle_event(event) click to toggle source
Calls superclass method
# File lib/flic/client/features/ping.rb, line 40
def handle_event(event)
  case event
    when Protocol::Events::PingResponse
      callback = @ping_id_callback_semaphore.synchronize do
        @ping_id_callback.delete event.ping_id
      end

      callback.call if callback
    else
      super
  end
end