/
SensorTag.js
133 lines (116 loc) · 4.14 KB
/
SensorTag.js
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
126
127
128
129
130
131
132
133
const Device = require('noble-device-pg/lib/device');
/**
* @SensorTag contains methods related to TI SensorTAG and </br>
* inherits Generic BLE Device
*/
class SensorTag extends Device {
/**
*
* @param peripheral discovered from library nole
*/
constructor(peripheral) {
super(peripheral);
this._type = 'Generic';
}
/**
* Connects and discovers all services and initialize noble-
* @param callback
*/
initiate(callback) {
let sensorTagThis = this;
sensorTagThis.connect((error)=>{
if(error){
return callback(new Error(`Error connecting to device ${this.address}`));
}
console.debug(`[${this.address}] Connected.`);
sensorTagThis.discover((error)=>{
if(error){
return callback(new Error(`Error in discovering services from ${this.address}`));
}
console.debug(`[${this.address}] Services discovered.`);
callback();
});
});
}
disconnect(callback) {
console.debug(`[${this.address}] disconnected.`);
super.disconnect(callback);
}
/**
* Configures service with period and data would be sent to </br>
* service's listener
* @param service @{BLEService}
* @param period
* @param callback
*/
configure(service, period = 1000, callback) {
let sensorTagThis = this;
sensorTagThis._enableService(service, (error) => {
if (error) {
return callback(new Error("Error enabling service " + error));
}
console.debug(`[${service._SERVICE_NAME}] Enabled`);
sensorTagThis._period(service, period, (error) => {
if (error) {
return callback(new Error("Error setting reading _period on service " + error));
}
console.debug(`[${service._SERVICE_NAME}] reading period set as ${period}`);
sensorTagThis._subscribeData(service, (error) => {
if (error) {
return callback(new Error("Error subscribed service data" + error));
}
console.debug(`[${service._SERVICE_NAME}] subscribed to reading`);
callback(null);
})
})
})
}
disfigure(service, callback) {
let sensorTagThis = this;
sensorTagThis._unsubscribeData(service, (error) => {
if (error) {
callback(new Error("Error unsubscribe service data" + error));
return;
}
console.debug(`[${service._SERVICE_NAME}] unsubscribed from reading`);
sensorTagThis._disableService(service, (error) => {
if (error) {
callback(new Error("Error disabling service " + error));
return;
}
console.debug(`[${service._SERVICE_NAME}] service disabled.`);
callback(null);
});
})
}
_enableService(service, callback) {
this.writeUInt8Characteristic(service.SERVICE_UUID, service.CONFIG_UUID,
0x01, callback);
}
_disableService(service, callback) {
this.writeUInt8Characteristic(service.SERVICE_UUID, service.CONFIG_UUID,
0x00, callback);
}
_period(service, period, callback) {
period /= 10; // input is scaled by units of 10ms
if (period < 1) {
period = 1;
} else if (period > 255) {
period = 255;
}
this.writeUInt8Characteristic(service.SERVICE_UUID, service.PERIOD_UUID, period, callback);
}
_subscribeData(service, callback) {
this.notifyCharacteristic(service.SERVICE_UUID, service.DATA_UUID, true,
(data) => {
service.onData(data);
}, callback);
}
_unsubscribeData(service, callback) {
this.notifyCharacteristic(service.SERVICE_UUID, service.DATA_UUID, false,
(data) => {
service.onData(data);
}, callback);
}
}
module.exports = SensorTag;