Class: I2C::Drivers::MCP23008

Inherits:
Object
  • Object
show all
Defined in:
lib/i2c/drivers/mcp23008.rb

Constant Summary collapse

IODIR =

Registers

0x00
GPIO =
0x09

Instance Method Summary collapse

Constructor Details

#initialize(device, address) ⇒ MCP23008

Creates an instance representing exactly one MCP23008 on one I2C-bus.

device: I2C-device file (usually /dev/i2c-0).

Or an intantiated io class that supports
the necessary operations (#read, #write
and #ioctl).

address: Device address on the bus.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/i2c/drivers/mcp23008.rb', line 38

def initialize(device, address)
  if device.kind_of?(String)
    @device = ::I2C.create(device)
  else
    [ :read, :write ].each do |m|
      raise IncompatibleDeviceException, 
      "Missing #{m} method in device object." unless device.respond_to?(m)
    end
    @device = device
  end
  @address = address
  
  @dir = 0xFF # Direction is input initially 
  @device.write(@address, IODIR, @dir)
  @data = @device.read(@address, 1, GPIO).unpack("C")[0]   
end

Instance Method Details

#[](pin) ⇒ Object Also known as: read

Raises:

  • (ArgumentError)


75
76
77
78
79
# File 'lib/i2c/drivers/mcp23008.rb', line 75

def [](pin)
  raise ArgumentError, "Pin not 0-7." unless (0..7).include?(pin)
  @data = @device.read(@address, 1, GPIO).unpack("C")[0]
  return (@data >> pin) & 0x01        
end

#[]=(pin, value) ⇒ Object Also known as: write

Raises:

  • (ArgumentError)


67
68
69
70
71
72
# File 'lib/i2c/drivers/mcp23008.rb', line 67

def []=(pin, value)
  raise ArgumentError, "Pin not 0-7" unless (0..7).include?(pin)
  raise ArgumentError, 'invalid value' unless [0,1].include?(value)
  @data = set_bit_value(@data, pin, value)
  @device.write(@address, GPIO, @data)
end

#mode(pin, pin_mode) ⇒ Object

Raises:

  • (ArgumentError)


60
61
62
63
64
65
# File 'lib/i2c/drivers/mcp23008.rb', line 60

def mode(pin, pin_mode)
  raise ArgumentError, "Pin not 0-7" unless (0..7).include?(pin)
  raise ArgumentError, 'invalid value' unless [0,1].include?(pin_mode)
  @dir = set_bit_value(@dir, pin, pin_mode)
  @device.write(@address, IODIR, @dir)
end

#mode?(pin) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
58
# File 'lib/i2c/drivers/mcp23008.rb', line 55

def mode?(pin)
  @dir = @device.read(@address, 1, IODIR).unpack("C")[0]
  return (@dir >> pin) & 0x01
end