]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/function/autoplay/PointList.java
Version 18, July 2015
[GpsPrune.git] / tim / prune / function / autoplay / PointList.java
diff --git a/tim/prune/function/autoplay/PointList.java b/tim/prune/function/autoplay/PointList.java
new file mode 100644 (file)
index 0000000..13ccf61
--- /dev/null
@@ -0,0 +1,115 @@
+package tim.prune.function.autoplay;
+
+/**
+ * Class to hold a list of points and hold a running position
+ */
+public class PointList
+{
+       /** Array of milliseconds for each point */
+       private long[] _millis = null;
+       /** Array of indexes of corresponding points */
+       private int[]  _indexes = null;
+       /** Array index of current position */
+       private int    _currentItem = 0;
+       /** Max array index */
+       private int    _maxItem = 0;
+
+       /**
+        * Constructor
+        * @param inNumPoints number of points
+        */
+       public PointList(int inNumPoints)
+       {
+               _millis = new long[inNumPoints];
+               _indexes = new int[inNumPoints];
+               _currentItem = 0;
+               _maxItem = inNumPoints - 1;
+       }
+
+       /**
+        * Add a point to the array
+        * @param inMillis milliseconds since start
+        * @param inIndex point index
+        */
+       public void setPoint(long inMillis, int inIndex)
+       {
+               _millis[_currentItem] = inMillis;
+               _indexes[_currentItem] = inIndex;
+               _currentItem++;
+       }
+
+       /**
+        * Set the position using the current milliseconds
+        * @param inMillis milliseconds since start
+        */
+       public void set(long inMillis)
+       {
+               if (isFinished() || inMillis < _millis[_currentItem])
+               {
+                       // must be reset
+                       _currentItem = 0;
+               }
+               while (_currentItem < _maxItem && _millis[_currentItem + 1] < inMillis)
+               {
+                       _currentItem++;
+               }
+       }
+
+       /**
+        * Normalize the list to cover the requested number of seconds duration
+        * @param inSeconds length of autoplay sequence in seconds
+        */
+       public void normalize(int inSeconds)
+       {
+               if (_maxItem <= 0)
+               {
+                       return; // nothing to normalize
+               }
+               long currentDuration = _millis[_maxItem] - _millis[0];
+               if (currentDuration > 0L)
+               {
+                       double multFactor = inSeconds * 1000.0 / currentDuration;
+                       for (int i=0; i<=_maxItem; i++)
+                       {
+                               _millis[i] = (long) (_millis[i] * multFactor);
+                       }
+               }
+       }
+
+       /** @return the milliseconds of the current point */
+       public long getCurrentMilliseconds()
+       {
+               if (isAtStart() || isFinished()) {
+                       return 0L;
+               }
+               return _millis[_currentItem];
+       }
+
+       /** @return the index of the current point */
+       public int getCurrentPointIndex()
+       {
+               return _indexes[_currentItem];
+       }
+
+       /** @return true if we're on the first point */
+       public boolean isAtStart() {
+               return _currentItem == 0;
+       }
+
+       /** @return true if we're on the last point */
+       public boolean isFinished() {
+               return _currentItem >= _maxItem;
+       }
+
+       /**
+        * @param inCurrentMillis current time in milliseconds since start
+        * @return number of milliseconds to wait until next point is due
+        */
+       public long getMillisUntilNextPoint(long inCurrentMillis)
+       {
+               if (isFinished() || _millis[_currentItem+1] < _millis[_currentItem]) {
+                       return 0; // no next point
+               }
+               return _millis[_currentItem+1] - inCurrentMillis;
+       }
+}