]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/gui/profile/SpeedData.java
Version 10, May 2010
[GpsPrune.git] / tim / prune / gui / profile / SpeedData.java
diff --git a/tim/prune/gui/profile/SpeedData.java b/tim/prune/gui/profile/SpeedData.java
new file mode 100644 (file)
index 0000000..d836543
--- /dev/null
@@ -0,0 +1,83 @@
+package tim.prune.gui.profile;
+
+import tim.prune.I18nManager;
+import tim.prune.config.Config;
+import tim.prune.data.DataPoint;
+import tim.prune.data.Distance;
+import tim.prune.data.Track;
+import tim.prune.data.Distance.Units;
+
+/**
+ * Class to provide a source of speed data for the profile chart
+ */
+public class SpeedData extends ProfileData
+{
+       /** Flag for metric units */
+       private boolean _metric = true;
+
+       /**
+        * Constructor
+        * @param inTrack track object
+        */
+       public SpeedData(Track inTrack) {
+               super(inTrack);
+       }
+
+       /**
+        * Get the data and populate the instance arrays
+        */
+       public void init()
+       {
+               initArrays();
+               _metric = Config.getConfigBoolean(Config.KEY_METRIC_UNITS);
+               _hasData = false;
+               _minValue = _maxValue = 0.0;
+               if (_track != null) {
+                       DataPoint prevPrevPoint = null, prevPoint = null, point = null;
+                       for (int i=0; i<_track.getNumPoints(); i++)
+                       {
+                               point = _track.getPoint(i);
+                               if (prevPrevPoint != null && prevPrevPoint.hasTimestamp()
+                                       && prevPoint != null && prevPoint.hasTimestamp()
+                                       && point != null && point.hasTimestamp())
+                               {
+                                       // All three points have timestamps
+                                       double seconds = point.getTimestamp().getSecondsSince(prevPrevPoint.getTimestamp());
+                                       if (seconds > 0)
+                                       {
+                                               double distInRads = DataPoint.calculateRadiansBetween(prevPrevPoint, prevPoint)
+                                                       + DataPoint.calculateRadiansBetween(prevPoint, point);
+                                               double dist = Distance.convertRadiansToDistance(distInRads, _metric?Units.KILOMETRES:Units.MILES);
+                                               // Store the value and maintain max and min values
+                                               double value = dist / seconds * 60.0 * 60.0;
+                                               _pointValues[i-1] = value;
+                                               if (value < _minValue || _minValue == 0.0) {_minValue = value;}
+                                               if (value > _maxValue) {_maxValue = value;}
+
+                                               _hasData = true;
+                                               _pointHasData[i-1] = true;
+                                       }
+                               }
+                               // Exchange points
+                               prevPrevPoint = prevPoint;
+                               prevPoint = point;
+                       }
+               }
+       }
+
+       /**
+        * @return text description including units
+        */
+       public String getLabel()
+       {
+               return I18nManager.getText("fieldname.speed") + " ("
+                       + I18nManager.getText(_metric?"units.kmh":"units.mph") + ")";
+       }
+
+       /**
+        * @return key for message when no speeds present
+        */
+       public String getNoDataKey() {
+               return "display.notimestamps";
+       }
+}