public void OnSensorChanged(SensorEvent e) { if (e.Sensor == accelerometer && !lastAccelerometerSet) { CopyValues(e.Values, lastAccelerometer); lastAccelerometerSet = true; } else if (e.Sensor == magnetometer && !lastMagnetometerSet) { CopyValues(e.Values, lastMagnetometer); lastMagnetometerSet = true; } if (lastAccelerometerSet && lastMagnetometerSet) { SensorManager.GetRotationMatrix(r, null, lastAccelerometer, lastMagnetometer); SensorManager.GetOrientation(r, orientation); var azimuthInRadians = orientation[0]; var azimuthInDegress = (Java.Lang.Math.ToDegrees(azimuthInRadians) + 360.0) % 360.0; var data = new CompassData(azimuthInDegress); if (useSyncContext) { Platform.BeginInvokeOnMainThread(() => handler?.Invoke(data)); } else { handler?.Invoke(data); } lastMagnetometerSet = false; lastAccelerometerSet = false; } }
public void OnSensorChanged(SensorEvent e) { if (e.Sensor == accelerometer && !lastAccelerometerSet) { CopyValues(e.Values, lastAccelerometer); lastAccelerometerSet = true; } else if (e.Sensor == magnetometer && !lastMagnetometerSet) { CopyValues(e.Values, lastMagnetometer); lastMagnetometerSet = true; } if (lastAccelerometerSet && lastMagnetometerSet) { SensorManager.GetRotationMatrix(r, null, lastAccelerometer, lastMagnetometer); SensorManager.GetOrientation(r, orientation); var azimuthInRadians = orientation[0]; var azimuthInDegress = (Java.Lang.Math.ToDegrees(azimuthInRadians) + 360.0) % 360.0; var data = new CompassData(azimuthInDegress); Compass.OnChanged(data); lastMagnetometerSet = false; lastAccelerometerSet = false; } }
internal static void PlatformStart(SensorSpeed sensorSpeed, Action <CompassData> handler) { var compass = DefaultCompass; var useSyncContext = false; var interval = NormalInterval; switch (sensorSpeed) { case SensorSpeed.Fastest: interval = FastestInterval; break; case SensorSpeed.Game: interval = GameInterval; break; default: useSyncContext = true; break; } compass.ReportInterval = compass.MinimumReportInterval >= interval ? interval : compass.MinimumReportInterval; MonitorCTS.Token.Register(CancelledToken); void CancelledToken() { Platform.BeginInvokeOnMainThread(() => { compass.ReadingChanged -= CompassReportedInterval; DisposeToken(); }); } compass.ReadingChanged += CompassReportedInterval; void CompassReportedInterval(object sender, CompassReadingChangedEventArgs e) { var data = new CompassData(e.Reading.HeadingMagneticNorth); if (useSyncContext) { Platform.BeginInvokeOnMainThread(() => handler?.Invoke(data)); } else { handler?.Invoke(data); } } }
internal CompassChangedEventArgs(CompassData reading) => Reading = reading;
internal static void OnChanged(CompassData reading) => OnChanged(new CompassChangedEventArgs(reading));
internal static void PlatformStart(SensorSpeed sensorSpeed, Action <CompassData> handler) { var useSyncContext = false; var locationManager = new CLLocationManager(); switch (sensorSpeed) { case SensorSpeed.Fastest: locationManager.HeadingFilter = FastestFilter; locationManager.DesiredAccuracy = CLLocation.AccurracyBestForNavigation; break; case SensorSpeed.Game: locationManager.HeadingFilter = GameFilter; locationManager.DesiredAccuracy = CLLocation.AccurracyBestForNavigation; break; case SensorSpeed.Normal: locationManager.HeadingFilter = NormalFilter; locationManager.DesiredAccuracy = CLLocation.AccuracyBest; useSyncContext = true; break; case SensorSpeed.Ui: locationManager.HeadingFilter = UiFilter; locationManager.DesiredAccuracy = CLLocation.AccuracyBest; useSyncContext = true; break; } MonitorCTS.Token.Register(CancelledToken, useSyncContext); locationManager.UpdatedHeading += LocationManagerUpdatedHeading; locationManager.StartUpdatingHeading(); void CancelledToken() { if (locationManager != null) { locationManager.UpdatedHeading -= LocationManagerUpdatedHeading; locationManager.StopUpdatingHeading(); locationManager.Dispose(); locationManager = null; } DisposeToken(); } void LocationManagerUpdatedHeading(object sender, CLHeadingUpdatedEventArgs e) { var data = new CompassData(e.NewHeading.MagneticHeading); if (useSyncContext) { Platform.BeginInvokeOnMainThread(() => handler?.Invoke(data)); } else { handler?.Invoke(data); } } }
static void CompassReportedInterval(object sender, CompassReadingChangedEventArgs e) { var data = new CompassData(e.Reading.HeadingMagneticNorth); OnChanged(data); }
static void LocationManagerUpdatedHeading(object sender, CLHeadingUpdatedEventArgs e) { var data = new CompassData(e.NewHeading.MagneticHeading); OnChanged(data); }