private int _startIndex = -1, _endIndex = -1;
private int _currentPhotoIndex = -1;
private int _currentAudioIndex = -1;
- private IntegerRange _altitudeRange = null;
- private int _climb = -1, _descent = -1;
- private Altitude.Format _altitudeFormat = Altitude.Format.NO_FORMAT;
- private long _totalSeconds = 0L, _movingSeconds = 0L;
- private double _angDistance = -1.0, _angMovingDistance = -1.0;
- private int _numSegments = 0;
+ private AltitudeRange _altitudeRange = null;
+ private long _movingMilliseconds = 0L;
+ private double _angMovingDistance = -1.0;
/**
*/
private void recalculate()
{
- _altitudeFormat = Altitude.Format.NO_FORMAT;
- _numSegments = 0;
final int numPoints = _track.getNumPoints();
// Recheck if the number of points has changed
- if (numPoints != _prevNumPoints) {
+ if (numPoints != _prevNumPoints)
+ {
_prevNumPoints = numPoints;
check();
}
if (numPoints > 0 && hasRangeSelected())
{
- _altitudeRange = new IntegerRange();
- _climb = 0;
- _descent = 0;
+ _altitudeRange = new AltitudeRange();
Altitude altitude = null;
- Timestamp time = null, startTime = null, endTime = null;
- Timestamp previousTime = null;
+ Timestamp time = null, previousTime = null;
DataPoint lastPoint = null, currPoint = null;
- _angDistance = 0.0; _angMovingDistance = 0.0;
- _totalSeconds = 0L; _movingSeconds = 0L;
- int altValue = 0;
- int lastAltValue = 0;
- boolean foundAlt = false;
+ _angMovingDistance = 0.0;
+ _movingMilliseconds = 0L;
+ // Loop over points in selection
for (int i=_startIndex; i<=_endIndex; i++)
{
currPoint = _track.getPoint(i);
// Ignore waypoints in altitude calculations
if (!currPoint.isWaypoint() && altitude.isValid())
{
- altValue = altitude.getValue(_altitudeFormat);
- if (_altitudeFormat == Altitude.Format.NO_FORMAT)
- _altitudeFormat = altitude.getFormat();
- _altitudeRange.addValue(altValue);
- if (foundAlt)
- {
- if (altValue > lastAltValue)
- _climb += (altValue - lastAltValue);
- else
- _descent += (lastAltValue - altValue);
+ if (currPoint.getSegmentStart()) {
+ _altitudeRange.ignoreValue(altitude);
+ }
+ else {
+ _altitudeRange.addValue(altitude);
}
- lastAltValue = altValue;
- foundAlt = true;
}
- // Store the first and last timestamp in the range
+ // Compare timestamps within the segments
time = currPoint.getTimestamp();
if (time.isValid())
{
- if (startTime == null || startTime.isAfter(time)) startTime = time;
- if (endTime == null || time.isAfter(endTime)) endTime = time;
// add moving time
if (!currPoint.getSegmentStart() && previousTime != null && time.isAfter(previousTime)) {
- _movingSeconds += time.getSecondsSince(previousTime);
+ _movingMilliseconds += time.getMillisecondsSince(previousTime);
}
previousTime = time;
}
if (lastPoint != null)
{
double radians = DataPoint.calculateRadiansBetween(lastPoint, currPoint);
- _angDistance += radians;
- if (currPoint.getSegmentStart()) {
- _numSegments++;
- }
- else {
+ if (!currPoint.getSegmentStart()) {
_angMovingDistance += radians;
}
}
lastPoint = currPoint;
- // If it's a track point then there must be at least one segment
- if (_numSegments == 0) {_numSegments = 1;}
}
}
- if (endTime != null) {
- _totalSeconds = endTime.getSecondsSince(startTime);
- }
}
_valid = true;
}
return _endIndex;
}
-
- /**
- * @return the altitude format, ie feet or metres
- */
- public Altitude.Format getAltitudeFormat()
- {
- return _altitudeFormat;
- }
-
/**
* @return altitude range
*/
- public IntegerRange getAltitudeRange()
+ public AltitudeRange getAltitudeRange()
{
if (!_valid) recalculate();
return _altitudeRange;
}
- /**
- * @return climb
- */
- public int getClimb()
- {
- if (!_valid) recalculate();
- return _climb;
- }
-
- /**
- * @return descent
- */
- public int getDescent()
- {
- if (!_valid) recalculate();
- return _descent;
- }
-
-
- /**
- * @return number of seconds spanned by selection
- */
- public long getNumSeconds()
- {
- if (!_valid) recalculate();
- return _totalSeconds;
- }
-
/**
* @return number of seconds spanned by segments within selection
*/
public long getMovingSeconds()
{
if (!_valid) recalculate();
- return _movingSeconds;
- }
-
- /**
- * @param inUnits distance units to use, from class Distance
- * @return distance of Selection in specified units
- */
- public double getDistance(Distance.Units inUnits)
- {
- return Distance.convertRadiansToDistance(_angDistance, inUnits);
- }
-
- /**
- * @param inUnits distance units to use, from class Distance
- * @return moving distance of Selection in specified units
- */
- public double getMovingDistance(Distance.Units inUnits)
- {
- return Distance.convertRadiansToDistance(_angMovingDistance, inUnits);
+ return _movingMilliseconds / 1000L;
}
/**
- * @return number of segments in selection
+ * @return moving distance of Selection in current units
*/
- public int getNumSegments()
+ public double getMovingDistance()
{
- return _numSegments;
+ return Distance.convertRadiansToDistance(_angMovingDistance);
}
/**