begin calculating elevation only if queue is has enough data points (see #99) - (needs testing)
This commit is contained in:
parent
9f26a30b75
commit
d0c93e3124
3 changed files with 24 additions and 12 deletions
|
@ -113,6 +113,8 @@ object Keys {
|
||||||
const val DEFAULT_THRESHOLD_LOCATION_AGE: Long = 60000000000L // one minute in nanoseconds
|
const val DEFAULT_THRESHOLD_LOCATION_AGE: Long = 60000000000L // one minute in nanoseconds
|
||||||
const val DEFAULT_THRESHOLD_DISTANCE: Float = 15f // 15 meters
|
const val DEFAULT_THRESHOLD_DISTANCE: Float = 15f // 15 meters
|
||||||
const val DEFAULT_ZOOM_LEVEL: Double = 16.0
|
const val DEFAULT_ZOOM_LEVEL: Double = 16.0
|
||||||
|
const val MIN_NUMBER_OF_WAYPOINTS_FOR_ELEVATION_CALCULATION: Int = 5
|
||||||
|
const val MAX_NUMBER_OF_WAYPOINTS_FOR_ELEVATION_CALCULATION: Int = 20
|
||||||
const val ALTITUDE_MEASUREMENT_ERROR_THRESHOLD = 10 // altitude changes of 10 meter or more (per 15 seconds) are being discarded
|
const val ALTITUDE_MEASUREMENT_ERROR_THRESHOLD = 10 // altitude changes of 10 meter or more (per 15 seconds) are being discarded
|
||||||
const val REQUEST_CODE_FOREGROUND = 42
|
const val REQUEST_CODE_FOREGROUND = 42
|
||||||
|
|
||||||
|
|
|
@ -121,8 +121,8 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList
|
||||||
preferenceAltitudeSmoothingValue.key = Keys.PREF_ALTITUDE_SMOOTHING_VALUE
|
preferenceAltitudeSmoothingValue.key = Keys.PREF_ALTITUDE_SMOOTHING_VALUE
|
||||||
preferenceAltitudeSmoothingValue.summary = getString(R.string.pref_altitude_smoothing_value_summary)
|
preferenceAltitudeSmoothingValue.summary = getString(R.string.pref_altitude_smoothing_value_summary)
|
||||||
preferenceAltitudeSmoothingValue.showSeekBarValue = true
|
preferenceAltitudeSmoothingValue.showSeekBarValue = true
|
||||||
preferenceAltitudeSmoothingValue.min = 5
|
preferenceAltitudeSmoothingValue.min = Keys.MIN_NUMBER_OF_WAYPOINTS_FOR_ELEVATION_CALCULATION
|
||||||
preferenceAltitudeSmoothingValue.max = 20
|
preferenceAltitudeSmoothingValue.max = Keys.MAX_NUMBER_OF_WAYPOINTS_FOR_ELEVATION_CALCULATION
|
||||||
preferenceAltitudeSmoothingValue.setDefaultValue(Keys.DEFAULT_ALTITUDE_SMOOTHING_VALUE)
|
preferenceAltitudeSmoothingValue.setDefaultValue(Keys.DEFAULT_ALTITUDE_SMOOTHING_VALUE)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -264,6 +264,8 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
|
||||||
// save state
|
// save state
|
||||||
trackingState = Keys.STATE_TRACKING_STOPPED
|
trackingState = Keys.STATE_TRACKING_STOPPED
|
||||||
PreferencesHelper.saveTrackingState(this, trackingState)
|
PreferencesHelper.saveTrackingState(this, trackingState)
|
||||||
|
// reset altitude values queue
|
||||||
|
altitudeValues.reset()
|
||||||
// stop recording steps and location fixes
|
// stop recording steps and location fixes
|
||||||
sensorManager.unregisterListener(this)
|
sensorManager.unregisterListener(this)
|
||||||
handler.removeCallbacks(periodicTrackUpdate)
|
handler.removeCallbacks(periodicTrackUpdate)
|
||||||
|
@ -533,20 +535,21 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
|
||||||
// put current altitude into queue
|
// put current altitude into queue
|
||||||
val currentBestLocationAltitude: Double = currentBestLocation.altitude
|
val currentBestLocationAltitude: Double = currentBestLocation.altitude
|
||||||
if (currentBestLocationAltitude != Keys.DEFAULT_ALTITUDE) altitudeValues.add(currentBestLocationAltitude)
|
if (currentBestLocationAltitude != Keys.DEFAULT_ALTITUDE) altitudeValues.add(currentBestLocationAltitude)
|
||||||
|
|
||||||
// TODO remove
|
// TODO remove
|
||||||
// uncomment to use test altitude values - useful if testing wirth an emulator
|
// uncomment to use test altitude values - useful if testing wirth an emulator
|
||||||
// altitudeValues.add(getTestAltitude()) // TODO remove
|
//altitudeValues.add(getTestAltitude()) // TODO remove
|
||||||
// TODO remove
|
// TODO remove
|
||||||
|
|
||||||
// get current smoothed altitude
|
// only start calculating elevation differences, if enough data has been added to queue
|
||||||
val currentAltitude: Double = altitudeValues.getAverage()
|
if (altitudeValues.prepared) {
|
||||||
// calculate and store elevation differences
|
// get current smoothed altitude
|
||||||
track = LocationHelper.calculateElevationDifferences(currentAltitude, previousAltitude, track)
|
val currentAltitude: Double = altitudeValues.getAverage()
|
||||||
|
// calculate and store elevation differences
|
||||||
// TODO remove
|
track = LocationHelper.calculateElevationDifferences(currentAltitude, previousAltitude, track)
|
||||||
LogHelper.e(TAG, "prev = $previousAltitude | curr = $currentAltitude | pos = ${track.positiveElevation} | neg = ${track.negativeElevation}")
|
// TODO remove
|
||||||
// TODO remove
|
LogHelper.d(TAG, "Elevation Calculation || prev = $previousAltitude | curr = $currentAltitude | pos = ${track.positiveElevation} | neg = ${track.negativeElevation}")
|
||||||
|
// TODO remove
|
||||||
|
}
|
||||||
|
|
||||||
// save a temp track
|
// save a temp track
|
||||||
val now: Date = GregorianCalendar.getInstance().time
|
val now: Date = GregorianCalendar.getInstance().time
|
||||||
|
@ -572,8 +575,10 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
|
||||||
/* Simple queue that evicts older elements and holds an average */
|
/* Simple queue that evicts older elements and holds an average */
|
||||||
/* Credit: CircularQueue https://stackoverflow.com/a/51923797 */
|
/* Credit: CircularQueue https://stackoverflow.com/a/51923797 */
|
||||||
class SimpleMovingAverageQueue(var capacity: Int) : LinkedList<Double>() {
|
class SimpleMovingAverageQueue(var capacity: Int) : LinkedList<Double>() {
|
||||||
|
var prepared: Boolean = false
|
||||||
private var sum: Double = 0.0
|
private var sum: Double = 0.0
|
||||||
override fun add(element: Double): Boolean {
|
override fun add(element: Double): Boolean {
|
||||||
|
prepared = this.size + 1 >= Keys.MIN_NUMBER_OF_WAYPOINTS_FOR_ELEVATION_CALCULATION
|
||||||
if (this.size >= capacity) {
|
if (this.size >= capacity) {
|
||||||
sum -= this.first
|
sum -= this.first
|
||||||
removeFirst()
|
removeFirst()
|
||||||
|
@ -582,6 +587,11 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
|
||||||
return super.add(element)
|
return super.add(element)
|
||||||
}
|
}
|
||||||
fun getAverage(): Double = sum / this.size
|
fun getAverage(): Double = sum / this.size
|
||||||
|
fun reset() {
|
||||||
|
this.clear()
|
||||||
|
prepared = false
|
||||||
|
sum = 0.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue