/*
* Flingbox - An OpenSource physics sandbox for Google's Android
* Copyright (C) 2009 Jon Ander Peñalba & Endika Gutiérrez
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package edu.eside.flingbox.physics.gravity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import edu.eside.flingbox.math.Vector2D;
/**
* Gravity Source defines a gravity vector.
*
*/
public class GravitySource extends Vector2D implements SensorEventListener {
/** Empirical value for a gravity multiply factor */
private static final float FACTOR = 80f;
public static final float GRAVITY_SUN = 275.0f;
public static final float GRAVITY_MERCURY = 3.7f;
public static final float GRAVITY_VENUS = 8.87f;
public static final float GRAVITY_EARTH = 9.80665f;
public static final float GRAVITY_MARS = 3.71f;
public static final float GRAVITY_JUPITER = 23.12f;
public static final float GRAVITY_SATURN = 8.96f;
public static final float GRAVITY_NEPTUNE = 11.0f;
public static final float GRAVITY_PLUTO = 0.6f;
public static final float GRAVITY_MOON = 1.6f;
public static final float GRAVITY_DEATH_STAR = 3.5303614E-7f;
public static GravitySource getAccelerometerBasedGravity(Context c) {
// Get Manager from context
SensorManager sensorManager = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
// Request Accelerometer
Sensor accelSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
GravitySource gravity = new GravitySource();
// Set accelerometer event callback
sensorManager.registerListener(gravity, accelSensor, SensorManager.SENSOR_DELAY_FASTEST);
return gravity;
}
public static GravitySource getStaticGravity(Vector2D v) {
return new GravitySource(v);
}
public static GravitySource getStaticGravity(float i, float j) {
return new GravitySource(i, j);
}
private GravitySource() {
super();
}
private GravitySource(Vector2D v) {
super(v.mul(FACTOR));
}
private GravitySource(float i, float j) {
super(i * FACTOR, j * FACTOR);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
this.i = -event.values[SensorManager.DATA_X] * FACTOR;
this.j = -event.values[SensorManager.DATA_Y] * FACTOR;
}
}