1 package net.mograsim.plugin.launch;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.Optional;
7 import org.eclipse.core.resources.IFile;
8 import org.eclipse.core.resources.IProject;
9 import org.eclipse.core.resources.IResourceChangeEvent;
10 import org.eclipse.core.resources.IResourceChangeListener;
11 import org.eclipse.core.resources.ResourcesPlugin;
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.IProgressMonitor;
14 import org.eclipse.core.runtime.IStatus;
15 import org.eclipse.core.runtime.Status;
16 import org.eclipse.debug.core.ILaunch;
17 import org.eclipse.debug.core.ILaunchConfiguration;
18 import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
19 import org.eclipse.ui.statushandlers.StatusManager;
21 import net.mograsim.machine.Machine;
22 import net.mograsim.machine.MachineDefinition;
23 import net.mograsim.machine.mi.MicroInstructionMemory;
24 import net.mograsim.machine.mi.MicroInstructionMemoryDefinition;
25 import net.mograsim.machine.mi.MicroInstructionMemoryParser;
26 import net.mograsim.plugin.MograsimActivator;
27 import net.mograsim.plugin.nature.MachineContext;
28 import net.mograsim.plugin.nature.MograsimNature;
29 import net.mograsim.plugin.nature.ProjectMachineContext;
31 public class MachineLaunchConfigType extends LaunchConfigurationDelegate
33 public static final String PROJECT_ATTR = MograsimActivator.PLUGIN_ID + ".project";
34 public static final String MPM_FILE_ATTR = MograsimActivator.PLUGIN_ID + ".mpm";
35 public static final String INITIAL_RAM_FILE_ATTR = MograsimActivator.PLUGIN_ID + ".initialram";
37 private final IResourceChangeListener resChangedListener;
39 public MachineLaunchConfigType()
41 this.resChangedListener = this::resourceChanged;
42 ResourcesPlugin.getWorkspace().addResourceChangeListener(resChangedListener,
43 // IResourceChangeEvent.POST_BUILD |
44 IResourceChangeEvent.POST_CHANGE |
45 // IResourceChangeEvent.PRE_BUILD |
46 // IResourceChangeEvent.PRE_CLOSE |
47 // IResourceChangeEvent.PRE_DELETE |
48 // IResourceChangeEvent.PRE_REFRESH |
53 public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException
55 String projName = configuration.getAttribute(PROJECT_ATTR, "");
56 if ("".equals(projName))
57 return showErrorAndReturnFalse("No project specified");
59 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
60 if (!project.isAccessible())
61 return showErrorAndReturnFalse("Project not accessible");
62 if (!project.hasNature(MograsimNature.NATURE_ID))
63 return showErrorAndReturnFalse("Project is not a Mograsim project");
65 MachineContext machineContext = ProjectMachineContext.getMachineContextOf(project);
66 Optional<MachineDefinition> machDefOptional = machineContext.getMachineDefinition();
67 if (machDefOptional.isEmpty())
68 return showErrorAndReturnFalse("No machine definition set");
70 MachineDefinition machineDefinition = machDefOptional.orElseThrow();
71 MicroInstructionMemoryDefinition miMemDef = machineDefinition.getMicroInstructionMemoryDefinition();
73 String mpmFileName = configuration.getAttribute(MPM_FILE_ATTR, "");
74 if ("".equals(mpmFileName))
75 return showErrorAndReturnFalse("No MPM file specified");
77 IFile mpmFile = project.getFile(mpmFileName);
78 if (!mpmFile.isAccessible())
79 return showErrorAndReturnFalse("MPM file not accessible");
81 try (InputStream mpmStream = mpmFile.getContents())
83 MicroInstructionMemoryParser.parseMemory(miMemDef, mpmStream);
87 throw new CoreException(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Unexpected IO exception reading MPM file", e));
92 return super.preLaunchCheck(configuration, mode, monitor);
95 private static boolean showErrorAndReturnFalse(String message)
97 StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, message, null), StatusManager.SHOW);
102 public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException
104 String projName = configuration.getAttribute(PROJECT_ATTR, "");
105 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
107 MachineContext machineContext = ProjectMachineContext.getMachineContextOf(project);
108 MachineDefinition machineDefinition = machineContext.getMachineDefinition().orElseThrow();
109 MicroInstructionMemoryDefinition miMemDef = machineDefinition.getMicroInstructionMemoryDefinition();
111 IFile mpmFile = project.getFile(configuration.getAttribute(MPM_FILE_ATTR, ""));
113 MicroInstructionMemory mpm;
114 try (InputStream mpmStream = mpmFile.getContents())
116 mpm = MicroInstructionMemoryParser.parseMemory(miMemDef, mpmStream);
118 catch (IOException e)
120 throw new CoreException(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Unexpected IO exception reading MPM file", e));
125 MachineDebugTarget debugTarget = new MachineDebugTarget(new MachineProcess(launch, machineDefinition));
126 debugTarget.setExecutionSpeed(1);
127 Machine machine = debugTarget.getMachine();
128 machine.getMicroInstructionMemory().bind(mpm);
133 private void resourceChanged(IResourceChangeEvent event)
135 // TODO react to MPM changes
136 int type = event.getType();
140 case IResourceChangeEvent.POST_BUILD:
141 typeStr = "POST_BUILD";
143 case IResourceChangeEvent.POST_CHANGE:
144 typeStr = "POST_CHANGE";
146 case IResourceChangeEvent.PRE_BUILD:
147 typeStr = "PRE_BUILD";
149 case IResourceChangeEvent.PRE_CLOSE:
150 typeStr = "PRE_CLOSE";
152 case IResourceChangeEvent.PRE_DELETE:
153 typeStr = "PRE_DELETE";
155 case IResourceChangeEvent.PRE_REFRESH:
156 typeStr = "PRE_REFRESH";
159 typeStr = "<unknown: " + type + ">";
161 System.out.println(typeStr + ": " + event);