class LadderDrive::Protocol::Protocol

Constants

TIMEOUT

Attributes

host[RW]
port[RW]

Public Class Methods

new(options={}) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 34
def initialize options={}
  @logger = Logger.new(STDOUT)
  self.log_level = options[:log_level] || :info
end

Public Instance Methods

[](*args) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 108
def [] *args
  case args.size
  when 1
    # protocol["DM0"]
    # protocol["DM0".."DM9"]
    case args[0]
    when String
      self[args[0], 1].first
    when Range
      self[args[0].first, args[0].count]
    else
      raise ArgumentError.new("#{args[0]} must be String or Range.")
    end
  when 2
    # protocol["DM0", 10]
    d = device_by_name args[0]
    c = args[1]
    if d.bit_device?
      a = []
      b = available_bits_range(d).last
      until c == 0
        n_c = [b, c].min
        a += get_bits_from_device(n_c, d)
        d += n_c
        c -= n_c
      end
      a
    else
      a = []
      b = available_words_range(d).last
      until c == 0
        n_c = [b, c].min
        a += get_words_from_device(n_c, d)
        d += n_c
        c -= n_c
      end
      a
    end
  else
    raise ArgumentError.new("wrong number of arguments (given #{args.size}, expected 1 or 2)")
  end
end
[]=(*args) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 151
def []= *args
  case args.size
  when 2
    # protocol["DM0"] = 0
    # protocol["DM0".."DM9"] = [0, 1, .., 9]
    v = args[1]
    v = [v] unless v.is_a? Array
    case args[0]
    when String
      self[args[0], 1] = v
    when Range
      self[args[0].first, args[0].count] = v
    else
      raise ArgumentError.new("#{args[1]} must be String or Array.")
    end
  when 3
    # protocol["DM0", 10] = [0, 1, .., 9]
    d = device_by_name args[0]
    c = args[1]
    values = args[2]
    values = [values] unless values.is_a? Array
    raise ArgumentError.new("Count #{c} is not match #{args[2].size}.") unless c == values.size
    if d.bit_device?
      a = []
      values.each_slice(available_bits_range(d).last) do |sv|
        set_bits_to_device(sv, d)
        d += sv.size
      end
      a
    else
      a = []
      values.each_slice(available_words_range(d).last) do |sv|
        set_words_to_device(sv, d)
        d += sv.size
      end
      a
    end
  else
    raise ArgumentError.new("wrong number of arguments (given #{args.size}, expected 2 or 3)")
  end
end
available_bits_range(device=nil) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 100
def available_bits_range device=nil
  -Float::INFINITY..Float::INFINITY
end
available_words_range(device=nil) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 104
def available_words_range device=nil
  -Float::INFINITY..Float::INFINITY
end
close() click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 66
def close; end
destination_ipv4() click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 193
def destination_ipv4
  Socket.gethostbyname(self.host)[3].unpack("C4").join('.')
end
device_by_name(name;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 78
def device_by_name name; nil; end
get_bit_from_device(device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 68
def get_bit_from_device device; get_bits_from_device(1, device_by_name(device)).first; end
get_bits_from_device(count, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 69
def get_bits_from_device count, device; end
get_from_devices(device, count = 1) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 80
def get_from_devices device, count = 1
  d = device_by_name device
  if d.bit_device?
    get_bits_from_device count, d
  else
    get_words_from_device count, d
  end
end
get_word_from_device(device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 73
def get_word_from_device device; get_words_from_device(1, device_by_name(device)).first; end
get_words_from_device(count, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 74
def get_words_from_device count, device; end
log_level() click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 39
def log_level
  @log_level
end
log_level=(level) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 43
def log_level= level
  @log_level = level.is_a?(String) ? level.to_sym : level
  case @log_level
  when :debug
    @logger.level = Logger::DEBUG
  when :error
    @logger.level = Logger::ERROR
  when :fatal
    @logger.level = Logger::FATAL
  when :info
    @logger.level = Logger::INFO
  when :unknown
    @logger.level = Logger::UNKNOWN
  when :warn
    @logger.level = Logger::WARN
  end
end
open() click to toggle source

abstract methods

# File lib/ladder_drive/protocol/protocol.rb, line 65
def open; end
self_ipv4() click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 197
def self_ipv4
  Socket::getaddrinfo(Socket.gethostname,"echo",Socket::AF_INET)[0][3]
end
set_bit_to_device(bit, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 70
def set_bit_to_device bit, device; set_bits_to_device [bit], device; end
set_bits_to_device(bits, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 71
def set_bits_to_device bits, device; end
set_to_devices(device, values) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 89
def set_to_devices device, values
  values = [values] unless values.is_a? Array
  d = device_by_name device
  if d.bit_device?
    values = values.map{|v| case v;  when 1; true; when 0; false; else; v; end}
    set_bits_to_device values, d
  else
    set_words_to_device values, d
  end
end
set_word_to_device(word, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 75
def set_word_to_device word, device; set_words_to_device [word], device; end
set_words_to_device(words, device;) click to toggle source
# File lib/ladder_drive/protocol/protocol.rb, line 76
def set_words_to_device words, device; end