diff --git a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java index 0d4a55f89..e9f8f2357 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java @@ -48,7 +48,9 @@ public class TrackPoint { private TrackPoint.Id id; + @NonNull private Instant time; + private Double latitude; private Double longitude; private Float accuracy; @@ -96,10 +98,16 @@ public class TrackPoint { public TrackPoint(@NonNull Type type) { this.type = type; + this.time = Instant.now(); //TODO This may result in #800 + } + + public TrackPoint(@NonNull Type type, Instant time) { + this(type); + this.time = time; } public TrackPoint(@NonNull Location location) { - this(Type.TRACKPOINT, location, Instant.now()); + this(Type.TRACKPOINT, location, Instant.now()); //TODO This may result in #800 } public TrackPoint(@NonNull Type type, @NonNull Location location, @NonNull Instant time) { @@ -116,11 +124,6 @@ public class TrackPoint { setTime(time); } - public TrackPoint(@NonNull Type type, Instant time) { - this(type); - this.time = time; - } - public TrackPoint(double latitude, double longitude, Altitude altitude, Instant time) { this(Type.TRACKPOINT); this.latitude = latitude; diff --git a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java index b5275829c..1ee86eea1 100644 --- a/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java +++ b/src/main/java/de/dennisguse/opentracks/content/sensor/SensorDataCycling.java @@ -128,20 +128,21 @@ public final class SensorDataCycling { float timeDiff_ms = UintUtils.diff(wheelRevolutionsTime, previous.wheelRevolutionsTime, UintUtils.UINT16_MAX) / 1024f * UnitConversions.S_TO_MS; Duration timeDiff = Duration.ofMillis((long) timeDiff_ms); if (timeDiff.isZero() || timeDiff.isNegative()) { - Log.e(TAG, "Timestamps difference is invalid: cannot compute cadence."); + Log.e(TAG, "Timestamps difference is invalid: cannot compute speed."); value = null; - } else { - long wheelDiff = UintUtils.diff(wheelRevolutionsCount, previous.wheelRevolutionsCount, UintUtils.UINT16_MAX); - wheelDiff = Math.abs(wheelDiff); //HACK for Garmin Speed 2 as some of those seem to count backwards - - Distance distance = wheelCircumference.multipliedBy(wheelDiff); - Distance distanceOverall = distance; - if (previous.hasValue()) { - distanceOverall = distance.plus(previous.getValue().distanceOverall); - } - Speed speed_mps = Speed.of(distance, timeDiff); - value = new Data(distance, distanceOverall, speed_mps); + return; } + + long wheelDiff = UintUtils.diff(wheelRevolutionsCount, previous.wheelRevolutionsCount, UintUtils.UINT16_MAX); + wheelDiff = Math.abs(wheelDiff); //HACK for Garmin Speed 2 as some of those seem to count backwards + + Distance distance = wheelCircumference.multipliedBy(wheelDiff); + Distance distanceOverall = distance; + if (previous.hasValue()) { + distanceOverall = distance.plus(previous.getValue().distanceOverall); + } + Speed speed_mps = Speed.of(distance, timeDiff); + value = new Data(distance, distanceOverall, speed_mps); } } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index f245a530b..1807d43ab 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -670,7 +670,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand return null; } - SensorDataSet sensorData = remoteSensorManager.getSensorData(); + SensorDataSet sensorData = remoteSensorManager.getSensorData(); //TODO Should return a copy of SensorDataSet if (sensorData == null) { return null; } @@ -756,10 +756,18 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand return; } Track track = contentProviderUtils.getTrack(recordingStatus.getTrackId()); - track.getTrackStatistics().setTotalTime(TrackRecordingService.this.getTotalTime()); - SensorDataSet sensorDataSet = fillWithSensorDataSet(lastTrackPoint); - recordingDataObservable.postValue(new RecordingData(track, lastTrackPoint, sensorDataSet)); + // Compute temporary track statistics using sensorData and update time. + //TODO This somehow should happen in the HandlerServer as we create a new TrackPoint. + TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater); + TrackPoint tmpLastTrackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT); + SensorDataSet sensorDataSet = fillWithSensorDataSet(tmpLastTrackPoint); + + tmpTrackStatisticsUpdater.addTrackPoint(tmpLastTrackPoint, recordingDistanceInterval); + track.setTrackStatistics(tmpTrackStatisticsUpdater.getTrackStatistics()); + + + recordingDataObservable.postValue(new RecordingData(track, tmpLastTrackPoint, sensorDataSet)); } public LiveData getRecordingStatusObservable() { diff --git a/src/main/java/de/dennisguse/opentracks/stats/DoubleRingBuffer.java b/src/main/java/de/dennisguse/opentracks/stats/DoubleRingBuffer.java index bc2167cfb..f127378fb 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/DoubleRingBuffer.java +++ b/src/main/java/de/dennisguse/opentracks/stats/DoubleRingBuffer.java @@ -18,6 +18,8 @@ package de.dennisguse.opentracks.stats; import androidx.annotation.NonNull; +import java.util.Arrays; + /** * This class maintains a ring buffer of doubles. * This buffer is a convenient class for storing a series of doubles and calculating information about them. @@ -49,6 +51,12 @@ class DoubleRingBuffer { reset(); } + DoubleRingBuffer(DoubleRingBuffer toCopy) { + this.buffer = Arrays.copyOf(toCopy.buffer, toCopy.buffer.length); + this.index = toCopy.index; + this.isFull = toCopy.isFull; + } + /** * Resets the buffer. */ diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java index 65927cc41..039e258c4 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java @@ -64,8 +64,8 @@ public class TrackStatisticsUpdater { private final TrackStatistics trackStatistics; - private final DoubleRingBuffer altitudeBuffer_m = new DoubleRingBuffer(ALTITUDE_SMOOTHING_FACTOR); - private final DoubleRingBuffer speedBuffer_mps = new DoubleRingBuffer(SPEED_SMOOTHING_FACTOR); + private final DoubleRingBuffer altitudeBuffer_m; + private final DoubleRingBuffer speedBuffer_mps; // The current segment's statistics private final TrackStatistics currentSegment = new TrackStatistics(); @@ -75,7 +75,7 @@ public class TrackStatisticsUpdater { private TrackPoint lastMovingTrackPoint; public TrackStatisticsUpdater() { - trackStatistics = new TrackStatistics(); + this(new TrackStatistics()); } /** @@ -86,6 +86,22 @@ public class TrackStatisticsUpdater { public TrackStatisticsUpdater(TrackStatistics trackStatistics) { this.trackStatistics = trackStatistics; trackInitialized = true; + + altitudeBuffer_m = new DoubleRingBuffer(ALTITUDE_SMOOTHING_FACTOR); + speedBuffer_mps = new DoubleRingBuffer(SPEED_SMOOTHING_FACTOR); + } + + public TrackStatisticsUpdater(TrackStatisticsUpdater toCopy) { + this.trackInitialized = toCopy.trackInitialized; + this.segmentInitialized = toCopy.segmentInitialized; + this.altitudeBuffer_m = new DoubleRingBuffer(toCopy.altitudeBuffer_m); + this.speedBuffer_mps = new DoubleRingBuffer(toCopy.speedBuffer_mps); + + this.lastTrackPoint = toCopy.lastTrackPoint; + this.lastMovingTrackPoint = toCopy.lastMovingTrackPoint; + + this.trackStatistics = toCopy.getTrackStatistics(); + this.currentSegment.merge(toCopy.currentSegment); } public TrackStatistics getTrackStatistics() { @@ -109,11 +125,6 @@ public class TrackStatisticsUpdater { * @param minGPSDistance the min recording distance */ public void addTrackPoint(TrackPoint trackPoint, Distance minGPSDistance) { - internalAddTrackPoint(trackPoint, minGPSDistance); - Log.v(TAG, this.toString()); - } - - private void internalAddTrackPoint(TrackPoint trackPoint, Distance minGPSDistance) { if (!trackInitialized) { trackStatistics.setStartTime(trackPoint.getTime()); trackInitialized = true;