sane-ffi/lib/sane/device.rb

134 lines
2.6 KiB
Ruby
Raw Normal View History

2011-05-31 23:21:15 +02:00
class Sane
2011-05-31 18:26:57 +02:00
class Device
2011-06-01 14:37:24 +02:00
attr_reader :name, :vendor, :model, :type
2011-06-01 14:07:08 +02:00
def initialize(options)
@name = options[:name]
@vendor = options[:vendor]
@model = options[:model]
@type = options[:type]
2011-05-31 23:21:15 +02:00
@handle = nil
end
def closed?
@handle.nil?
end
2011-06-01 14:07:08 +02:00
def open?
2011-05-31 23:21:15 +02:00
!closed?
2011-05-31 18:26:57 +02:00
end
2011-06-01 14:07:08 +02:00
def open
ensure_closed!
@handle = Sane.instance.send(:open, @name)
if block_given?
begin
yield(self)
ensure
close
end
end
end
2011-05-31 18:26:57 +02:00
def close
2011-06-01 14:07:08 +02:00
ensure_open!
Sane.instance.send(:close, @handle)
2011-05-31 23:21:15 +02:00
@handle = nil
2011-05-31 18:26:57 +02:00
end
2011-06-01 14:07:08 +02:00
def start
ensure_open!
Sane.instance.start(@handle)
end
def read
ensure_open!
Sane.instance.send(:read, @handle)
end
2011-06-01 14:37:24 +02:00
def cancel
ensure_open!
Sane.instance.send(:cancel, @handle)
end
def sync
ensure_open!
Sane.instance.send(:set_io_mode, @handle, false)
end
def async
ensure_open!
Sane.instance.send(:set_io_mode, @handle, true)
end
2011-06-01 14:07:08 +02:00
def option_count
ensure_open!
Sane.instance.send(:get_option, @handle, 0)
end
def parameters
ensure_open!
Sane.instance.send(:get_parameters, @handle)
end
def [](option)
ensure_open!
Sane.instance.send(:get_option, @handle, option_lookup(option))
end
def []=(option, value)
ensure_open!
Sane.instance.send(:set_option, @handle, option_lookup(option), value)
end
def option_descriptors
option_count.times.map { |i| Sane.instance.send(:get_option_descriptor, @handle, i) }
end
def option_names
option_descriptors.map { |option| option[:name] }
end
def option_values
option_count.times.map do |i|
begin
self[i]
2011-06-01 14:37:24 +02:00
rescue Error => e
if e.status == :inval
nil # we can't read values of some options (i.e. buttons), ignore them
else
raise e
end
2011-06-01 14:07:08 +02:00
end
end
end
def options
2011-06-01 14:37:24 +02:00
Hash[*option_names.zip(option_values).flatten]
2011-06-01 14:07:08 +02:00
end
def option_lookup(option_name)
return option_name if (0..option_count).include?(option_name)
2011-06-01 14:20:30 +02:00
option_descriptors.index { |option| option[:name] == option_name.to_s } or raise(ArgumentError, "Option not found: #{option_name}")
2011-06-01 14:07:08 +02:00
end
def describe(option)
option_descriptors[option_lookup(option)]
end
2011-06-01 14:51:57 +02:00
def inspect
%Q{#<#{self.class.name}:"#{name}">}
end
2011-06-01 14:07:08 +02:00
private
def ensure_closed!
2011-06-01 14:20:30 +02:00
raise("Device is already open") if open?
2011-06-01 14:07:08 +02:00
end
def ensure_open!
2011-06-01 14:20:30 +02:00
raise("Device is closed") if closed?
2011-06-01 14:07:08 +02:00
end
2011-05-31 18:26:57 +02:00
end
end