@ -37,6 +37,7 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent ;
import android.hardware.SensorEvent ;
import android.hardware.SensorEventListener ;
import android.hardware.SensorEventListener ;
import android.hardware.SensorManager ;
import android.hardware.SensorManager ;
import android.os.Vibrator ;
import android.view.Display ;
import android.view.Display ;
import android.view.Surface ;
import android.view.Surface ;
import android.view.WindowManager ;
import android.view.WindowManager ;
@ -55,6 +56,25 @@ import java.util.logging.Level;
import java.util.logging.Logger ;
import java.util.logging.Logger ;
/ * *
/ * *
* AndroidSensorJoyInput converts the Android Sensor system into Joystick events .
* Each sensor type is a seperate joystick that can be used with RawInputListener
* or the onAnalog listener .
*
* Device Orientation is not a physicsal sensor , but rather a calculation based
* on the current accelerometer and magnetic sensor . Orientation is configured
* as joystick [ 0 ] , while physical sensors are configured with the joyId set to
* the Android constant for the sensor type .
*
* Right now , only the Orientation is exposed as a Joystick .
*
* MainActivity needs the following line to enable Joysticks
* joystickEventsEnabled = true ;
*
* Rumble needs the following line in the Manifest File
* < uses - permission android : name = "android.permission.VIBRATE" / >
* Because Andorid does not allow for the user to define the intensity of the
* vibration , the rumble amount ( ie strength ) is converted into the number of
* milliseconds the vibration lasts .
*
*
* @author iwgeric
* @author iwgeric
* /
* /
@ -63,6 +83,7 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener {
private InputManager inputManager = null ;
private InputManager inputManager = null ;
private SensorManager sensorManager = null ;
private SensorManager sensorManager = null ;
private Vibrator vibrator = null ;
private RawInputListener listener = null ;
private RawInputListener listener = null ;
private IntMap < SensorData > sensors = new IntMap < SensorData > ( ) ;
private IntMap < SensorData > sensors = new IntMap < SensorData > ( ) ;
private Joystick [ ] joysticks ;
private Joystick [ ] joysticks ;
@ -101,7 +122,10 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener {
private void initSensorManager ( ) {
private void initSensorManager ( ) {
initWindow ( ) ;
initWindow ( ) ;
// Get instance of the SensorManager from the current Context
sensorManager = ( SensorManager ) JmeAndroidSystem . getActivity ( ) . getSystemService ( Context . SENSOR_SERVICE ) ;
sensorManager = ( SensorManager ) JmeAndroidSystem . getActivity ( ) . getSystemService ( Context . SENSOR_SERVICE ) ;
// Get instance of Vibrator from current Context
vibrator = ( Vibrator ) JmeAndroidSystem . getActivity ( ) . getSystemService ( Context . VIBRATOR_SERVICE ) ;
initSensors ( ) ;
initSensors ( ) ;
}
}
@ -268,6 +292,9 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener {
for ( Entry entry : sensors ) {
for ( Entry entry : sensors ) {
unRegisterListener ( entry . getKey ( ) ) ;
unRegisterListener ( entry . getKey ( ) ) ;
}
}
if ( vibrator ! = null ) {
vibrator . cancel ( ) ;
}
}
}
/ * *
/ * *
@ -457,6 +484,10 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener {
deltaOrientation [ 1 ] = orientValues [ 2 ] - orientationLastValues [ 2 ] ;
deltaOrientation [ 1 ] = orientValues [ 2 ] - orientationLastValues [ 2 ] ;
deltaOrientation [ 2 ] = orientValues [ 0 ] - orientationLastValues [ 0 ] ;
deltaOrientation [ 2 ] = orientValues [ 0 ] - orientationLastValues [ 0 ] ;
// logger.log(Level.INFO, "Sensor Values x:{0}, y:{1}, z:{2}, deg x:{3}, y:{4}, z:{5}",
// new Object[]{orientValues[1], orientValues[2], orientValues[0],
// orientValues[1]*FastMath.RAD_TO_DEG, orientValues[2]*FastMath.RAD_TO_DEG, orientValues[0]*FastMath.RAD_TO_DEG});
synchronized ( eventQueue ) {
synchronized ( eventQueue ) {
// only send data to inputManager if it is different than last time
// only send data to inputManager if it is different than last time
// orientValues[1] is the X axis -> JoyAxisEvent Axis 0
// orientValues[1] is the X axis -> JoyAxisEvent Axis 0
@ -492,7 +523,11 @@ public class AndroidSensorJoyInput implements JoyInput, SensorEventListener {
// Start of JoyInput methods
// Start of JoyInput methods
public void setJoyRumble ( int joyId , float amount ) {
public void setJoyRumble ( int joyId , float amount ) {
return ;
// convert amount to milliseconds since Android doesn't allow intensity
if ( vibrator ! = null ) {
vibrator . vibrate ( ( long ) ( amount * 1000 ) ) ;
}
}
}
public Joystick [ ] loadJoysticks ( InputManager inputManager ) {
public Joystick [ ] loadJoysticks ( InputManager inputManager ) {