package eu.livegov.mobilesensing.sensors.accelerometer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import eu.livegov.mobilesensing.Constants;
import eu.livegov.mobilesensing.sensors.Metadata;
import eu.livegov.mobilesensing.sensors.SensorService;
import eu.livegov.mobilesensing.sensors.SensorValue;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
public class AccelerometerSensorService extends SensorService {
public static final String SENSOR_NAME = "Accelerometer";
public static final String LOG_TAG = Constants.LOG_TAG;
// Metadata about sensor
Metadata meta;
// initialize AccelerometerSensorValue
public AccelerometerSensorValue lastValue = new AccelerometerSensorValue(-1,-1,-1,-1);
// Queue with accelerometer sensor data
private LinkedBlockingQueue<AccelerometerSensorValue> valueQueue = new LinkedBlockingQueue<AccelerometerSensorValue>();
// native Android Sensor classes
Sensor androidSensor;
SensorManager androidSensorManager;
//////// Startup/Shutdown Service and Recording /////////
public boolean startupSensor() {
// Called when service start
// Check for Accelerometer Sensor
androidSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
@SuppressWarnings("static-access")
List<Sensor> sensorList = androidSensorManager.getSensorList(androidSensor.TYPE_ACCELEROMETER);
if (sensorList.size() > 0) {
androidSensor = sensorList.get(0);
} else {
Log.e(LOG_TAG, "Sensor not found!");
// Stop Service Throw Exception!
return false;
}
//set meta info
meta = new Metadata(SENSOR_NAME);
meta.autoSetSensorInfo(androidSensor);
Log.i(LOG_TAG, "Accelerometer service started");
return true;
}
@Override
public void startRecording() {
super.startRecording();
Log.i(LOG_TAG, "Accelerometer RECORDING!");
androidSensorManager.registerListener(
Listener,
androidSensor,
SensorManager.SENSOR_DELAY_FASTEST
);
}
// Event listener for recording
SensorEventListener Listener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
public void onSensorChanged(SensorEvent arg0) {
// Read out sensor event
lastValue = new AccelerometerSensorValue(
arg0.timestamp,
arg0.values[0],
arg0.values[1],
arg0.values[2]
);
valueQueue.add(lastValue);
}
};
@Override
public void stopRecording() {
super.stopRecording();
// Stop Service
androidSensorManager.unregisterListener(Listener);
Log.i(LOG_TAG, "Accelerometer stopped Recording.");
}
//////// Method Implementation /////////
@Override
public Metadata getMetadata() {
return meta;
}
@Override
public SensorValue getLastValue() {
return lastValue;
}
@Override
public List<? extends SensorValue> pullData() {
int queueSize = valueQueue.size();
// Returns all SensorValues
List<AccelerometerSensorValue> values = new ArrayList<AccelerometerSensorValue>(
queueSize);
Iterator<AccelerometerSensorValue> iterator = valueQueue.iterator();
while (iterator.hasNext()) {
AccelerometerSensorValue iteratorValue = (AccelerometerSensorValue) iterator
.next();
values.add(iteratorValue);
}
// Clears the internal data queue
valueQueue.clear();
return values;
}
@Override
public void putSensorValue(SensorValue value) {
lastValue = (AccelerometerSensorValue) value;
valueQueue.add(lastValue);
}
public void writeLog(){
Log.i(LOG_TAG, lastValue.toString() );
}
}