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 /// Magnetometer Class. Used for registering callbacks for magnetometer and getting magnetometer data
16 public class Magnetometer : Sensor
18 private static string MagnetometerKey = "http://tizen.org/feature/sensor.magnetometer";
20 private event EventHandler<SensorAccuracyChangedEventArgs> _accuracyChanged;
22 /// Gets the X component of the magnetometer.
24 public float X { get; private set; }
27 /// Gets the Y component of the magnetometer.
29 public float Y { get; private set; }
32 /// Gets the Z component of the magnetometer.
34 public float Z { get; private set; }
37 /// Returns true or false based on whether magnetometer is supported by device.
39 public static bool IsSupported
43 Log.Info(Globals.LogTag, "Checking if the Magnetometer is supported");
44 return CheckIfSupported(SensorType.Magnetometer, MagnetometerKey);
49 /// Returns the number of magnetometers available on the device.
51 public static int Count
55 Log.Info(Globals.LogTag, "Getting the count of magnetometers");
61 /// Initializes a new instance of the <see cref="Tizen.Sensor.Magnetometer"/> class.
63 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
64 /// <exception cref="NotSupportedException">Thrown when the sensor is not supported</exception>
65 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
66 /// <param name='index'>
67 /// Index. Default value for this is 0. Index refers to a particular magnetometer in case of multiple sensors
69 public Magnetometer(int index = 0) : base(index)
71 Log.Info(Globals.LogTag, "Creating Magnetometer object");
74 internal override SensorType GetSensorType()
76 return SensorType.Magnetometer;
80 /// Event Handler for storing the callback functions for event corresponding to change in magnetometer data.
83 public event EventHandler<MagnetometerDataUpdatedEventArgs> DataUpdated;
86 /// Event handler for accuracy changed events.
88 public event EventHandler<SensorAccuracyChangedEventArgs> AccuracyChanged
92 if (_accuracyChanged == null)
94 AccuracyListenStart();
96 _accuracyChanged += value;
100 _accuracyChanged -= value;
101 if (_accuracyChanged == null)
103 AccuracyListenStop();
108 private static int GetCount()
112 int error = Interop.SensorManager.GetSensorList(SensorType.Magnetometer, out list, out count);
113 if (error != (int)SensorError.None)
115 Log.Error(Globals.LogTag, "Error getting sensor list for magnetometer");
119 Interop.Libc.Free(list);
123 protected override void EventListenStart()
125 int error = Interop.SensorListener.SetEventCallback(ListenerHandle, Interval, SensorEventCallback, IntPtr.Zero);
126 if (error != (int)SensorError.None)
128 Log.Error(Globals.LogTag, "Error setting event callback for magnetometer");
129 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set event callback for magnetometer");
133 protected override void EventListenStop()
135 int error = Interop.SensorListener.UnsetEventCallback(ListenerHandle);
136 if (error != (int)SensorError.None)
138 Log.Error(Globals.LogTag, "Error unsetting event callback for magnetometer");
139 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset event callback for magnetometer");
143 private void AccuracyListenStart()
145 int error = Interop.SensorListener.SetAccuracyCallback(ListenerHandle, Interval, AccuracyEventCallback, IntPtr.Zero);
146 if (error != (int)SensorError.None)
148 Log.Error(Globals.LogTag, "Error setting accuracy event callback for magnetometer");
149 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to set accuracy event callback for magnetometer");
153 private void AccuracyListenStop()
155 int error = Interop.SensorListener.UnsetAccuracyCallback(ListenerHandle);
156 if (error != (int)SensorError.None)
158 Log.Error(Globals.LogTag, "Error unsetting accuracy event callback for magnetometer");
159 throw SensorErrorFactory.CheckAndThrowException(error, "Unable to unset accuracy event callback for magnetometer");
163 private void SensorEventCallback(IntPtr sensorHandle, IntPtr sensorPtr, IntPtr data)
165 Interop.SensorEventStruct sensorData = Interop.IntPtrToEventStruct(sensorPtr);
166 TimeSpan = new TimeSpan((Int64)sensorData.timestamp);
167 X = sensorData.values[0];
168 Y = sensorData.values[1];
169 Z = sensorData.values[2];
171 DataUpdated?.Invoke(this, new MagnetometerDataUpdatedEventArgs(sensorData.values));
174 private void AccuracyEventCallback(IntPtr sensorHandle, UInt64 timestamp, SensorDataAccuracy accuracy, IntPtr data)
176 TimeSpan = new TimeSpan((Int64)timestamp);
177 _accuracyChanged?.Invoke(this, new SensorAccuracyChangedEventArgs(new TimeSpan((Int64)timestamp), accuracy));