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