Class: AVR::Memory

Inherits:
Object
  • Object
show all
Extended by:
T::Helpers, T::Sig
Defined in:
lib/avr/memory.rb

Direct Known Subclasses

EEPROM, Flash, SRAM

Defined Under Namespace

Classes: Watch, WatchBinding

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, size, value = 0) ⇒ Memory

Returns a new instance of Memory.



82
83
84
85
86
87
88
89
90
# File 'lib/avr/memory.rb', line 82

def initialize(name, size, value = 0)
  @name = name
  @size = size
  @memory = T.let(
    size.times.map { |address| MemoryByte.new(self, address, value) },
    T::Array[MemoryByte]
  )
  @watches = T.let([], T::Array[WatchBinding])
end

Instance Attribute Details

#memoryObject (readonly)

Returns the value of attribute memory.



76
77
78
# File 'lib/avr/memory.rb', line 76

def memory
  @memory
end

#nameObject (readonly)

Returns the value of attribute name.



70
71
72
# File 'lib/avr/memory.rb', line 70

def name
  @name
end

#sizeObject (readonly)

Returns the value of attribute size.



73
74
75
# File 'lib/avr/memory.rb', line 73

def size
  @size
end

#watchesObject (readonly)

Returns the value of attribute watches.



79
80
81
# File 'lib/avr/memory.rb', line 79

def watches
  @watches
end

Instance Method Details

#inspectObject



93
94
95
# File 'lib/avr/memory.rb', line 93

def inspect
  "#<#{self.class.name} size=#{size}>"
end

#load_from_intel_hex(filename) ⇒ Object



153
154
155
156
157
158
159
160
161
# File 'lib/avr/memory.rb', line 153

def load_from_intel_hex(filename)
  ihex = IntelHex::FileReader.new(filename)
  sum = 0
  ihex.each_byte_with_address do |byte, address|
    T.must(memory[address]).value = byte
    sum += 1
  end
  sum
end

#notify(memory_byte, old_value, new_value) ⇒ Object



105
106
107
108
109
110
111
# File 'lib/avr/memory.rb', line 105

def notify(memory_byte, old_value, new_value)
  watches.each do |watch|
    if watch.include?(memory_byte.address)
      watch.watch.notify(memory_byte, old_value, new_value)
    end
  end
end

#push_watch(watch, filter = nil) ⇒ Object



119
120
121
# File 'lib/avr/memory.rb', line 119

def push_watch(watch, filter = nil)
  watches.push(WatchBinding.new(watch, filter))
end

#resetObject



98
99
100
101
102
# File 'lib/avr/memory.rb', line 98

def reset
  memory.each do |byte|
    byte.value = 0
  end
end

#set_word(address, value) ⇒ Object



146
147
148
149
150
# File 'lib/avr/memory.rb', line 146

def set_word(address, value)
  byte_address = address << 1
  T.must(memory[byte_address + 1]).value = (value & 0xff00) >> 8
  T.must(memory[byte_address]).value = value & 0x00ff
end

#unshift_watch(watch, filter = nil) ⇒ Object



114
115
116
# File 'lib/avr/memory.rb', line 114

def unshift_watch(watch, filter = nil)
  watches.unshift(WatchBinding.new(watch, filter))
end

#watch(filter = nil, &block) ⇒ Object



133
134
135
136
137
# File 'lib/avr/memory.rb', line 133

def watch(filter = nil, &block)
  watch = Watch.new(block.to_proc)
  push_watch(watch, filter.is_a?(Integer) ? [filter] : filter)
  watch
end

#word(address) ⇒ Object



140
141
142
143
# File 'lib/avr/memory.rb', line 140

def word(address)
  byte_address = address << 1
  (T.must(memory[byte_address + 1]).value << 8) | T.must(memory[byte_address]).value
end