class LadderDrive::Emulator::PluginTriggerState
Attributes
config[R]
device[R]
plc[R]
value[R]
value_type[R]
Public Class Methods
new(plc, config)
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 42 def initialize plc, config @plc = plc @config = config @value_type = config[:value_type] @devices = {} @next_trigger_times = {} end
Public Instance Methods
changed?()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 67 def changed? !!@changed end
device_with_trigger(trigger)
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 145 def device_with_trigger trigger @devices[trigger.object_id] ||= @plc.device_by_name(trigger[:device]) end
fallen?()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 75 def fallen? !!@fallen end
key()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 50 def key object_id end
raised?()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 71 def raised? !!@raised end
reset()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 138 def reset @changed = nil @raised = nil @fallen = nil @triggered = nil end
triggered?()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 79 def triggered? !!@triggered end
update()
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 87 def update return unless @triggered.nil? triggers = config[:triggers] triggers ||= [config[:trigger]] @triggered = false triggers.each do |trigger| case trigger[:type] when "changed", "raise", "fall", "raise_and_fall" device = device_with_trigger(trigger) value = device.send(@value_type || :value) # update flags @changed = @value != value case value when true, false, nil @raised = @changed && !!value @fallen = @changed && !value else @fallen = @changed && value == 0 @raised = @changed && !@fallen end @value = value # judgement triggered case trigger[:type] when "raise" @triggered = true if @raised when "fall" @triggered = true if @fallen else @triggered = true if @changed end when "interval" now = Time.now t = @next_trigger_times[trigger.object_id] || now while now >= t @triggered ||= true t += trigger[:interval] end @next_trigger_times[trigger.object_id] = t else @triggered = false end end @triggered end
value=(value)
click to toggle source
# File lib/plc/emulator/plugin_trigger_state.rb, line 58 def value= value if @changed.nil? @changed = @value != value @raised = @changed && !!value @fallen = @changed && !value @value = value end end