forked from upstream-mirrors/OpenTracks
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.
This commit is contained in:
@@ -1,10 +1,13 @@
|
|||||||
package de.dennisguse.opentracks.content.data;
|
package de.dennisguse.opentracks.content.data;
|
||||||
|
|
||||||
|
import android.location.Location;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
@@ -25,4 +28,35 @@ public class TrackPointTest {
|
|||||||
|
|
||||||
assertFalse(tp.isRecent());
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +146,34 @@ public class TrackStatisticsUpdaterTest {
|
|||||||
assertEquals(15, subject.getTrackStatistics().getTotalDistance().toM(), 0.01);
|
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")
|
@Ignore("TODO: create a concept ont to compute speed from GPS and sensor")
|
||||||
@Test
|
@Test
|
||||||
public void addTrackPoint_speed_from_GPS_not_moving() {
|
public void addTrackPoint_speed_from_GPS_not_moving() {
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ public class TrackStatisticsUpdater {
|
|||||||
|
|
||||||
if (!trackPoint.hasSensorDistance()) {
|
if (!trackPoint.hasSensorDistance()) {
|
||||||
// GPS-based distance/speed
|
// GPS-based distance/speed
|
||||||
Distance movingDistance = lastMovingTrackPoint.distanceToPrevious(trackPoint);
|
Distance movingDistance = trackPoint.distanceToPrevious(lastMovingTrackPoint);
|
||||||
if (movingDistance.lessThan(minGPSDistance) && !trackPoint.isMoving()) {
|
if (movingDistance.lessThan(minGPSDistance) && !trackPoint.isMoving()) {
|
||||||
speedBuffer_mps.reset();
|
speedBuffer_mps.reset();
|
||||||
lastTrackPoint = trackPoint;
|
lastTrackPoint = trackPoint;
|
||||||
|
|||||||
Reference in New Issue
Block a user