package eu.livegov.mobilesensing.sensors.gps;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import android.content.Context;
import android.hardware.Sensor;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import eu.livegov.mobilesensing.Constants;
import eu.livegov.mobilesensing.sensors.Metadata;
import eu.livegov.mobilesensing.sensors.SensorService;
import eu.livegov.mobilesensing.sensors.SensorValue;
public class GpsSensorService extends SensorService{
public static final String SENSOR_NAME = "GPS";
public static final String LOG_TAG = Constants.LOG_TAG;
// Metadata about sensor
Metadata meta;
// initialize GpsSensorValue
GpsSensorValue lastValue = new GpsSensorValue(-1,-1,-1,-1);
// Queue with Gps sensor data
private LinkedBlockingQueue<GpsSensorValue> valueQueue = new LinkedBlockingQueue<GpsSensorValue>();
// native Android Sensor classes
Sensor androidSensor;
LocationManager androidLocationManager;
//////// Startup/Shutdown Service and Recording /////////
public boolean startupSensor() {
// Called when service start
// Check for Gps Sensor
androidLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> sensorList = androidLocationManager.getProviders(true);
if (sensorList.size() > 0) {
Log.i(LOG_TAG, "Sensor found!");
//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, "GPS service started");
return true;
}
@Override
public void startRecording() {
super.startRecording();
Log.i(LOG_TAG, "GPS RECORDING!");
androidLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
Listener
);
}
// Location listener for recording
LocationListener Listener = new LocationListener(){
@Override
public void onLocationChanged(Location location) {
if (location != null) {
lastValue = new GpsSensorValue(
location.getTime(),
(float) location.getLatitude(),
(float) location.getLongitude(),
(float) location.getAltitude()
);
valueQueue.add(lastValue);
// writeLog();
}
}
@Override
public void onProviderDisabled(String provider) {
Log.i(LOG_TAG, "GPS Provider disabled");
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Log.i(LOG_TAG, "Provider enabled");
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
Log.i(LOG_TAG, "Status changed");
}
};
@Override
public void stopRecording() {
super.stopRecording();
// Stop Service
androidLocationManager.removeUpdates(Listener);
Log.i(LOG_TAG, "GPS 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<GpsSensorValue> values = new ArrayList<GpsSensorValue>(
queueSize);
Iterator<GpsSensorValue> iterator = valueQueue.iterator();
while (iterator.hasNext()) {
GpsSensorValue iteratorValue = (GpsSensorValue) iterator
.next();
values.add(iteratorValue);
}
// Clears the internal data queue
valueQueue.clear();
return values;
}
@Override
public void putSensorValue(SensorValue value) {
lastValue = (GpsSensorValue) value;
valueQueue.add(lastValue);
}
public void writeLog(){
Log.i(LOG_TAG, lastValue.toString() );
}
public void onDestroy(){
stopRecording();
}
}