/
Accelerometer.cs
100 lines (84 loc) · 2.85 KB
/
Accelerometer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using Microsoft.Xna.Framework;
using MonoTouch.CoreMotion;
using MonoTouch.Foundation;
namespace Microsoft.Devices.Sensors
{
public sealed class Accelerometer : SensorBase<AccelerometerReading>
{
static readonly int MaxSensorCount = 10;
static int instanceCount;
private static bool started = false;
private static SensorState state = IsSupported ? SensorState.Initializing : SensorState.NotSupported;
public static bool IsSupported
{
get { return motionManager.AccelerometerAvailable; }
}
public SensorState State
{
get { return state; }
}
private static event CMAccelerometerHandler readingChanged;
public Accelerometer()
{
if (!IsSupported)
throw new AccelerometerFailedException("Failed to start accelerometer data acquisition. No default sensor found.", -1);
else if (instanceCount >= MaxSensorCount)
throw new SensorFailedException("The limit of 10 simultaneous instances of the Accelerometer class per application has been exceeded.");
++instanceCount;
this.TimeBetweenUpdatesChanged += this.UpdateInterval;
readingChanged += ReadingChangedHandler;
}
protected override void Dispose (bool disposing)
{
if (!IsDisposed)
{
if (disposing)
{
if (started)
Stop();
--instanceCount;
}
}
base.Dispose(disposing);
}
public override void Start()
{
if (started == false)
{
motionManager.StartAccelerometerUpdates(NSOperationQueue.CurrentQueue, AccelerometerHandler);
started = true;
state = SensorState.Ready;
}
else
throw new AccelerometerFailedException("Failed to start accelerometer data acquisition. Data acquisition already started.", -1);
}
public override void Stop()
{
motionManager.StopAccelerometerUpdates();
started = false;
state = SensorState.Disabled;
}
private void AccelerometerHandler(CMAccelerometerData data, NSError error)
{
readingChanged(data, error);
}
private void ReadingChangedHandler(CMAccelerometerData data, NSError error)
{
AccelerometerReading reading = new AccelerometerReading();
this.IsDataValid = error == null;
if (this.IsDataValid)
{
this.IsDataValid = true;
reading.Acceleration = new Vector3((float)data.Acceleration.X, (float)data.Acceleration.Y, (float)data.Acceleration.Z);
reading.Timestamp = DateTime.Now;
this.CurrentValue = reading;
this.IsDataValid = error == null;
}
}
private void UpdateInterval(object sender, EventArgs args)
{
motionManager.AccelerometerUpdateInterval = this.TimeBetweenUpdates.TotalSeconds;
}
}
}