app/src/main/java/com/sdp13epfl2021/projmag/activities/OrientationActivity.kt
package com.sdp13epfl2021.projmag.activities
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.sdp13epfl2021.projmag.R
class OrientationActivity : AppCompatActivity(), SensorEventListener {
private lateinit var sensorManager: SensorManager
private val accelerometerReading = FloatArray(3)
private val magnetometerReading = FloatArray(3)
private val rotationMatrix = FloatArray(9)
private val orientationAngles = FloatArray(3)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_orientation)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
}
override fun onResume() {
super.onResume()
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer ->
sensorManager.registerListener(
this,
accelerometer,
SensorManager.SENSOR_DELAY_NORMAL,
SensorManager.SENSOR_DELAY_UI
)
}
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField ->
sensorManager.registerListener(
this,
magneticField,
SensorManager.SENSOR_DELAY_NORMAL,
SensorManager.SENSOR_DELAY_UI
)
}
}
override fun onPause() {
super.onPause()
sensorManager.unregisterListener(this)
}
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
System.arraycopy(event.values, 0, accelerometerReading, 0, accelerometerReading.size)
} else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
System.arraycopy(event.values, 0, magnetometerReading, 0, magnetometerReading.size)
}
}
/**
* Compute the three orientation angles based on the most recent readings from the device's accelerometer and magnetometer
* and update orientationAngles
*/
fun computeOrientationAngles() {
SensorManager.getRotationMatrix(
rotationMatrix,
null,
accelerometerReading,
magnetometerReading
)
SensorManager.getOrientation(rotationMatrix, orientationAngles)
}
/**
*
* @return the FloatArray orientationAngles
*/
fun getOrientationAngles(): FloatArray {
return orientationAngles
}
}