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 MagnetometerSensor extends AbstractSwanSensor { public static final String TAG = "MagnetometerSensor"; /** * 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.magnetometer_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"; public static final String TOTAL_FIELD = "total"; private Sensor magnetometer; private SensorManager sensorManager; private SensorEventListener sensorEventListener = new SensorEventListener() { public void onAccuracyChanged(Sensor sensor, int accuracy) { if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { currentConfiguration.putInt(ACCURACY, accuracy); } } public void onSensorChanged(SensorEvent event) { long now = System.currentTimeMillis(); if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { for (int i = 0; i < 3; i++) { putValueTrimSize(VALUE_PATHS[i], null, now, event.values[i]); } float total = (float) Math.sqrt(event.values[0] * event.values[0] + event.values[1] * event.values[1] + event.values[2] * event.values[2]); putValueTrimSize(TOTAL_FIELD, null, now, total); } } }; @Override public String[] getValuePaths() { return new String[] { X_FIELD, Y_FIELD, Z_FIELD, TOTAL_FIELD }; } @Override public void initDefaultConfiguration(Bundle DEFAULT_CONFIGURATION) { DEFAULT_CONFIGURATION.putInt(ACCURACY, SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onConnected() { SENSOR_NAME = "Magnetometer Sensor"; sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor> sensorList = sensorManager .getSensorList(Sensor.TYPE_MAGNETIC_FIELD); if (sensorList.size() > 0) { magnetometer = sensorList.get(0); } else { Log.e(TAG, "No magnetometer 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, magnetometer, highestAccuracy); } } @Override public final void unregister(String id) { updateAccuracy(); } @Override public final void onDestroySensor() { sensorManager.unregisterListener(sensorEventListener); super.onDestroySensor(); } @Override public float getCurrentMilliAmpere() { return magnetometer.getPower(); } }