class TelosLWCP::Engine

Attributes

host[RW]
port[RW]

Public Class Methods

new(host:, port: 20518) click to toggle source
# File lib/telos_lwcp/engine.rb, line 10
def initialize host:, port: 20518
  self.host = host
  self.port = port

  @listeners = Hash.new {|h, k| h[k] = {}}
  @subscriptions = []
end

Public Instance Methods

call_number(line_nr, number) click to toggle source
# File lib/telos_lwcp/engine.rb, line 67
def call_number(line_nr, number)
  wait(
      [:event, "studio.line##{line_nr}"] => proc { true }
  ) do
    write :call, "studio.line##{line_nr}", number: number
  end
end
connect() { |self| ... } click to toggle source
# File lib/telos_lwcp/engine.rb, line 18
def connect
  @server = TCPSocket.new host, port
  start_reader_thread
  if block_given?
    yield self
    disconnect
  end
end
disconnect() click to toggle source
# File lib/telos_lwcp/engine.rb, line 27
def disconnect
  @reader_thread.terminate if @reader_thread
  @server.close
end
list_studios() click to toggle source
# File lib/telos_lwcp/engine.rb, line 40
def list_studios
  wait(
    [:indi, :cc] => proc {|r| r.arguments[:studio_list] }
  ) do
    write :get, "cc studio_list"
  end
end
login(user, password) click to toggle source
# File lib/telos_lwcp/engine.rb, line 32
def login(user, password)
  wait(
    [:ack, :cc] => proc {|r| r.arguments[:logged] }
  ) do
    write :login, :cc, user: user, password: password
  end
end
seize(line_nr) click to toggle source
# File lib/telos_lwcp/engine.rb, line 58
def seize(line_nr)
  wait(
      [:event, "studio.line##{line_nr}"] => proc { true },
      [:ack, "studio.line##{line_nr}"] => proc {|r| Error.new(r.system_items[:msg]) }
  ) do
    write :seize, "studio.line##{line_nr}"
  end
end
select_studio(id) click to toggle source
# File lib/telos_lwcp/engine.rb, line 49
def select_studio(id)
  wait(
      [:event, :studio] => proc {|r| r },
      [:ack, :studio] => proc {|r| Error.new(r.system_items[:msg]) }
  ) do
    write :select, :studio, id: id
  end
end
subscribe(command: nil, object: nil, matcher: nil, &block) click to toggle source
# File lib/telos_lwcp/engine.rb, line 75
def subscribe(command: nil, object: nil, matcher: nil, &block)
  @subscriptions << Subscription.new(command: command, object: object, matcher: matcher, block: block)
end
wait(expectations, read_timeout: 5, &block) click to toggle source
# File lib/telos_lwcp/engine.rb, line 85
def wait(expectations, read_timeout: 5, &block)
  data = nil
  thread = Thread.current
  expectations.each do |(cmd, object), proc|
    @listeners[cmd.to_s][object.to_s] = proc {|d|
      data = proc.call(d);
      expectations.each {|(cmd, object), _| @listeners[cmd.to_s][object.to_s] = nil }
      thread.run
    }
  end
  block.call
  Timeout.timeout(read_timeout) do
    Thread.stop
  end
  Error === data ? raise(data) : data
end
write(command, object, arguments = {}) click to toggle source

Low level

# File lib/telos_lwcp/engine.rb, line 80
def write(command, object, arguments = {})
  cmd = Command.outgoing(command, object, arguments)
  @server.write(cmd.to_s)
end

Private Instance Methods

start_reader_thread() click to toggle source
# File lib/telos_lwcp/engine.rb, line 103
def start_reader_thread
  Thread.abort_on_exception = true
  @reader_thread = Thread.start do
    loop do
      raw = @server.gets.chomp
      value = Command.incoming(raw)
      if listener = @listeners[value.command][value.object]
        listener.call(value)
      end

      @subscriptions.select {|sub| sub.match?(value) }.each {|sub| sub.call(value) }
    end
  end
end