class AVR::Port

Constants

PINS

Attributes

cpu[R]
name[R]

Public Class Methods

new(cpu, name, pin_address, ddr_address, port_address) click to toggle source
# File lib/avr/port.rb, line 25
def initialize(cpu, name, pin_address, ddr_address, port_address)
  @cpu = cpu
  @name = name
  @input = T.let(PINS.map { :Z }, T::Array[Symbol])
  @pin_address = pin_address
  @ddr_address = ddr_address
  @port_address = port_address
  @sram_watch = T.let(
    Memory::Watch.new do |_memory_byte, _old_value, _new_value|
      # puts "Port watch fired"
    end,
    Memory::Watch
  )
  @cpu.sram.push_watch(@sram_watch, [@ddr_address, @port_address])
end

Public Instance Methods

ddr() click to toggle source
# File lib/avr/port.rb, line 47
def ddr
  T.must(cpu.sram.memory[@ddr_address])
end
inspect() click to toggle source
# File lib/avr/port.rb, line 103
def inspect
  "#<#{self.class.name} #{value_pins}>"
end
pin() click to toggle source
# File lib/avr/port.rb, line 42
def pin
  T.must(cpu.sram.memory[@pin_address])
end
pin_input(pin, state) click to toggle source
# File lib/avr/port.rb, line 57
def pin_input(pin, state)
  raise unless %i[H L Z].include?(state)

  @input[pin] = state
end
pin_state(pin, _pin_value, ddr_value, port_value) click to toggle source
# File lib/avr/port.rb, line 71
def pin_state(pin, _pin_value, ddr_value, port_value)
  n_bv = 1 << pin
  drive = (ddr_value & n_bv) == n_bv
  state = (port_value & n_bv) == n_bv

  return (state ? :H : :L) if drive

  @input.fetch(pin)
end
pin_states() click to toggle source
# File lib/avr/port.rb, line 82
def pin_states
  pin_value = pin.value
  ddr_value = ddr.value
  port_value = port.value

  PINS.map { |n| pin_state(n, pin_value, ddr_value, port_value) }
end
port() click to toggle source
# File lib/avr/port.rb, line 52
def port
  T.must(cpu.sram.memory[@port_address])
end
value() click to toggle source
# File lib/avr/port.rb, line 96
def value
  sum = 0
  pin_states.each_with_index { |n, i| sum += (n == :H ? 1 : 0) * (2**i).to_i }
  sum
end
value_pins() click to toggle source
# File lib/avr/port.rb, line 91
def value_pins
  PINS.zip(pin_states).map { |n, s| "P#{n}=#{s}" }.join(', ')
end