Class: LIFX::NetworkContext

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
RequiredKeywordArguments
Defined in:
lib/lifx/network_context.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from RequiredKeywordArguments

#required!

Constructor Details

#initialize(transport_manager: required!('transport_manager')) ⇒ NetworkContext

Returns a new instance of NetworkContext.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/lifx/network_context.rb', line 22

def initialize(transport_manager: required!('transport_manager'))
  @devices = {}

  @transport_manager = transport_manager
  @transport_manager.context = WeakRef.new(self)
  @transport_manager.add_observer(self, :message_received) do |message: nil, ip: nil, transport: nil|
    handle_message(message, ip, transport)
  end

  reset!

  @threads = []
  @threads << initialize_timer_thread
end

Instance Attribute Details

#routing_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



20
21
22
# File 'lib/lifx/network_context.rb', line 20

def routing_manager
  @routing_manager
end

#tag_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



20
21
22
# File 'lib/lifx/network_context.rb', line 20

def tag_manager
  @tag_manager
end

#transport_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



20
21
22
# File 'lib/lifx/network_context.rb', line 20

def transport_manager
  @transport_manager
end

Instance Method Details

#all_lightsObject



135
136
137
# File 'lib/lifx/network_context.rb', line 135

def all_lights
  @devices.values
end

#discoverObject



37
38
39
# File 'lib/lifx/network_context.rb', line 37

def discover
  @transport_manager.discover
end

#flush(**options) ⇒ Object



121
122
123
# File 'lib/lifx/network_context.rb', line 121

def flush(**options)
  @transport_manager.flush(**options)
end

#lightsObject



131
132
133
# File 'lib/lifx/network_context.rb', line 131

def lights
  LightCollection.new(context: self)
end

#refresh(force: true) ⇒ Object



41
42
43
# File 'lib/lifx/network_context.rb', line 41

def refresh(force: true)
  @routing_manager.refresh(force: force)
end

#register_device(device) ⇒ Object



125
126
127
128
129
# File 'lib/lifx/network_context.rb', line 125

def register_device(device)
  return if device.site_id == NULL_SITE_ID
  device_id = device.id
  @devices[device_id] = device # What happens when there's already one registered?
end

#reset!Object



45
46
47
48
# File 'lib/lifx/network_context.rb', line 45

def reset!
  @routing_manager = RoutingManager.new(context: self)
  @tag_manager = TagManager.new(context: self, tag_table: @routing_manager.tag_table)
end

#send_message(target: required!(:target), payload: required!(:payload), acknowledge: false, at_time: nil) ⇒ Object

Sends a message to their destination(s)

Parameters:

  • target: (Target) (defaults to: required!(:target))

    Target of the message

  • payload: (Protocol::Payload) (defaults to: required!(:payload))

    Message payload

  • acknowledge: (Boolean) (defaults to: false)

    If recipients must acknowledge with a response

  • at_time: (Integer) (defaults to: nil)

    Unix epoch in milliseconds to run the payload. Only applicable to certain payload types.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/lifx/network_context.rb', line 65

def send_message(target: required!(:target), payload: required!(:payload), acknowledge: false, at_time: nil)
  paths = @routing_manager.resolve_target(target)

  messages = paths.map do |path|
    Message.new(path: path, payload: payload, acknowledge: acknowledge, at_time: at_time)
  end

  if within_sync?
    Thread.current[:sync_messages].push(*messages)
    return
  end

  messages.each do |message|
    @transport_manager.write(message)
  end
end

#stopObject



50
51
52
53
54
55
56
57
58
# File 'lib/lifx/network_context.rb', line 50

def stop
  @transport_manager.stop
  stop_timers
  @threads.each do |thread|
    thread.abort
    thread.join
  end
  @threads = nil
end

#sync(delay: 0) { ... } ⇒ Float

Note:

This is alpha

Synchronize asynchronous set_color, set_waveform and set_power messages to multiple devices. You cannot use synchronous methods in the block

Parameters:

  • delay: (Float) (defaults to: 0)

    The delay to add to sync commands when dealing with latency.

Yields:

  • Block to synchronize commands in

Returns:

  • (Float)

    Delay before messages are executed



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/lifx/network_context.rb', line 93

def sync(delay: 0, &block)
  if within_sync?
    raise "You cannot nest sync"
  end
  messages = Thread.start do
    Thread.current[:sync_enabled] = true
    Thread.current[:sync_messages] = messages = []
    block.call
    Thread.current[:sync_enabled] = false
    messages
  end.join.value

  time = nil
  try_until -> { time } do
    light = lights.alive.sample
    time = light && light.time
  end

  delay += (messages.count + 1) * (1.0 / @transport_manager.message_rate)
  at_time = ((time.to_f + delay) * 1_000_000_000).to_i
  messages.each do |m|
    m.at_time = at_time
    @transport_manager.write(m)
  end
  flush
  delay
end

#tags_for_device(device) ⇒ Object



147
148
149
# File 'lib/lifx/network_context.rb', line 147

def tags_for_device(device)
  @routing_manager.tags_for_device_id(device.id)
end

#to_sObject Also known as: inspect



151
152
153
# File 'lib/lifx/network_context.rb', line 151

def to_s
  %Q{#<LIFX::NetworkContext transport_manager=#{transport_manager}>}
end