package com.integreight.onesheeld.shields.controller; import android.app.Activity; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Handler; import com.integreight.onesheeld.R; import com.integreight.onesheeld.enums.UIShield; import com.integreight.onesheeld.sdk.ShieldFrame; import com.integreight.onesheeld.shields.ControllerParent; import com.integreight.onesheeld.utils.Log; public class AccelerometerShield extends ControllerParent<AccelerometerShield> implements SensorEventListener { public static final byte ACCELEROMETER_VALUE = 0x01; private SensorManager mSensorManager; private Sensor mAccelerometer; private AccelerometerEventHandler eventHandler; private ShieldFrame frame; Handler handler; int PERIOD = 100; boolean flag = false; boolean isHandlerLive = false; float oldInput_x = 0, oldInput_y = 0, oldInput_z = 0; boolean isFirstTime = true; private final Runnable processSensors = new Runnable() { @Override public void run() { // Do work with the sensor values. flag = true; // The Runnable is posted to run again here: if (handler != null) handler.postDelayed(this, PERIOD); } }; public AccelerometerShield() { } public AccelerometerShield(Activity activity, String tag) { super(activity, tag); } @Override public ControllerParent<AccelerometerShield> init(String tag) { return super.init(tag); } @Override public ControllerParent<AccelerometerShield> invalidate( com.integreight.onesheeld.shields.ControllerParent.SelectionAction selectionAction, boolean isToastable) { this.selectionAction = selectionAction; mSensorManager = (SensorManager) getApplication().getSystemService( Context.SENSOR_SERVICE); mAccelerometer = mSensorManager .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); registerSensorListener(isToastable); return super.invalidate(selectionAction, isToastable); } public void setAccelerometerEventHandler( AccelerometerEventHandler eventHandler) { this.eventHandler = eventHandler; } @Override public void onNewShieldFrameReceived(ShieldFrame frame) { // TODO Auto-generated method stub } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { if (flag && (oldInput_x != event.values[0] || oldInput_y != event.values[1] || oldInput_z != event.values[2] || isFirstTime)) { frame = new ShieldFrame(UIShield.ACCELEROMETER_SHIELD.getId(), ACCELEROMETER_VALUE); isFirstTime = false; oldInput_x = event.values[0]; oldInput_y = event.values[1]; oldInput_z = event.values[2]; // frame.addByteArgument((byte) Math.round(event.values[0])); frame.addArgument(event.values[0]); frame.addArgument(event.values[1]); frame.addArgument(event.values[2]); sendShieldFrame(frame); if (eventHandler != null) eventHandler.onSensorValueChangedFloat(event.values); Log.d("Sensor Data of X", event.values[0] + ""); Log.d("Sensor Data of Y", event.values[1] + ""); Log.d("Sensor Data of Z", event.values[2] + ""); // flag = false; } } // Register a listener for the sensor. public void registerSensorListener(boolean isToastable) { // check on mSensorManager and sensor != null if (mSensorManager == null | mAccelerometer == null) { mSensorManager = (SensorManager) getApplication().getSystemService( Context.SENSOR_SERVICE); mAccelerometer = mSensorManager .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } if (mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) { // Success! There's sensor. if (!isHandlerLive) { handler = new Handler(); if (mAccelerometer != null) mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); handler.post(processSensors); if (eventHandler != null) eventHandler.isDeviceHasSensor(true); isHandlerLive = true; if (selectionAction != null) selectionAction.onSuccess(); } else { Log.d("Your Sensor is registered", "Accelerometer"); } } else { // Failure! No sensor. Log.d("Device doesn't have Sensor ", "Accelerometer"); if (selectionAction != null) selectionAction.onFailure(); if (isToastable) activity.showToast(R.string.general_toasts_device_doesnt_support_this_sensor_toast); if (eventHandler != null) eventHandler.isDeviceHasSensor(false); } } // Unregister a listener for the sensor . public void unegisterSensorListener() { // mSensorManager.unregisterListener(this); if (mSensorManager != null && handler != null && mAccelerometer != null) { mSensorManager.unregisterListener(this, mAccelerometer); mSensorManager.unregisterListener(this); if (processSensors != null) handler.removeCallbacks(processSensors); handler.removeCallbacksAndMessages(null); isHandlerLive = false; } } public static interface AccelerometerEventHandler { void onSensorValueChangedFloat(float[] value); void isDeviceHasSensor(Boolean hasSensor); } @Override public void reset() { // TODO Auto-generated method stub this.unegisterSensorListener(); } }