class RPicSim::Mplab::MplabAssembly

This class wraps objects belonging to the abstract Java class com.microchip.mplab.mdbcore.assemblies.Assembly, which represent a collection of objects being used together.

Attributes

device[R]

Public Class Methods

new(device) click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 11
def initialize(device)
  @device = device
  assembly_factory = Lookup.default.lookup(Mdbcore.assemblies.AssemblyFactory.java_class)
  RPicSim::Mplab.mute_stdout do
    @assembly = assembly_factory.create(device)
  end
end

Public Instance Methods

debugger_step() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 46
def debugger_step
  debugger.StepInstr
end
device_info() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 61
def device_info
  @device_info ||= MplabDeviceInfo.new(@assembly.GetDevice)
end
disassembler() click to toggle source

Gets a com.microchip.mplab.mdbcore.disasm.Disasm object which we can use to disassemble the program binary.

# File lib/rpicsim/mplab/mplab_assembly.rb, line 57
def disassembler
  @disassembler ||= MplabDisassembler.new lookup Mdbcore.disasm.DisAsm.java_class
end
load_file(filename) click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 42
def load_file(filename)
  loader.Load(filename)
end
simulator() click to toggle source

Gets a com.microchip.mplab.mdbcore.simulator.Simulator object.

# File lib/rpicsim/mplab/mplab_assembly.rb, line 51
def simulator
  @simulator ||= MplabSimulator.new lookup Mdbcore.simulator.Simulator.java_class
end
start_simulator_and_debugger(filename) click to toggle source

Connect the assembly to a simulator and debugger.

# File lib/rpicsim/mplab/mplab_assembly.rb, line 20
def start_simulator_and_debugger(filename)
  # In MPLAB X v1.70, this line had to be before the call to SetTool, or else when we run
  # debugger.Connect we will get two lines of: [Fatal Error] :1:1: Premature end of file.
  simulator

  sim_meta = Mdbcore.platformtool.PlatformToolMetaManager.getTool('Simulator')
  @assembly.SetTool(sim_meta.configuration_object_id, sim_meta.class_name, sim_meta.flavor, '')
  if !sim_meta.getToolSupportForDevice(device).all?(&:isSupported)
    raise "Microchip's simulator does not support " + device + '.'
  end
  @assembly.SetHeader('')  # The Microchip documentation doesn't say what this is.
  debugger.Connect(Mdbcore.debugger.Debugger::CONNECTION_TYPE::DEBUGGER)

  # Load our firmware into the simulator.
  load_file(filename)
  debugger.Program(Mdbcore.debugger.Debugger::PROGRAM_OPERATION::AUTO_SELECT)

  check_for_errors

  nil
end

Private Instance Methods

check_for_errors() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 80
def check_for_errors
  warn_about_5C
  warn_about_path_retrieval
  @simulator.check_peripherals
end
debugger() click to toggle source

Gets a com.microchip.mplab.mdbcore.debugger.Debugger object.

# File lib/rpicsim/mplab/mplab_assembly.rb, line 68
def debugger
  lookup Mdbcore.debugger.Debugger.java_class
end
loader() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 72
def loader
  lookup Mdbcore.loader.Loader.java_class
end
lookup(klass) click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 76
def lookup(klass)
  @assembly.getLookup.lookup klass
end
warn_about_5C() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 86
def warn_about_5C
  # Detect a problem that once caused peripherals to load incorrectly.
  # More info: http://stackoverflow.com/q/15794170/28128
  f = DocumentLocator.java_class.resource('MPLABDocumentLocator.class').getFile
  if f.include?('%5C')
    $stderr.puts 'warning: A %5C character was detected in the ' \
      'MPLABDocumentLoator.class file location.  ' \
      'This might cause errors in the Microchip code.'
  end
end
warn_about_path_retrieval() click to toggle source
# File lib/rpicsim/mplab/mplab_assembly.rb, line 97
def warn_about_path_retrieval
  # See spec/mplab_x/path_retrieval_spec.rb for more info.
  retrieval = com.microchip.mplab.open.util.pathretrieval.PathRetrieval
  path = retrieval.getPath(DocumentLocator.java_class)
  if !java.io.File.new(path).exists
    $stderr.puts "warning: MPLAB X will be looking for files at a bad path: #{path}"
  end
end