class PiDriver::Device::MCP23017

Attributes

hardware_address[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 21
def initialize(options = {})
  @argument_helper = Utils::ArgumentHelper.new prefix: 'MCP23017'
  @i2c_master = options[:i2c_master]
  @hardware_address = HardwareAddress.new observer: self
  update_opcodes
end

Private Class Methods

register_reader(*register_array) click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 69
def self.register_reader(*register_array)
  register_array.each do |register|
    define_method register do
      registers[register]
    end
  end
end

Public Instance Methods

read(*register_array) click to toggle source

TODO: read and write look similar. consider consolidation

# File lib/pi_driver/device/mcp23017.rb, line 43
def read(*register_array)
  check_registers register_array

  @i2c_master.start

  register_array.each_with_index do |register, sequence_index|
    @i2c_master.restart unless sequence_index.zero?
    read_register register
  end

  @i2c_master.stop
end
update_opcodes() click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 35
def update_opcodes
  bits = [0, 1, 0, 0, @hardware_address.a2, @hardware_address.a1, @hardware_address.a0]
  base = Utils::Byte.bits_to_byte(bits)
  @opcode_for_write = PiDriver::I2CMaster.prepare_address_for_write base
  @opcode_for_read = PiDriver::I2CMaster.prepare_address_for_read base
end
update_registers() click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 28
def update_registers
  bank = registers[:iocon].bank
  registers.each_value do |register|
    register.update_address bank
  end
end
write(*register_array) click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 56
def write(*register_array)
  check_registers register_array

  @i2c_master.start

  register_array.each_with_index do |register, sequence_index|
    @i2c_master.restart unless sequence_index.zero?
    write_register register
  end

  @i2c_master.stop
end

Private Instance Methods

check_registers(register_array) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/pi_driver/device/mcp23017.rb, line 116
def check_registers(register_array)
  register_array.each do |register|
    @argument_helper.check(:register, register, registers.keys)
  end
end
initialize_registers() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/pi_driver/device/mcp23017.rb, line 97
def initialize_registers
  {
    iodira: Iodir.new(port: :a),      iodirb: Iodir.new(port: :b),
    ipola: Ipol.new(port: :a),        ipolb: Ipol.new(port: :b),
    gpintena: Gpinten.new(port: :a),  gpintenb: Gpinten.new(port: :b),
    defvala: Defval.new(port: :a),    defvalb: Defval.new(port: :b),
    intcona: Intcon.new(port: :a),    intconb: Intcon.new(port: :b),

    iocon: Iocon.new(observer: self),

    gppua: Gppu.new(port: :a),        gppub: Gppu.new(port: :b),
    intfa: Intf.new(port: :a),        intfb: Intf.new(port: :b),
    intcapa: Intcap.new(port: :a),    intcapb: Intcap.new(port: :b),
    gpioa: Gpio.new(port: :a),        gpiob: Gpio.new(port: :b),
    olata: Olat.new(port: :a),        olatb: Olat.new(port: :b)
  }
end
read_register(register) click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 122
def read_register(register)
  @i2c_master.write @opcode_for_write
  @i2c_master.ack
  @i2c_master.write registers[register].address
  @i2c_master.ack

  @i2c_master.restart

  @i2c_master.write @opcode_for_read
  @i2c_master.ack
  registers[register].byte = @i2c_master.read
end
registers() click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 92
def registers
  @registers ||= initialize_registers
end
write_register(register) click to toggle source
# File lib/pi_driver/device/mcp23017.rb, line 135
def write_register(register)
  @i2c_master.write @opcode_for_write
  @i2c_master.ack
  @i2c_master.write registers[register].address
  @i2c_master.ack
  @i2c_master.write registers[register].byte
  @i2c_master.ack
end