From 928632ad43232bf2682e80670c15e41c9dd222dc Mon Sep 17 00:00:00 2001 From: Tsoi Yat Shing Date: Thu, 16 Apr 2020 14:14:33 +0800 Subject: [PATCH] Prevent dropping the TYPE_ACCELEROMETER and TYPE_MAGNETIC_FIELD sensor events, otherwise, only one sensor value is updated in each heading update. Especially, there may be more TYPE_ACCELEROMETER events in some devices, such that TYPE_MAGNETIC_FIELD events could be dropped easily. Also, it took longer time to reflect the latest heading if there are few events, due to the lowPassFilter. --- .../LocationComponentCompassEngine.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentCompassEngine.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentCompassEngine.java index 9f363bf14..230fc1b39 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentCompassEngine.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentCompassEngine.java @@ -104,11 +104,6 @@ class LocationComponentCompassEngine implements CompassEngine, SensorEventListen @Override public void onSensorChanged(@NonNull SensorEvent event) { - // check when the last time the compass was updated, return if too soon. - long currentTime = SystemClock.elapsedRealtime(); - if (currentTime < compassUpdateNextTimestamp) { - return; - } if (lastAccuracySensorStatus == SensorManager.SENSOR_STATUS_UNRELIABLE) { Logger.d(TAG, "Compass sensor is unreliable, device calibration is needed."); return; @@ -123,9 +118,6 @@ class LocationComponentCompassEngine implements CompassEngine, SensorEventListen magneticValues = lowPassFilter(getRotationVectorFromSensorEvent(event), magneticValues); updateOrientation(); } - - // Update the compassUpdateNextTimestamp - compassUpdateNextTimestamp = currentTime + LocationComponentConstants.COMPASS_UPDATE_RATE_MS; } @Override @@ -140,6 +132,12 @@ class LocationComponentCompassEngine implements CompassEngine, SensorEventListen @SuppressWarnings("SuspiciousNameCombination") private void updateOrientation() { + // check when the last time the compass was updated, return if too soon. + long currentTime = SystemClock.elapsedRealtime(); + if (currentTime < compassUpdateNextTimestamp) { + return; + } + if (rotationVectorValue != null) { SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVectorValue); } else { @@ -182,6 +180,9 @@ class LocationComponentCompassEngine implements CompassEngine, SensorEventListen // The x-axis is all we care about here. notifyCompassChangeListeners((float) Math.toDegrees(orientation[0])); + + // Update the compassUpdateNextTimestamp + compassUpdateNextTimestamp = currentTime + LocationComponentConstants.COMPASS_UPDATE_RATE_MS; } private void notifyCompassChangeListeners(float heading) {