diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/PressureSensorUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/PressureSensorUtilsTest.java index 1dd2cf01a..572b1fb63 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/PressureSensorUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/PressureSensorUtilsTest.java @@ -16,7 +16,7 @@ public class PressureSensorUtilsTest { // when // then for (float v : sensorValues_hPa) { - assertNull(PressureSensorUtils.computeChanges_m(firstSensorValue, v)); + assertNull(PressureSensorUtils.computeChanges(firstSensorValue, v)); } } @@ -33,7 +33,7 @@ public class PressureSensorUtilsTest { float lastUsedPressureValue_hPa = firstSensorValue; for (float v : sensorValues_hPa) { - PressureSensorUtils.AltitudeChange altitudeChange = PressureSensorUtils.computeChanges_m(lastUsedPressureValue_hPa, v); + PressureSensorUtils.AltitudeChange altitudeChange = PressureSensorUtils.computeChanges(lastUsedPressureValue_hPa, v); if (altitudeChange != null) { altitudeGain_m += altitudeChange.getAltitudeGain_m(); altitudeLoss += altitudeChange.getAltitudeLoss_m(); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index e6a3edbad..bb611ee7e 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -778,6 +778,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand tmpLastTrackPoint.setLongitude(lastTrackPoint.getLongitude()); tmpLastTrackPoint.setLatitude(lastTrackPoint.getLatitude()); } + tmpLastTrackPoint.setAltitudeGain(getAltitudeGain_m()); + tmpLastTrackPoint.setAltitudeLoss(getAltitudeLoss_m()); SensorDataSet sensorDataSet = fillWithSensorDataSet(tmpLastTrackPoint); 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 cb79f7a78..773347501 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/AltitudeSumManager.java @@ -100,12 +100,13 @@ public class AltitudeSumManager implements SensorEventListener { return; } + altitudeGain_m = altitudeGain_m != null ? altitudeGain_m : 0; + altitudeLoss_m = altitudeLoss_m != null ? altitudeLoss_m : 0; + PressureSensorUtils.AltitudeChange altitudeChange = PressureSensorUtils.computeChangesWithSmoothing_m(lastAcceptedPressureValue_hPa, lastSeenSensorValue_hPa, value_hPa); if (altitudeChange != null) { - altitudeGain_m = altitudeGain_m != null ? altitudeGain_m : 0; - altitudeGain_m = altitudeChange.getAltitudeGain_m(); + altitudeGain_m += altitudeChange.getAltitudeGain_m(); - altitudeLoss_m = altitudeLoss_m != null ? altitudeLoss_m : 0; altitudeLoss_m += altitudeChange.getAltitudeLoss_m(); lastAcceptedPressureValue_hPa = altitudeChange.getCurrentSensorValue_hPa(); diff --git a/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java b/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java index 74a485cb8..eb5af3a0a 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/PressureSensorUtils.java @@ -2,6 +2,8 @@ package de.dennisguse.opentracks.util; import android.hardware.SensorManager; +import androidx.annotation.VisibleForTesting; + public class PressureSensorUtils { //Everything above is considered a meaningful change in altitude. @@ -9,6 +11,8 @@ public class PressureSensorUtils { private static final float EXPONENTIAL_SMOOTHING = 0.3f; + private static final float p0 = SensorManager.PRESSURE_STANDARD_ATMOSPHERE; + private PressureSensorUtils() { } @@ -46,17 +50,13 @@ public class PressureSensorUtils { public static AltitudeChange computeChangesWithSmoothing_m(float lastAcceptedSensorValue_hPa, float lastSeenSensorValue_hPa, float currentSensorValue_hPa) { float nextSensorValue_hPa = EXPONENTIAL_SMOOTHING * currentSensorValue_hPa + (1 - EXPONENTIAL_SMOOTHING) * lastSeenSensorValue_hPa; - return computeChanges_m(lastAcceptedSensorValue_hPa, nextSensorValue_hPa); + return computeChanges(lastAcceptedSensorValue_hPa, nextSensorValue_hPa); } - /** - * Computes the altitude gain and altitude loss. - * - * @return null if no meaningful altitudeC change occurred. - */ - public static AltitudeChange computeChanges_m(float lastAcceptedSensorValue_hPa, float currentSensorValue_hPa) { - float lastSensorValue_m = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastAcceptedSensorValue_hPa); - float currentSensorValue_m = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentSensorValue_hPa); + @VisibleForTesting + public static AltitudeChange computeChanges(float lastAcceptedSensorValue_hPa, float currentSensorValue_hPa) { + float lastSensorValue_m = SensorManager.getAltitude(p0, lastAcceptedSensorValue_hPa); + float currentSensorValue_m = SensorManager.getAltitude(p0, currentSensorValue_hPa); float altitudeChange_m = currentSensorValue_m - lastSensorValue_m; if (Math.abs(altitudeChange_m) < ALTITUDE_CHANGE_DIFF_M) { @@ -66,9 +66,9 @@ public class PressureSensorUtils { // Limit altitudeC change by ALTITUDE_CHANGE_DIFF and computes pressure value accordingly. AltitudeChange altitudeChange = new AltitudeChange(currentSensorValue_hPa, altitudeChange_m); if (altitudeChange.getAltitudeChange_m() > 0) { - return new AltitudeChange(getBarometricPressure(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastSensorValue_m + ALTITUDE_CHANGE_DIFF_M), ALTITUDE_CHANGE_DIFF_M); + return new AltitudeChange(getBarometricPressure(lastSensorValue_m + ALTITUDE_CHANGE_DIFF_M), ALTITUDE_CHANGE_DIFF_M); } else { - return new AltitudeChange(getBarometricPressure(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, lastSensorValue_m - ALTITUDE_CHANGE_DIFF_M), -1 * ALTITUDE_CHANGE_DIFF_M); + return new AltitudeChange(getBarometricPressure(lastSensorValue_m - ALTITUDE_CHANGE_DIFF_M), -1 * ALTITUDE_CHANGE_DIFF_M); } } @@ -77,7 +77,7 @@ 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 p0, float altitude_m) { + private static float getBarometricPressure(float altitude_m) { return (float) (p0 * Math.pow(1.0 - 0.0065 * altitude_m / 288.15, 5.255f)); } } diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/IntervalStatistics.java b/src/main/java/de/dennisguse/opentracks/viewmodels/IntervalStatistics.java index b0aab9cc6..46ee4acd1 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/IntervalStatistics.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/IntervalStatistics.java @@ -163,10 +163,8 @@ public class IntervalStatistics { time = time.plus(trackStatistics.getTotalTime()); gain_m = trackStatistics.hasTotalAltitudeGain() ? trackStatistics.getTotalAltitudeGain() : gain_m; loss_m = trackStatistics.hasTotalAltitudeLoss() ? trackStatistics.getTotalAltitudeLoss() : loss_m; - if (gain_m != null && lastTrackPoint != null && lastTrackPoint.hasAltitudeGain()) { + if (hasGain() && lastTrackPoint != null && lastTrackPoint.hasAltitudeGain()) { gain_m = gain_m - lastTrackPoint.getAltitudeGain(); - } - if (loss_m != null && lastTrackPoint != null && lastTrackPoint.hasAltitudeLoss()) { loss_m = loss_m - lastTrackPoint.getAltitudeLoss(); } }