2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 namespace Tizen.Sensor
22 /// MagnetometerRotationVectorSensor Class. Used for registering callbacks for magnetometer rotation vector sensor and getting magnetometer rotation vector data
24 public sealed class MagnetometerRotationVectorSensor : Sensor
26 private static string MagnetometerRVKey = "http://tizen.org/feature/sensor.geomagnetic_rotation_vector";
28 private event EventHandler<SensorAccuracyChangedEventArgs> _accuracyChanged;
30 /// Gets the X component of the magnetometer rotation vector.
32 public float X { get; private set; } = float.MinValue;
35 /// Gets the Y component of the magnetometer rotation vector.
37 public float Y { get; private set; } = float.MinValue;
40 /// Gets the Z component of the magnetometer rotation vector.
42 public float Z { get; private set; } = float.MinValue;
45 /// Gets the W component of the magnetometer rotation vector.
47 public float W { get; private set; } = float.MinValue;
50 /// Gets the Accuracy of the magnetometer rotation vector data.
52 public SensorDataAccuracy Accuracy { get; private set; }
55 /// Returns true or false based on whether magnetometer rotation vector sensor is supported by device.
57 public static bool IsSupported
61 Log.Info(Globals.LogTag, "Checking if the MagnetometerRotationVectorSensor is supported");
62 return CheckIfSupported(SensorType.MagnetometerRotationVectorSensor, MagnetometerRVKey);
67 /// Returns the number of magnetometer rotation vector sensors available on the device.
69 public static int Count
73 Log.Info(Globals.LogTag, "Getting the count of magnetometer rotation vector sensors");
79 /// Initializes a new instance of the <see cref="Tizen.Sensor.MagnetometerRotationVectorSensor"/> class.
81 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
82 /// <exception cref="NotSupportedException">Thrown when the sensor is not supported</exception>
83 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
84 /// <param name='index'>
85 /// Index. Default value for this is 0. Index refers to a particular magnetometer rotation vector sensor in case of multiple sensors
87 public MagnetometerRotationVectorSensor(uint index = 0) : base(index)
89 Log.Info(Globals.LogTag, "Creating MagnetometerRotationVectorSensor object");
92 internal override SensorType GetSensorType()
94 return SensorType.MagnetometerRotationVectorSensor;
98 /// Event Handler for storing the callback functions for event corresponding to change in magnetometer rotation vector sensor data.
101 public event EventHandler<MagnetometerRotationVectorSensorDataUpdatedEventArgs> DataUpdated;
104 /// Event handler for accuracy changed events.
106 public event EventHandler<SensorAccuracyChangedEventArgs> AccuracyChanged
110 if (_accuracyChanged == null)
112 AccuracyListenStart();
114 _accuracyChanged += value;
118 _accuracyChanged -= value;
119 if (_accuracyChanged == null)
121 AccuracyListenStop();
126 private static bool CheckIfSupported()
129 int error = Interop.SensorManager.SensorIsSupported(SensorType.MagnetometerRotationVectorSensor, out isSupported);
130 if (error != (int)SensorError.None)
132 Log.Error(Globals.LogTag, "Error checking if magnetometer rotation vector sensor is supported");
138 private static int GetCount()
142 int error = Interop.SensorManager.GetSensorList(SensorType.MagnetometerRotationVectorSensor, out list, out count);
143 if (error != (int)SensorError.None)
145 Log.Error(Globals.LogTag, "Error getting sensor list for magnetometer rotation vector");
149 Interop.Libc.Free(list);
153 protected internal override void EventListenStart()
155 int error = Interop.SensorListener.SetEventCallback(ListenerHandle, Interval, SensorEventCallback, IntPtr.Zero);
156 if (error != (int)SensorError.None)
158 Log.Error(Globals.LogTag, "Error setting event callback for magnetometer rotation vector sensor");
159 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set event callback for magnetometer rotation vector");
163 protected internal override void EventListenStop()
165 int error = Interop.SensorListener.UnsetEventCallback(ListenerHandle);
166 if (error != (int)SensorError.None)
168 Log.Error(Globals.LogTag, "Error unsetting event callback for magnetometer rotation vector sensor");
169 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset event callback for magnetometer rotation vector");
173 private void AccuracyListenStart()
175 int error = Interop.SensorListener.SetAccuracyCallback(ListenerHandle, AccuracyEventCallback, IntPtr.Zero);
176 if (error != (int)SensorError.None)
178 Log.Error(Globals.LogTag, "Error setting accuracy event callback for magnetometer rotation vector sensor");
179 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set accuracy event callback for magnetometer rotation vector");
183 private void AccuracyListenStop()
185 int error = Interop.SensorListener.UnsetAccuracyCallback(ListenerHandle);
186 if (error != (int)SensorError.None)
188 Log.Error(Globals.LogTag, "Error unsetting accuracy event callback for magnetometer rotation vector sensor");
189 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset accuracy event callback for magnetometer rotation vector");
193 private void SensorEventCallback(IntPtr sensorHandle, IntPtr sensorPtr, IntPtr data)
195 Interop.SensorEventStruct sensorData = Interop.IntPtrToEventStruct(sensorPtr);
196 TimeSpan = new TimeSpan((Int64)sensorData.timestamp);
197 X = sensorData.values[0];
198 Y = sensorData.values[1];
199 Z = sensorData.values[2];
200 Accuracy = sensorData.accuracy;
202 DataUpdated?.Invoke(this, new MagnetometerRotationVectorSensorDataUpdatedEventArgs(sensorData.values, sensorData.accuracy));
205 private void AccuracyEventCallback(IntPtr sensorHandle, UInt64 timestamp, SensorDataAccuracy accuracy, IntPtr data)
207 TimeSpan = new TimeSpan((Int64)timestamp);
209 _accuracyChanged?.Invoke(this, new SensorAccuracyChangedEventArgs(new TimeSpan((Int64)timestamp), accuracy));