File: Compass\Compass.uwp.cs
Web Access
Project: src\src\Essentials\src\Essentials.csproj (Microsoft.Maui.Essentials)
using Windows.Devices.Sensors;
 
using WindowsCompass = Windows.Devices.Sensors.Compass;
 
namespace Microsoft.Maui.Devices.Sensors
{
	partial class CompassImplementation : ICompass
	{
		// Magic numbers from https://docs.microsoft.com/en-us/uwp/api/windows.devices.sensors.compass.reportinterval#Windows_Devices_Sensors_Compass_ReportInterval
		internal const uint FastestInterval = 8;
		internal const uint GameInterval = 22;
		internal const uint NormalInterval = 33;
 
		// keep around a reference so we can stop this same instance
		WindowsCompass sensor;
 
		static WindowsCompass DefaultCompass =>
			WindowsCompass.GetDefault();
 
		bool PlatformIsSupported =>
			DefaultCompass != null;
 
		void PlatformStart(SensorSpeed sensorSpeed, bool applyLowPassFilter)
		{
			sensor = DefaultCompass;
 
			var interval = NormalInterval;
			switch (sensorSpeed)
			{
				case SensorSpeed.Fastest:
					interval = FastestInterval;
					break;
				case SensorSpeed.Game:
					interval = GameInterval;
					break;
			}
 
			sensor.ReportInterval = sensor.MinimumReportInterval >= interval ? sensor.MinimumReportInterval : interval;
 
			sensor.ReadingChanged += CompassReportedInterval;
		}
 
		void CompassReportedInterval(object sender, CompassReadingChangedEventArgs e)
		{
			var data = new CompassData(e.Reading.HeadingMagneticNorth);
			RaiseReadingChanged(data);
		}
 
		void PlatformStop()
		{
			sensor.ReadingChanged -= CompassReportedInterval;
			sensor.ReportInterval = 0;
		}
	}
}