diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java index 39423f835..49abe630f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java @@ -39,6 +39,7 @@ import de.dennisguse.opentracks.io.file.importer.TrackPointAssert; import de.dennisguse.opentracks.services.sensors.AltitudeSumManager; import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; import de.dennisguse.opentracks.settings.PreferencesUtils; +import de.dennisguse.opentracks.util.PressureSensorUtils; /** * Tests insert location. @@ -437,12 +438,18 @@ public class TrackRecordingServiceTestLocation { } }; + AltitudeSumManager altitudeSumManager = new AltitudeSumManager(); + // given Track.Id trackId = service.startNewTrack(); service.getTrackPointCreator().setRemoteSensorManager(remoteSensorManager); service.getTrackPointCreator().setAltitudeSumManager(altitudeSumManager); + altitudeSumManager.stop(service); + altitudeSumManager.setConnected(true); // when + altitudeSumManager.addAltitudeGain_m(6f); + altitudeSumManager.addAltitudeLoss_m(6f); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(0))); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(2))); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 1, 15); @@ -452,9 +459,13 @@ public class TrackRecordingServiceTestLocation { remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(13))); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 3, 15); + altitudeSumManager.addAltitudeGain_m(6f); + altitudeSumManager.addAltitudeLoss_m(6f); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(14))); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 4, 15); + altitudeSumManager.addAltitudeGain_m(6f); + altitudeSumManager.addAltitudeLoss_m(6f); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(16))); service.endCurrentTrack(); @@ -471,30 +482,28 @@ public class TrackRecordingServiceTestLocation { .setLongitude(35) .setHorizontalAccuracy(Distance.of(1)) .setSpeed(Speed.of(5)) - .setAltitudeGain(0f) - .setAltitudeLoss(0f) + .setAltitudeGain(6f) + .setAltitudeLoss(6f) .setSensorDistance(Distance.of(2)), new TrackPoint(TrackPoint.Type.TRACKPOINT, null) .setLatitude(45) .setLongitude(35) .setHorizontalAccuracy(Distance.of(2)) .setSpeed(Speed.of(5)) - .setAltitudeGain(0f) - .setAltitudeLoss(0f) .setSensorDistance(Distance.of(10)), new TrackPoint(TrackPoint.Type.TRACKPOINT, null) .setLatitude(45) .setLongitude(35) .setHorizontalAccuracy(Distance.of(4)) .setSpeed(Speed.of(5)) - .setAltitudeGain(0f) - .setAltitudeLoss(0f) + .setAltitudeGain(6f) + .setAltitudeLoss(6f) .setSensorDistance(Distance.of(2)), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) .setSensorDistance(Distance.of(11)) .setSpeed(Speed.of(5)) - .setAltitudeGain(0f) - .setAltitudeLoss(0f) + .setAltitudeGain(6f) + .setAltitudeLoss(6f) .setSensorDistance(Distance.of(2)) ), trackPoints); } 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 b8299aea4..39d1f471c 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java @@ -349,9 +349,15 @@ public class TrackPoint { return this; } - public TrackPoint minusSensorDistance(@NonNull TrackPoint lastTrackPoint) { + public TrackPoint minusCumulativeSensorData(@NonNull TrackPoint lastTrackPoint) { if (hasSensorDistance() && lastTrackPoint.hasSensorDistance()) { - setSensorDistance(getSensorDistance().minus(lastTrackPoint.getSensorDistance())); + sensorDistance = sensorDistance.minus(lastTrackPoint.getSensorDistance()); + } + if (hasAltitudeGain() && lastTrackPoint.hasAltitudeGain()) { + altitudeGain_m -= lastTrackPoint.altitudeGain_m; + } + if (hasAltitudeLoss() && lastTrackPoint.hasAltitudeLoss()) { + altitudeLoss_m -= lastTrackPoint.altitudeLoss_m; } return this; } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index d8d8d2be4..8cf194c6f 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -208,7 +208,7 @@ class TrackRecordingManager { } else { insertTrackPointHelper(trackId, lastTrackPoint); // Remove the sensorDistance from trackPoint that is already going be stored with lastTrackPoint. - trackPoint.minusSensorDistance(lastTrackPoint); + trackPoint.minusCumulativeSensorData(lastTrackPoint); } lastTrackPoint = null; } diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java index 15c4089a1..94ac27816 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java @@ -70,6 +70,19 @@ public class AltitudeSumManager implements SensorEventListener { return isConnected ? altitudeGain_m : null; } + + @VisibleForTesting + public void addAltitudeGain_m(float altitudeGain_m) { + this.altitudeGain_m = this.altitudeGain_m == null ? 0f : this.altitudeGain_m; + this.altitudeGain_m += altitudeGain_m ; + } + + @VisibleForTesting + public void addAltitudeLoss_m(Float altitudeLoss_m) { + this.altitudeLoss_m = this.altitudeLoss_m == null ? 0f : this.altitudeLoss_m; + this.altitudeLoss_m += altitudeLoss_m ; + } + public @Nullable Float getAltitudeLoss_m() { return isConnected ? altitudeLoss_m : null; diff --git a/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java b/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java index eb5af3a0a..e6e5351da 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java @@ -77,7 +77,8 @@ public class PressureSensorUtils { * https://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Internationale_H%C3%B6henformel * {\color{White} p(h)} = p_0 \cdot \left( 1 - \frac{0{,}0065 \frac{\mathrm K}{\mathrm m} \cdot h}{T_0\ } \right)^{5{,}255} */ - private static float getBarometricPressure(float altitude_m) { + @VisibleForTesting + public static float getBarometricPressure(float altitude_m) { return (float) (p0 * Math.pow(1.0 - 0.0065 * altitude_m / 288.15, 5.255f)); } }