package edu.mit.media.funf.tests;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.test.AndroidTestCase;
public class SensorTest extends AndroidTestCase {
private long lastNanos = 0L;
private long lastNanosSum = 0L;
private long count = 0L;
public void testSensorSpeed() throws InterruptedException {
for (int i = 0; i< 1000; i++) {
// calibrateNanosConversion();
System.out.println(millisToSeconds(System.currentTimeMillis()) - uptimeNanosToTimestamp(System.nanoTime()));
}
System.out.println("---------------------------");
double lastNano = 0;
for (int i = 0; i< 20; i++) {
long nano = System.nanoTime();
double diff = millisToSeconds(System.currentTimeMillis()) - uptimeNanosToTimestamp(nano);
System.out.println(diff);
System.out.println(uptimeNanosToTimestamp(nano) - uptimeNanosToTimestamp(lastNanos));
lastNanos = nano;
System.out.println(millisToSeconds(System.currentTimeMillis()) + " " + uptimeNanosToTimestamp(System.nanoTime()));
}
SensorManager manager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
calibrateNanosConversion();
SensorEventListener sensorListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
System.out.println("--------------------");
long mili = System.currentTimeMillis();
long nano = System.nanoTime();
if (lastNanos == 0L) {
lastNanos = event.timestamp;
}
//calibrateNanosConversion();
System.out.println("Event Seconds: " + uptimeNanosToTimestamp(event.timestamp));
System.out.println("Nano Seconds: " + uptimeNanosToTimestamp(nano));
System.out.println("Diff Seconds: " + (uptimeNanosToTimestamp(nano) - uptimeNanosToTimestamp(event.timestamp)));
System.out.println("Acc Period: " + (uptimeNanosToTimestamp(nano) - uptimeNanosToTimestamp(lastNanos)));
System.out.println("Mili Seconds: " + millisToSeconds(mili));
lastNanosSum += nano - lastNanos;
count++;
System.out.println("Avg diff:" + (lastNanosSum / count));
lastNanos = nano;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
manager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
Thread.sleep(30);
}
public static double millisToSeconds(long millis) {
return ((double)millis)/1000;
}
public static long secondsToMillis(double seconds) {
return (long)(seconds*1000);
}
public static final long NANOS_IN_SECOND = 1000000000; // 10^9
private static long referenceNanos;
private static long referenceMillis;
private static double secondsOffset;
/**
* Aligns the nano seconds to the start of a new millisecond.
* This should be called whenever device wakes up from sleep.
*/
public static void calibrateNanosConversion() {
long originalMillis = System.currentTimeMillis();
long updatedMillis = originalMillis;
while(originalMillis == updatedMillis) {
updatedMillis = System.currentTimeMillis();
}
referenceNanos = System.nanoTime();
referenceMillis = updatedMillis;
secondsOffset = millisToSeconds(referenceMillis) - (double)referenceNanos / (double)NANOS_IN_SECOND;
}
public static double uptimeNanosToTimestamp(long nanos) {
long currentMillisAccordingToNanos = secondsToMillis(_uptimeNanosToTimestamp(System.nanoTime()));
if (Math.abs(currentMillisAccordingToNanos - System.currentTimeMillis()) > 1) {
calibrateNanosConversion();
}
return _uptimeNanosToTimestamp(nanos);
}
private static double _uptimeNanosToTimestamp(long nanos) {
return ((double)nanos / (double)NANOS_IN_SECOND) + secondsOffset;
}
}