|
|
@@ -0,0 +1,96 @@
|
|
|
+package knacki.com.androimouse;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.hardware.Sensor;
|
|
|
+import android.hardware.SensorEvent;
|
|
|
+import android.hardware.SensorEventListener;
|
|
|
+import android.hardware.SensorManager;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.logging.Logger;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by thibault on 6/16/17.
|
|
|
+ */
|
|
|
+public class SensorService {
|
|
|
+ private static SensorService instance = null;
|
|
|
+ private final SensorManager sensorManager;
|
|
|
+ private final static Logger logger = Logger.getLogger(SensorService.class.getName());
|
|
|
+ private final List<Sensor> accelerometerSensors;
|
|
|
+ private final List<Sensor> gravitySensors;
|
|
|
+ /**
|
|
|
+ * Measures the acceleration force in mm/s2 that is applied to a device on all three physical axes (x, y, and z), including the force of gravity.
|
|
|
+ */
|
|
|
+ protected float[] latestAccelerometerValue = { 0.f, 0.f, 0.f };
|
|
|
+ protected float[] latestGravityValue = { 0.f, 0.f, 0.f };
|
|
|
+
|
|
|
+ private SensorService(Context c) {
|
|
|
+ sensorManager = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
|
|
|
+ accelerometerSensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
|
|
|
+ gravitySensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void attach() {
|
|
|
+ for (Sensor s: accelerometerSensors) {
|
|
|
+ logger.info("Found sensor " +s.getName());
|
|
|
+ sensorManager.registerListener(accelerometerListener, s, SensorManager.SENSOR_DELAY_FASTEST);
|
|
|
+ }
|
|
|
+ for (Sensor s: gravitySensors) {
|
|
|
+ logger.info("Found sensor " +s.getName());
|
|
|
+ sensorManager.registerListener(gravityListener, s, SensorManager.SENSOR_DELAY_FASTEST);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void detach() {
|
|
|
+ for (Sensor s: accelerometerSensors) {
|
|
|
+ logger.info("Stopping listening sensor " +s.getName());
|
|
|
+ sensorManager.unregisterListener(accelerometerListener, s);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static SensorService get(Context c) {
|
|
|
+ synchronized (SensorService.class) {
|
|
|
+ if (instance == null) {
|
|
|
+ synchronized (SensorService.class) {
|
|
|
+ instance = new SensorService(c);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ public float[] getLatestValue() {
|
|
|
+ float [] result = { 0.f, 0.f, 0.f };
|
|
|
+
|
|
|
+ for (int i =0; i < 3; i++) {
|
|
|
+ result[i] = latestGravityValue[i] - latestAccelerometerValue[i];
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private final SensorEventListener accelerometerListener = new SensorEventListener() {
|
|
|
+ @Override
|
|
|
+ public void onSensorChanged(SensorEvent event) {
|
|
|
+ for (int i =0; i < 3; i++) {
|
|
|
+ latestAccelerometerValue[i] = event.values[i] * 1000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ private final SensorEventListener gravityListener = new SensorEventListener() {
|
|
|
+ @Override
|
|
|
+ public void onSensorChanged(SensorEvent event) {
|
|
|
+ for (int i =0; i < 3; i++) {
|
|
|
+ latestGravityValue[i] = event.values[i] * 1000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|