Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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);
                }
            }
        }
Ejemplo n.º 4
0
 internal CompassChangedEventArgs(CompassData reading) => Reading = reading;
Ejemplo n.º 5
0
 internal static void OnChanged(CompassData reading)
 => OnChanged(new CompassChangedEventArgs(reading));
Ejemplo n.º 6
0
        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);
                }
            }
        }
Ejemplo n.º 7
0
        static void CompassReportedInterval(object sender, CompassReadingChangedEventArgs e)
        {
            var data = new CompassData(e.Reading.HeadingMagneticNorth);

            OnChanged(data);
        }
Ejemplo n.º 8
0
        static void LocationManagerUpdatedHeading(object sender, CLHeadingUpdatedEventArgs e)
        {
            var data = new CompassData(e.NewHeading.MagneticHeading);

            OnChanged(data);
        }