-
Notifications
You must be signed in to change notification settings - Fork 15
/
id-characteristic.ts
67 lines (57 loc) · 1.76 KB
/
id-characteristic.ts
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
/**
* Copyright (c) 2019-present, Sony Interactive Entertainment Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import { EventEmitter } from 'events'
import TypedEmitter from 'typed-emitter'
import { Characteristic } from 'noble-mac'
import { IdSpec, PositionIdInfo, StandardIdInfo, DataType } from './specs/id-spec'
/**
* @hidden
*/
export interface Event {
'id:position-id': (info: PositionIdInfo) => void
'id:standard-id': (info: StandardIdInfo) => void
'id:position-id-missed': () => void
'id:standard-id-missed': () => void
}
/**
* @hidden
*/
export class IdCharacteristic {
public static readonly UUID = '10b201015b3b45719508cf3efcd7bbae'
private readonly characteristic: Characteristic
private readonly eventEmitter: TypedEmitter<Event>
public constructor(characteristic: Characteristic, eventEmitter: EventEmitter) {
this.characteristic = characteristic
if (this.characteristic.properties.includes('notify')) {
this.characteristic.on('data', this.onData.bind(this))
this.characteristic.subscribe()
}
this.eventEmitter = eventEmitter as TypedEmitter<Event>
}
private onData(data: Buffer): void {
const idSpec = new IdSpec()
try {
const ret: DataType = idSpec.parse(data)
switch (ret.dataType) {
case 'id:position-id':
this.eventEmitter.emit(ret.dataType, ret.data)
break
case 'id:standard-id':
this.eventEmitter.emit(ret.dataType, ret.data)
break
case 'id:position-id-missed':
case 'id:standard-id-missed':
this.eventEmitter.emit(ret.dataType)
break
default:
break
}
} catch (e) {
return
}
}
}