incyclist-devices 1.4.95 → 1.4.97
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/ant/antfe/AntFEAdapter.js +2 -3
- package/lib/ant/antfe/ant-fe-adv-st-mode.d.ts +9 -0
- package/lib/ant/antfe/ant-fe-adv-st-mode.js +51 -0
- package/lib/ant/antfe/ant-fe-erg-mode.d.ts +1 -0
- package/lib/ant/antfe/ant-fe-erg-mode.js +1 -0
- package/lib/ant/antfe/ant-fe-st-mode copy.d.ts +7 -0
- package/lib/ant/antfe/ant-fe-st-mode copy.js +54 -0
- package/lib/ant/antfe/ant-fe-st-mode.d.ts +0 -2
- package/lib/ant/antfe/ant-fe-st-mode.js +1 -40
- package/lib/ble/ble-erg-mode.d.ts +1 -0
- package/lib/ble/ble-erg-mode.js +2 -7
- package/lib/ble/ble-interface.js +11 -22
- package/lib/ble/fm.js +12 -1
- package/lib/daum/ERGCyclingMode.d.ts +1 -0
- package/lib/daum/ERGCyclingMode.js +1 -0
- package/lib/kettler/ergo-racer/ERGCyclingMode.d.ts +1 -0
- package/lib/kettler/ergo-racer/ERGCyclingMode.js +1 -0
- package/lib/modes/simulator.d.ts +1 -0
- package/lib/modes/simulator.js +1 -0
- package/package.json +1 -1
|
@@ -18,8 +18,7 @@ const utils_1 = require("../utils");
|
|
|
18
18
|
const utils_2 = require("../../utils");
|
|
19
19
|
const ant_fe_st_mode_1 = __importDefault(require("./ant-fe-st-mode"));
|
|
20
20
|
const ant_fe_erg_mode_1 = __importDefault(require("./ant-fe-erg-mode"));
|
|
21
|
-
const
|
|
22
|
-
const intVal = (d) => d ? parseInt(d) : d;
|
|
21
|
+
const ant_fe_adv_st_mode_1 = __importDefault(require("./ant-fe-adv-st-mode"));
|
|
23
22
|
const hex = (v) => Math.abs(v).toString(16).toUpperCase();
|
|
24
23
|
const TIMEOUT_ACK = 5000;
|
|
25
24
|
const TIMEOUT_START = 10000;
|
|
@@ -58,7 +57,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
58
57
|
return `${(0, utils_1.getBrand)(ManId)} FE ${DeviceID}${hrmStr}`;
|
|
59
58
|
}
|
|
60
59
|
getSupportedCyclingModes() {
|
|
61
|
-
return [ant_fe_st_mode_1.default, ant_fe_erg_mode_1.default];
|
|
60
|
+
return [ant_fe_st_mode_1.default, ant_fe_erg_mode_1.default, ant_fe_adv_st_mode_1.default];
|
|
62
61
|
}
|
|
63
62
|
setCyclingMode(mode, settings) {
|
|
64
63
|
let selectedMode;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import FtmsCyclingMode from "../../ble/ble-st-mode";
|
|
2
|
+
import { UpdateRequest } from "../../CyclingMode";
|
|
3
|
+
import { DeviceAdapter } from "../../Device";
|
|
4
|
+
export default class AntAdvSimCyclingMode extends FtmsCyclingMode {
|
|
5
|
+
constructor(adapter: DeviceAdapter, props?: any);
|
|
6
|
+
getName(): string;
|
|
7
|
+
getDescription(): string;
|
|
8
|
+
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
9
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ble_st_mode_1 = __importDefault(require("../../ble/ble-st-mode"));
|
|
7
|
+
const MAX_DEVIATION = 10;
|
|
8
|
+
class AntAdvSimCyclingMode extends ble_st_mode_1.default {
|
|
9
|
+
constructor(adapter, props) {
|
|
10
|
+
super(adapter, props);
|
|
11
|
+
this.initLogger('AntAdvSimMode');
|
|
12
|
+
}
|
|
13
|
+
getName() {
|
|
14
|
+
return 'Advanced Smart Trainer';
|
|
15
|
+
}
|
|
16
|
+
getDescription() {
|
|
17
|
+
return 'Sends Slope to device. Respects Limits (from workout or settings). Calculates speed based on power and slope. ';
|
|
18
|
+
}
|
|
19
|
+
sendBikeUpdate(request) {
|
|
20
|
+
const getData = () => {
|
|
21
|
+
if (!this.data)
|
|
22
|
+
return {};
|
|
23
|
+
const { gear, pedalRpm, slope, power, speed } = this.data;
|
|
24
|
+
return { gear, pedalRpm, slope, power, speed };
|
|
25
|
+
};
|
|
26
|
+
this.logger.logEvent({ message: "processing update request", request, prev: this.prevRequest, data: getData() });
|
|
27
|
+
let newRequest = {};
|
|
28
|
+
if (request.slope === undefined && request.targetPower === undefined && request.refresh && this.prevRequest) {
|
|
29
|
+
return this.prevRequest;
|
|
30
|
+
}
|
|
31
|
+
if (request.slope !== undefined) {
|
|
32
|
+
newRequest.slope = parseFloat(request.slope.toFixed(1));
|
|
33
|
+
this.data.slope = newRequest.slope;
|
|
34
|
+
}
|
|
35
|
+
if (this.data && this.data.power) {
|
|
36
|
+
const { minPower, maxPower } = request;
|
|
37
|
+
let { targetPower } = request;
|
|
38
|
+
if (minPower !== undefined && maxPower !== undefined && minPower === maxPower)
|
|
39
|
+
targetPower = maxPower;
|
|
40
|
+
if (targetPower !== undefined && Math.abs(this.data.power - targetPower) > MAX_DEVIATION)
|
|
41
|
+
newRequest.targetPower = targetPower;
|
|
42
|
+
else if (minPower !== undefined && this.data.power < minPower)
|
|
43
|
+
newRequest.targetPower = minPower;
|
|
44
|
+
else if (request.maxPower !== undefined && this.data.power > request.maxPower)
|
|
45
|
+
newRequest.targetPower = maxPower;
|
|
46
|
+
}
|
|
47
|
+
this.prevRequest = JSON.parse(JSON.stringify(newRequest));
|
|
48
|
+
return newRequest;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.default = AntAdvSimCyclingMode;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import FtmsCyclingMode from "../../ble/ble-st-mode";
|
|
2
|
+
import { UpdateRequest } from "../../CyclingMode";
|
|
3
|
+
import { DeviceAdapter } from "../../Device";
|
|
4
|
+
export default class AntStCyclingMode extends FtmsCyclingMode {
|
|
5
|
+
constructor(adapter: DeviceAdapter, props?: any);
|
|
6
|
+
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
7
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ble_st_mode_1 = __importDefault(require("../../ble/ble-st-mode"));
|
|
7
|
+
class AntStCyclingMode extends ble_st_mode_1.default {
|
|
8
|
+
constructor(adapter, props) {
|
|
9
|
+
super(adapter, props);
|
|
10
|
+
this.initLogger('AntSTMode');
|
|
11
|
+
}
|
|
12
|
+
sendBikeUpdate(request) {
|
|
13
|
+
console.log('~~~ SIMMode:sendBikeUpdate reuqest', request);
|
|
14
|
+
const getData = () => {
|
|
15
|
+
if (!this.data)
|
|
16
|
+
return {};
|
|
17
|
+
const { gear, pedalRpm, slope, power, speed } = this.data;
|
|
18
|
+
return { gear, pedalRpm, slope, power, speed };
|
|
19
|
+
};
|
|
20
|
+
const event = {};
|
|
21
|
+
if (this.data === undefined)
|
|
22
|
+
event.noData = true;
|
|
23
|
+
if (request.slope !== undefined && (event.noData || Math.abs(request.slope - this.data.slope) >= 0.1))
|
|
24
|
+
event.slopeUpdate = true;
|
|
25
|
+
if (this.prevRequest === undefined)
|
|
26
|
+
event.initialCall = true;
|
|
27
|
+
this.logger.logEvent({ message: "processing update request", request, prev: this.prevRequest, data: getData(), event });
|
|
28
|
+
let newRequest = {};
|
|
29
|
+
if (request.slope === undefined && request.targetPower === undefined && request.refresh && this.prevRequest) {
|
|
30
|
+
return this.prevRequest;
|
|
31
|
+
}
|
|
32
|
+
if (request.slope !== undefined) {
|
|
33
|
+
newRequest.slope = parseFloat(request.slope.toFixed(1));
|
|
34
|
+
this.data.slope = newRequest.slope;
|
|
35
|
+
}
|
|
36
|
+
if (request.targetPower !== undefined) {
|
|
37
|
+
newRequest.targetPower = request.targetPower;
|
|
38
|
+
}
|
|
39
|
+
if (request.minPower && request.maxPower && request.minPower === request.maxPower) {
|
|
40
|
+
newRequest.targetPower = request.minPower;
|
|
41
|
+
}
|
|
42
|
+
const prevData = this.data;
|
|
43
|
+
if (newRequest.targetPower === undefined && prevData && prevData.power) {
|
|
44
|
+
if (request.minPower !== undefined && prevData.power < request.minPower)
|
|
45
|
+
newRequest.targetPower = request.minPower;
|
|
46
|
+
if (request.maxPower !== undefined && prevData.power > request.maxPower)
|
|
47
|
+
newRequest.targetPower = request.maxPower;
|
|
48
|
+
}
|
|
49
|
+
this.prevRequest = JSON.parse(JSON.stringify(newRequest));
|
|
50
|
+
console.log('~~~ SimMode:sendBikeUpdate result', newRequest);
|
|
51
|
+
return newRequest;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.default = AntStCyclingMode;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import FtmsCyclingMode from "../../ble/ble-st-mode";
|
|
2
|
-
import { UpdateRequest } from "../../CyclingMode";
|
|
3
2
|
import { DeviceAdapter } from "../../Device";
|
|
4
3
|
export default class AntStCyclingMode extends FtmsCyclingMode {
|
|
5
4
|
constructor(adapter: DeviceAdapter, props?: any);
|
|
6
|
-
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
7
5
|
}
|
|
@@ -7,46 +7,7 @@ const ble_st_mode_1 = __importDefault(require("../../ble/ble-st-mode"));
|
|
|
7
7
|
class AntStCyclingMode extends ble_st_mode_1.default {
|
|
8
8
|
constructor(adapter, props) {
|
|
9
9
|
super(adapter, props);
|
|
10
|
-
this.initLogger('
|
|
11
|
-
}
|
|
12
|
-
sendBikeUpdate(request) {
|
|
13
|
-
const getData = () => {
|
|
14
|
-
if (!this.data)
|
|
15
|
-
return {};
|
|
16
|
-
const { gear, pedalRpm, slope, power, speed } = this.data;
|
|
17
|
-
return { gear, pedalRpm, slope, power, speed };
|
|
18
|
-
};
|
|
19
|
-
const event = {};
|
|
20
|
-
if (this.data === undefined)
|
|
21
|
-
event.noData = true;
|
|
22
|
-
if (request.slope !== undefined && (event.noData || Math.abs(request.slope - this.data.slope) >= 0.1))
|
|
23
|
-
event.slopeUpdate = true;
|
|
24
|
-
if (this.prevRequest === undefined)
|
|
25
|
-
event.initialCall = true;
|
|
26
|
-
this.logger.logEvent({ message: "processing update request", request, prev: this.prevRequest, data: getData(), event });
|
|
27
|
-
let newRequest = {};
|
|
28
|
-
if (request.slope === undefined && request.targetPower === undefined && request.refresh && this.prevRequest) {
|
|
29
|
-
return this.prevRequest;
|
|
30
|
-
}
|
|
31
|
-
if (request.slope !== undefined) {
|
|
32
|
-
newRequest.slope = parseFloat(request.slope.toFixed(1));
|
|
33
|
-
this.data.slope = newRequest.slope;
|
|
34
|
-
}
|
|
35
|
-
if (request.targetPower !== undefined) {
|
|
36
|
-
newRequest.targetPower = request.targetPower;
|
|
37
|
-
}
|
|
38
|
-
if (request.minPower && request.maxPower && request.minPower === request.maxPower) {
|
|
39
|
-
newRequest.targetPower = request.minPower;
|
|
40
|
-
}
|
|
41
|
-
const prevData = this.data;
|
|
42
|
-
if (newRequest.targetPower === undefined && prevData && prevData.power) {
|
|
43
|
-
if (request.minPower !== undefined && prevData.power < request.minPower)
|
|
44
|
-
newRequest.targetPower = request.minPower;
|
|
45
|
-
if (request.maxPower !== undefined && prevData.power > request.maxPower)
|
|
46
|
-
newRequest.targetPower = request.maxPower;
|
|
47
|
-
}
|
|
48
|
-
this.prevRequest = JSON.parse(JSON.stringify(newRequest));
|
|
49
|
-
return newRequest;
|
|
10
|
+
this.initLogger('AntSimMode');
|
|
50
11
|
}
|
|
51
12
|
}
|
|
52
13
|
exports.default = AntStCyclingMode;
|
|
@@ -2,6 +2,7 @@ import CyclingMode, { CyclingModeProperty, IncyclistBikeData, UpdateRequest } fr
|
|
|
2
2
|
import { DeviceAdapter } from "../Device";
|
|
3
3
|
import PowerBasedCyclingModeBase from "../modes/power-base";
|
|
4
4
|
export default class BleERGCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
|
|
5
|
+
static isERG: boolean;
|
|
5
6
|
prevRequest: UpdateRequest;
|
|
6
7
|
hasBikeUpdate: boolean;
|
|
7
8
|
chain: number[];
|
package/lib/ble/ble-erg-mode.js
CHANGED
|
@@ -50,21 +50,15 @@ class BleERGCyclingMode extends power_base_1.default {
|
|
|
50
50
|
this.prevRequest = {};
|
|
51
51
|
return request.reset ? { reset: true } : {};
|
|
52
52
|
}
|
|
53
|
+
delete request.slope;
|
|
53
54
|
const prevData = this.data || {};
|
|
54
55
|
if (request.targetPower !== undefined) {
|
|
55
|
-
delete request.slope;
|
|
56
56
|
delete request.refresh;
|
|
57
57
|
}
|
|
58
58
|
if (request.refresh) {
|
|
59
59
|
delete request.refresh;
|
|
60
60
|
newRequest.targetPower = this.prevRequest.targetPower;
|
|
61
61
|
}
|
|
62
|
-
if (request.slope !== undefined) {
|
|
63
|
-
if (!this.data)
|
|
64
|
-
this.data = {};
|
|
65
|
-
this.data.slope = request.slope;
|
|
66
|
-
delete request.slope;
|
|
67
|
-
}
|
|
68
62
|
if (request.maxPower !== undefined && request.minPower !== undefined && request.maxPower === request.minPower) {
|
|
69
63
|
request.targetPower = request.maxPower;
|
|
70
64
|
newRequest.targetPower = request.targetPower;
|
|
@@ -130,3 +124,4 @@ class BleERGCyclingMode extends power_base_1.default {
|
|
|
130
124
|
}
|
|
131
125
|
}
|
|
132
126
|
exports.default = BleERGCyclingMode;
|
|
127
|
+
BleERGCyclingMode.isERG = true;
|
package/lib/ble/ble-interface.js
CHANGED
|
@@ -56,9 +56,7 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
56
56
|
if (this.logger) {
|
|
57
57
|
this.logger.logEvent(event);
|
|
58
58
|
}
|
|
59
|
-
|
|
60
|
-
console.log('~~BLE:', event);
|
|
61
|
-
}
|
|
59
|
+
console.log('~~BLE:', event);
|
|
62
60
|
}
|
|
63
61
|
onStateChange(state) {
|
|
64
62
|
if (state !== ble_1.BleState.POWERED_ON) {
|
|
@@ -73,9 +71,6 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
73
71
|
}
|
|
74
72
|
connect(props = {}) {
|
|
75
73
|
const timeout = props.timeout || 2000;
|
|
76
|
-
const runBackgroundScan = () => {
|
|
77
|
-
return;
|
|
78
|
-
};
|
|
79
74
|
return new Promise((resolve, reject) => {
|
|
80
75
|
if (this.connectState.isConnected) {
|
|
81
76
|
return resolve(true);
|
|
@@ -124,7 +119,6 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
124
119
|
this.connectState.isConnecting = false;
|
|
125
120
|
this.logEvent({ message: 'connect result: success' });
|
|
126
121
|
resolve(true);
|
|
127
|
-
runBackgroundScan();
|
|
128
122
|
return;
|
|
129
123
|
}
|
|
130
124
|
else {
|
|
@@ -144,7 +138,6 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
144
138
|
this.connectState.isConnected = true;
|
|
145
139
|
this.connectState.isConnecting = false;
|
|
146
140
|
this.logEvent({ message: 'connect result: success' });
|
|
147
|
-
runBackgroundScan();
|
|
148
141
|
return resolve(true);
|
|
149
142
|
}
|
|
150
143
|
else {
|
|
@@ -491,7 +484,7 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
491
484
|
}
|
|
492
485
|
scan(props) {
|
|
493
486
|
return __awaiter(this, void 0, void 0, function* () {
|
|
494
|
-
const { timeout = DEFAULT_SCAN_TIMEOUT, deviceTypes = [], requested
|
|
487
|
+
const { timeout = DEFAULT_SCAN_TIMEOUT, deviceTypes = [], requested } = props;
|
|
495
488
|
let profile;
|
|
496
489
|
if (requested)
|
|
497
490
|
profile = requested instanceof ble_1.BleDeviceClass ?
|
|
@@ -499,7 +492,7 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
499
492
|
requested.profile;
|
|
500
493
|
const { id, address, name } = requested || {};
|
|
501
494
|
const scanForDevice = (requested !== null && requested !== undefined);
|
|
502
|
-
const services = (
|
|
495
|
+
const services = (!deviceTypes || deviceTypes.length === 0) ? this.getAllSupportedServices() : this.getServicesFromDeviceTypes(deviceTypes);
|
|
503
496
|
const bleBinding = this.getBinding();
|
|
504
497
|
if (!bleBinding)
|
|
505
498
|
return Promise.reject(new Error('no binding defined'));
|
|
@@ -508,18 +501,14 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
508
501
|
}
|
|
509
502
|
const peripheralsProcessed = [];
|
|
510
503
|
const devicesProcessed = [];
|
|
511
|
-
this.logEvent({ message: 'scan()', props: { timeout
|
|
504
|
+
this.logEvent({ message: 'scan()', props: { timeout }, scanState: this.scanState,
|
|
512
505
|
peripheralCache: this.peripheralCache.map(i => ({ address: i.address, ts: i.ts, name: i.peripheral ? i.peripheral.advertisement.localName : '' })),
|
|
513
506
|
deviceCache: this.devices.map(i => ({ address: i.device.address, profile: i.device.getProfile(), isConnected: i.isConnected }))
|
|
514
507
|
});
|
|
515
|
-
if (!props.isBackgroundScan && this.scanState.isBackgroundScan) {
|
|
516
|
-
yield this.stopScan();
|
|
517
|
-
this.scanState.isBackgroundScan = false;
|
|
518
|
-
}
|
|
519
508
|
let opStr;
|
|
520
509
|
if (scanForDevice) {
|
|
521
510
|
opStr = 'search device';
|
|
522
|
-
this.logEvent({ message: 'search device request', device: { id, address, name }, deviceTypes });
|
|
511
|
+
this.logEvent({ message: 'search device request', services, device: { id, address, name }, deviceTypes });
|
|
523
512
|
}
|
|
524
513
|
else {
|
|
525
514
|
opStr = 'scan';
|
|
@@ -538,8 +527,6 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
538
527
|
}
|
|
539
528
|
return new Promise((resolve, reject) => {
|
|
540
529
|
this.scanState.isScanning = true;
|
|
541
|
-
if (props.isBackgroundScan)
|
|
542
|
-
this.scanState.isBackgroundScan = true;
|
|
543
530
|
if (scanForDevice) {
|
|
544
531
|
if (this.devices && this.devices.length > 0) {
|
|
545
532
|
const knownDevices = this.devices.map(i => ({ name: i.device.name, address: i.device.address, isConnected: i.isConnected, connectState: i.device.getConnectState() }));
|
|
@@ -566,14 +553,14 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
566
553
|
});
|
|
567
554
|
};
|
|
568
555
|
const onPeripheralFound = (peripheral, fromCache = false) => __awaiter(this, void 0, void 0, function* () {
|
|
569
|
-
if (!peripheral || !peripheral.advertisement || !peripheral.advertisement.localName || !peripheral.advertisement.serviceUuids
|
|
556
|
+
if (!peripheral || !peripheral.advertisement || !peripheral.advertisement.localName || !peripheral.advertisement.serviceUuids)
|
|
570
557
|
return;
|
|
571
558
|
if (fromCache) {
|
|
572
559
|
this.logEvent({ message: 'adding from Cache', peripheral: peripheral.address });
|
|
573
560
|
}
|
|
574
561
|
else {
|
|
575
562
|
const { id, name, address, advertisement = {} } = peripheral;
|
|
576
|
-
this.logEvent({ message: 'BLE scan: found device', peripheral: { id, name, address, services: advertisement.serviceUuids } });
|
|
563
|
+
this.logEvent({ message: 'BLE scan: found device', peripheral: { id, name: advertisement.localName, address, services: advertisement.serviceUuids } });
|
|
577
564
|
}
|
|
578
565
|
if (peripheral.address === undefined || peripheral.address === '')
|
|
579
566
|
peripheral.address = peripheral.id;
|
|
@@ -581,8 +568,10 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
581
568
|
if (isPeripheralProcessed)
|
|
582
569
|
return;
|
|
583
570
|
peripheralsProcessed.push(peripheral.address);
|
|
584
|
-
|
|
571
|
+
if (scanForDevice && requested.name && requested.name !== peripheral.advertisement.localName)
|
|
572
|
+
return;
|
|
585
573
|
const connector = this.getConnector(peripheral);
|
|
574
|
+
const characteristics = yield this.getCharacteristics(peripheral);
|
|
586
575
|
const connectedServices = connector.getServices();
|
|
587
576
|
const services = connectedServices ? connectedServices.map(cs => cs.uuid) : undefined;
|
|
588
577
|
const connectedPeripheral = connector.getPeripheral();
|
|
@@ -644,7 +633,7 @@ class BleInterface extends ble_1.BleInterfaceClass {
|
|
|
644
633
|
});
|
|
645
634
|
this.logEvent({ message: `${opStr}: start scanning`, requested: scanForDevice ? { name, address, profile } : undefined, timeout });
|
|
646
635
|
let services = [];
|
|
647
|
-
if (scanForDevice) {
|
|
636
|
+
if (scanForDevice && name && !name.toLowerCase().startsWith('tacx')) {
|
|
648
637
|
if (props.requested instanceof ble_1.BleDeviceClass) {
|
|
649
638
|
const device = props.requested;
|
|
650
639
|
services = (device.getServices()) || [];
|
package/lib/ble/fm.js
CHANGED
|
@@ -21,6 +21,7 @@ const power_meter_1 = __importDefault(require("../modes/power-meter"));
|
|
|
21
21
|
const ble_st_mode_1 = __importDefault(require("./ble-st-mode"));
|
|
22
22
|
const ble_erg_mode_1 = __importDefault(require("./ble-erg-mode"));
|
|
23
23
|
const consts_1 = require("./consts");
|
|
24
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
24
25
|
const cwABike = {
|
|
25
26
|
race: 0.35,
|
|
26
27
|
triathlon: 0.29,
|
|
@@ -685,7 +686,17 @@ class FmAdapter extends Device_1.default {
|
|
|
685
686
|
break;
|
|
686
687
|
}
|
|
687
688
|
}
|
|
688
|
-
yield this.device.requestControl();
|
|
689
|
+
let hasControl = yield this.device.requestControl();
|
|
690
|
+
if (!hasControl) {
|
|
691
|
+
let retry = 1;
|
|
692
|
+
while (!hasControl && retry < 3) {
|
|
693
|
+
yield sleep(1000);
|
|
694
|
+
hasControl = yield this.device.requestControl();
|
|
695
|
+
retry++;
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
if (!hasControl)
|
|
699
|
+
throw new Error('could not establish control');
|
|
689
700
|
const startRequest = this.getCyclingMode().getBikeInitRequest();
|
|
690
701
|
yield this.sendUpdate(startRequest);
|
|
691
702
|
bleDevice.on('data', (data) => {
|
|
@@ -13,6 +13,7 @@ export default class ERGCyclingMode extends PowerBasedCyclingModeBase implements
|
|
|
13
13
|
chain: number[];
|
|
14
14
|
cassette: number[];
|
|
15
15
|
event: ERGEvent;
|
|
16
|
+
static isERG: boolean;
|
|
16
17
|
constructor(adapter: DaumAdapter, props?: any);
|
|
17
18
|
getName(): string;
|
|
18
19
|
getDescription(): string;
|
package/lib/modes/simulator.d.ts
CHANGED
package/lib/modes/simulator.js
CHANGED