private void CheckOrientation(Simple3DVector filteredAcceleration) { DeviceOrientation deviceOrientation1 = DeviceOrientation.Unknown; double x = filteredAcceleration.X; double y = filteredAcceleration.Y; double z = filteredAcceleration.Z; double num1 = Math.Sqrt(x * x + y * y + z * z); double num2 = x / num1; double num3 = y / num1; double num4 = z / num1; if (this._currentOrientation == DeviceOrientation.Unknown) { deviceOrientation1 = num4 >= 0.0 ? DeviceOrientation.ScreenSideDown : DeviceOrientation.ScreenSideUp; } if (num3 < -0.8) { deviceOrientation1 = DeviceOrientation.PortraitRightSideUp; } else if (num3 > 0.8) { deviceOrientation1 = DeviceOrientation.PortraitUpSideDown; } else if (num2 < -0.8) { deviceOrientation1 = DeviceOrientation.LandscapeLeft; } else if (num2 > 0.8) { deviceOrientation1 = DeviceOrientation.LandscapeRight; } else if (num4 < -0.8) { deviceOrientation1 = DeviceOrientation.ScreenSideUp; } else if (num4 > 0.8) { deviceOrientation1 = DeviceOrientation.ScreenSideDown; } DeviceOrientation deviceOrientation2 = DeviceOrientation.Unknown; bool flag = false; if (deviceOrientation1 != DeviceOrientation.Unknown) { lock (this) { this._currentOrientation = deviceOrientation1; if (this._previousOrientation != this._currentOrientation) { deviceOrientation2 = this._previousOrientation; this._previousOrientation = this._currentOrientation; flag = true; } } } if (!flag) { return; } DeviceOrientationChangedEventArgs e = new DeviceOrientationChangedEventArgs(); e.CurrentOrientation = deviceOrientation1; e.PreviousOrientation = deviceOrientation2; // ISSUE: reference to a compiler-generated field if (this.OrientationChanged == null) { return; } // ISSUE: reference to a compiler-generated field this.OrientationChanged(this, e); }
/// <summary> /// Main orientation change detection logic /// </summary> /// <param name="filteredAcceleration">current filtered acceleration</param> private void CheckOrientation(Simple3DVector filteredAcceleration) { DeviceOrientation currentOrientation = DeviceOrientation.Unknown; double xAcceleration = filteredAcceleration.X; double yAcceleration = filteredAcceleration.Y; double zAcceleration = filteredAcceleration.Z; // Normalize acceleration to 1g double magnitudeXYZ = Math.Sqrt(xAcceleration * xAcceleration + yAcceleration * yAcceleration + zAcceleration * zAcceleration); xAcceleration = xAcceleration / magnitudeXYZ; yAcceleration = yAcceleration / magnitudeXYZ; zAcceleration = zAcceleration / magnitudeXYZ; if (_currentOrientation == DeviceOrientation.Unknown) { // No pre-existing orientation: default is flat if (zAcceleration < 0) { currentOrientation = DeviceOrientation.ScreenSideUp; } else { currentOrientation = DeviceOrientation.ScreenSideDown; } } if (yAcceleration < -tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.PortraitRightSideUp; } else if (yAcceleration > tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.PortraitUpSideDown; } else if (xAcceleration < -tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.LandscapeLeft; } else if (xAcceleration > tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.LandscapeRight; } else if (zAcceleration < -tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.ScreenSideUp; } else if (zAcceleration > tiltAccelerationThreshold) { currentOrientation = DeviceOrientation.ScreenSideDown; } DeviceOrientation previousOrientation = DeviceOrientation.Unknown; bool fireEvent = false; if (currentOrientation != DeviceOrientation.Unknown) { lock (this) // Keep the lock as brief as posible { _currentOrientation = currentOrientation; if (_previousOrientation != _currentOrientation) { previousOrientation = _previousOrientation; _previousOrientation = _currentOrientation; fireEvent = true; } } } if (fireEvent) { DeviceOrientationChangedEventArgs orientationEventArgs = new DeviceOrientationChangedEventArgs(); orientationEventArgs.CurrentOrientation = currentOrientation; orientationEventArgs.PreviousOrientation = previousOrientation; if (OrientationChanged != null) { OrientationChanged(this, orientationEventArgs); } } }