Removing Android Sensor Support (undo r9610). Preparing for new way of implementing sensor support on Android.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9646 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
143789d3f0
commit
16851eb1d8
@ -1,584 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.input.android; |
|
||||||
|
|
||||||
import android.content.Context; |
|
||||||
import android.hardware.Sensor; |
|
||||||
import android.hardware.SensorEvent; |
|
||||||
import android.hardware.SensorEventListener; |
|
||||||
import android.hardware.SensorManager; |
|
||||||
import android.view.Display; |
|
||||||
import android.view.Surface; |
|
||||||
import android.view.WindowManager; |
|
||||||
import com.jme3.input.RawInputListener; |
|
||||||
import com.jme3.input.SensorInput; |
|
||||||
import com.jme3.input.event.MotionSensorEvent; |
|
||||||
import com.jme3.math.Vector3f; |
|
||||||
import com.jme3.system.android.JmeAndroidSystem; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Map.Entry; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.logging.Level; |
|
||||||
import java.util.logging.Logger; |
|
||||||
|
|
||||||
/** |
|
||||||
* Android specific implementation of SensorInput. |
|
||||||
* |
|
||||||
* @author iwgeric |
|
||||||
*/ |
|
||||||
public class AndroidSensorInput implements SensorInput, SensorEventListener { |
|
||||||
private final static Logger logger = Logger.getLogger(AndroidSensorInput.class.getName()); |
|
||||||
|
|
||||||
private SensorManager sensorManager = null; |
|
||||||
private RawInputListener listener = null; |
|
||||||
private Map<Integer, SensorData> sensors = new HashMap<Integer, SensorData>(); |
|
||||||
private boolean initialized = false; |
|
||||||
private WindowManager window; |
|
||||||
private Display disp; |
|
||||||
|
|
||||||
private final float[] curAccValues = new float[3]; |
|
||||||
private final float[] curMagValues = new float[3]; |
|
||||||
private final float[] curInclination = new float[9]; |
|
||||||
private final float[] curRotation = new float[9]; |
|
||||||
private final float[] rotatedRotation = new float[9]; |
|
||||||
|
|
||||||
private final ArrayList<MotionSensorEvent> eventQueue = new ArrayList<MotionSensorEvent>(); |
|
||||||
|
|
||||||
/** |
|
||||||
* Internal class to enclose data for each sensor. |
|
||||||
*/ |
|
||||||
private class SensorData { |
|
||||||
int androidSensorType = -1; |
|
||||||
int androidSensorSpeed = SensorManager.SENSOR_DELAY_UI; |
|
||||||
Sensor sensor = null; |
|
||||||
Vector3f lastValues = new Vector3f(); |
|
||||||
float minChangePercent = 0f; |
|
||||||
boolean enabled = false; |
|
||||||
boolean paused = false; |
|
||||||
|
|
||||||
public SensorData(int androidSensorType, Sensor sensor) { |
|
||||||
this.androidSensorType = androidSensorType; |
|
||||||
this.sensor = sensor; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Pauses the active sensors to save battery. Mostly used internally so that |
|
||||||
* the sensors can be deactivated while the game Activity is |
|
||||||
* in the background to save battery life |
|
||||||
*/ |
|
||||||
public void pauseSensors() { |
|
||||||
for (Entry<Integer, SensorData> entry : sensors.entrySet()) { |
|
||||||
SensorData sensorData = entry.getValue(); |
|
||||||
if (sensorData.sensor != null) { |
|
||||||
unRegisterListener(entry.getKey()); |
|
||||||
sensorData.paused = true; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Resumes paused sensors. Mostly used internally so that |
|
||||||
* the sensors can be reactivated when the game Activity is |
|
||||||
* placed back onto the forefront. |
|
||||||
*/ |
|
||||||
public void resumeSensors() { |
|
||||||
for (Entry<Integer, SensorData> entry : sensors.entrySet()) { |
|
||||||
SensorData sensorData = entry.getValue(); |
|
||||||
if (sensorData.sensor != null && sensorData.paused) { |
|
||||||
if (registerListener(entry.getKey())) { |
|
||||||
sensorData.paused = false; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Used internally by the context to reset the Sensor Manager on device rotations. |
|
||||||
* Necessary because a new Activity is created on a device rotation, so the |
|
||||||
* Sensor Manager needs to be reset with the new Activity. |
|
||||||
*/ |
|
||||||
public void resetSensorManager() { |
|
||||||
initSensorManager(); |
|
||||||
} |
|
||||||
|
|
||||||
private void initSensorManager() { |
|
||||||
window = JmeAndroidSystem.getActivity().getWindowManager(); |
|
||||||
disp = window.getDefaultDisplay(); |
|
||||||
|
|
||||||
sensorManager = (SensorManager) JmeAndroidSystem.getActivity().getSystemService(Context.SENSOR_SERVICE); |
|
||||||
|
|
||||||
initSensor(SensorInput.SENSOR_TYPE_MAGNETIC_FIELD); |
|
||||||
initSensor(SensorInput.SENSOR_TYPE_ACCELEROMETER); |
|
||||||
initSensor(SensorInput.SENSOR_TYPE_ORIENTATION); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private boolean initSensor(int sensorType) { |
|
||||||
boolean result = false; |
|
||||||
boolean previouslyActive = false; |
|
||||||
|
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
if (sensorData != null) { |
|
||||||
if (sensorData.enabled) { |
|
||||||
previouslyActive = true; |
|
||||||
} |
|
||||||
unRegisterListener(sensorType); |
|
||||||
} else { |
|
||||||
sensorData = new SensorData(sensorType, null); |
|
||||||
sensors.put(sensorType, sensorData); |
|
||||||
} |
|
||||||
|
|
||||||
switch (sensorType) { |
|
||||||
case SensorInput.SENSOR_TYPE_MAGNETIC_FIELD: |
|
||||||
sensorData.androidSensorType = Sensor.TYPE_MAGNETIC_FIELD; |
|
||||||
sensorData.sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); |
|
||||||
break; |
|
||||||
case SensorInput.SENSOR_TYPE_ACCELEROMETER: |
|
||||||
sensorData.androidSensorType = Sensor.TYPE_ACCELEROMETER; |
|
||||||
sensorData.sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); |
|
||||||
break; |
|
||||||
case SensorInput.SENSOR_TYPE_ORIENTATION: |
|
||||||
sensorData.androidSensorType = Sensor.TYPE_ORIENTATION; |
|
||||||
//Orientation is not a sensor anymore but rather a call to SensorMangaer
|
|
||||||
// to get the current orientation based on the Magnetic and Accelerometer sensor data
|
|
||||||
sensorData.sensor = null; |
|
||||||
break; |
|
||||||
|
|
||||||
default: |
|
||||||
throw new IllegalArgumentException("Invalid Sensor Type."); |
|
||||||
} |
|
||||||
|
|
||||||
if (sensorData.sensor != null || sensorType == SensorInput.SENSOR_TYPE_ORIENTATION) { |
|
||||||
logger.log(Level.INFO, "Sensor Type {0} found.", sensorType); |
|
||||||
if (previouslyActive) { |
|
||||||
logger.log(Level.INFO, "Reactivating Sensor Type {0}.", sensorType); |
|
||||||
registerListener(sensorType); |
|
||||||
} |
|
||||||
result = true; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
private boolean registerListener(int sensorType) { |
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
if (sensorData != null) { |
|
||||||
if (sensorData.enabled) { |
|
||||||
logger.log(Level.INFO, "Sensor Already Active: SensorType: {0}, active: {1}", |
|
||||||
new Object[]{sensorType, sensorData.enabled}); |
|
||||||
return true; |
|
||||||
} |
|
||||||
if (sensorData.sensor != null) { |
|
||||||
if (sensorManager.registerListener(this, sensorData.sensor, sensorData.androidSensorSpeed)) { |
|
||||||
sensorData.enabled = true; |
|
||||||
logger.log(Level.INFO, "SensorType: {0}, active: {1}", |
|
||||||
new Object[]{sensorType, sensorData.enabled}); |
|
||||||
logger.log(Level.INFO, "Sensor Type {0} activated.", sensorType); |
|
||||||
return true; |
|
||||||
} else { |
|
||||||
sensorData.enabled = false; |
|
||||||
logger.log(Level.INFO, "Sensor Type {0} activation failed.", sensorType); |
|
||||||
} |
|
||||||
} else if (sensorType == SensorInput.SENSOR_TYPE_ORIENTATION) { |
|
||||||
logger.log(Level.INFO, "Sensor is Orientation"); |
|
||||||
if (registerListener(SensorInput.SENSOR_TYPE_MAGNETIC_FIELD) && registerListener(SensorInput.SENSOR_TYPE_ACCELEROMETER)) { |
|
||||||
sensorData.enabled = true; |
|
||||||
logger.log(Level.INFO, "Magnetic and Acceleration Sensors Registered and Orientation Sensor being simulated."); |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
||||||
sensorData.lastValues = null; |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
private void unRegisterListener(int sensorType) { |
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
if (sensorData != null) { |
|
||||||
if (sensorData.sensor != null) { |
|
||||||
sensorManager.unregisterListener(this, sensorData.sensor); |
|
||||||
} else if (sensorType == SensorInput.SENSOR_TYPE_ORIENTATION) { |
|
||||||
logger.log(Level.INFO, "Mangetic and Acceleration Sensors are being deactivated with Orientation Sensor."); |
|
||||||
unRegisterListener(SensorInput.SENSOR_TYPE_MAGNETIC_FIELD); |
|
||||||
unRegisterListener(SensorInput.SENSOR_TYPE_ACCELEROMETER); |
|
||||||
} |
|
||||||
sensorData.enabled = false; |
|
||||||
logger.log(Level.INFO, "SensorType: {0}, active: {1}", |
|
||||||
new Object[]{sensorType, sensorData.enabled}); |
|
||||||
logger.log(Level.INFO, "Sensor Type {0} deactivated.", sensorType); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/* |
|
||||||
* Android remapCoordinateSystem from the Android docs |
|
||||||
* remapCoordinateSystem(float[] inR, int X, int Y, float[] outR) |
|
||||||
* |
|
||||||
* @param inR the rotation matrix to be transformed. Usually it is the matrix |
|
||||||
* returned by getRotationMatrix(float[], float[], float[], float[]). |
|
||||||
* |
|
||||||
* @param outR the transformed rotation matrix. inR and outR can be the same |
|
||||||
* array, but it is not recommended for performance reason. |
|
||||||
* |
|
||||||
* X defines on which world axis and direction the X axis of the device is mapped. |
|
||||||
* Y defines on which world axis and direction the Y axis of the device is mapped. |
|
||||||
* |
|
||||||
* @return True if successful |
|
||||||
*/ |
|
||||||
|
|
||||||
private boolean remapCoordinates(float[] inR, float[] outR) { |
|
||||||
int xDir = SensorManager.AXIS_X; |
|
||||||
int yDir = SensorManager.AXIS_Y; |
|
||||||
|
|
||||||
// logger.log(Level.INFO, "Screen Rotation: {0}", getScreenRotation());
|
|
||||||
if (getScreenRotation() == Surface.ROTATION_0) { |
|
||||||
xDir = SensorManager.AXIS_X; |
|
||||||
yDir = SensorManager.AXIS_Y; |
|
||||||
} |
|
||||||
if (getScreenRotation() == Surface.ROTATION_90) { |
|
||||||
xDir = SensorManager.AXIS_MINUS_Y; |
|
||||||
yDir = SensorManager.AXIS_MINUS_X; |
|
||||||
} |
|
||||||
if (getScreenRotation() == Surface.ROTATION_180) { |
|
||||||
xDir = SensorManager.AXIS_MINUS_X; |
|
||||||
yDir = SensorManager.AXIS_MINUS_Y; |
|
||||||
} |
|
||||||
if (getScreenRotation() == Surface.ROTATION_270) { |
|
||||||
xDir = SensorManager.AXIS_Y; |
|
||||||
yDir = SensorManager.AXIS_MINUS_X; |
|
||||||
} |
|
||||||
return SensorManager.remapCoordinateSystem(inR, xDir, yDir, outR); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Returns the current device rotation. |
|
||||||
* Surface.ROTATION_0 = device in natural default rotation |
|
||||||
* Surface.ROTATION_90 = device in rotated 90deg counterclockwise |
|
||||||
* Surface.ROTATION_180 = device in rotated 180deg counterclockwise |
|
||||||
* Surface.ROTATION_270 = device in rotated 270deg counterclockwise |
|
||||||
* |
|
||||||
* When the Manifest locks the orientation, this value will not change during |
|
||||||
* gametime, but if the orientation of the screen is based off the sensor, |
|
||||||
* this value will change as the device is rotated. |
|
||||||
* @return Current device rotation amount |
|
||||||
*/ |
|
||||||
private int getScreenRotation() { |
|
||||||
|
|
||||||
return disp.getRotation(); |
|
||||||
} |
|
||||||
|
|
||||||
private Integer getAndroidSensorSpeed(int sensorInputSpeed) { |
|
||||||
Integer androidSpeed = null; |
|
||||||
switch (sensorInputSpeed) { |
|
||||||
case SensorInput.SENSOR_SPEED_SLOW: |
|
||||||
androidSpeed = SensorManager.SENSOR_DELAY_UI; |
|
||||||
break; |
|
||||||
case SensorInput.SENSOR_SPEED_MEDIUM: |
|
||||||
androidSpeed = SensorManager.SENSOR_DELAY_NORMAL; |
|
||||||
break; |
|
||||||
case SensorInput.SENSOR_SPEED_FAST: |
|
||||||
androidSpeed = SensorManager.SENSOR_DELAY_GAME; |
|
||||||
break; |
|
||||||
default: |
|
||||||
throw new IllegalArgumentException("Invalid Sensor Speed."); |
|
||||||
} |
|
||||||
return androidSpeed; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Calculates the device orientation based off the data recieved from the |
|
||||||
* Acceleration Sensor and Mangetic Field sensor |
|
||||||
* Values are returned relative to the Earth. |
|
||||||
* |
|
||||||
* From the Android Doc |
|
||||||
* |
|
||||||
* Computes the device's orientation based on the rotation matrix. When it returns, the array values is filled with the result: |
|
||||||
* values[0]: azimuth, rotation around the Z axis. |
|
||||||
* values[1]: pitch, rotation around the X axis. |
|
||||||
* values[2]: roll, rotation around the Y axis. |
|
||||||
* |
|
||||||
* The reference coordinate-system used is different from the world |
|
||||||
* coordinate-system defined for the rotation matrix: |
|
||||||
* X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points West). |
|
||||||
* Y is tangential to the ground at the device's current location and points towards the magnetic North Pole. |
|
||||||
* Z points towards the center of the Earth and is perpendicular to the ground. |
|
||||||
* |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private boolean updateOrientation() { |
|
||||||
SensorData sensorData; |
|
||||||
sensorData = sensors.get((Integer)SensorInput.SENSOR_TYPE_MAGNETIC_FIELD); |
|
||||||
if (sensorData == null || !sensorData.enabled) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
sensorData = sensors.get((Integer)SensorInput.SENSOR_TYPE_ACCELEROMETER); |
|
||||||
if (sensorData == null || !sensorData.enabled) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
sensorData = sensors.get((Integer)SensorInput.SENSOR_TYPE_ORIENTATION); |
|
||||||
if (sensorData != null && sensorData.enabled) { |
|
||||||
|
|
||||||
// create new copies so they don't get updated during the getRotationMatrix call
|
|
||||||
final float[] accValues = new float[3]; |
|
||||||
final float[] magValues = new float[3]; |
|
||||||
synchronized(curAccValues) { |
|
||||||
accValues[0] = curAccValues[0]; |
|
||||||
accValues[1] = curAccValues[1]; |
|
||||||
accValues[2] = curAccValues[2]; |
|
||||||
} |
|
||||||
synchronized(curMagValues) { |
|
||||||
magValues[0] = curMagValues[0]; |
|
||||||
magValues[1] = curMagValues[1]; |
|
||||||
magValues[2] = curMagValues[2]; |
|
||||||
} |
|
||||||
|
|
||||||
if (SensorManager.getRotationMatrix(curRotation, curInclination, accValues, magValues)) { |
|
||||||
final float [] orientValues = new float[3]; |
|
||||||
if (remapCoordinates(curRotation, rotatedRotation)) { |
|
||||||
SensorManager.getOrientation(rotatedRotation, orientValues); |
|
||||||
// logger.log(Level.INFO, "Orientation Values: {0}, {1}, {2}",
|
|
||||||
// new Object[]{orientValues[0], orientValues[1], orientValues[2]});
|
|
||||||
|
|
||||||
updateEventQueue(SensorInput.SENSOR_TYPE_ORIENTATION, |
|
||||||
orientValues[0], orientValues[1], orientValues[2], System.nanoTime()); |
|
||||||
|
|
||||||
return true; |
|
||||||
} else { |
|
||||||
//logger.log(Level.INFO, "remapCoordinateSystem failed");
|
|
||||||
} |
|
||||||
|
|
||||||
} else { |
|
||||||
//logger.log(Level.INFO, "getRotationMatrix returned false");
|
|
||||||
} |
|
||||||
|
|
||||||
} else { |
|
||||||
if (!sensorData.enabled) { |
|
||||||
//logger.log(Level.INFO, "Orientation is not active");
|
|
||||||
} |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
private void updateEventQueue(int sensorType, float x, float y, float z, long timestamp) { |
|
||||||
// logger.log(Level.INFO, "updateEventQueue for {0}: values: {1}, {2}, {3}",
|
|
||||||
// new Object[]{sensorType, x, y, z});
|
|
||||||
float lastX, lastY, lastZ; |
|
||||||
float dX, dY, dZ; |
|
||||||
|
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
|
|
||||||
if (sensorData != null) { |
|
||||||
// if lastValues is null, then this is the first scan after a registerListener
|
|
||||||
// so set lastValues to the current values so dX,dY,dZ are zero this pass
|
|
||||||
if (sensorData.lastValues == null) { |
|
||||||
sensorData.lastValues = new Vector3f(x, y, z); |
|
||||||
} |
|
||||||
|
|
||||||
lastX = sensorData.lastValues.x; |
|
||||||
lastY = sensorData.lastValues.y; |
|
||||||
lastZ = sensorData.lastValues.z; |
|
||||||
|
|
||||||
dX = x - lastX; |
|
||||||
dY = y - lastY; |
|
||||||
dZ = z - lastZ; |
|
||||||
|
|
||||||
if (dX != 0 && dY != 0 && dZ != 0) { |
|
||||||
MotionSensorEvent motionEvent = new MotionSensorEvent(sensorType, x, y, z, dX, dY, dZ); |
|
||||||
motionEvent.setTime(timestamp); |
|
||||||
sensorData.lastValues.x = x; |
|
||||||
sensorData.lastValues.y = y; |
|
||||||
sensorData.lastValues.z = z; |
|
||||||
|
|
||||||
synchronized (eventQueue){ |
|
||||||
eventQueue.add(motionEvent); |
|
||||||
} |
|
||||||
} else { |
|
||||||
//logger.log(Level.INFO, "No change in Sensor Data for: {0}", sensorType);
|
|
||||||
} |
|
||||||
} else { |
|
||||||
//logger.log(Level.INFO, "Sensor Data is null for: {0}", sensorType);
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Start of methods from SensorInput
|
|
||||||
|
|
||||||
public boolean isEnabled(int sensorType) { |
|
||||||
logger.log(Level.INFO, "Checking isEnabled for type: {0}", sensorType); |
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
if (sensorData == null) { |
|
||||||
// logger.log(Level.INFO, "sensor data is null, sensors size is: {0}", sensors.size());
|
|
||||||
return false; |
|
||||||
} |
|
||||||
return sensors.get((Integer)sensorType).enabled; |
|
||||||
} |
|
||||||
|
|
||||||
public void setEnable(boolean enable) { |
|
||||||
for (Integer sensorType: sensors.keySet()) { |
|
||||||
setEnable(sensorType, enable); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void setEnable(int sensorType, boolean enable) { |
|
||||||
logger.log(Level.INFO, "Setting Sensor {0} Enable to {1}", |
|
||||||
new Object[]{sensorType, enable}); |
|
||||||
if (enable) { |
|
||||||
// registerListener(sensorType, true);
|
|
||||||
registerListener(sensorType); |
|
||||||
} else { |
|
||||||
unRegisterListener(sensorType); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void setSensorFrequency(int sensorType, int updateSpeed) { |
|
||||||
SensorData sensorData = sensors.get((Integer)sensorType); |
|
||||||
if (sensorData == null || sensorData.enabled) { |
|
||||||
throw new IllegalArgumentException("Sensor Type Not Configured or is already active."); |
|
||||||
} |
|
||||||
|
|
||||||
sensorData.androidSensorSpeed = getAndroidSensorSpeed(updateSpeed); |
|
||||||
} |
|
||||||
|
|
||||||
public Set<Integer> getSensorTypes() { |
|
||||||
return Collections.unmodifiableSet(sensors.keySet()); |
|
||||||
} |
|
||||||
|
|
||||||
public void setSensorMinChange(int sensorType, float minChangePercent) { |
|
||||||
throw new UnsupportedOperationException("Not supported yet."); |
|
||||||
} |
|
||||||
|
|
||||||
public void initialize() { |
|
||||||
logger.log(Level.INFO, "Doing Initialize."); |
|
||||||
initSensorManager(); |
|
||||||
initialized = true; |
|
||||||
} |
|
||||||
|
|
||||||
public void update() { |
|
||||||
updateOrientation(); |
|
||||||
synchronized (eventQueue){ |
|
||||||
// flush events to listener
|
|
||||||
for (int i = 0; i < eventQueue.size(); i++){ |
|
||||||
listener.onMotionSensorEvent(eventQueue.get(i)); |
|
||||||
} |
|
||||||
eventQueue.clear(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void destroy() { |
|
||||||
for (Integer i: sensors.keySet()) { |
|
||||||
unRegisterListener(i); |
|
||||||
} |
|
||||||
logger.log(Level.INFO, "Doing Destroy"); |
|
||||||
if (sensorManager != null) { |
|
||||||
sensorManager.unregisterListener(this); |
|
||||||
} |
|
||||||
sensors.clear(); |
|
||||||
eventQueue.clear(); |
|
||||||
} |
|
||||||
|
|
||||||
public boolean isInitialized() { |
|
||||||
return initialized; |
|
||||||
} |
|
||||||
|
|
||||||
public void setInputListener(RawInputListener listener) { |
|
||||||
this.listener = listener; |
|
||||||
} |
|
||||||
|
|
||||||
public long getInputTimeNanos() { |
|
||||||
return System.nanoTime(); |
|
||||||
} |
|
||||||
|
|
||||||
// End of methods from SensorInput
|
|
||||||
|
|
||||||
// Start of methods from SensorEventListener
|
|
||||||
|
|
||||||
public void onSensorChanged(SensorEvent se) { |
|
||||||
// logger.log(Level.INFO, "onSensorChanged for {0}: values: {1}, {2}, {3}",
|
|
||||||
// new Object[]{se.sensor.getType(), se.values[0], se.values[1], se.values[2]});
|
|
||||||
SensorData sensorData; |
|
||||||
int sensorType; |
|
||||||
for (Entry<Integer, SensorData> entry : sensors.entrySet()) { |
|
||||||
// if (entry.getValue().sensor == null) {
|
|
||||||
// logger.log(Level.INFO, "Sensor is null for SensorType: {0}", entry.getKey());
|
|
||||||
// }
|
|
||||||
if (entry.getValue().sensor != null && entry.getValue().sensor.equals(se.sensor)) { |
|
||||||
sensorType = entry.getKey(); |
|
||||||
sensorData = entry.getValue(); |
|
||||||
|
|
||||||
updateEventQueue(sensorType, se.values[0], se.values[1], se.values[2], se.timestamp); |
|
||||||
|
|
||||||
if (sensorType == SensorInput.SENSOR_TYPE_MAGNETIC_FIELD) { |
|
||||||
synchronized(curMagValues) { |
|
||||||
curMagValues[0] = se.values[0]; |
|
||||||
curMagValues[1] = se.values[1]; |
|
||||||
curMagValues[2] = se.values[2]; |
|
||||||
} |
|
||||||
} |
|
||||||
if (sensorType == SensorInput.SENSOR_TYPE_ACCELEROMETER) { |
|
||||||
synchronized(curAccValues) { |
|
||||||
curAccValues[0] = se.values[0]; |
|
||||||
curAccValues[1] = se.values[1]; |
|
||||||
curAccValues[2] = se.values[2]; |
|
||||||
} |
|
||||||
} |
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void onAccuracyChanged(Sensor sensor, int i) { |
|
||||||
logger.log(Level.INFO, "onAccuracyChanged for {0}: accuracy: {1}", |
|
||||||
new Object[]{sensor.toString(), i}); |
|
||||||
} |
|
||||||
|
|
||||||
// End of methods from SensorEventListener
|
|
||||||
|
|
||||||
} |
|
@ -1,146 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.input; |
|
||||||
|
|
||||||
import java.util.Set; |
|
||||||
|
|
||||||
/** |
|
||||||
* A specific API for interfacing with sensors. |
|
||||||
* |
|
||||||
* In order to conserve battery power for handheld devices, sensors must be |
|
||||||
* enabled before data will be sent. Use the setEnable method to enable or disable |
|
||||||
* the sensors. |
|
||||||
* |
|
||||||
* Sensor speed can also be set. Constants in this class are used so that each |
|
||||||
* platform implementation can decide what absolute update rate to use. Use the |
|
||||||
* setSensorFrequency method to set the desired update rate. |
|
||||||
* |
|
||||||
* In order to minimize the amount of data sent to the application, there is a |
|
||||||
* method available to set how much change is required between sensor readings |
|
||||||
* before the new updated data is sent. Use the setSensorMinChange method to set |
|
||||||
* a minimum data change percentage (percentage of max sensor range). Data will |
|
||||||
* not be sent to the application until the data has changed by this amount. |
|
||||||
* |
|
||||||
* |
|
||||||
* |
|
||||||
* |
|
||||||
* |
|
||||||
* @author iwgeric |
|
||||||
*/ |
|
||||||
public interface SensorInput extends Input { |
|
||||||
|
|
||||||
/** |
|
||||||
* Orientation Sensor. Values returned in the onMotionSensorChanged event |
|
||||||
* are in radians. |
|
||||||
*/ |
|
||||||
public static final int SENSOR_TYPE_ORIENTATION = 0; |
|
||||||
|
|
||||||
/** |
|
||||||
* Accelerometer Sensor. Values returned in the onMotionSensorChanged event |
|
||||||
* are in m/s^2. Values include gravity. To get true device acceleration, |
|
||||||
* gravity must be removed. |
|
||||||
*/ |
|
||||||
public static final int SENSOR_TYPE_ACCELEROMETER = 1; |
|
||||||
|
|
||||||
/** |
|
||||||
* Magnetic Field Sensor. Values returned in the onMotionSensorChanged event |
|
||||||
* are in micro-Tesla (uT). |
|
||||||
*/ |
|
||||||
public static final int SENSOR_TYPE_MAGNETIC_FIELD = 2; |
|
||||||
|
|
||||||
/** |
|
||||||
* Slowest Sensor Update Speed |
|
||||||
*/ |
|
||||||
public static final int SENSOR_SPEED_SLOW = 0; |
|
||||||
|
|
||||||
/** |
|
||||||
* Medium Sensor Update Speed |
|
||||||
*/ |
|
||||||
public static final int SENSOR_SPEED_MEDIUM = 1; |
|
||||||
|
|
||||||
/** |
|
||||||
* Fastest Sensor Update Speed |
|
||||||
*/ |
|
||||||
public static final int SENSOR_SPEED_FAST = 2; |
|
||||||
|
|
||||||
/** |
|
||||||
* Returns whether a sensor is enabled or not. |
|
||||||
* |
|
||||||
* @param sensorType The sensor type. |
|
||||||
* @return whether a sensor is enabled or not. |
|
||||||
*/ |
|
||||||
public boolean isEnabled(int sensorType); |
|
||||||
|
|
||||||
/** |
|
||||||
* Sets enable/disable for a specific sensor type. |
|
||||||
* |
|
||||||
* @param sensorType The sensor type. |
|
||||||
* @param enable True to enable, False to disable. |
|
||||||
*/ |
|
||||||
public void setEnable(int sensorType, boolean enable); |
|
||||||
|
|
||||||
/** |
|
||||||
* Sets enable/disable for all sensor types. |
|
||||||
* |
|
||||||
* @param enable True to enable, False to disable. |
|
||||||
*/ |
|
||||||
public void setEnable(boolean enable); |
|
||||||
|
|
||||||
/** |
|
||||||
* Returns a list of available sensor types. |
|
||||||
* |
|
||||||
* @return a list of available sensor types. |
|
||||||
*/ |
|
||||||
public Set<Integer> getSensorTypes(); |
|
||||||
|
|
||||||
/** |
|
||||||
* Set the minimum amount of change that is required before an event |
|
||||||
* is created for the sensor. minChangePercent is defined as a percentage |
|
||||||
* of the maximum sensor range. |
|
||||||
* |
|
||||||
* @param sensorType The sensor type. |
|
||||||
* @param minChangePercent Percentage of changed required before creating an event. |
|
||||||
*/ |
|
||||||
public void setSensorMinChange(int sensorType, float minChangePercent); |
|
||||||
|
|
||||||
/** |
|
||||||
* Set the update frequency for the sensor. Use the defined constants in |
|
||||||
* SensorInput for setting the speed becuase the actual update frequency is |
|
||||||
* platform dependant. |
|
||||||
* |
|
||||||
* @param sensorType The sensor type. |
|
||||||
* @param updateSpeed Target update speed as a constant (do not use absolute values) |
|
||||||
*/ |
|
||||||
public void setSensorFrequency(int sensorType, int updateSpeed); |
|
||||||
|
|
||||||
} |
|
@ -1,58 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.input.controls; |
|
||||||
|
|
||||||
import com.jme3.input.SensorInput; |
|
||||||
|
|
||||||
/** |
|
||||||
* <code>MotionSensorListener</code> is used to receive events from Sensors |
|
||||||
* |
|
||||||
* @author iwgeric |
|
||||||
*/ |
|
||||||
public interface MotionSensorListener extends InputListener { |
|
||||||
|
|
||||||
/** |
|
||||||
* Called when data from a sensor has been updated. |
|
||||||
* |
|
||||||
* @param name The name of the mapping that was invoked |
|
||||||
* @param sensorType Sensor Type value from {@link SensorInput}. |
|
||||||
* @param x X component of the new sensor data based on the sensor type. |
|
||||||
* @param y Y component of the new sensor data based on the sensor type. |
|
||||||
* @param z Z component of the new sensor data based on the sensor type. |
|
||||||
* @param dX Change in the x component from the last update. |
|
||||||
* @param dY Change in the y component from the last update. |
|
||||||
* @param dZ Change in the z component from the last update. |
|
||||||
*/ |
|
||||||
public void onMotionSensorChange(String name, int sensorType, float x, float y, float z, float dX, float dY, float dZ); |
|
||||||
|
|
||||||
} |
|
@ -1,83 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.input.controls; |
|
||||||
|
|
||||||
import com.jme3.input.SensorInput; |
|
||||||
|
|
||||||
/** |
|
||||||
* A <code>SensorTrigger</code> is used as a mapping to receive events |
|
||||||
* from a sensor. |
|
||||||
* |
|
||||||
* @author Kirill Vainer |
|
||||||
*/ |
|
||||||
public class SensorTrigger implements Trigger { |
|
||||||
|
|
||||||
// private final SensorInput.Type sensorType;
|
|
||||||
private final int sensorType; |
|
||||||
|
|
||||||
/** |
|
||||||
* Create a new <code>SensorTrigger</code> to receive sensor events. |
|
||||||
* |
|
||||||
* @param Sensor Type. See {@link SensorInput}. |
|
||||||
*/ |
|
||||||
// public SensorTrigger(SensorInput.Type sensorType) {
|
|
||||||
public SensorTrigger(int sensorType) { |
|
||||||
// if (sensorType == null)
|
|
||||||
if (sensorType < 0 || sensorType > 255) |
|
||||||
throw new IllegalArgumentException("Invalide Sensor Type"); |
|
||||||
|
|
||||||
this.sensorType = sensorType; |
|
||||||
} |
|
||||||
|
|
||||||
// public SensorInput.Type getSensorType() {
|
|
||||||
public int getSensorType() { |
|
||||||
return sensorType; |
|
||||||
} |
|
||||||
|
|
||||||
public String getName() { |
|
||||||
return sensorType + " Sensor"; |
|
||||||
} |
|
||||||
|
|
||||||
// public static int sensorHash(SensorInput.Type sensorType){
|
|
||||||
public static int sensorHash(int sensorType){ |
|
||||||
// assert sensorType != null;
|
|
||||||
// return 256 | (sensorType.ordinal() & 0xff);
|
|
||||||
assert sensorType >= 0 && sensorType <= 255; |
|
||||||
return 1024 | (sensorType & 0xff); |
|
||||||
} |
|
||||||
|
|
||||||
public int triggerHashCode() { |
|
||||||
return sensorHash(sensorType); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,118 +0,0 @@ |
|||||||
/* |
|
||||||
* Copyright (c) 2009-2010 jMonkeyEngine |
|
||||||
* All rights reserved. |
|
||||||
* |
|
||||||
* Redistribution and use in source and binary forms, with or without |
|
||||||
* modification, are permitted provided that the following conditions are |
|
||||||
* met: |
|
||||||
* |
|
||||||
* * Redistributions of source code must retain the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer. |
|
||||||
* |
|
||||||
* * Redistributions in binary form must reproduce the above copyright |
|
||||||
* notice, this list of conditions and the following disclaimer in the |
|
||||||
* documentation and/or other materials provided with the distribution. |
|
||||||
* |
|
||||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
|
||||||
* may be used to endorse or promote products derived from this software |
|
||||||
* without specific prior written permission. |
|
||||||
* |
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
|
||||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
*/ |
|
||||||
|
|
||||||
package com.jme3.input.event; |
|
||||||
|
|
||||||
/** |
|
||||||
* Motion Sensor event. |
|
||||||
* |
|
||||||
* @author iwgeric |
|
||||||
*/ |
|
||||||
public class MotionSensorEvent extends InputEvent { |
|
||||||
|
|
||||||
private int sensorType; |
|
||||||
private float x, y, z, dX, dY, dZ; |
|
||||||
|
|
||||||
public MotionSensorEvent(int sensorType, float x, float y, float z, float dX, float dY, float dZ) { |
|
||||||
this.sensorType = sensorType; |
|
||||||
this.x = x; |
|
||||||
this.y = y; |
|
||||||
this.z = z; |
|
||||||
this.dX = dX; |
|
||||||
this.dY = dY; |
|
||||||
this.dZ = dZ; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Sensor Type |
|
||||||
* @return Sensor Type |
|
||||||
*/ |
|
||||||
public int getSensorType() { |
|
||||||
return sensorType; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Current X coordinate |
|
||||||
* @return Current X coordinate |
|
||||||
*/ |
|
||||||
public float getX() { |
|
||||||
return x; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Current Y coordinate |
|
||||||
* @return Current Y coordinate |
|
||||||
*/ |
|
||||||
public float getY() { |
|
||||||
return y; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Current Z coordinate |
|
||||||
* @return Current Z coordinate |
|
||||||
*/ |
|
||||||
public float getZ() { |
|
||||||
return z; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* The change in X coordinate |
|
||||||
* @return change in X coordinate |
|
||||||
*/ |
|
||||||
public float getDX() { |
|
||||||
return dX; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* The change in Y coordinate |
|
||||||
* |
|
||||||
* @return change in Y coordinate |
|
||||||
*/ |
|
||||||
public float getDY() { |
|
||||||
return dY; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* The change in Z coordinate |
|
||||||
* |
|
||||||
* @return change in Z coordinate |
|
||||||
*/ |
|
||||||
public float getDZ() { |
|
||||||
return dZ; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String toString(){ |
|
||||||
return "MotionSensor(Type="+sensorType+", X="+x+", Y="+y+", Z="+z+", DX="+dX+", DY="+dY+", DZ="+dZ+")"; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue