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