TrackRecordingManager: do not store altitude changes twice (previous …

…TrackPoint's storage was delayed).

Fixes #969.
This commit is contained in:
Dennis Guse
2021-10-08 23:36:12 +02:00
parent 90493ae498
commit d07ab3cc22
5 changed files with 41 additions and 12 deletions
@@ -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.AltitudeSumManager;
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.PressureSensorUtils;
/** /**
* Tests insert location. * Tests insert location.
@@ -437,12 +438,18 @@ public class TrackRecordingServiceTestLocation {
} }
}; };
AltitudeSumManager altitudeSumManager = new AltitudeSumManager();
// given // given
Track.Id trackId = service.startNewTrack(); Track.Id trackId = service.startNewTrack();
service.getTrackPointCreator().setRemoteSensorManager(remoteSensorManager); service.getTrackPointCreator().setRemoteSensorManager(remoteSensorManager);
service.getTrackPointCreator().setAltitudeSumManager(altitudeSumManager); service.getTrackPointCreator().setAltitudeSumManager(altitudeSumManager);
altitudeSumManager.stop(service);
altitudeSumManager.setConnected(true);
// when // 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(0)));
remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(2))); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(2)));
TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 1, 15); 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))); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(13)));
TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 3, 15); 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))); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(14)));
TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 4, 15); 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))); remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(16)));
service.endCurrentTrack(); service.endCurrentTrack();
@@ -471,30 +482,28 @@ public class TrackRecordingServiceTestLocation {
.setLongitude(35) .setLongitude(35)
.setHorizontalAccuracy(Distance.of(1)) .setHorizontalAccuracy(Distance.of(1))
.setSpeed(Speed.of(5)) .setSpeed(Speed.of(5))
.setAltitudeGain(0f) .setAltitudeGain(6f)
.setAltitudeLoss(0f) .setAltitudeLoss(6f)
.setSensorDistance(Distance.of(2)), .setSensorDistance(Distance.of(2)),
new TrackPoint(TrackPoint.Type.TRACKPOINT, null) new TrackPoint(TrackPoint.Type.TRACKPOINT, null)
.setLatitude(45) .setLatitude(45)
.setLongitude(35) .setLongitude(35)
.setHorizontalAccuracy(Distance.of(2)) .setHorizontalAccuracy(Distance.of(2))
.setSpeed(Speed.of(5)) .setSpeed(Speed.of(5))
.setAltitudeGain(0f)
.setAltitudeLoss(0f)
.setSensorDistance(Distance.of(10)), .setSensorDistance(Distance.of(10)),
new TrackPoint(TrackPoint.Type.TRACKPOINT, null) new TrackPoint(TrackPoint.Type.TRACKPOINT, null)
.setLatitude(45) .setLatitude(45)
.setLongitude(35) .setLongitude(35)
.setHorizontalAccuracy(Distance.of(4)) .setHorizontalAccuracy(Distance.of(4))
.setSpeed(Speed.of(5)) .setSpeed(Speed.of(5))
.setAltitudeGain(0f) .setAltitudeGain(6f)
.setAltitudeLoss(0f) .setAltitudeLoss(6f)
.setSensorDistance(Distance.of(2)), .setSensorDistance(Distance.of(2)),
new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null)
.setSensorDistance(Distance.of(11)) .setSensorDistance(Distance.of(11))
.setSpeed(Speed.of(5)) .setSpeed(Speed.of(5))
.setAltitudeGain(0f) .setAltitudeGain(6f)
.setAltitudeLoss(0f) .setAltitudeLoss(6f)
.setSensorDistance(Distance.of(2)) .setSensorDistance(Distance.of(2))
), trackPoints); ), trackPoints);
} }
@@ -349,9 +349,15 @@ public class TrackPoint {
return this; return this;
} }
public TrackPoint minusSensorDistance(@NonNull TrackPoint lastTrackPoint) { public TrackPoint minusCumulativeSensorData(@NonNull TrackPoint lastTrackPoint) {
if (hasSensorDistance() && lastTrackPoint.hasSensorDistance()) { 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; return this;
} }
@@ -208,7 +208,7 @@ class TrackRecordingManager {
} else { } else {
insertTrackPointHelper(trackId, lastTrackPoint); insertTrackPointHelper(trackId, lastTrackPoint);
// Remove the sensorDistance from trackPoint that is already going be stored with lastTrackPoint. // Remove the sensorDistance from trackPoint that is already going be stored with lastTrackPoint.
trackPoint.minusSensorDistance(lastTrackPoint); trackPoint.minusCumulativeSensorData(lastTrackPoint);
} }
lastTrackPoint = null; lastTrackPoint = null;
} }
@@ -70,6 +70,19 @@ public class AltitudeSumManager implements SensorEventListener {
return isConnected ? altitudeGain_m : null; 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 public @Nullable
Float getAltitudeLoss_m() { Float getAltitudeLoss_m() {
return isConnected ? altitudeLoss_m : null; return isConnected ? altitudeLoss_m : null;
@@ -77,7 +77,8 @@ public class PressureSensorUtils {
* https://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Internationale_H%C3%B6henformel * 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} * {\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)); return (float) (p0 * Math.pow(1.0 - 0.0065 * altitude_m / 288.15, 5.255f));
} }
} }