Class: LIFX::NetworkContext
- Inherits:
-
Object
- Object
- LIFX::NetworkContext
- Extended by:
- Forwardable
- Includes:
- RequiredKeywordArguments
- Defined in:
- lib/lifx/network_context.rb
Instance Attribute Summary collapse
-
#routing_manager ⇒ Object
readonly
NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager.
-
#tag_manager ⇒ Object
readonly
NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager.
-
#transport_manager ⇒ Object
readonly
NetworkContext stores lights and ties together TransportManager, TagManager and RoutingManager.
Instance Method Summary collapse
- #all_lights ⇒ Object
- #discover ⇒ Object
- #flush(**options) ⇒ Object
-
#initialize(transport_manager: required!('transport_manager')) ⇒ NetworkContext
constructor
A new instance of NetworkContext.
- #lights ⇒ Object
- #refresh ⇒ Object
- #register_device(device) ⇒ Object
- #reset! ⇒ Object
-
#send_message(target: required!(:target), payload: required!(:payload), acknowledge: false) ⇒ Object
Sends a message to their destination(s).
- #stop ⇒ Object
-
#sync { ... } ⇒ Float
Synchronize asynchronous set_color, set_waveform and set_power messages to multiple devices.
- #tags_for_device(device) ⇒ Object
- #to_s ⇒ Object (also: #inspect)
Methods included from RequiredKeywordArguments
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| (, ip, transport) end reset! @threads = [] end |
Instance Attribute Details
#routing_manager ⇒ Object (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_manager ⇒ Object (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_manager ⇒ Object (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_lights ⇒ Object
125 126 127 |
# File 'lib/lifx/network_context.rb', line 125 def all_lights @devices.values end |
#discover ⇒ Object
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(**) @transport_manager.flush(**) end |
#lights ⇒ Object
121 122 123 |
# File 'lib/lifx/network_context.rb', line 121 def lights LightCollection.new(context: self) end |
#refresh ⇒ Object
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)
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 (target: required!(:target), payload: required!(:payload), acknowledge: false) paths = @routing_manager.resolve_target(target) = paths.map do |path| Message.new(path: path, payload: payload, acknowledge: acknowledge) end if within_sync? Thread.current[:sync_messages].push(*) return end .each do || @transport_manager.write() end end |
#stop ⇒ Object
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
This is alpha
Synchronize asynchronous set_color, set_waveform and set_power messages to multiple devices. You cannot use synchronous methods in the block
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 = Thread.new do Thread.current[:sync_enabled] = true Thread.current[:sync_messages] = = [] block.call Thread.current[:sync_enabled] = false end.join.value time = nil try_until -> { time } do light = gateways.sample time = light && light.time end delay = (.count + 1) * (1.0 / ) at_time = ((time.to_f + delay) * 1_000_000_000).to_i .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 (device) @routing_manager.(device.id) end |
#to_s ⇒ Object 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 |