1 package net.mograsim.logic.core.timeline;
3 import java.util.ArrayList;
5 import java.util.function.Consumer;
7 import net.mograsim.logic.core.timeline.Timeline.TimeFunction;
9 public class PauseableTimeFunction implements TimeFunction
11 private boolean paused = false;
12 private long unpausedSysTime = 0, lastPausedInternalTime = 0;
13 private double speedFactor = 1;
15 private final List<Consumer<Double>> simulTimeToRealTimeFactorChangedListeners = new ArrayList<>();
21 lastPausedInternalTime = getTime();
31 unpausedSysTime = System.nanoTime() / 1000;
38 return (long) (paused ? lastPausedInternalTime
39 : lastPausedInternalTime + (System.nanoTime() / 1000 - unpausedSysTime) * speedFactor);
43 public void setTime(long time)
45 lastPausedInternalTime = time;
46 unpausedSysTime = System.nanoTime() / 1000;
49 public double getSimulTimeToRealTimeFactor()
51 return 1 / 1000d / speedFactor;
54 public void setSpeedFactor(double factor)
57 throw new IllegalArgumentException("time factor can't be less than or equal to 0");
63 this.speedFactor = factor;
64 callSimulTimeToRealTimeFactorChangedListeners(getSimulTimeToRealTimeFactor());
68 public void addSimulTimeToRealTimeFactorChangedListener(Consumer<Double> listener)
69 {simulTimeToRealTimeFactorChangedListeners.add (listener);}
70 public void removeSimulTimeToRealTimeFactorChangedListener(Consumer<Double> listener)
71 {simulTimeToRealTimeFactorChangedListeners.remove(listener);}
72 private void callSimulTimeToRealTimeFactorChangedListeners(double f)
73 {simulTimeToRealTimeFactorChangedListeners.forEach(l -> l.accept(f));}
76 public boolean isPaused()