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";
36 private final IResourceChangeListener resChangedListener;
38 public MachineLaunchConfigType()
40 this.resChangedListener = this::resourceChanged;
41 ResourcesPlugin.getWorkspace().addResourceChangeListener(resChangedListener,
42 // IResourceChangeEvent.POST_BUILD |
43 IResourceChangeEvent.POST_CHANGE |
44 // IResourceChangeEvent.PRE_BUILD |
45 // IResourceChangeEvent.PRE_CLOSE |
46 // IResourceChangeEvent.PRE_DELETE |
47 // IResourceChangeEvent.PRE_REFRESH |
52 public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException
54 String projName = configuration.getAttribute(PROJECT_ATTR, "");
55 if ("".equals(projName))
56 return showErrorAndReturnFalse("No project specified");
58 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
59 if (!project.isAccessible())
60 return showErrorAndReturnFalse("Project not accessible");
61 if (!project.hasNature(MograsimNature.NATURE_ID))
62 return showErrorAndReturnFalse("Project is not a Mograsim project");
64 MachineContext machineContext = ProjectMachineContext.getMachineContextOf(project);
65 Optional<MachineDefinition> machDefOptional = machineContext.getMachineDefinition();
66 if (machDefOptional.isEmpty())
67 return showErrorAndReturnFalse("No machine definition set");
69 MachineDefinition machineDefinition = machDefOptional.orElseThrow();
70 MicroInstructionMemoryDefinition miMemDef = machineDefinition.getMicroInstructionMemoryDefinition();
72 String mpmFileName = configuration.getAttribute(MPM_FILE_ATTR, "");
73 if ("".equals(mpmFileName))
74 return showErrorAndReturnFalse("No MPM file specified");
76 IFile mpmFile = project.getFile(mpmFileName);
77 if (!mpmFile.isAccessible())
78 return showErrorAndReturnFalse("MPM file not accessible");
80 try (InputStream mpmStream = mpmFile.getContents())
82 MicroInstructionMemoryParser.parseMemory(miMemDef, mpmStream);
86 throw new CoreException(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Unexpected IO exception reading MPM file", e));
89 return super.preLaunchCheck(configuration, mode, monitor);
92 private static boolean showErrorAndReturnFalse(String message)
94 StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, message, null), StatusManager.SHOW);
99 public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException
101 String projName = configuration.getAttribute(PROJECT_ATTR, "");
102 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projName);
104 MachineContext machineContext = ProjectMachineContext.getMachineContextOf(project);
105 MachineDefinition machineDefinition = machineContext.getMachineDefinition().orElseThrow();
106 MicroInstructionMemoryDefinition miMemDef = machineDefinition.getMicroInstructionMemoryDefinition();
108 IFile mpmFile = project.getFile(configuration.getAttribute(MPM_FILE_ATTR, ""));
110 MicroInstructionMemory mpm;
111 try (InputStream mpmStream = mpmFile.getContents())
113 mpm = MicroInstructionMemoryParser.parseMemory(miMemDef, mpmStream);
115 catch (IOException e)
117 throw new CoreException(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "Unexpected IO exception reading MPM file", e));
120 MachineDebugTarget debugTarget = new MachineDebugTarget(new MachineProcess(launch, machineDefinition));
121 debugTarget.setExecutionSpeed(1);
122 Machine machine = debugTarget.getMachine();
123 machine.getMicroInstructionMemory().bind(mpm);
127 private void resourceChanged(IResourceChangeEvent event)
129 // TODO react to MPM changes
130 int type = event.getType();
134 case IResourceChangeEvent.POST_BUILD:
135 typeStr = "POST_BUILD";
137 case IResourceChangeEvent.POST_CHANGE:
138 typeStr = "POST_CHANGE";
140 case IResourceChangeEvent.PRE_BUILD:
141 typeStr = "PRE_BUILD";
143 case IResourceChangeEvent.PRE_CLOSE:
144 typeStr = "PRE_CLOSE";
146 case IResourceChangeEvent.PRE_DELETE:
147 typeStr = "PRE_DELETE";
149 case IResourceChangeEvent.PRE_REFRESH:
150 typeStr = "PRE_REFRESH";
153 typeStr = "<unknown: " + type + ">";
155 System.out.println(typeStr + ": " + event);