class PiDriver::I2CMaster

Public Class Methods

new(options = {}) click to toggle source
# File lib/pi_driver/i2c_master.rb, line 3
def initialize(options = {})
  @frequency = 100_000
  @delta_time = @frequency**-1.0
  @clock_pin = options[:clock_pin]
  @data_pin = options[:data_pin]
  stop
end
prepare_address_for_read(address_byte) click to toggle source
# File lib/pi_driver/i2c_master.rb, line 45
def self.prepare_address_for_read(address_byte)
  (address_byte << 1) | 1
end
prepare_address_for_write(address_byte) click to toggle source
# File lib/pi_driver/i2c_master.rb, line 41
def self.prepare_address_for_write(address_byte)
  address_byte << 1
end

Public Instance Methods

ack() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 33
def ack
  release_data_pin
  release_clock_pin
  success = @data_pin.clear?
  drive_clock_pin
  success
end
read() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 28
def read
  release_data_pin
  read_data
end
restart()
Alias for: start
start() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 16
def start
  drive_data_pin
  drive_clock_pin
end
Also aliased as: restart
stop() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 11
def stop
  release_clock_pin
  release_data_pin
end
write(byte) click to toggle source
# File lib/pi_driver/i2c_master.rb, line 23
def write(byte)
  send_data byte
  byte
end

Private Instance Methods

drive_clock_pin() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 86
def drive_clock_pin
  @clock_pin.output Utils::State::LOW
  observe_speed_requirement
end
drive_data_pin() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 75
def drive_data_pin
  @data_pin.output Utils::State::LOW
  observe_speed_requirement
end
observe_clock_stretch() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 91
def observe_clock_stretch
  clock_stretch_began_at = Time.now
  one_millisecond = 0.001
  loop do
    elapsed_time = Time.now - clock_stretch_began_at
    timed_out = elapsed_time > one_millisecond
    break if @clock_pin.set? || timed_out
  end
end
observe_speed_requirement() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 101
def observe_speed_requirement
  start = Time.now
  loop { break if (Time.now - start) > @delta_time }
end
read_data() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 60
def read_data
  bits = []
  Utils::Byte::NUM_BITS_PER_BYTE.times do
    release_clock_pin
    bits << @data_pin.value
    drive_clock_pin
  end
  Utils::Byte.bits_to_byte(bits)
end
release_clock_pin() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 80
def release_clock_pin
  @clock_pin.input
  observe_clock_stretch
  observe_speed_requirement
end
release_data_pin() click to toggle source
# File lib/pi_driver/i2c_master.rb, line 70
def release_data_pin
  @data_pin.input
  observe_speed_requirement
end
send_data(byte) click to toggle source
# File lib/pi_driver/i2c_master.rb, line 51
def send_data(byte)
  bits = Utils::Byte.byte_to_bits(byte)
  bits.each do |bit|
    bit == Utils::State::HIGH ? release_data_pin : drive_data_pin
    release_clock_pin
    drive_clock_pin
  end
end