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=86f4ce996d990ba4c8fc7b3fee833fc37719a9ba;hpb=363c9377b3c542c87fc5e7f57674751439246dbd;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 86f4ce99..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 int speedPercentage = 100; + private double speedFactor = 0; + + private final List> simulTimeToRealTimeFactorChangedListeners = new ArrayList<>(); public void pause() { if (!paused) { - lastPausedInternalTime = getAsLong(); + lastPausedInternalTime = getTime(); paused = true; } } @@ -22,27 +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 paused ? lastPausedInternalTime - : lastPausedInternalTime + ((System.currentTimeMillis() - unpausedSysTime) * speedPercentage) / 100; + return (long) (paused ? lastPausedInternalTime + : lastPausedInternalTime + (System.nanoTime() / 1000 - unpausedSysTime) * speedFactor); } - public void setSpeedPercentage(int percentage) + @Override + public void setTime(long time) { + lastPausedInternalTime = time; + unpausedSysTime = System.nanoTime() / 1000; + } + + public double getSimulTimeToRealTimeFactor() + { + 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 less than or equal to 0"); if (!paused) { pause(); unpause(); } - this.speedPercentage = Integer.min(100, Integer.max(percentage, 1)); + 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;