package org.cleos.adroid.ondevicesensors2dt; import org.cleos.android.lib.Write2File; import org.cleos.android.rbnb.SimpleFlusher; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Log; public class Accelerometer2DT_Thread extends Thread implements SensorEventListener { private String TAG = getClass().getSimpleName(); private boolean abort_ = false; private SensorManager mSM; private Sensor accelerometer; private Context context; private SimpleFlusher sf; private String name; private Write2File log = new Write2File("Accelerometer", TAG, true); private int delay = 250; // in mS // for filtering the accelerometer data float[] gravity = new float[3]; float[] linear_acceleration = new float[3]; private String[] data = new String[6]; public Accelerometer2DT_Thread(String name, Context context, String ipp, SensorManager mSM, Sensor mS){ this.name = name; this.context = context; //this.addressAndPort = ipp; this.mSM = mSM; this.accelerometer = mS; sf = new SimpleFlusher(name, context, ipp, log); mSM.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); } public void setDelay(int delay_mS){ // this.delay = delay_mS; } @Override public void run() { super.run(); sf.createConnections(); while (true) { synchronized (this) { if (abort_) { Log.e(TAG, "Loop terminated!******************************"); kill(); break; } } sendData(); sleep(delay); } mSM.unregisterListener(this); Log.i(TAG, "Accelerometer thread finished with unregisterListener."); } public synchronized void abort(){ abort_ = true; } private void sendData() { sf.flushData(data); } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { } @Override public void onSensorChanged(SensorEvent event) { // In this example, alpha is calculated as t / (t + dT), // where t is the low-pass filter's time-constant and // dT is the event delivery rate. final float alpha = (float) 0.8; // Isolate the force of gravity with the low-pass filter. gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; // Remove the gravity contribution with the high-pass filter. linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; data[0] = Float.toString(gravity[0]); data[1] = Float.toString(gravity[1]); data[2] = Float.toString(gravity[2]); data[3] = Float.toString(linear_acceleration[0]); data[4] = Float.toString(linear_acceleration[1]); data[5] = Float.toString(linear_acceleration[2]); } private void sleep(int mS) { try { super.sleep(mS); } catch (InterruptedException e) { e.printStackTrace(); } } public void kill() { sf.kill(); } public void setChNames(String[] chNames) { sf.setChNames(chNames); } public void setdTypes(String[] dTypes) { sf.setdTypes(dTypes); } public void setUnits(String[] units) { sf.setUnits(units); } public void setMIMEs(String[] mIMEs) { sf.setMIMEs(mIMEs); } }