Updated the compass to compensate for device rotation

Change-Id: I67640254a4c454a42719c99b5720e56b77eaf137
Signed-off-by: Ricky Barrette <rickbarrette@gmail.com>
This commit is contained in:
2012-03-10 09:44:27 -05:00
parent e0c7df5ea6
commit 54de0d8060
2 changed files with 67 additions and 80 deletions

Binary file not shown.

View File

@@ -6,8 +6,9 @@
*/
package com.TwentyCodes.android.location;
import com.TwentyCodes.android.debug.Debug;
import android.content.Context;
import android.content.res.Configuration;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -15,8 +16,6 @@ import android.hardware.SensorManager;
import android.os.Handler;
import android.os.Message;
import com.TwentyCodes.android.debug.Debug;
/**
* A simple convince class that accesses the compass sensor on another thread
* @author ricky barrette
@@ -24,76 +23,74 @@ import com.TwentyCodes.android.debug.Debug;
public class CompassSensor{
private static final int BEARING = 0;
private SensorManager mSensorManager;
private Context mContext;
private final SensorManager mSensorManager;
private CompassListener mListener;
private Handler mHandler;
private SensorCallBack mCallBack;
private final Handler mHandler;
/**
* A convince callback class for the compass sensor
* @author ricky barrette
*/
private class SensorCallBack implements SensorEventListener {
private final SensorEventListener mCallBack = new SensorEventListener() {
private float[] inR = new float[16];
private float[] I = new float[16];
private float[] gravity = new float[3];
private float[] geomag = new float[3];
private float[] orientVals = new float[3];
private double azimuth = 0;
// double pitch = 0;
// double roll = 0;
public void onSensorChanged(SensorEvent sensorEvent) {
// If the sensor data is unreliable return
if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
return;
// Gets the value of the sensor that has been changed
switch (sensorEvent.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
gravity = sensorEvent.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
geomag = sensorEvent.values.clone();
break;
}
// If gravity and geomag have values then find rotation matrix
if (gravity != null && geomag != null) {
// checks that the rotation matrix is found
boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);
if (success) {
SensorManager.getOrientation(inR, orientVals);
azimuth = Math.toDegrees(orientVals[0]);
// pitch = Math.toDegrees(orientVals[1]);
// roll = Math.toDegrees(orientVals[2]);
}
}
mHandler.sendMessage(mHandler.obtainMessage(BEARING, (float) azimuth));
}
/**
* (non-Javadoc)
* @see android.hardware.SensorEventListener#onAccuracyChanged(android.hardware.Sensor, int)
* @author ricky barrette
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// NOT USED
}
/**
* (non-Javadoc)
* @see android.hardware.SensorEventListener#onSensorChanged(android.hardware.SensorEvent)
* @author ricky barrette
*/
@Override
public void onSensorChanged(SensorEvent event) {
float myAzimuth = event.values[0];
// myPitch = event.values[1];
float roll = event.values[2];
if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
boolean isNormal = false;
if (roll <= -25)
isNormal = false;
if (roll >= 25)
isNormal = true;
if (isNormal)
myAzimuth = myAzimuth + 90;
else
myAzimuth = myAzimuth - 90;
}
mHandler.sendMessage(mHandler.obtainMessage(BEARING, myAzimuth));
}
}
};
/**
* Creates a new CompassSensor
* @author ricky barrette
*/
public CompassSensor(Context context) {
mContext = context;
setUiHandler();
//start getting information from the compass sensor
new Thread(new Runnable(){
public CompassSensor(final Context context) {
mHandler = new Handler(){
@Override
public void run() {
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
public void handleMessage(Message msg){
// System.out.print((Float) msg.obj);
if(mListener != null)
if(msg.what == BEARING)
mListener.onCompassUpdate((Float) msg.obj);
}
}).start();
mCallBack = new SensorCallBack();
};
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
/**
@@ -113,26 +110,16 @@ public class CompassSensor{
public void enable(CompassListener listener){
if(mListener == null) {
mListener = listener;
if(mSensorManager == null)
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), Debug.COMPASS_UPDATE_INTERVAL);
}
}
/**
* Sets up the UI handler
* @author ricky barrette
*/
private void setUiHandler() {
mHandler = new Handler(){
if(mSensorManager != null)
new Thread(new Runnable(){
@Override
public void handleMessage(Message msg){
// System.out.print((Float) msg.obj);
if(mListener != null)
if(msg.what == BEARING)
mListener.onCompassUpdate((Float) msg.obj);
public void run() {
// Register this class as a listener for the accelerometer sensor
mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), Debug.COMPASS_UPDATE_INTERVAL);
// ...and the orientation sensor
mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), Debug.COMPASS_UPDATE_INTERVAL);
}
}).start();
}
};
}
}