package net.mograsim.plugin.launch;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.PlatformObject;
import net.mograsim.machine.Machine;
import net.mograsim.machine.MachineDefinition;
import net.mograsim.plugin.MograsimActivator;
+import net.mograsim.plugin.launch.MachineLaunchConfigType.MachineLaunchParams;
public class MachineDebugTarget extends PlatformObject implements IDebugTarget, IMemoryBlockRetrievalExtension
{
+ private final static boolean USE_PSEUDO_THREAD = true;
+
private final ILaunch launch;
private final Machine machine;
private final LogicExecuter exec;
+ private final MachineThread thread;
private boolean running;
- public MachineDebugTarget(ILaunch launch, MachineDefinition machineDefinition)
+ private final List<Consumer<Double>> executionSpeedListeners;
+
+ private final MachineLaunchParams launchParams;
+
+ public MachineDebugTarget(ILaunch launch, MachineLaunchParams launchParams, MachineDefinition machineDefinition)
{
this.launch = launch;
this.machine = machineDefinition.createNew();
this.exec = new LogicExecuter(machine.getTimeline());
+ this.executionSpeedListeners = new ArrayList<>();
+ this.launchParams = launchParams;
+
exec.startLiveExecution();
running = true;
getLaunch().addDebugTarget(this);
fireCreationEvent();
+
+ // create after creating ourself
+ this.thread = USE_PSEUDO_THREAD ? new MachineThread(this) : null;
}
public Machine getMachine()
return launch;
}
+ public MachineLaunchParams getLaunchParams()
+ {
+ return launchParams;
+ }
+
+ public double getExecutionSpeed()
+ {
+ return exec.getSpeedFactor();
+ }
+
public void setExecutionSpeed(double speed)
{
- exec.setSpeedFactor(speed);
+ if (getExecutionSpeed() != speed)
+ {
+ exec.setSpeedFactor(speed);
+ callExecutionSpeedListener(speed);
+ }
}
@Override
@Override
public boolean hasThreads() throws DebugException
{
- return false;
+ return USE_PSEUDO_THREAD;
}
@Override
public IThread[] getThreads() throws DebugException
{
- return new IThread[0];
+ return thread == null ? new IThread[0] : new IThread[] { thread };
+ }
+
+ public void addExecutionSpeedListener(Consumer<Double> executionSpeedListener)
+ {
+ executionSpeedListeners.add(executionSpeedListener);
+ }
+
+ public void removeExecutionSpeedListener(Consumer<Double> executionSpeedListener)
+ {
+ executionSpeedListeners.remove(executionSpeedListener);
+ }
+
+ private void callExecutionSpeedListener(double executionSpeed)
+ {
+ executionSpeedListeners.forEach(l -> l.accept(executionSpeed));
}
@SuppressWarnings("unchecked")