[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kstars] /: Fix issue with rotation when in automatic mode in KStars Lite. Added low-pass filter to 
From:       Artem Fedoskin <null () kde ! org>
Date:       2017-05-01 5:48:30
Message-ID: E1d54CE-0000Nh-OC () code ! kde ! org
[Download RAW message or body]

Git commit 2886366b7fcd68161fd4fd50d8849bdc714ac766 by Artem Fedoskin.
Committed on 01/05/2017 at 05:48.
Pushed by afedoskin into branch 'master'.

Fix issue with rotation when in automatic mode in KStars Lite. Added low-pass filter \
to reduce hittering of screen in auto mode.

M  +3    -1    apk/src/org/kde/kstars/DeviceOrientation.java
M  +14   -0    apk/src/org/kde/kstars/rotation/RotationVectorListener.java
M  +1    -0    kstars/auxiliary/ksutils.cpp
M  +7    -4    kstars/kstarslite/deviceorientation.cpp
M  +0    -1    kstars/skymaplite.cpp

https://commits.kde.org/kstars/2886366b7fcd68161fd4fd50d8849bdc714ac766

diff --git a/apk/src/org/kde/kstars/DeviceOrientation.java \
b/apk/src/org/kde/kstars/DeviceOrientation.java index 4fbc6c04f..ab9379f1e 100644
--- a/apk/src/org/kde/kstars/DeviceOrientation.java
+++ b/apk/src/org/kde/kstars/DeviceOrientation.java
@@ -93,6 +93,9 @@ public class DeviceOrientation extends QtActivity implements \
RotationUpdateDeleg  public void onRotationUpdate(float[] newMatrix) {
             // remap matrix values according to display rotation, as in
             // SensorManager documentation.
+    	    final Display display = ((WindowManager) \
getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); +    	    \
mDisplayRotation = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) ? \
display.getRotation() : display.getOrientation(); +
             switch (mDisplayRotation) {
             case Surface.ROTATION_0:
             case Surface.ROTATION_180:
@@ -111,7 +114,6 @@ public class DeviceOrientation extends QtActivity implements \
RotationUpdateDeleg  Azimuth = m_orientation[0];
             Pitch = m_orientation[1];
             Roll = m_orientation[2];
-//            System.out.println(m_orientation[0] + " " + m_orientation[1] + " " + \
m_orientation[2]);  }
 
     // Other Activity life-cycle methods
diff --git a/apk/src/org/kde/kstars/rotation/RotationVectorListener.java \
b/apk/src/org/kde/kstars/rotation/RotationVectorListener.java index \
                cb274befa..92f37b8df 100644
--- a/apk/src/org/kde/kstars/rotation/RotationVectorListener.java
+++ b/apk/src/org/kde/kstars/rotation/RotationVectorListener.java
@@ -20,6 +20,12 @@ import android.hardware.SensorManager;
 public class RotationVectorListener implements SensorEventListener {
 	private float[] mRotationM = new float[16];
 	private RotationUpdateDelegate mRotationUpdateDelegate;
+	private final float mFilterFactor = 1.0f;
+	private final float mFilterFactorInv = 1.0f - mFilterFactor;
+
+	private boolean firstSensor = true;
+
+	private float[] mVectorVals = new float[] { 0f, 0f, 0f };
 
 	public RotationVectorListener(RotationUpdateDelegate rotationUpdateDelegate) {
 		mRotationUpdateDelegate = rotationUpdateDelegate;
@@ -28,6 +34,8 @@ public class RotationVectorListener implements SensorEventListener \
{  @SuppressLint("NewApi")
 	@Override
 	public void onSensorChanged(SensorEvent event) {
+		// smooth(event.values, mVectorVals, mVectorVals);
+
 		SensorManager.getRotationMatrixFromVector(mRotationM, event.values);
 		mRotationUpdateDelegate.onRotationUpdate(mRotationM);
 	}
@@ -35,4 +43,10 @@ public class RotationVectorListener implements SensorEventListener \
{  @Override
 	public void onAccuracyChanged(Sensor sensor, int accuracy) {
 	}
+
+	private void smooth(float[] inv, float prevv[], float outv[]) {
+		outv[0] = prevv[0] + mFilterFactor * (inv[0] - prevv[0]);
+		outv[1] = prevv[1] + mFilterFactor * (inv[1] - prevv[1]);
+		outv[2] = prevv[2] + mFilterFactor * (inv[2] - prevv[2]);
+	}
 }
diff --git a/kstars/auxiliary/ksutils.cpp b/kstars/auxiliary/ksutils.cpp
index fc0a65d10..80d50e9ff 100644
--- a/kstars/auxiliary/ksutils.cpp
+++ b/kstars/auxiliary/ksutils.cpp
@@ -36,6 +36,7 @@
 #include "auxiliary/kspaths.h"
 
 #include <QPointer>
+#include <QProcessEnvironment>
 
 namespace KSUtils
 {
diff --git a/kstars/kstarslite/deviceorientation.cpp \
b/kstars/kstarslite/deviceorientation.cpp index aea1cebbc..b28a01b1f 100644
--- a/kstars/kstarslite/deviceorientation.cpp
+++ b/kstars/kstarslite/deviceorientation.cpp
@@ -4,10 +4,11 @@
 #include <QAndroidJniObject>
 #include <QtAndroidExtras>
 #include <QtAndroid>
+#define ALPHA_LOW_PASS 0.1
 #endif
 
 DeviceOrientation::DeviceOrientation(QObject * parent)
-    : QObject(parent)
+    : QObject(parent), m_Azimuth(0), m_Altitude(0), m_Roll(0)
 {
 
 }
@@ -32,8 +33,10 @@ void DeviceOrientation::getOrientation()
 {
 #if defined (Q_OS_ANDROID)
     QAndroidJniObject activity = QtAndroid::androidActivity();
-    m_Azimuth = activity.callMethod<float>("getAzimuth");
-    m_Altitude = activity.callMethod<float>("getPitch");
-    m_Roll = activity.callMethod<float>("getRoll");
+    m_Azimuth = m_Azimuth + ALPHA_LOW_PASS * \
(activity.callMethod<float>("getAzimuth") - m_Azimuth); +    m_Altitude = m_Altitude \
+ ALPHA_LOW_PASS * (activity.callMethod<float>("getPitch") - m_Altitude); +
+    float newRoll = activity.callMethod<float>("getRoll");
+    m_Roll = abs(newRoll - m_Roll) > 10 ? newRoll : m_Roll + ALPHA_LOW_PASS * \
(newRoll - m_Roll);  #endif
 }
diff --git a/kstars/skymaplite.cpp b/kstars/skymaplite.cpp
index 89eb763c5..41943c826 100644
--- a/kstars/skymaplite.cpp
+++ b/kstars/skymaplite.cpp
@@ -156,7 +156,6 @@ SkyMapLite::SkyMapLite()
     connect(&automaticModeTimer, SIGNAL(timeout()), this, \
SLOT(updateAutomaticMode()));  setAutomaticMode(false);
 #endif
-//    setRotation(30);
 }
 
 QSGNode * SkyMapLite::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * \
updatePaintNodeData)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic