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