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.



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lifx/network_context.rb', line 18

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

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

  reset!

  @threads = []
end

Instance Attribute Details

#routing_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



16
17
18
# File 'lib/lifx/network_context.rb', line 16

def routing_manager
  @routing_manager
end

#tag_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



16
17
18
# File 'lib/lifx/network_context.rb', line 16

def tag_manager
  @tag_manager
end

#transport_managerObject (readonly)

NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager



16
17
18
# File 'lib/lifx/network_context.rb', line 16

def transport_manager
  @transport_manager
end

Instance Method Details

#all_lightsObject



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

def all_lights
  @devices.values
end

#discoverObject



32
33
34
# File 'lib/lifx/network_context.rb', line 32

def discover
  @transport_manager.discover
end

#flush(**options) ⇒ Object



111
112
113
# File 'lib/lifx/network_context.rb', line 111

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

#lightsObject



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

def lights
  LightCollection.new(context: self)
end

#refreshObject



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

def refresh
  @routing_manager.refresh
end

#register_device(device) ⇒ Object



115
116
117
118
119
# File 'lib/lifx/network_context.rb', line 115

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



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

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) ⇒ 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



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/lifx/network_context.rb', line 56

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

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

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

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

#stopObject



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

def stop
  @transport_manager.stop
  @threads.each do |thread|
    Thread.kill(thread)
  end
end

#sync { ... } ⇒ 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

Yields:

  • Block to synchronize commands in

Returns:

  • (Float)

    Delay before messages are executed



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/lifx/network_context.rb', line 83

def sync(&block)
  if within_sync?
    raise "You cannot nest sync"
  end
  messages = Thread.new 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 = gateways.sample
    time = light && light.time
  end

  delay = (messages.count + 1) * (1.0 / 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



137
138
139
# File 'lib/lifx/network_context.rb', line 137

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

#to_sObject Also known as: inspect



141
142
143
# File 'lib/lifx/network_context.rb', line 141

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