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(force: true) ⇒ Object
- #register_device(device) ⇒ Object
- #reset! ⇒ Object
-
#send_message(target: required!(:target), payload: required!(:payload), acknowledge: false, at_time: nil) ⇒ Object
Sends a message to their destination(s).
- #stop ⇒ Object
-
#sync(delay: 0) { ... } ⇒ 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.
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| (, ip, transport) end reset! @threads = [] @threads << initialize_timer_thread end |
Instance Attribute Details
#routing_manager ⇒ Object (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_manager ⇒ Object (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_manager ⇒ Object (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_lights ⇒ Object
135 136 137 |
# File 'lib/lifx/network_context.rb', line 135 def all_lights @devices.values end |
#discover ⇒ Object
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(**) @transport_manager.flush(**) end |
#lights ⇒ Object
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)
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 (target: required!(:target), payload: required!(:payload), acknowledge: false, at_time: nil) paths = @routing_manager.resolve_target(target) = 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(*) return end .each do || @transport_manager.write() end end |
#stop ⇒ Object
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
This is alpha
Synchronize asynchronous set_color, set_waveform and set_power messages to multiple devices. You cannot use synchronous methods in the block
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 = Thread.start 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 = lights.alive.sample time = light && light.time end delay += (.count + 1) * (1.0 / @transport_manager.) 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
147 148 149 |
# File 'lib/lifx/network_context.rb', line 147 def (device) @routing_manager.(device.id) end |
#to_s ⇒ Object 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 |