--- /dev/null
+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";
+ }
+}