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=f086268faf1c9e3abec4b529cf3a5f7ca6e01055;hb=f5d961acea5bee7c3b38c0b31119a9998fa97667;hp=86f4ce996d990ba4c8fc7b3fee833fc37719a9ba;hpb=46d4c053db9a363185a9dce28fcefbc3bf9d6afd;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..f086268f 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,12 +1,17 @@ package net.mograsim.logic.core.timeline; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; import java.util.function.LongSupplier; public class PauseableTimeFunction implements LongSupplier { private boolean paused = false; private long unpausedSysTime = 0, lastPausedInternalTime = 0; - private int speedPercentage = 100; + private double speedFactor = 1; + + private final List> simulTimeToRealTimeFactorChangedListeners = new ArrayList<>(); public void pause() { @@ -22,27 +27,44 @@ public class PauseableTimeFunction implements LongSupplier if (paused) { paused = false; - unpausedSysTime = System.currentTimeMillis(); + unpausedSysTime = System.nanoTime() / 1000; } } @Override public long getAsLong() { - return paused ? lastPausedInternalTime - : lastPausedInternalTime + ((System.currentTimeMillis() - unpausedSysTime) * speedPercentage) / 100; + return (long) (paused ? lastPausedInternalTime + : lastPausedInternalTime + (System.nanoTime() / 1000 - unpausedSysTime) * speedFactor); } - public void setSpeedPercentage(int percentage) + public double getSimulTimeToRealTimeFactor() { + return 1 / 1000d / speedFactor; + } + + public void setSpeedFactor(double factor) + { + if (factor <= 0) + throw new IllegalArgumentException("time factor can't be smaller than 1"); 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;