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
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