36 package com.mission_base.arviewer_android.viewer;
38 import android.content.Context;
39 import android.graphics.Canvas;
40 import android.graphics.Paint;
41 import android.graphics.Paint.Style;
42 import android.hardware.Sensor;
43 import android.hardware.SensorEvent;
44 import android.hardware.SensorEventListener;
45 import android.hardware.SensorManager;
46 import android.util.Log;
47 import android.view.View;
49 import com.mission_base.arviewer_android.Arvos;
50 import com.mission_base.arviewer_android.viewer.opengl.ArvosObject;
63 private Arvos mInstance;
64 private String mTag =
"ArvosRadarView";
65 private Paint mPaint =
new Paint();
67 private float mAngleFilteredAzimuth = 0;
68 private float mAngleFilteredPitch = 0;
69 private float mAngleFilteredRoll = 0;
71 private SensorManager mSensorManager;
74 private float[] mGravity = null;
75 private float[] mGeomagnetic = null;
76 private float Rmat[] =
new float[9];
77 private float Imat[] =
new float[9];
78 private float mOrientation[] =
new float[3];
89 Log.d(mTag,
"ArvosRadarView()");
92 mPaint.setColor(0xff0000ff);
93 mPaint.setStyle(Style.STROKE);
94 mPaint.setAntiAlias(
true);
96 mSensorManager = (SensorManager) mInstance.
getActivity().getSystemService(Context.SENSOR_SERVICE);
97 mSensorManager.registerListener(mAccelerometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
98 mSensorManager.registerListener(mMagnetometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
102 SensorEventListener mAccelerometerListener =
new SensorEventListener()
104 public void onAccuracyChanged(Sensor sensor,
int accuracy)
108 public void onSensorChanged(SensorEvent event)
110 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
112 mGravity =
event.values.clone();
118 SensorEventListener mMagnetometerListener =
new SensorEventListener()
120 public void onAccuracyChanged(Sensor sensor,
int accuracy)
124 public void onSensorChanged(SensorEvent event)
126 if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
128 mGeomagnetic =
event.values.clone();
135 private float restrictAngle(
float angle)
150 private float calculateFilteredAngle(
float x,
float y)
152 final float alpha = 0.3f;
156 diff = restrictAngle(diff);
159 y = restrictAngle(y + alpha * diff);
164 private void processSensorData()
166 if (mGravity != null && mGeomagnetic != null)
168 boolean success = SensorManager.getRotationMatrix(Rmat, Imat, mGravity, mGeomagnetic);
171 SensorManager.getOrientation(Rmat, mOrientation);
172 mAngleFilteredAzimuth = calculateFilteredAngle(Arvos.toDegrees(mOrientation[0]), mAngleFilteredAzimuth);
173 mAngleFilteredPitch = calculateFilteredAngle(Arvos.toDegrees(mOrientation[1]), mAngleFilteredPitch);
174 mAngleFilteredRoll = calculateFilteredAngle(-Arvos.toDegrees(mOrientation[2]), mAngleFilteredRoll);
181 private void update()
183 mInstance.
mAzimuth = mAngleFilteredAzimuth;
184 mInstance.
mPitch = mAngleFilteredPitch;
185 mInstance.
mRoll = mAngleFilteredRoll;
188 ArvosTextView textView = ((ArvosViewer) (mInstance.
getActivity())).mTextView;
189 if (textView != null)
191 textView.updateWithNewLocation();
200 int width = getWidth();
201 int centerX = width - 100;
206 mPaint.setColor(0xffff0000);
207 mPaint.setStrokeWidth(2);
212 int x = Math.round(arvosObject.
mPosition[0]);
213 int y = Math.round(arvosObject.
mPosition[2]);
215 double distance = Math.sqrt(x * x + y * y);
220 canvas.drawLine(x - 3, y - 3, x + 3, y + 3, mPaint);
221 canvas.drawLine(x + 3, y - 3, x - 3, y + 3, mPaint);
225 mPaint.setColor(0xff0000ff);
227 canvas.rotate(degrees, centerX, centerY);
229 mPaint.setStrokeWidth(4);
230 canvas.drawLine(centerX, centerY, centerX, 0, mPaint);
231 mPaint.setStrokeWidth(8);
232 canvas.drawCircle(centerX, centerY, 50, mPaint);
237 mSensorManager.registerListener(mAccelerometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
238 mSensorManager.registerListener(mMagnetometerListener, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
240 mAngleFilteredAzimuth = 0;
241 mAngleFilteredPitch = 0;
242 mAngleFilteredRoll = 0;
249 mSensorManager.unregisterListener(mAccelerometerListener);
250 mSensorManager.unregisterListener(mMagnetometerListener);