Class: I2C::Drivers::MCP23008
- Inherits:
-
Object
- Object
- I2C::Drivers::MCP23008
- Defined in:
- lib/i2c/drivers/mcp23008.rb
Constant Summary collapse
- IODIR =
Registers
0x00
- GPIO =
0x09
Instance Method Summary collapse
- #[](pin) ⇒ Object (also: #read)
- #[]=(pin, value) ⇒ Object (also: #write)
-
#initialize(device, address) ⇒ MCP23008
constructor
Creates an instance representing exactly one MCP23008 on one I2C-bus.
- #mode(pin, pin_mode) ⇒ Object
- #mode?(pin) ⇒ Boolean
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
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
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
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
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 |