﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=11
@EndOfDesignText@
Sub Class_Globals
	Dim Accelerometer, Magnetic  As PhoneSensors
	Dim accValues(), magValues() As Float
	Dim SM As JavaObject
	Dim MAGNETIC_HEADING As Int = -1
	
	Dim Timer1 As Timer
	Private mEventName As String
	Private mTarget As Object
End Sub

' This was an attempt to use the recommended way of implementing a compass for device that don't implement the Orientation sensor
' like Surface Duo and Redmi Note 9 Pro. However it's not good at the moment so its not in use.

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(TargetModule As Object, EventName As String)
	
	Accelerometer.Initialize(Accelerometer.TYPE_ACCELEROMETER)
	Magnetic.Initialize(Magnetic.TYPE_MAGNETIC_FIELD)
	SM.InitializeStatic("android.hardware.SensorManager")
	
	Timer1.Initialize("Timer1",   200) 	'  200 =   0.2 seconds
	Timer1.Enabled = False
	
	mTarget = TargetModule
	mEventName = EventName
End Sub

Sub Resume 'ignore
	Accelerometer.StartListening("Accelerometer")
	Magnetic.StartListening("Magnetic")
	Timer1.Enabled  = True
End Sub

Sub Pause 'ignore
	Accelerometer.StopListening
	Magnetic.StopListening
	Timer1.Enabled = False
End Sub

Sub Timer1_Tick
	'If MAGNETIC_HEADING >=0 And SubExists(mTarget , mEventName & "_NewHeading") Then
		CallSub2(mTarget, mEventName & "_NewHeading", MAGNETIC_HEADING)
	'End If
End Sub

Sub Accelerometer_SensorChanged (Values() As Float)
	accValues = Values
	CalcOrientation
End Sub

Sub Magnetic_SensorChanged (Values() As Float)
	magValues = Values
	CalcOrientation
End Sub

Sub CalcOrientation
	If accValues.Length = 0 Or magValues.Length = 0 Then Return
	Dim rotationMatrix(9) As Float
	Dim success As Boolean = SM.RunMethod("getRotationMatrix", Array(rotationMatrix, Null, accValues, magValues))
	If success Then
		Dim orientationAngles(3) As Float
		SM.RunMethod("getOrientation", Array(rotationMatrix, orientationAngles))
		MAGNETIC_HEADING = (orientationAngles(0) * 180 / cPI)
		If MAGNETIC_HEADING < 0 Then MAGNETIC_HEADING = MAGNETIC_HEADING + 360
	End If
End Sub