package com.DeviceTest; import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import com.DeviceTest.helper.ControlButtonUtil; import com.DeviceTest.helper.SystemUtil; import com.DeviceTest.view.CompassView; import android.app.Activity; import android.content.Context; import android.hardware.SensorListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; public class CompassTestActivity extends Activity { private CompassView compassView; private float firstYaw = 0; private int count; private float lastYaw = 0; private float STABLE_VALUE = 0.5F; private int STABLE_COUNT = 10; TextView compassText; String accuracyStr = ""; int[] yawRange = new int[] { 285 - 30, 285 + 30 }; boolean start = false; private static enum STATE { WAIT_FOR_FIRST_STABLE, WAIT_FOR_ROTATE, WAIT_FOR_SECOND_STABLE, UNDEF }; Button startButton; STATE state; boolean stop = false; Handler mHandler = new Handler(); Runnable mFailedRunnable = new Runnable() { public void run() { if (stop) { return; } mHandler.removeCallbacks(mFailedRunnable); findViewById(R.id.btn_Fail).performClick(); } }; protected String text = ""; @SuppressWarnings("deprecation") public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); setTitle(getTitle() + "----(" + getIntent().getStringExtra(DeviceTest.EXTRA_TEST_PROGRESS) + ")"); // requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(FLAG_FULLSCREEN | FLAG_KEEP_SCREEN_ON); setContentView(R.layout.compasstest); compassView = (CompassView) findViewById(R.id.compasstestview); state = STATE.WAIT_FOR_FIRST_STABLE; count = 0; compassText = (TextView) findViewById(R.id.compassText); startButton = (Button) findViewById(R.id.Start); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { start = true; count = 0; state = STATE.WAIT_FOR_FIRST_STABLE; startButton.setEnabled(false); text = "wait for stable data..."; } }); final SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensorManager.registerListener(new SensorListener() { public void onSensorChanged(int sensor, float[] values) { if (stop) { sensorManager.unregisterListener(this); } if ((int) values[0] == 0 || values[0] == 360) { return; } float yaw = values[0]; compassView.update(yaw); Log.e("jeffy", "yaw:" + yaw); if (!start) { return; } boolean pass = Math.abs(lastYaw - yaw) < STABLE_VALUE; if (state == STATE.WAIT_FOR_ROTATE) { pass = !pass; } if (pass) { count++; } else { count = 0; } if (count >= STABLE_COUNT) { switch (state) { case WAIT_FOR_FIRST_STABLE: firstYaw = yaw; if (firstYaw < yawRange[0] || firstYaw > yawRange[1]) { text = "invalid orientation:" + (int) firstYaw; state = STATE.UNDEF; mHandler.postDelayed(mFailedRunnable, 2000); sensorManager.unregisterListener(this); break; } state = STATE.WAIT_FOR_ROTATE; count = 0; text = "valid orientation, first stable data:" + (int) firstYaw + ", wait for rotate..."; break; case WAIT_FOR_ROTATE: state = STATE.WAIT_FOR_SECOND_STABLE; count = 0; text = "first stable data:" + (int) firstYaw + ", wait for stable data..."; break; case WAIT_FOR_SECOND_STABLE: state = STATE.UNDEF; float deltaYaw = Math.abs(yaw - firstYaw); if (deltaYaw <= 5) { findViewById(R.id.btn_Pass).performClick(); } else { findViewById(R.id.btn_Fail).performClick(); } count = 0; sensorManager.unregisterListener(this); text = "first stable data:" + (int) firstYaw + ", second stable data:" + (int) yaw; break; default: return; } } compassText.setText(accuracyStr + "\n" + text); lastYaw = yaw; } public void onAccuracyChanged(int sensor, int accuracy) { Log.e("Jeffy", "onAccuracyChanged" + accuracy); accuracyStr = "accuracy:" + accuracy; if (accuracy == 3) { accuracyStr += ",pass"; if (!start) { accuracyStr += ",ready"; startButton.setEnabled(true); } } else { accuracyStr += ",failed"; accuracyStr += ",needs correction!"; state = STATE.UNDEF; start = false; text = ""; startButton.setEnabled(false); } compassText.setText(accuracyStr + "\n" + text); } }, SensorManager.SENSOR_ORIENTATION); ControlButtonUtil.initControlButtonView(this); // findViewById(R.id.btn_Fail).setVisibility(View.INVISIBLE); // findViewById(R.id.btn_Pass).setVisibility(View.INVISIBLE); } protected void onStop() { super.onStop(); stop = true; mHandler.removeCallbacks(mFailedRunnable); } public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { return false; } return super.dispatchKeyEvent(event); } }