From 00489a121ae4df1657ad918bb4203fa58594b5bf Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Thu, 13 May 2021 08:00:42 +0200 Subject: [PATCH] Bugfix: TrackStatisticsUpdater was computing distance incorrectly. While using a cycling speed and distance sensor, the updater was not using the distance from the most recent trackpoint but rather the one considered last moving. Fixes #762. --- .../content/data/TrackPointTest.java | 34 +++++++++++++++++++ .../stats/TrackStatisticsUpdaterTest.java | 28 +++++++++++++++ .../stats/TrackStatisticsUpdater.java | 2 +- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/data/TrackPointTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/data/TrackPointTest.java index 4f42c23df..bd9a1b7e5 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/data/TrackPointTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/data/TrackPointTest.java @@ -1,10 +1,13 @@ package de.dennisguse.opentracks.content.data; +import android.location.Location; + import org.junit.Test; import java.time.Instant; import java.time.temporal.ChronoUnit; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -25,4 +28,35 @@ public class TrackPointTest { assertFalse(tp.isRecent()); } + + @Test + public void distanceToPrevious() { + Location l1 = new Location("test"); + l1.setLatitude(0); + l1.setLongitude(0.0001); + TrackPoint tp1 = new TrackPoint(l1); + + Location l2 = new Location("test"); + l2.setLatitude(0); + l2.setLongitude(0.0002); + TrackPoint tp2 = new TrackPoint(l2); + + // without sensor distance + assertEquals(11.13, tp2.distanceToPrevious(tp1).toM(), 0.01); + + // tp1 has sensor distance + tp1.setSensorDistance(Distance.of(5)); + tp1.setSensorDistance(null); + assertEquals(11.13, tp2.distanceToPrevious(tp1).toM(), 0.01); + + // tp2 has sensor distance + tp1.setSensorDistance(null); + tp2.setSensorDistance(Distance.of(5)); + assertEquals(5, tp2.distanceToPrevious(tp1).toM(), 0.01); + + // tp1 and tp2 have sensor distance + tp1.setSensorDistance(Distance.of(10)); + tp2.setSensorDistance(Distance.of(5)); + assertEquals(5, tp2.distanceToPrevious(tp1).toM(), 0.01); + } } \ No newline at end of file diff --git a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java index 3288e73c1..bf39405e5 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java @@ -146,6 +146,34 @@ public class TrackStatisticsUpdaterTest { assertEquals(15, subject.getTrackStatistics().getTotalDistance().toM(), 0.01); } + @Test + public void addTrackPoint_distance_from_GPS_moving_and_sensor_disconnecting() { + // given + TrackStatisticsUpdater subject = new TrackStatisticsUpdater(); + + TrackPoint tp1 = new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.ofEpochMilli(1000)); + TrackPoint tp2 = new TrackPoint(0, 0, Altitude.WGS84.of(5.0), Instant.ofEpochMilli(2000)); + TrackPoint tp3 = new TrackPoint(0.00001, 0, Altitude.WGS84.of(5.0), Instant.ofEpochMilli(3000)); + tp3.setSensorDistance(Distance.of(5f)); + TrackPoint tp4 = new TrackPoint(0.0005, 0, Altitude.WGS84.of(5.0), Instant.ofEpochMilli(4000)); + TrackPoint tp5 = new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.ofEpochMilli(5000)); + + // when + subject.addTrackPoint(tp1, GPS_DISTANCE); + subject.addTrackPoint(tp2, GPS_DISTANCE); + subject.addTrackPoint(tp3, GPS_DISTANCE); + + // then + assertEquals(5, subject.getTrackStatistics().getTotalDistance().toM(), 0.01); + + // when + subject.addTrackPoint(tp4, GPS_DISTANCE); + subject.addTrackPoint(tp5, GPS_DISTANCE); + + // then + assertEquals(59.18, subject.getTrackStatistics().getTotalDistance().toM(), 0.01); + } + @Ignore("TODO: create a concept ont to compute speed from GPS and sensor") @Test public void addTrackPoint_speed_from_GPS_not_moving() { diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java index f1e1f946e..886b1cc71 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java @@ -159,7 +159,7 @@ public class TrackStatisticsUpdater { if (!trackPoint.hasSensorDistance()) { // GPS-based distance/speed - Distance movingDistance = lastMovingTrackPoint.distanceToPrevious(trackPoint); + Distance movingDistance = trackPoint.distanceToPrevious(lastMovingTrackPoint); if (movingDistance.lessThan(minGPSDistance) && !trackPoint.isMoving()) { speedBuffer_mps.reset(); lastTrackPoint = trackPoint;