forked from upstream-mirrors/OpenTracks
Temporary TrackStatistics should also contain gain/loss from barometric sensor.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user