-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBleButtonService.cs
More file actions
125 lines (106 loc) · 3.58 KB
/
Copy pathBleButtonService.cs
File metadata and controls
125 lines (106 loc) · 3.58 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
using Windows.Devices.Enumeration;
using Windows.Storage.Streams;
using Buffer = Windows.Storage.Streams.Buffer;
namespace SensorTag
{
/// <summary>
/// This class provides access to the SensorTag button (key) data.
/// </summary>
public class BleButtonService : BleGenericGattService
{
public BleButtonService()
{
}
/// <summary>
/// The version of the SensorTag device. 1=CC2541, 2=CC2650.
/// </summary>
public int Version { get; set; }
public static Guid ButtonServiceUuid = Guid.Parse("0000ffe0-0000-1000-8000-00805f9b34fb");
public static Guid ButtonCharacteristicUuid = Guid.Parse("0000ffe1-0000-1000-8000-00805f9b34fb");
Delegate _buttonValueChanged;
public event EventHandler<SensorButtonEventArgs> ButtonValueChanged
{
add
{
if (_buttonValueChanged != null)
{
_buttonValueChanged = Delegate.Combine(_buttonValueChanged, value);
}
else
{
_buttonValueChanged = value;
RegisterForValueChangeEvents(ButtonCharacteristicUuid);
}
}
remove
{
if (_buttonValueChanged != null)
{
_buttonValueChanged = Delegate.Remove(_buttonValueChanged, value);
if (_buttonValueChanged == null)
{
UnregisterForValueChangeEvents(ButtonCharacteristicUuid);
}
}
}
}
private void OnButtonValueChanged(SensorButtonEventArgs args)
{
if (_buttonValueChanged != null)
{
((EventHandler<SensorButtonEventArgs>)_buttonValueChanged)(this, args);
}
}
public async Task<bool> ConnectAsync(string deviceContainerId)
{
return await this.ConnectAsync(ButtonServiceUuid, deviceContainerId);
}
protected override void OnCharacteristicValueChanged(GattCharacteristic sender, GattValueChangedEventArgs eventArgs)
{
if (sender.Uuid == ButtonCharacteristicUuid)
{
if (_buttonValueChanged != null)
{
uint dataLength = eventArgs.CharacteristicValue.Length;
using (DataReader reader = DataReader.FromBuffer(eventArgs.CharacteristicValue))
{
if (dataLength == 1)
{
byte bits = reader.ReadByte();
OnButtonValueChanged(new SensorButtonEventArgs(bits, eventArgs.Timestamp));
}
}
}
}
}
}
public class SensorButtonEventArgs : EventArgs
{
private byte bits;
public SensorButtonEventArgs(byte bits, DateTimeOffset timestamp)
{
this.bits = bits;
Timestamp = timestamp;
}
public bool LeftButtonDown
{
get { return (bits & 0x2) == 0x2; }
}
public bool RightButtonDown
{
get { return (bits & 0x1) == 0x1; }
}
public DateTimeOffset Timestamp
{
get;
private set;
}
}
}