From 5697089d981d88f48997576c51261b1002ddc06c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 20 Oct 2013 23:52:02 -0700 Subject: [PATCH] Fixed bug 2156 - Android: Accelerometer values fed to joystick driver are inverted for the X axis and wrong for Z Denis Bernard Background information: http://developer.android.com/reference/android/hardware/SensorEvent.html#values Steps to reproduce: compile testjoystick.c as an android app (change screen size according to your device). While running the app, also run: adb logcat -c; adb logcat -s 'SDL:*' 'SDL/APP:*' When tilting the device left/right, the joystick moves in the opposite direction of what one would expect. Or at least, the behaviour is not consistent with the Y axis. Also when the device sits on a table (obviously not moving), the Z axis value oscillates between -32000 and +32000 (by overflow): I/SDL/APP ( 1994): Joystick 0 axis 2 value: 32511 I/SDL/APP ( 1994): Joystick 0 axis 2 value: 32575 I/SDL/APP ( 1994): Joystick 0 axis 2 value: 32383 I/SDL/APP ( 1994): Joystick 0 axis 2 value: -32386 I/SDL/APP ( 1994): Joystick 0 axis 2 value: -32450 I/SDL/APP ( 1994): Joystick 0 axis 2 value: -32578 This is caused by the accelerometer yielding a constant value around 9.81 for Z and feeding something like 0.9 to 1.1 to the joystick driver, resulting in the overflow. Proposed fix in SDLActivity.java (swap X and subtract G from Z reading) --- android-project/src/org/libsdl/app/SDLActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 02b6ebd61..49b014ce1 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -642,9 +642,9 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, y = event.values[1]; break; } - SDLActivity.onNativeAccel(x / SensorManager.GRAVITY_EARTH, + SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH, y / SensorManager.GRAVITY_EARTH, - event.values[2] / SensorManager.GRAVITY_EARTH); + event.values[2] / SensorManager.GRAVITY_EARTH - 1); } }