package interdroid.swan.sensors.impl;
import interdroid.swan.R;
import interdroid.swan.sensors.AbstractConfigurationActivity;
import interdroid.swan.sensors.AbstractSwanSensor;
import java.util.List;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
public class GyroscopeSensor extends AbstractSwanSensor {
public static final String TAG = "GyroscopeSensor";
/**
* The configuration activity for this sensor.
*
* @author nick <palmer@cs.vu.nl>
*
*/
public static class ConfigurationActivity extends
AbstractConfigurationActivity {
@Override
public final int getPreferencesXML() {
return R.xml.gyroscope_preferences;
}
}
/** Value of ACCURACY must be one of SensorManager.SENSOR_DELAY_* */
public static final String ACCURACY = "accuracy";
public static final String X_FIELD = "x";
public static final String Y_FIELD = "y";
public static final String Z_FIELD = "z";
protected static final int HISTORY_SIZE = 30;
private Sensor gyroscope;
private SensorManager sensorManager;
private SensorEventListener sensorEventListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
if (sensor.getType() == Sensor.TYPE_GYROSCOPE) {
currentConfiguration.putInt(ACCURACY, accuracy);
}
}
public void onSensorChanged(SensorEvent event) {
long now = System.currentTimeMillis();
if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
for (int i = 0; i < 3; i++) {
putValueTrimSize(VALUE_PATHS[i], null, now,
event.values[i]);
}
}
}
};
@Override
public String[] getValuePaths() {
return new String[] { X_FIELD, Y_FIELD, Z_FIELD };
}
@Override
public void initDefaultConfiguration(Bundle DEFAULT_CONFIGURATION) {
DEFAULT_CONFIGURATION.putInt(ACCURACY,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onConnected() {
SENSOR_NAME = "Gyroscope Sensor";
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensorList = sensorManager
.getSensorList(Sensor.TYPE_GYROSCOPE);
if (sensorList.size() > 0) {
gyroscope = sensorList.get(0);
} else {
Log.e(TAG, "No gyroscope found on device!");
}
}
@Override
public final void register(String id, String valuePath, Bundle configuration) {
updateAccuracy();
}
private void updateAccuracy() {
sensorManager.unregisterListener(sensorEventListener);
if (registeredConfigurations.size() > 0) {
int highestAccuracy = mDefaultConfiguration.getInt(ACCURACY);
for (Bundle configuration : registeredConfigurations.values()) {
if (configuration == null) {
continue;
}
if (configuration.containsKey(ACCURACY)) {
highestAccuracy = Math
.min(highestAccuracy,
Integer.parseInt(configuration
.getString(ACCURACY)));
}
}
highestAccuracy = Math.max(highestAccuracy,
SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(sensorEventListener, gyroscope,
highestAccuracy);
}
}
@Override
public final void unregister(String id) {
updateAccuracy();
}
@Override
public final void onDestroySensor() {
sensorManager.unregisterListener(sensorEventListener);
super.onDestroySensor();
}
@Override
public float getCurrentMilliAmpere() {
return gyroscope.getPower();
}
}