module Flic::Client::Features::Scan

Public Class Methods

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

  super
end

Public Instance Methods

add_scanner(scanner) click to toggle source
# File lib/flic/client/features/scan.rb, line 20
def add_scanner(scanner)
  scan_id = _add_scanner(scanner)

  send_command Protocol::Commands::CreateScanner.new(scan_id: scan_id) if scan_id
end
remove_scanner(scanner) click to toggle source
# File lib/flic/client/features/scan.rb, line 26
def remove_scanner(scanner)
  scan_id = _remove_scanner(scanner)

  send_command Protocol::Commands::RemoveScanner.new(scan_id: scan_id) if scan_id
end
scanners() click to toggle source
# File lib/flic/client/features/scan.rb, line 16
def scanners
  @scan_id_scanner_semaphore.synchronize { @scan_id_scanner.values }
end
shutdown(*) click to toggle source
Calls superclass method
# File lib/flic/client/features/scan.rb, line 32
def shutdown(*)
  scanners.each do |scanner|
    _remove_scanner(scanner)
  end

  super
end

Private Instance Methods

_add_scanner(scanner) click to toggle source
# File lib/flic/client/features/scan.rb, line 61
def _add_scanner(scanner)
  scan_id = nil

  @scan_id_scanner_semaphore.synchronize do
    unless @scan_id_scanner.values.include?(scanner)
      loop do
        scan_id = rand(2**32)

        break unless @scan_id_scanner.has_key?(scan_id)
      end

      @scan_id_scanner[scan_id] = scanner
    end
  end

  scanner.added self if scan_id # we have to do this here because the server does not callback

  scan_id
end
_remove_scanner(scanner) click to toggle source
# File lib/flic/client/features/scan.rb, line 81
def _remove_scanner(scanner)
  scan_id = nil

  @scan_id_scanner_semaphore.synchronize do
    @scan_id_scanner.each do |_scan_id, _scanner|
      if scanner == _scanner
        scan_id = _scan_id
        break
      end
    end

    @scan_id_scanner.delete scan_id if scan_id
  end

  scanner.removed self if scan_id # we have to do this here because the server does not callback

  scan_id
end
find_scanner_for_scan_id(needle) click to toggle source
# File lib/flic/client/features/scan.rb, line 100
def find_scanner_for_scan_id(needle)
  @scan_id_scanner_semaphore.synchronize do
    @scan_id_scanner.each do |scan_id, scanner|
      return scanner if scan_id == needle
    end
  end

  nil
end
handle_event(event) click to toggle source
Calls superclass method
# File lib/flic/client/features/scan.rb, line 42
def handle_event(event)
  case event
    when Protocol::Events::AdvertisementPacket
      scanner = find_scanner_for_scan_id(scanner)

      if scanner
        scanner.advertisement_received(
            event.bluetooth_address,
            event.name,
            event.rssi,
            event.is_private,
            event.is_already_verified
        )
      end
    else
      super
  end
end