public void getHeading(string options) { if (!DeviceCompass.IsSupported) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "{code:" + Not_Supported + "}")); } else { //if (compass == null) //{ // // Instantiate the compass. // compass = new DeviceCompass(); // compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(40); // compass.CurrentValueChanged += new EventHandler<Microsoft.Devices.Sensors.SensorReadingEventArgs<Microsoft.Devices.Sensors.CompassReading>>(compass_CurrentValueChanged); // compass.Calibrate += new EventHandler<Microsoft.Devices.Sensors.CalibrationEventArgs>(compass_Calibrate); //} //compass.Start(); } try { if (currentStatus != Running) { lock (compass) { compass.CurrentValueChanged += compass_SingleHeadingValueChanged; compass.Start(); this.SetStatus(Starting); } long timeout = 2000; while ((currentStatus == Starting) && (timeout > 0)) { timeout = timeout - 100; Thread.Sleep(100); } if (currentStatus != Running) { DispatchCommandResult(new PluginResult(PluginResult.Status.IO_EXCEPTION, ErrorFailedToStart)); return; } } lock (compass) { compass.CurrentValueChanged -= compass_SingleHeadingValueChanged; if (watchers.Count < 1) { compass.Stop(); this.SetStatus(Stopped); } } } catch (UnauthorizedAccessException) { DispatchCommandResult(new PluginResult(PluginResult.Status.ILLEGAL_ACCESS_EXCEPTION, ErrorFailedToStart)); } catch (Exception) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ErrorFailedToStart)); } }