forked from upstream-mirrors/OpenTracks
TrackRecordingManager: do not store altitude changes twice (previous …
…TrackPoint's storage was delayed). Fixes #969.
This commit is contained in:
+17
-8
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user