package org.spin.gaitlib.gaitlibdemo.beat;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import org.spin.gaitlib.GaitAnalysis;
import org.spin.gaitlib.core.GaitData;
import org.spin.gaitlib.core.IGaitUpdateListener;
import org.spin.gaitlib.filter.FilterNotSetException;
import org.spin.gaitlib.gait.IClassifierModelLoadingListener;
public class GaitAnalysisService extends Service {
public static final String GAIT_UPDATE = "spin.gaitlib.GaitAnalysisService.GAIT_UPDATE";
public static final String CADENCE = "spin.gaitlib.GaitAnalysisService.CADENCE";
public static final String GAIT = "spin.gaitlib.GaitAnalysisService.GAIT";
public static final String GAIT_ALL = "spin.gaitlib.GaitAnalysisService.GAIT_ALL";
public static final String GAITLIB_STATUS_UPDATE = "spin.gaitlib.GaitAnalysisService.GAITLIB_STATUS_UPDATE";
public static final String GAITLIB_STATUS_MESSAGE = "spin.gaitlib.GaitAnalysisService.GAITLIB_STATUS_MESSAGE";
private WakeLock wakeLock;
private GaitAnalysis mGaitAnalysis = null;
private Logger logger = null;
@Override
public void onCreate() {
PowerManager mgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
int WAKE_LOCK = PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE;
wakeLock = mgr.newWakeLock(WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
mGaitAnalysis = new GaitAnalysis();
logger = new Logger();
registerSensorListeners();
mGaitAnalysis.registerGaitUpdateListener(new IGaitUpdateListener() {
public void onGaitUpdated(GaitData data) {
try {
float cadence = mGaitAnalysis.getCadence(false);
String gait = mGaitAnalysis.getCurrentGait();
logger.addCadence(cadence);
logger.addGait(gait);
logger.addTimeStamp(data.getTimeStamp());
Intent intent = new Intent(GAIT_UPDATE);
intent.putExtra(CADENCE, cadence);
intent.putExtra(GAIT, gait);
intent.putStringArrayListExtra(GAIT_ALL, logger.getGaits());
sendBroadcast(intent);
} catch (FilterNotSetException e) {
}
}
});
mGaitAnalysis
.addGaitClassifierModelLoadingListener(new IClassifierModelLoadingListener() {
public void onModelLoaded(boolean success) {
String message = success ? "Model loaded successfully."
: "GaitLib failed to load the model.";
Intent intent = new Intent(GAITLIB_STATUS_UPDATE);
intent.putExtra(GAITLIB_STATUS_MESSAGE, message);
sendBroadcast(intent);
}
public void onLoadingStart() {
String message = "GaitLib is loading the model.";
Intent intent = new Intent(GAITLIB_STATUS_UPDATE);
intent.putExtra(GAITLIB_STATUS_MESSAGE, message);
sendBroadcast(intent);
}
});
mGaitAnalysis.startGaitAnalysis(2000, 1000);
super.onCreate();
}
@Override
public void onDestroy() {
wakeLock.release();
mGaitAnalysis.stopGaitAnalysis();
unregisterSensorListeners();
clearCache();
super.onDestroy();
}
private void registerSensorListeners() {
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(mGaitAnalysis.getSignalListener(),
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_FASTEST);
}
private void unregisterSensorListeners() {
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensorManager.unregisterListener(mGaitAnalysis.getSignalListener());
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
public void clearCache() {
logger.clearAll();
}
}