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