1 // Copyright 2016 by Samsung Electronics, Inc.,
3 // This software is the confidential and proprietary information
4 // of Samsung Electronics, Inc. ("Confidential Information"). You
5 // shall not disclose such Confidential Information and shall use
6 // it only in accordance with the terms of the license agreement
7 // you entered into with Samsung.
11 namespace Tizen.Sensor
14 /// MagnetometerRotationVectorSensor Class. Used for registering callbacks for magnetometer rotation vector sensor and getting magnetometer rotation vector data
16 public class MagnetometerRotationVectorSensor : Sensor
18 private static string MagnetometerRVKey = "http://tizen.org/feature/sensor.geomagnetic_rotation_vector";
20 private event EventHandler<SensorAccuracyChangedEventArgs> _accuracyChanged;
22 /// Gets the X component of the magnetometer rotation vector.
24 public float X { get; private set; }
27 /// Gets the Y component of the magnetometer rotation vector.
29 public float Y { get; private set; }
32 /// Gets the Z component of the magnetometer rotation vector.
34 public float Z { get; private set; }
37 /// Gets the W component of the magnetometer rotation vector.
39 public float W { get; private set; }
42 /// Gets the Accuracy of the magnetometer rotation vector data.
44 public SensorDataAccuracy Accuracy { get; private set; }
47 /// Returns true or false based on whether magnetometer rotation vector sensor is supported by device.
49 public static bool IsSupported
53 Log.Info(Globals.LogTag, "Checking if the MagnetometerRotationVectorSensor is supported");
54 return CheckIfSupported(SensorType.MagnetometerRotationVectorSensor, MagnetometerRVKey);
59 /// Returns the number of magnetometer rotation vector sensors available on the device.
61 public static int Count
65 Log.Info(Globals.LogTag, "Getting the count of magnetometer rotation vector sensors");
71 /// Initializes a new instance of the <see cref="Tizen.Sensor.MagnetometerRotationVectorSensor"/> class.
73 /// <param name='index'>
74 /// Index. Default value for this is 0. Index refers to a particular magnetometer rotation vector sensor in case of multiple sensors
76 public MagnetometerRotationVectorSensor(int index = 0) : base(index)
78 Log.Info(Globals.LogTag, "Creating MagnetometerRotationVectorSensor object");
81 internal override SensorType GetSensorType()
83 return SensorType.MagnetometerRotationVectorSensor;
87 /// Event Handler for storing the callback functions for event corresponding to change in magnetometer rotation vector sensor data.
90 public event EventHandler<MagnetometerRotationVectorSensorDataUpdatedEventArgs> DataUpdated;
93 /// Event handler for accuracy changed events.
95 public event EventHandler<SensorAccuracyChangedEventArgs> AccuracyChanged
99 if (_accuracyChanged == null)
101 AccuracyListenStart();
103 _accuracyChanged += value;
107 _accuracyChanged -= value;
108 if (_accuracyChanged == null)
110 AccuracyListenStop();
115 private static bool CheckIfSupported()
118 int error = Interop.SensorManager.SensorIsSupported(SensorType.MagnetometerRotationVectorSensor, out isSupported);
119 if (error != (int)SensorError.None)
121 Log.Error(Globals.LogTag, "Error checking if magnetometer rotation vector sensor is supported");
127 private static int GetCount()
131 int error = Interop.SensorManager.GetSensorList(SensorType.MagnetometerRotationVectorSensor, out list, out count);
132 if (error != (int)SensorError.None)
134 Log.Error(Globals.LogTag, "Error getting sensor list for magnetometer rotation vector");
138 Interop.Libc.Free(list);
142 protected override void EventListenStart()
144 int error = Interop.SensorListener.SetEventCallback(ListenerHandle, Interval, SensorEventCallback, IntPtr.Zero);
145 if (error != (int)SensorError.None)
147 Log.Error(Globals.LogTag, "Error setting event callback for magnetometer rotation vector sensor");
148 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set event callback for magnetometer rotation vector");
152 protected override void EventListenStop()
154 int error = Interop.SensorListener.UnsetEventCallback(ListenerHandle);
155 if (error != (int)SensorError.None)
157 Log.Error(Globals.LogTag, "Error unsetting event callback for magnetometer rotation vector sensor");
158 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset event callback for magnetometer rotation vector");
162 private void AccuracyListenStart()
164 int error = Interop.SensorListener.SetAccuracyCallback(ListenerHandle, Interval, AccuracyEventCallback, IntPtr.Zero);
165 if (error != (int)SensorError.None)
167 Log.Error(Globals.LogTag, "Error setting accuracy event callback for magnetometer rotation vector sensor");
168 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set accuracy event callback for magnetometer rotation vector");
172 private void AccuracyListenStop()
174 int error = Interop.SensorListener.UnsetAccuracyCallback(ListenerHandle);
175 if (error != (int)SensorError.None)
177 Log.Error(Globals.LogTag, "Error unsetting accuracy event callback for magnetometer rotation vector sensor");
178 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset accuracy event callback for magnetometer rotation vector");
182 private void SensorEventCallback(IntPtr sensorHandle, IntPtr sensorPtr, IntPtr data)
184 Interop.SensorEventStruct sensorData = Interop.IntPtrToEventStruct(sensorPtr);
185 TimeSpan = new TimeSpan((Int64)sensorData.timestamp);
186 X = sensorData.values[0];
187 Y = sensorData.values[1];
188 Z = sensorData.values[2];
189 Accuracy = sensorData.accuracy;
191 DataUpdated?.Invoke(this, new MagnetometerRotationVectorSensorDataUpdatedEventArgs(sensorData.values, sensorData.accuracy));
194 private void AccuracyEventCallback(IntPtr sensorHandle, UInt64 timestamp, SensorDataAccuracy accuracy, IntPtr data)
196 TimeSpan = new TimeSpan((Int64)timestamp);
198 _accuracyChanged?.Invoke(this, new SensorAccuracyChangedEventArgs(new TimeSpan((Int64)timestamp), accuracy));