X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftimeline%2FPauseableTimeFunction.java;h=7a6185e808600467fed8d6d064bbc1beb32929af;hb=HEAD;hp=4a99310c38dec9207ff8e0599155bea86a69df00;hpb=26eb7899013bc52e4501ee97422d79d6e1ea2b9c;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/PauseableTimeFunction.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/PauseableTimeFunction.java index 4a99310c..7a6185e8 100644 --- a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/PauseableTimeFunction.java +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/PauseableTimeFunction.java @@ -1,18 +1,24 @@ package net.mograsim.logic.core.timeline; -import java.util.function.LongSupplier; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; -public class PauseableTimeFunction implements LongSupplier +import net.mograsim.logic.core.timeline.Timeline.TimeFunction; + +public class PauseableTimeFunction implements TimeFunction { private boolean paused = false; private long unpausedSysTime = 0, lastPausedInternalTime = 0; - private double speedFactor = 1; + private double speedFactor = 0; + + private final List> simulTimeToRealTimeFactorChangedListeners = new ArrayList<>(); public void pause() { if (!paused) { - lastPausedInternalTime = getAsLong(); + lastPausedInternalTime = getTime(); paused = true; } } @@ -22,34 +28,56 @@ public class PauseableTimeFunction implements LongSupplier if (paused) { paused = false; - unpausedSysTime = System.currentTimeMillis(); + unpausedSysTime = System.nanoTime() / 1000; } } @Override - public long getAsLong() + public long getTime() { return (long) (paused ? lastPausedInternalTime - : lastPausedInternalTime + (System.currentTimeMillis() - unpausedSysTime) * speedFactor); + : lastPausedInternalTime + (System.nanoTime() / 1000 - unpausedSysTime) * speedFactor); + } + + @Override + public void setTime(long time) + { + lastPausedInternalTime = time; + unpausedSysTime = System.nanoTime() / 1000; } - public long simulTimeDeltaToRealTimeMillis(long simulTime) + public double getSimulTimeToRealTimeFactor() { - return paused ? -1 : (long) (simulTime / speedFactor); + return 1 / 1000d / speedFactor; + } + + public double getSpeedFactor() + { + return speedFactor; } public void setSpeedFactor(double factor) { if (factor <= 0) - throw new IllegalArgumentException("time factor can't be smaller than 1"); + throw new IllegalArgumentException("time factor can't be less than or equal to 0"); if (!paused) { pause(); unpause(); } this.speedFactor = factor; + callSimulTimeToRealTimeFactorChangedListeners(getSimulTimeToRealTimeFactor()); } + //@formatter:off + public void addSimulTimeToRealTimeFactorChangedListener(Consumer listener) + {simulTimeToRealTimeFactorChangedListeners.add (listener);} + public void removeSimulTimeToRealTimeFactorChangedListener(Consumer listener) + {simulTimeToRealTimeFactorChangedListeners.remove(listener);} + private void callSimulTimeToRealTimeFactorChangedListeners(double f) + {simulTimeToRealTimeFactorChangedListeners.forEach(l -> l.accept(f));} + //@formatter:on + public boolean isPaused() { return paused;