incyclist-devices 3.0.6 → 3.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/antv2/base/adapter.js +13 -7
- package/lib/cjs/antv2/base/interface.js +4 -4
- package/lib/cjs/base/adpater.js +2 -5
- package/lib/cjs/ble/base/adapter.js +9 -1
- package/lib/cjs/ble/base/interface.js +83 -38
- package/lib/cjs/ble/base/peripheral.js +14 -7
- package/lib/cjs/ble/base/sensor.js +11 -4
- package/lib/cjs/ble/bindings/linux.js +2 -5
- package/lib/cjs/ble/bindings/mock.js +3 -6
- package/lib/cjs/ble/bindings/types.js +2 -5
- package/lib/cjs/direct-connect/base/interface.js +8 -7
- package/lib/cjs/direct-connect/base/peripheral.js +17 -3
- package/lib/cjs/modes/antble-smarttrainer.js +1 -1
- package/lib/cjs/serial/base/serial-interface.js +9 -9
- package/lib/cjs/serial/base/serial-provider.js +113 -0
- package/lib/cjs/serial/daum/DaumAdapter.js +3 -3
- package/lib/cjs/serial/daum/classic/mock.js +2 -2
- package/lib/cjs/serial/index.js +3 -3
- package/lib/cjs/serial/kettler/comms.js +2 -5
- package/lib/cjs/utils/task.js +2 -5
- package/lib/esm/antv2/base/adapter.js +12 -6
- package/lib/esm/antv2/base/interface.js +2 -2
- package/lib/esm/base/adpater.js +1 -1
- package/lib/esm/ble/base/adapter.js +9 -1
- package/lib/esm/ble/base/interface.js +81 -33
- package/lib/esm/ble/base/peripheral.js +14 -7
- package/lib/esm/ble/base/sensor.js +11 -4
- package/lib/esm/ble/bindings/linux.js +1 -1
- package/lib/esm/ble/bindings/mock.js +1 -1
- package/lib/esm/ble/bindings/types.js +1 -1
- package/lib/esm/direct-connect/base/interface.js +6 -2
- package/lib/esm/direct-connect/base/peripheral.js +16 -2
- package/lib/esm/modes/antble-smarttrainer.js +1 -1
- package/lib/esm/serial/base/serial-interface.js +2 -2
- package/lib/esm/serial/base/serial-provider.js +75 -0
- package/lib/esm/serial/base/serialport.js +0 -2
- package/lib/esm/serial/daum/DaumAdapter.js +1 -1
- package/lib/esm/serial/daum/classic/mock.js +1 -1
- package/lib/esm/serial/index.js +1 -1
- package/lib/esm/serial/kettler/comms.js +1 -1
- package/lib/esm/utils/task.js +1 -1
- package/lib/types/antv2/base/adapter.d.ts +2 -2
- package/lib/types/antv2/base/binding.d.ts +1 -1
- package/lib/types/antv2/base/interface.d.ts +2 -2
- package/lib/types/antv2/types.d.ts +1 -1
- package/lib/types/base/adpater.d.ts +1 -1
- package/lib/types/ble/base/adapter.d.ts +1 -0
- package/lib/types/ble/base/interface.d.ts +6 -2
- package/lib/types/ble/bindings/linux.d.ts +1 -1
- package/lib/types/ble/bindings/types.d.ts +1 -1
- package/lib/types/ble/types.d.ts +1 -1
- package/lib/types/direct-connect/base/interface.d.ts +1 -1
- package/lib/types/direct-connect/base/peripheral.d.ts +2 -1
- package/lib/types/direct-connect/bindings/types.d.ts +1 -1
- package/lib/types/serial/base/serial-interface.d.ts +1 -1
- package/lib/types/serial/base/serial-provider.d.ts +16 -0
- package/lib/types/serial/daum/DaumAdapter.d.ts +1 -1
- package/lib/types/serial/index.d.ts +1 -1
- package/lib/types/serial/kettler/comms.d.ts +1 -1
- package/lib/types/types/adapter.d.ts +1 -1
- package/lib/types/types/interface.d.ts +1 -1
- package/lib/types/utils/task.d.ts +1 -1
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ const utils_js_2 = require("../utils.js");
|
|
|
12
12
|
const consts_js_1 = require("../consts.js");
|
|
13
13
|
const sensor_factory_js_1 = __importDefault(require("../factories/sensor-factory.js"));
|
|
14
14
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
15
|
-
const node_events_1 =
|
|
15
|
+
const node_events_1 = require("node:events");
|
|
16
16
|
const INTERFACE_NAME = 'ant';
|
|
17
17
|
const MAX_RETRIES = 3;
|
|
18
18
|
class AntAdapter extends adpater_js_1.default {
|
|
@@ -30,7 +30,7 @@ class AntAdapter extends adpater_js_1.default {
|
|
|
30
30
|
sensorConnected;
|
|
31
31
|
startStatus;
|
|
32
32
|
startupRetryPause = 1000;
|
|
33
|
-
internalEmitter = new node_events_1.
|
|
33
|
+
internalEmitter = new node_events_1.EventEmitter();
|
|
34
34
|
constructor(settings, props) {
|
|
35
35
|
super(settings, props);
|
|
36
36
|
const profile = this.getProfileName();
|
|
@@ -334,21 +334,27 @@ class AntAdapter extends adpater_js_1.default {
|
|
|
334
334
|
async initSensor(props) {
|
|
335
335
|
this.startStatus.sensorStarted = this.sensorConnected;
|
|
336
336
|
if (this.startStatus.sensorStarted)
|
|
337
|
-
return;
|
|
338
|
-
|
|
337
|
+
return true;
|
|
338
|
+
const logProps = structuredClone(props ?? {});
|
|
339
|
+
logProps.routeName = logProps?.route?.title;
|
|
340
|
+
logProps.routeId = logProps?.route?.id;
|
|
341
|
+
delete logProps.route;
|
|
342
|
+
this.logEvent({ message: 'start sensor', device: this.getName(), props: logProps });
|
|
339
343
|
try {
|
|
340
344
|
this.sensorConnected = await this.startSensor();
|
|
341
345
|
if (this.sensorConnected) {
|
|
342
|
-
this.logEvent({ message: 'sensor started', device: this.getName(),
|
|
346
|
+
this.logEvent({ message: 'sensor started', device: this.getName(), channelNo: this.sensor?.getChannel()?.getChannelNo(), props: logProps });
|
|
343
347
|
this.startStatus.sensorStarted = true;
|
|
348
|
+
return true;
|
|
344
349
|
}
|
|
345
350
|
else {
|
|
346
|
-
this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: 'unknown', props });
|
|
351
|
+
this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: 'unknown', props: logProps });
|
|
347
352
|
}
|
|
348
353
|
}
|
|
349
354
|
catch (err) {
|
|
350
|
-
this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: err.message, props });
|
|
355
|
+
this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: err.message, props: logProps });
|
|
351
356
|
}
|
|
357
|
+
return false;
|
|
352
358
|
}
|
|
353
359
|
getLogProps(startProps) {
|
|
354
360
|
const { user, userWeight, bikeWeight, startupTimeout, automaticReconnect } = startProps ?? {};
|
|
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const node_events_1 =
|
|
6
|
+
const node_events_1 = require("node:events");
|
|
7
7
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
8
8
|
const sensor_factory_js_1 = __importDefault(require("../factories/sensor-factory.js"));
|
|
9
9
|
const utils_js_1 = require("../../utils/utils.js");
|
|
10
10
|
const adapter_factory_js_1 = __importDefault(require("../factories/adapter-factory.js"));
|
|
11
|
-
class AntInterface extends node_events_1.
|
|
11
|
+
class AntInterface extends node_events_1.EventEmitter {
|
|
12
12
|
static _instance = undefined;
|
|
13
13
|
static INTERFACE_NAME = 'ant';
|
|
14
14
|
static getInstance(props = {}) {
|
|
@@ -178,7 +178,7 @@ class AntInterface extends node_events_1.default {
|
|
|
178
178
|
if (this.isScanning()) {
|
|
179
179
|
return await this.scanPromise;
|
|
180
180
|
}
|
|
181
|
-
this.activeScan = { emitter: new node_events_1.
|
|
181
|
+
this.activeScan = { emitter: new node_events_1.EventEmitter() };
|
|
182
182
|
const detected = [];
|
|
183
183
|
const _scan = () => new Promise(async (done) => {
|
|
184
184
|
const onDetected = (profile, deviceID) => {
|
|
@@ -340,7 +340,7 @@ class AntInterface extends node_events_1.default {
|
|
|
340
340
|
this.logEvent({ message: 'could not start sensor' });
|
|
341
341
|
channel.off('data', onData);
|
|
342
342
|
}
|
|
343
|
-
this.logEvent({ message: 'sensor started',
|
|
343
|
+
this.logEvent({ message: 'sensor started', channelNo: sensor.getChannel()?.getChannelNo(), profile: sensor.getProfile(), deviceID: sensor.getDeviceID() });
|
|
344
344
|
return started;
|
|
345
345
|
}
|
|
346
346
|
catch (err) {
|
package/lib/cjs/base/adpater.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
const index_js_1 = require("../types/index.js");
|
|
7
|
-
const node_events_1 =
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
8
5
|
const consts_js_1 = require("./consts.js");
|
|
9
6
|
const utils_js_1 = require("../utils/utils.js");
|
|
10
|
-
class IncyclistDevice extends node_events_1.
|
|
7
|
+
class IncyclistDevice extends node_events_1.EventEmitter {
|
|
11
8
|
onDataFn;
|
|
12
9
|
settings;
|
|
13
10
|
lastUpdate;
|
|
@@ -15,6 +15,7 @@ class BleAdapter extends adpater_js_1.default {
|
|
|
15
15
|
device;
|
|
16
16
|
onDeviceDataHandler = this.onDeviceData.bind(this);
|
|
17
17
|
onDeviceDisconnectHandler = this.emit.bind(this);
|
|
18
|
+
onDisconnectDoneHandler = this.onDisconnectDone.bind(this);
|
|
18
19
|
startTask;
|
|
19
20
|
constructor(settings, props) {
|
|
20
21
|
super(settings, props);
|
|
@@ -198,7 +199,7 @@ class BleAdapter extends adpater_js_1.default {
|
|
|
198
199
|
await this.stop();
|
|
199
200
|
}
|
|
200
201
|
const ble = this.getBle();
|
|
201
|
-
ble.once('disconnect-done', this.
|
|
202
|
+
ble.once('disconnect-done', this.onDisconnectDoneHandler);
|
|
202
203
|
this.startTask = new task_js_1.InteruptableTask(this.startAdapter(startProps), {
|
|
203
204
|
timeout: startProps?.timeout,
|
|
204
205
|
name: 'start',
|
|
@@ -206,6 +207,9 @@ class BleAdapter extends adpater_js_1.default {
|
|
|
206
207
|
log: this.logEvent.bind(this)
|
|
207
208
|
});
|
|
208
209
|
const res = await this.startTask.run();
|
|
210
|
+
if (!res) {
|
|
211
|
+
ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
|
|
212
|
+
}
|
|
209
213
|
return res;
|
|
210
214
|
}
|
|
211
215
|
isStarting() {
|
|
@@ -303,6 +307,8 @@ class BleAdapter extends adpater_js_1.default {
|
|
|
303
307
|
this.logEvent({ message: 'start result: error', error: err.message, device: this.getName(), interface: this.getInterface(), protocol: this.getProtocolName() });
|
|
304
308
|
this.started = false;
|
|
305
309
|
this.stopped = true;
|
|
310
|
+
const ble = this.getBle();
|
|
311
|
+
ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
|
|
306
312
|
return false;
|
|
307
313
|
}
|
|
308
314
|
}
|
|
@@ -380,6 +386,8 @@ class BleAdapter extends adpater_js_1.default {
|
|
|
380
386
|
sensor.off('data', this.onDeviceDataHandler);
|
|
381
387
|
sensor.off('disconnected', this.onDeviceDisconnectHandler);
|
|
382
388
|
sensor.off('error', console.log);
|
|
389
|
+
const ble = this.getBle();
|
|
390
|
+
ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
|
|
383
391
|
sensor.reset();
|
|
384
392
|
this.resetData();
|
|
385
393
|
this.stopped = true;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.BleInterfaceFactory = exports.BleInterface = void 0;
|
|
7
|
-
const node_events_1 =
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
8
5
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
9
6
|
const task_js_1 = require("../../utils/task.js");
|
|
10
7
|
const peripheral_js_1 = require("./peripheral.js");
|
|
@@ -14,7 +11,7 @@ const index_js_1 = require("../factories/index.js");
|
|
|
14
11
|
const BLE_EXPIRATION_TIMEOUT = 10 * 1000 * 60;
|
|
15
12
|
const BLE_DEFAULT_CONNECT_TIMEOUT = 30 * 1000;
|
|
16
13
|
let instanceCount = 0;
|
|
17
|
-
class BleInterface extends node_events_1.
|
|
14
|
+
class BleInterface extends node_events_1.EventEmitter {
|
|
18
15
|
static _instance;
|
|
19
16
|
static INTERFACE_NAME = 'ble';
|
|
20
17
|
logger;
|
|
@@ -39,6 +36,8 @@ class BleInterface extends node_events_1.default {
|
|
|
39
36
|
emitted = [];
|
|
40
37
|
confirmedBleState;
|
|
41
38
|
currentBleState;
|
|
39
|
+
isAutoStart = false;
|
|
40
|
+
stateChangeEventHandler = null;
|
|
42
41
|
static getInstance(props = {}) {
|
|
43
42
|
if (BleInterface._instance === undefined)
|
|
44
43
|
BleInterface._instance = new BleInterface(props);
|
|
@@ -66,7 +65,7 @@ class BleInterface extends node_events_1.default {
|
|
|
66
65
|
if (binding) {
|
|
67
66
|
this.setBinding(binding);
|
|
68
67
|
}
|
|
69
|
-
this.internalEvents = new node_events_1.
|
|
68
|
+
this.internalEvents = new node_events_1.EventEmitter();
|
|
70
69
|
this.onDiscovered = this.onPeripheralFound.bind(this);
|
|
71
70
|
const { enabled = true } = props;
|
|
72
71
|
if (this.binding && enabled)
|
|
@@ -94,10 +93,23 @@ class BleInterface extends node_events_1.default {
|
|
|
94
93
|
getBinding() {
|
|
95
94
|
return this.binding;
|
|
96
95
|
}
|
|
97
|
-
autoConnect() {
|
|
98
|
-
this.
|
|
96
|
+
async autoConnect() {
|
|
97
|
+
this.isAutoStart = true;
|
|
98
|
+
await this.connectInternal();
|
|
99
99
|
}
|
|
100
100
|
async connect(reconnect) {
|
|
101
|
+
if (this.isAutoStart)
|
|
102
|
+
return this.isConnected();
|
|
103
|
+
else
|
|
104
|
+
return this.connectInternal(reconnect);
|
|
105
|
+
}
|
|
106
|
+
async connectInternal(reconnect) {
|
|
107
|
+
if (this.isConnected())
|
|
108
|
+
return true;
|
|
109
|
+
if (!this.stateChangeEventHandler) {
|
|
110
|
+
this.stateChangeEventHandler = this.onBleStateChange.bind(this);
|
|
111
|
+
this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
|
|
112
|
+
}
|
|
101
113
|
if (!this.getBinding()) {
|
|
102
114
|
this.logEvent({ message: 'BLE not available' });
|
|
103
115
|
return false;
|
|
@@ -106,8 +118,6 @@ class BleInterface extends node_events_1.default {
|
|
|
106
118
|
this.logEvent({ message: 'BLE connect - already connecting' });
|
|
107
119
|
return this.connectTask.getPromise();
|
|
108
120
|
}
|
|
109
|
-
if (this.isConnected())
|
|
110
|
-
return true;
|
|
111
121
|
this.logEvent({ message: 'BLE connect request' });
|
|
112
122
|
this.connectTask = new task_js_1.InteruptableTask(this.connectBle(), {
|
|
113
123
|
timeout: this.getConnectTimeout(),
|
|
@@ -116,6 +126,9 @@ class BleInterface extends node_events_1.default {
|
|
|
116
126
|
log: this.logEvent.bind(this),
|
|
117
127
|
});
|
|
118
128
|
const success = await this.connectTask.run().catch(() => false);
|
|
129
|
+
this.removeAllListeners('ble-state-change');
|
|
130
|
+
if (success)
|
|
131
|
+
this.emit('connected');
|
|
119
132
|
return success;
|
|
120
133
|
}
|
|
121
134
|
async disconnect(connectionLost) {
|
|
@@ -126,7 +139,7 @@ class BleInterface extends node_events_1.default {
|
|
|
126
139
|
this.confirmedBleState = 'poweredOff';
|
|
127
140
|
return false;
|
|
128
141
|
}
|
|
129
|
-
this.getBinding()
|
|
142
|
+
this.getBinding()?.removeAllListeners('error');
|
|
130
143
|
if (!this.isConnected() && !connectionLost) {
|
|
131
144
|
this.confirmedBleState = 'poweredOff';
|
|
132
145
|
return true;
|
|
@@ -144,11 +157,19 @@ class BleInterface extends node_events_1.default {
|
|
|
144
157
|
if (this.isConnecting())
|
|
145
158
|
await this.connectTask?.stop();
|
|
146
159
|
this.emit('disconnect-done');
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
160
|
+
if (connectionLost) {
|
|
161
|
+
this.getBinding()?.removeAllListeners('stateChange');
|
|
162
|
+
this.stateChangeEventHandler = this.stateChangeEventHandler ?? this.onBleStateChange.bind(this);
|
|
163
|
+
this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.getBinding()?.removeAllListeners('stateChange');
|
|
167
|
+
this.stateChangeEventHandler = null;
|
|
168
|
+
}
|
|
169
|
+
this.getBinding()?.on('error', this.onError.bind(this));
|
|
150
170
|
this.logEvent({ message: 'interface disconnected', interface: 'BLE' });
|
|
151
171
|
this.confirmedBleState = 'poweredOff';
|
|
172
|
+
this.emit('disconnect');
|
|
152
173
|
return true;
|
|
153
174
|
};
|
|
154
175
|
if (this.isDisconnecting()) {
|
|
@@ -156,7 +177,7 @@ class BleInterface extends node_events_1.default {
|
|
|
156
177
|
}
|
|
157
178
|
this.disconnectTask = new task_js_1.InteruptableTask(performDisconnect(), {
|
|
158
179
|
timeout: this.getConnectTimeout(),
|
|
159
|
-
name: 'BLE
|
|
180
|
+
name: 'BLE disconnect',
|
|
160
181
|
errorOnTimeout: false,
|
|
161
182
|
log: this.logEvent.bind(this),
|
|
162
183
|
});
|
|
@@ -225,13 +246,13 @@ class BleInterface extends node_events_1.default {
|
|
|
225
246
|
this.logEvent({ message: 'pausing logging' });
|
|
226
247
|
this.logDisabled = true;
|
|
227
248
|
try {
|
|
228
|
-
this.getBinding()
|
|
249
|
+
this.getBinding()?.pauseLogging();
|
|
229
250
|
}
|
|
230
251
|
catch { }
|
|
231
252
|
}
|
|
232
253
|
resumeLogging() {
|
|
233
254
|
try {
|
|
234
|
-
this.getBinding()
|
|
255
|
+
this.getBinding()?.resumeLogging();
|
|
235
256
|
}
|
|
236
257
|
catch { }
|
|
237
258
|
this.logDisabled = false;
|
|
@@ -289,7 +310,7 @@ class BleInterface extends node_events_1.default {
|
|
|
289
310
|
}
|
|
290
311
|
this.logEvent({ message: 'reconnecting interface', stack: error.stack });
|
|
291
312
|
await this.disconnect();
|
|
292
|
-
await this.
|
|
313
|
+
await this.connectInternal(true);
|
|
293
314
|
}
|
|
294
315
|
async startPeripheralScan(retry = false) {
|
|
295
316
|
if (!this.isConnected() || this.isDiscovering()) {
|
|
@@ -568,27 +589,41 @@ class BleInterface extends node_events_1.default {
|
|
|
568
589
|
addKnownDevice(_settings) {
|
|
569
590
|
}
|
|
570
591
|
async connectBle() {
|
|
571
|
-
|
|
572
|
-
|
|
592
|
+
const prev = this.currentBleState;
|
|
593
|
+
this.currentBleState = this.currentBleState ?? this.getBinding()?.state;
|
|
594
|
+
if (this.currentBleState === 'poweredOn' && prev !== 'poweredOn') {
|
|
573
595
|
this.onConnected();
|
|
574
596
|
return true;
|
|
575
597
|
}
|
|
598
|
+
else if (this.currentBleState === 'unauthorized' || this.currentBleState === 'unsupported') {
|
|
599
|
+
return false;
|
|
600
|
+
}
|
|
576
601
|
const res = await this.waitForBleConnected();
|
|
577
602
|
return res;
|
|
578
603
|
}
|
|
579
604
|
waitForBleConnected() {
|
|
580
605
|
return new Promise((done) => {
|
|
581
|
-
this.getBinding()
|
|
606
|
+
this.getBinding()?.once('error', (err) => {
|
|
582
607
|
this.logEvent({ message: 'Ble connect result: error', error: err.message });
|
|
583
608
|
return done(false);
|
|
584
609
|
});
|
|
585
|
-
this.
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
610
|
+
this.on('ble-state-change', (state) => {
|
|
611
|
+
try {
|
|
612
|
+
this.currentBleState = state;
|
|
613
|
+
if (state === 'poweredOn') {
|
|
614
|
+
this.onConnected();
|
|
615
|
+
this.removeAllListeners('ble-state-change');
|
|
616
|
+
this.currentBleState = state;
|
|
617
|
+
return done(true);
|
|
618
|
+
}
|
|
619
|
+
if (state === 'unauthorized') {
|
|
620
|
+
this.removeAllListeners('ble-state-change');
|
|
621
|
+
this.currentBleState = state;
|
|
622
|
+
return done(false);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
catch (err) {
|
|
626
|
+
console.log('# BLE waitForBleConnected error', err);
|
|
592
627
|
}
|
|
593
628
|
});
|
|
594
629
|
});
|
|
@@ -599,13 +634,16 @@ class BleInterface extends node_events_1.default {
|
|
|
599
634
|
async onConnected() {
|
|
600
635
|
if (this.isConnected())
|
|
601
636
|
return;
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
637
|
+
try {
|
|
638
|
+
this.confirmedBleState = 'poweredOn';
|
|
639
|
+
this.getBinding()?.removeAllListeners('error');
|
|
640
|
+
this.getBinding()?.on('error', this.onError.bind(this));
|
|
641
|
+
this.logEvent({ message: 'BLE connected' });
|
|
642
|
+
this.startPeripheralScan();
|
|
643
|
+
}
|
|
644
|
+
catch (err) {
|
|
645
|
+
console.log('# BLE onConnected error', err);
|
|
646
|
+
}
|
|
609
647
|
}
|
|
610
648
|
async onDisconnected() {
|
|
611
649
|
if (this.isDisconnecting() || !this.isConnected())
|
|
@@ -616,15 +654,22 @@ class BleInterface extends node_events_1.default {
|
|
|
616
654
|
async onBleStateChange(state) {
|
|
617
655
|
if (state === this.currentBleState)
|
|
618
656
|
return;
|
|
657
|
+
this.logEvent({ message: 'BLE state change', state });
|
|
619
658
|
this.currentBleState = state;
|
|
620
|
-
if (
|
|
621
|
-
this.
|
|
659
|
+
if (this.isConnecting()) {
|
|
660
|
+
this.emit('ble-state-change', state);
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
if (state === 'poweredOff' || state === 'unauthorized') {
|
|
664
|
+
if (this.isConnected()) {
|
|
665
|
+
this.onDisconnected();
|
|
666
|
+
}
|
|
622
667
|
}
|
|
623
668
|
else {
|
|
624
669
|
if (this.isDisconnecting()) {
|
|
625
670
|
await this.disconnectTask.getPromise();
|
|
626
671
|
}
|
|
627
|
-
this.
|
|
672
|
+
this.connectInternal();
|
|
628
673
|
}
|
|
629
674
|
}
|
|
630
675
|
getAdapterFactory() {
|
|
@@ -61,6 +61,10 @@ class BlePeripheral {
|
|
|
61
61
|
peripheral.on('error', this.onErrorHandler);
|
|
62
62
|
this.connected = true;
|
|
63
63
|
done();
|
|
64
|
+
})
|
|
65
|
+
.catch(() => {
|
|
66
|
+
this.connected = false;
|
|
67
|
+
done();
|
|
64
68
|
});
|
|
65
69
|
});
|
|
66
70
|
await this.connectPromise;
|
|
@@ -69,10 +73,9 @@ class BlePeripheral {
|
|
|
69
73
|
}
|
|
70
74
|
async disconnect(connectionLost = false) {
|
|
71
75
|
this.disconnecting = true;
|
|
72
|
-
if (
|
|
73
|
-
|
|
76
|
+
if (this.isConnected()) {
|
|
77
|
+
await this.unsubscribeAll(connectionLost);
|
|
74
78
|
}
|
|
75
|
-
await this.unsubscribeAll(connectionLost);
|
|
76
79
|
Object.keys(this.characteristics).forEach(uuid => {
|
|
77
80
|
const c = this.characteristics[uuid];
|
|
78
81
|
c.removeAllListeners();
|
|
@@ -88,7 +91,8 @@ class BlePeripheral {
|
|
|
88
91
|
return new Promise((done) => { this.getPeripheral().disconnect(() => { done(); }); });
|
|
89
92
|
};
|
|
90
93
|
}
|
|
91
|
-
await this.getPeripheral().disconnectAsync()
|
|
94
|
+
await this.getPeripheral().disconnectAsync()
|
|
95
|
+
.catch(() => { });
|
|
92
96
|
}
|
|
93
97
|
peripheral.removeAllListeners();
|
|
94
98
|
}
|
|
@@ -116,6 +120,7 @@ class BlePeripheral {
|
|
|
116
120
|
if (this.disconnectedSignalled || this.disconnecting)
|
|
117
121
|
return;
|
|
118
122
|
this.disconnectedSignalled = true;
|
|
123
|
+
this.getPeripheral().removeAllListeners();
|
|
119
124
|
this.ble.resumeLogging();
|
|
120
125
|
this.logEvent({ message: 'peripheral disconnected', address: this.getPeripheral()?.address });
|
|
121
126
|
try {
|
|
@@ -137,7 +142,8 @@ class BlePeripheral {
|
|
|
137
142
|
const peripheral = this.getPeripheral();
|
|
138
143
|
let services = [];
|
|
139
144
|
if (peripheral?.discoverServicesAsync) {
|
|
140
|
-
services = await peripheral.discoverServicesAsync([])
|
|
145
|
+
services = await peripheral.discoverServicesAsync([])
|
|
146
|
+
.catch(() => []);
|
|
141
147
|
}
|
|
142
148
|
this.discoveredServiceUUIds = services.map(s => (0, utils_js_1.beautifyUUID)(s.uuid));
|
|
143
149
|
this.logEvent({ message: 'discover services result', address: this.getPeripheral().address, services: this.discoveredServiceUUIds });
|
|
@@ -155,7 +161,8 @@ class BlePeripheral {
|
|
|
155
161
|
if (!this.getPeripheral())
|
|
156
162
|
return [];
|
|
157
163
|
this.logEvent({ message: 'discover services and characteristics', service: serviceUUID, address: this.getPeripheral().address });
|
|
158
|
-
const res = await this.getPeripheral().discoverSomeServicesAndCharacteristicsAsync([serviceUUID], [])
|
|
164
|
+
const res = await this.getPeripheral().discoverSomeServicesAndCharacteristicsAsync([serviceUUID], [])
|
|
165
|
+
.catch(() => ({ services: [], characteristics: [] }));
|
|
159
166
|
res.characteristics.forEach(c => this.characteristics[(0, utils_js_1.beautifyUUID)(c.uuid)] = c);
|
|
160
167
|
return res.characteristics.map(c => {
|
|
161
168
|
const { uuid, properties, name, _serviceUuid } = c;
|
|
@@ -182,7 +189,7 @@ class BlePeripheral {
|
|
|
182
189
|
}
|
|
183
190
|
return true;
|
|
184
191
|
}
|
|
185
|
-
let c = await this.queryRawCharacteristic(characteristicUUID);
|
|
192
|
+
let c = await this.queryRawCharacteristic(characteristicUUID).catch(() => null);
|
|
186
193
|
if (!c) {
|
|
187
194
|
return false;
|
|
188
195
|
}
|
|
@@ -122,17 +122,24 @@ class TBleSensor extends node_events_1.EventEmitter {
|
|
|
122
122
|
let connected = false;
|
|
123
123
|
let subscribed = false;
|
|
124
124
|
let success = false;
|
|
125
|
+
await (0, utils_js_1.sleep)(500);
|
|
125
126
|
do {
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
try {
|
|
128
|
+
if (!connected) {
|
|
129
|
+
connected = await this.startSensor(true);
|
|
130
|
+
}
|
|
131
|
+
if (connected && !subscribed) {
|
|
132
|
+
subscribed = await this.subscribe();
|
|
133
|
+
}
|
|
128
134
|
}
|
|
129
|
-
|
|
130
|
-
subscribed = await this.subscribe();
|
|
135
|
+
catch {
|
|
131
136
|
}
|
|
132
137
|
success = connected && subscribed;
|
|
133
138
|
if (!success) {
|
|
134
139
|
await (0, utils_js_1.sleep)(1000);
|
|
135
140
|
}
|
|
141
|
+
if (!this.stopRequested)
|
|
142
|
+
this.logEvent({ message: 'reconnect sensor retry' });
|
|
136
143
|
} while (!success || this.stopRequested);
|
|
137
144
|
this.logEvent({ message: 'reconnect sensor completed', success, stopRequested: this.stopRequested });
|
|
138
145
|
return success;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.BleLinuxBinding = void 0;
|
|
7
|
-
const events_1 =
|
|
8
|
-
class BleLinuxBinding extends events_1.
|
|
4
|
+
const events_1 = require("events");
|
|
5
|
+
class BleLinuxBinding extends events_1.EventEmitter {
|
|
9
6
|
static _instance;
|
|
10
7
|
_bindings;
|
|
11
8
|
state;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const events_1 =
|
|
3
|
+
const events_1 = require("events");
|
|
7
4
|
const utils_js_1 = require("../../utils/utils.js");
|
|
8
|
-
class Binding extends events_1.
|
|
5
|
+
class Binding extends events_1.EventEmitter {
|
|
9
6
|
static _instance;
|
|
10
7
|
_bindings;
|
|
11
8
|
state;
|
|
@@ -64,7 +61,7 @@ class Binding extends events_1.default {
|
|
|
64
61
|
callback();
|
|
65
62
|
}
|
|
66
63
|
}
|
|
67
|
-
class MockPeripheral extends events_1.
|
|
64
|
+
class MockPeripheral extends events_1.EventEmitter {
|
|
68
65
|
id;
|
|
69
66
|
address;
|
|
70
67
|
name;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.StaticNotifyCharacteristic = exports.StaticWriteCharacteristic = exports.StaticReadCharacteristic = exports.MockCharacteristic = exports.RESULT_UNLIKELY_ERROR = exports.RESULT_INVALID_ATTRIBUTE_LENGTH = exports.RESULT_ATTR_NOT_LONG = exports.RESULT_INVALID_OFFSET = exports.RESULT_SUCCESS = void 0;
|
|
7
|
-
const node_events_1 =
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
8
5
|
exports.RESULT_SUCCESS = 0x00;
|
|
9
6
|
exports.RESULT_INVALID_OFFSET = 0x07;
|
|
10
7
|
exports.RESULT_ATTR_NOT_LONG = 0x0b;
|
|
11
8
|
exports.RESULT_INVALID_ATTRIBUTE_LENGTH = 0x0d;
|
|
12
9
|
exports.RESULT_UNLIKELY_ERROR = 0x0e;
|
|
13
|
-
class MockCharacteristic extends node_events_1.
|
|
10
|
+
class MockCharacteristic extends node_events_1.EventEmitter {
|
|
14
11
|
uuid;
|
|
15
12
|
properties;
|
|
16
13
|
secure;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.DirectConnectInterfaceFactory = void 0;
|
|
7
|
-
const node_events_1 =
|
|
4
|
+
const node_events_1 = require("node:events");
|
|
8
5
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
9
6
|
const task_js_1 = require("../../utils/task.js");
|
|
10
7
|
const peripheral_js_1 = require("./peripheral.js");
|
|
@@ -16,7 +13,7 @@ const DC_TYPE = 'wahoo-fitness-tnp';
|
|
|
16
13
|
const DC_PORT = 36866;
|
|
17
14
|
const DC_EXPIRATION_TIMEOUT = 10 * 1000 * 60;
|
|
18
15
|
let instanceId = 0;
|
|
19
|
-
class DirectConnectInterface extends node_events_1.
|
|
16
|
+
class DirectConnectInterface extends node_events_1.EventEmitter {
|
|
20
17
|
static _instance;
|
|
21
18
|
static INTERFACE_NAME = 'wifi';
|
|
22
19
|
logger;
|
|
@@ -57,7 +54,7 @@ class DirectConnectInterface extends node_events_1.default {
|
|
|
57
54
|
if (binding) {
|
|
58
55
|
this.setBinding(binding);
|
|
59
56
|
}
|
|
60
|
-
this.internalEvents = new node_events_1.
|
|
57
|
+
this.internalEvents = new node_events_1.EventEmitter();
|
|
61
58
|
this.instance = ++instanceId;
|
|
62
59
|
const { enabled } = props;
|
|
63
60
|
if (this.binding && (enabled ?? false))
|
|
@@ -139,6 +136,7 @@ class DirectConnectInterface extends node_events_1.default {
|
|
|
139
136
|
return false;
|
|
140
137
|
}
|
|
141
138
|
this.connected = true;
|
|
139
|
+
this.emit('connected');
|
|
142
140
|
return true;
|
|
143
141
|
}
|
|
144
142
|
async disconnect() {
|
|
@@ -149,7 +147,10 @@ class DirectConnectInterface extends node_events_1.default {
|
|
|
149
147
|
this.getBinding()?.mdns?.disconnect();
|
|
150
148
|
this.internalEvents.removeAllListeners();
|
|
151
149
|
this.connected = false;
|
|
152
|
-
|
|
150
|
+
const disconnected = !this.isConnected();
|
|
151
|
+
if (disconnected)
|
|
152
|
+
this.emit('disconnect');
|
|
153
|
+
return disconnected;
|
|
153
154
|
}
|
|
154
155
|
isConnected() {
|
|
155
156
|
return this.connected && this.getBinding()?.mdns !== undefined && this.binding.mdns !== null;
|