ModelComponentTestbench works again
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / LogicExecuter.java
index 77a0935..a7f8c83 100644 (file)
@@ -5,6 +5,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import net.mograsim.logic.core.timeline.PauseableTimeFunction;
 import net.mograsim.logic.core.timeline.Timeline;
+import net.mograsim.logic.core.timeline.Timeline.ExecutionResult;
 
 //TODO maybe move to logic core?
 public class LogicExecuter
@@ -41,13 +42,16 @@ public class LogicExecuter
                        {
                                while (shouldBeRunningLive.get())
                                {
-                                       // always execute to keep timeline from "hanging behind" for too long
-                                       long current = tf.getAsLong();
-                                       timeline.executeUntil(timeline.laterThan(current), System.currentTimeMillis() + 10);
+                                       long current = tf.getTime();
+                                       // The tf.isPaused() condition is justified, because timeline.getSimulationTime() returns the timestamp of the last
+                                       // processed event during executeUntil()
+                                       if (timeline.executeUntil(() -> timeline.laterThan(current).getAsBoolean() || tf.isPaused(),
+                                                       System.currentTimeMillis() + 10) == ExecutionResult.EXEC_OUT_OF_TIME)
+                                               timeline.synchTime(); // TODO: should this also be called if tf.isPaused() condition is met?
                                        long nextEventTime = timeline.nextEventTime();
                                        long sleepTime;
                                        if (timeline.hasNext())
-                                               sleepTime = tf.simulTimeDeltaToRealTimeMillis(nextEventTime - current);
+                                               sleepTime = (long) ((nextEventTime - current) * tf.getSimulTimeToRealTimeFactor());
                                        else
                                                sleepTime = 10000;
                                        try
@@ -63,7 +67,7 @@ public class LogicExecuter
                                                }
                                        }
                                        catch (@SuppressWarnings("unused") InterruptedException e)
-                                       {// do nothing; it is normal execution flow to be interrupted
+                                       { // do nothing; it is normal execution flow to be interrupted
                                        }
                                }
                        }
@@ -79,9 +83,14 @@ public class LogicExecuter
                timeline.addEventAddedListener(event ->
                {
                        if (isRunningLive.get())
-                               if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0)
+                       {
+                               long nextExecSimulTime = this.nextExecSimulTime.get();
+                               if (nextExecSimulTime == -1 || Timeline.timeCmp(event.getTiming(), nextExecSimulTime) < 0)
                                        simulationThread.interrupt();
+                       }
                });
+               // not optimal; but we don't expect this to happen very often
+               tf.addSimulTimeToRealTimeFactorChangedListener(d -> simulationThread.interrupt());
        }
 
        public void executeNextStep()
@@ -131,6 +140,11 @@ public class LogicExecuter
                return isPaused.get();
        }
 
+       public double getSpeedFactor()
+       {
+               return tf.getSpeedFactor();
+       }
+
        public void setSpeedFactor(double factor)
        {
                tf.setSpeedFactor(factor);