incyclist-devices 1.4.54 → 1.4.57
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/Device.d.ts +1 -1
- package/lib/DeviceSupport.js +1 -5
- package/lib/ant/AntAdapter.d.ts +7 -0
- package/lib/ant/AntAdapter.js +16 -0
- package/lib/ant/AntScanner.js +1 -5
- package/lib/ant/antfe/AntFEAdapter.js +9 -3
- package/lib/ble/ble-erg-mode.js +2 -2
- package/lib/ble/ble-st-mode.js +2 -2
- package/lib/ble/ble.d.ts +0 -1
- package/lib/ble/incyclist-protocol.js +1 -5
- package/lib/ble/pwr.d.ts +7 -0
- package/lib/ble/pwr.js +35 -1
- package/lib/ble/wahoo-kickr.js +1 -5
- package/lib/daum/DaumAdapter.js +7 -11
- package/lib/daum/ERGCyclingMode.js +2 -2
- package/lib/daum/SmartTrainerCyclingMode.js +2 -2
- package/lib/daum/classic/DaumClassicAdapter.js +5 -1
- package/lib/daum/classic/DaumClassicCyclingMode.js +1 -1
- package/lib/daum/classic/DaumClassicProtocol.js +1 -5
- package/lib/daum/premium/DaumClassicCyclingMode.js +2 -2
- package/lib/daum/premium/DaumPremiumAdapter.js +4 -0
- package/lib/daum/premium/DaumPremiumProtocol.js +1 -5
- package/lib/kettler/comms.d.ts +0 -1
- package/lib/kettler/ergo-racer/adapter.js +1 -5
- package/lib/kettler/ergo-racer/protocol.d.ts +1 -1
- package/lib/kettler/ergo-racer/protocol.js +1 -5
- package/lib/modes/power-meter.js +2 -2
- package/lib/modes/simulator.d.ts +3 -2
- package/lib/modes/simulator.js +28 -16
- package/lib/simulator/Simulator.d.ts +8 -1
- package/lib/simulator/Simulator.js +26 -7
- package/package.json +1 -1
package/lib/Device.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export interface DeviceAdapter extends Device {
|
|
|
34
34
|
getName(): string;
|
|
35
35
|
getPort(): string;
|
|
36
36
|
getProtocol(): DeviceProtocol;
|
|
37
|
-
getProtocolName(): string;
|
|
37
|
+
getProtocolName(): string | undefined;
|
|
38
38
|
setIgnoreHrm(ignore: boolean): void;
|
|
39
39
|
setIgnorePower(ignore: boolean): void;
|
|
40
40
|
setIgnoreBike(ignore: boolean): void;
|
package/lib/DeviceSupport.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
package/lib/ant/AntAdapter.d.ts
CHANGED
|
@@ -17,6 +17,12 @@ export default class AntAdapter extends DeviceAdapter {
|
|
|
17
17
|
logger: EventLogger;
|
|
18
18
|
lastUpdate?: number;
|
|
19
19
|
updateFrequency: number;
|
|
20
|
+
userSettings: {
|
|
21
|
+
weight?: number;
|
|
22
|
+
};
|
|
23
|
+
bikeSettings: {
|
|
24
|
+
weight?: number;
|
|
25
|
+
};
|
|
20
26
|
constructor(protocol: any);
|
|
21
27
|
isSame(device: DeviceAdapter): boolean;
|
|
22
28
|
setSensor(sensor: any): void;
|
|
@@ -26,6 +32,7 @@ export default class AntAdapter extends DeviceAdapter {
|
|
|
26
32
|
setIgnorePower(ignore: any): void;
|
|
27
33
|
getProfile(): string;
|
|
28
34
|
getPort(): string;
|
|
35
|
+
getWeight(): number;
|
|
29
36
|
setChannel(channel: any): void;
|
|
30
37
|
setStick(stick: any): void;
|
|
31
38
|
isStopped(): boolean;
|
package/lib/ant/AntAdapter.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.DEFAULT_UPDATE_FREQUENCY = void 0;
|
|
7
7
|
const Device_1 = __importDefault(require("../Device"));
|
|
8
|
+
const Device_2 = require("../Device");
|
|
8
9
|
exports.DEFAULT_UPDATE_FREQUENCY = 1000;
|
|
9
10
|
class AntAdapter extends Device_1.default {
|
|
10
11
|
constructor(protocol) {
|
|
@@ -49,6 +50,17 @@ class AntAdapter extends Device_1.default {
|
|
|
49
50
|
getPort() {
|
|
50
51
|
return this.port;
|
|
51
52
|
}
|
|
53
|
+
getWeight() {
|
|
54
|
+
let userWeight = Device_2.DEFAULT_USER_WEIGHT;
|
|
55
|
+
let bikeWeight = Device_2.DEFAULT_BIKE_WEIGHT;
|
|
56
|
+
if (this.userSettings && this.userSettings.weight) {
|
|
57
|
+
userWeight = Number(this.userSettings.weight);
|
|
58
|
+
}
|
|
59
|
+
if (this.bikeSettings && this.bikeSettings.weight) {
|
|
60
|
+
bikeWeight = Number(this.bikeSettings.weight);
|
|
61
|
+
}
|
|
62
|
+
return bikeWeight + userWeight;
|
|
63
|
+
}
|
|
52
64
|
setChannel(channel) {
|
|
53
65
|
this.channel = channel;
|
|
54
66
|
}
|
|
@@ -78,6 +90,10 @@ class AntAdapter extends Device_1.default {
|
|
|
78
90
|
});
|
|
79
91
|
}
|
|
80
92
|
start(props) {
|
|
93
|
+
if (props && props.user)
|
|
94
|
+
this.userSettings = props.user;
|
|
95
|
+
if (props && props.bikeSettings)
|
|
96
|
+
this.bikeSettings = props.bikeSettings;
|
|
81
97
|
return new Promise(resolve => {
|
|
82
98
|
this.stopped = false;
|
|
83
99
|
resolve(true);
|
package/lib/ant/AntScanner.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -25,7 +25,8 @@ const TIMEOUT_ACK = 5000;
|
|
|
25
25
|
const TIMEOUT_START = 10000;
|
|
26
26
|
const TIMEOUT_ATTACH = 3000;
|
|
27
27
|
const DEFAULT_USER_WEIGHT = 75;
|
|
28
|
-
const DEFAULT_BIKE_WEIGHT =
|
|
28
|
+
const DEFAULT_BIKE_WEIGHT = 10;
|
|
29
|
+
const DEFAULT_BIKE_WEIGHT_MOUNTAIN = 14.5;
|
|
29
30
|
class AntFEAdapter extends AntAdapter_1.default {
|
|
30
31
|
constructor(DeviceID, port, stick, protocol) {
|
|
31
32
|
super(protocol);
|
|
@@ -214,7 +215,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
214
215
|
yield _super.start.call(this, props);
|
|
215
216
|
this.logger.logEvent({ message: 'start()', props });
|
|
216
217
|
const opts = props || {};
|
|
217
|
-
const { args = {} } = opts;
|
|
218
|
+
const { args = {}, user = {} } = opts;
|
|
218
219
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
219
220
|
if (this.ignoreHrm && this.ignoreBike && this.ignorePower) {
|
|
220
221
|
this.logger.logEvent({ message: 'start() not done: bike disabled' });
|
|
@@ -269,8 +270,13 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
269
270
|
yield this.sendTrackResistance(0.0);
|
|
270
271
|
status.trackResistanceSent = true;
|
|
271
272
|
}
|
|
273
|
+
const mode = this.getCyclingMode();
|
|
274
|
+
const bikeType = mode ? mode.getSetting('bikeType').toLowerCase() : 'race';
|
|
275
|
+
const defaultBikeWeight = bikeType === 'mountain' ? DEFAULT_BIKE_WEIGHT_MOUNTAIN : DEFAULT_BIKE_WEIGHT;
|
|
272
276
|
if (!status.userSent) {
|
|
273
|
-
|
|
277
|
+
const userWeight = args.userWeight || user.weight || DEFAULT_USER_WEIGHT;
|
|
278
|
+
const bikeWeight = args.bikeWeight || defaultBikeWeight;
|
|
279
|
+
yield this.sendUserConfiguration(userWeight, bikeWeight, args.wheelDiameter, args.gearRatio);
|
|
274
280
|
status.userSent = true;
|
|
275
281
|
}
|
|
276
282
|
this.started = true;
|
package/lib/ble/ble-erg-mode.js
CHANGED
|
@@ -108,11 +108,11 @@ class BleERGCyclingMode extends power_base_1.default {
|
|
|
108
108
|
const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
109
109
|
if (power === 0 && speed < MIN_SPEED) {
|
|
110
110
|
data.speed = Math.round(prevData.speed - 1) < 0 ? 0 : Math.round(prevData.speed - 1);
|
|
111
|
-
data.distanceInternal =
|
|
111
|
+
data.distanceInternal = distanceInternal + data.speed / 3.6 * t;
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
114
|
data.speed = (power === 0 && speed < MIN_SPEED) ? 0 : speed;
|
|
115
|
-
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ?
|
|
115
|
+
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ? distanceInternal : distanceInternal + distance;
|
|
116
116
|
}
|
|
117
117
|
data.power = Math.round(power);
|
|
118
118
|
data.slope = slope;
|
package/lib/ble/ble-st-mode.js
CHANGED
|
@@ -78,11 +78,11 @@ class FtmsCyclingMode extends power_base_1.default {
|
|
|
78
78
|
const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
79
79
|
if (power === 0 && speed < MIN_SPEED) {
|
|
80
80
|
data.speed = Math.round(prevData.speed - 1) < 0 ? 0 : Math.round(prevData.speed - 1);
|
|
81
|
-
data.distanceInternal =
|
|
81
|
+
data.distanceInternal = distanceInternal + data.speed / 3.6 * t;
|
|
82
82
|
}
|
|
83
83
|
else {
|
|
84
84
|
data.speed = (power === 0 && speed < MIN_SPEED) ? 0 : speed;
|
|
85
|
-
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ?
|
|
85
|
+
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ? distanceInternal : distanceInternal + distance;
|
|
86
86
|
}
|
|
87
87
|
data.power = Math.round(power);
|
|
88
88
|
data.slope = slope;
|
package/lib/ble/ble.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
package/lib/ble/pwr.d.ts
CHANGED
|
@@ -54,6 +54,12 @@ export declare class PwrAdapter extends DeviceAdapter {
|
|
|
54
54
|
mode: CyclingMode;
|
|
55
55
|
distanceInternal: number;
|
|
56
56
|
prevDataTS: number;
|
|
57
|
+
userSettings: {
|
|
58
|
+
weight?: number;
|
|
59
|
+
};
|
|
60
|
+
bikeSettings: {
|
|
61
|
+
weight?: number;
|
|
62
|
+
};
|
|
57
63
|
constructor(device: BleDeviceClass, protocol: BleProtocol);
|
|
58
64
|
isBike(): boolean;
|
|
59
65
|
isHrm(): boolean;
|
|
@@ -65,6 +71,7 @@ export declare class PwrAdapter extends DeviceAdapter {
|
|
|
65
71
|
getCyclingMode(): CyclingMode;
|
|
66
72
|
getDefaultCyclingMode(): CyclingMode;
|
|
67
73
|
getPort(): string;
|
|
74
|
+
getWeight(): number;
|
|
68
75
|
setIgnoreBike(ignore: any): void;
|
|
69
76
|
setIgnorePower(ignore: any): void;
|
|
70
77
|
onDeviceData(deviceData: PowerData): void;
|
package/lib/ble/pwr.js
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
22
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
23
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -15,7 +34,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
34
|
exports.PwrAdapter = void 0;
|
|
16
35
|
const ble_device_1 = require("./ble-device");
|
|
17
36
|
const ble_interface_1 = __importDefault(require("./ble-interface"));
|
|
18
|
-
const Device_1 =
|
|
37
|
+
const Device_1 = __importStar(require("../Device"));
|
|
19
38
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
20
39
|
const power_meter_1 = __importDefault(require("../modes/power-meter"));
|
|
21
40
|
class BleCyclingPowerDevice extends ble_device_1.BleDevice {
|
|
@@ -172,6 +191,17 @@ class PwrAdapter extends Device_1.default {
|
|
|
172
191
|
getPort() {
|
|
173
192
|
return 'ble';
|
|
174
193
|
}
|
|
194
|
+
getWeight() {
|
|
195
|
+
let userWeight = Device_1.DEFAULT_USER_WEIGHT;
|
|
196
|
+
let bikeWeight = Device_1.DEFAULT_BIKE_WEIGHT;
|
|
197
|
+
if (this.userSettings && this.userSettings.weight) {
|
|
198
|
+
userWeight = Number(this.userSettings.weight);
|
|
199
|
+
}
|
|
200
|
+
if (this.bikeSettings && this.bikeSettings.weight) {
|
|
201
|
+
bikeWeight = Number(this.bikeSettings.weight);
|
|
202
|
+
}
|
|
203
|
+
return bikeWeight + userWeight;
|
|
204
|
+
}
|
|
175
205
|
setIgnoreBike(ignore) {
|
|
176
206
|
this.ignore = ignore;
|
|
177
207
|
}
|
|
@@ -230,6 +260,10 @@ class PwrAdapter extends Device_1.default {
|
|
|
230
260
|
}
|
|
231
261
|
start(props) {
|
|
232
262
|
return __awaiter(this, void 0, void 0, function* () {
|
|
263
|
+
if (props && props.user)
|
|
264
|
+
this.userSettings = props.user;
|
|
265
|
+
if (props && props.bikeSettings)
|
|
266
|
+
this.bikeSettings = props.bikeSettings;
|
|
233
267
|
this.logger.logEvent({ message: 'start requested', profile: this.getProfile(), props });
|
|
234
268
|
try {
|
|
235
269
|
const bleDevice = yield this.ble.connectDevice(this.device);
|
package/lib/ble/wahoo-kickr.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
package/lib/daum/DaumAdapter.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -112,8 +108,8 @@ class DaumAdapterBase extends Device_1.default {
|
|
|
112
108
|
}
|
|
113
109
|
}
|
|
114
110
|
getWeight() {
|
|
115
|
-
const userWeight = this.userSettings.weight || Device_1.DEFAULT_USER_WEIGHT;
|
|
116
|
-
const bikeWeight = this.bikeSettings.weight || Device_1.DEFAULT_BIKE_WEIGHT;
|
|
111
|
+
const userWeight = Number(this.userSettings.weight || Device_1.DEFAULT_USER_WEIGHT);
|
|
112
|
+
const bikeWeight = Number(this.bikeSettings.weight || Device_1.DEFAULT_BIKE_WEIGHT);
|
|
117
113
|
return bikeWeight + userWeight;
|
|
118
114
|
}
|
|
119
115
|
getCurrentBikeData() {
|
|
@@ -322,13 +318,13 @@ class DaumAdapterBase extends Device_1.default {
|
|
|
322
318
|
return;
|
|
323
319
|
let distance = 0;
|
|
324
320
|
if (this.distanceInternal !== undefined && this.cyclingData.distanceInternal !== undefined) {
|
|
325
|
-
distance =
|
|
321
|
+
distance = this.cyclingData.distanceInternal - this.distanceInternal;
|
|
326
322
|
}
|
|
327
323
|
if (this.cyclingData.distanceInternal !== undefined)
|
|
328
324
|
this.distanceInternal = this.cyclingData.distanceInternal;
|
|
329
325
|
let data = {
|
|
330
|
-
speed:
|
|
331
|
-
slope:
|
|
326
|
+
speed: this.cyclingData.speed,
|
|
327
|
+
slope: this.cyclingData.slope,
|
|
332
328
|
power: (0, utils_1.intVal)(this.cyclingData.power),
|
|
333
329
|
cadence: (0, utils_1.intVal)(this.cyclingData.pedalRpm),
|
|
334
330
|
heartrate: (0, utils_1.intVal)(this.cyclingData.heartrate),
|
|
@@ -370,7 +366,7 @@ class DaumAdapterBase extends Device_1.default {
|
|
|
370
366
|
}
|
|
371
367
|
catch (err) {
|
|
372
368
|
this.requestBusy = false;
|
|
373
|
-
this.logEvent({ message: 'error',
|
|
369
|
+
this.logEvent({ message: 'sendRequest error', error: err.message || err });
|
|
374
370
|
return;
|
|
375
371
|
}
|
|
376
372
|
});
|
|
@@ -147,9 +147,9 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
147
147
|
const m = this.getWeight();
|
|
148
148
|
const t = this.getTimeSinceLastUpdate();
|
|
149
149
|
const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
150
|
-
data.speed =
|
|
150
|
+
data.speed = speed;
|
|
151
151
|
data.power = Math.round(power);
|
|
152
|
-
data.distanceInternal =
|
|
152
|
+
data.distanceInternal = distanceInternal + distance;
|
|
153
153
|
data.slope = slope;
|
|
154
154
|
data.pedalRpm = rpm;
|
|
155
155
|
data.gear = gear;
|
|
@@ -222,7 +222,7 @@ class SmartTrainerCyclingMode extends CyclingMode_1.CyclingModeBase {
|
|
|
222
222
|
this.event.rpmUpdate = true;
|
|
223
223
|
let m = this.adapter.getWeight();
|
|
224
224
|
let distanceInternal = prevData.distanceInternal || 0;
|
|
225
|
-
let distance =
|
|
225
|
+
let distance = (distanceInternal / 100);
|
|
226
226
|
let ts = Date.now();
|
|
227
227
|
let duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
228
228
|
if (rpm === 0 || bikeData.isPedalling === false) {
|
|
@@ -238,7 +238,7 @@ class SmartTrainerCyclingMode extends CyclingMode_1.CyclingModeBase {
|
|
|
238
238
|
speed = this.calculateSpeed(gear, rpm, slope, speed, { fromPower, prevSpeed });
|
|
239
239
|
}
|
|
240
240
|
const v = speed / 3.6;
|
|
241
|
-
distanceInternal +=
|
|
241
|
+
distanceInternal += (v * duration);
|
|
242
242
|
}
|
|
243
243
|
data.speed = parseFloat(speed.toFixed(1));
|
|
244
244
|
data.power = Math.round(power);
|
|
@@ -83,7 +83,11 @@ class DaumClassicAdapter extends DaumAdapter_1.default {
|
|
|
83
83
|
return __awaiter(this, void 0, void 0, function* () {
|
|
84
84
|
this.logger.logEvent({ message: 'start()', props });
|
|
85
85
|
const opts = props || {};
|
|
86
|
-
const { user } =
|
|
86
|
+
const { user, bikeSettings } = opts;
|
|
87
|
+
if (user && user.weight)
|
|
88
|
+
this.userSettings.weight = user.weight;
|
|
89
|
+
if (bikeSettings && bikeSettings.weight)
|
|
90
|
+
this.bikeSettings.weight = bikeSettings.weight;
|
|
87
91
|
this.initData();
|
|
88
92
|
let startState = {};
|
|
89
93
|
return (0, utils_1.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -78,7 +78,7 @@ class DaumClassicCyclingMode extends SmartTrainerCyclingMode_1.default {
|
|
|
78
78
|
else {
|
|
79
79
|
const duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
80
80
|
let v = speed / 3.6;
|
|
81
|
-
distanceInternal +=
|
|
81
|
+
distanceInternal += (v * duration);
|
|
82
82
|
}
|
|
83
83
|
data.speed = parseFloat(speed.toFixed(1));
|
|
84
84
|
data.power = Math.round(power);
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -67,11 +67,11 @@ class DaumClassicCyclingMode extends DaumPowerMeterCyclingMode_1.default {
|
|
|
67
67
|
this.logger.logEvent({ message: '~~~ distance overflow', distanceBike, distancePrev });
|
|
68
68
|
let v = speed / 3.6;
|
|
69
69
|
let duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
70
|
-
distanceInternal = distancePrev +
|
|
70
|
+
distanceInternal = distancePrev + v * duration;
|
|
71
71
|
}
|
|
72
72
|
data.speed = parseFloat(speed.toFixed(1));
|
|
73
73
|
data.power = Math.round(power);
|
|
74
|
-
data.distanceInternal =
|
|
74
|
+
data.distanceInternal = distanceInternal;
|
|
75
75
|
data.slope = slope;
|
|
76
76
|
this.logger.logEvent({ message: "updateData result", data, bikeData, prevRequest: {}, prevSpeed: prevData.speed });
|
|
77
77
|
this.data = JSON.parse(JSON.stringify(data));
|
|
@@ -68,6 +68,10 @@ class DaumPremiumDevice extends DaumAdapter_1.default {
|
|
|
68
68
|
console.log('~~~setPersonSupport:', this.getCyclingMode().getModeProperty('setPersonSupport'));
|
|
69
69
|
console.log('~~~eppSupport:', this.getCyclingMode().getModeProperty('eppSupport'));
|
|
70
70
|
const opts = props || {};
|
|
71
|
+
if (opts.user && opts.user.weight)
|
|
72
|
+
this.userSettings.weight = opts.user.weight;
|
|
73
|
+
if (opts.bikeSettings && opts.bikeSettings.weight)
|
|
74
|
+
this.bikeSettings.weight = opts.bikeSettings.weight;
|
|
71
75
|
const user = opts.user || this.userSettings;
|
|
72
76
|
const route = opts.route;
|
|
73
77
|
var info = {};
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
package/lib/kettler/comms.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -28,7 +28,7 @@ export default class KettlerRacerProtocol extends DeviceProtocolBase implements
|
|
|
28
28
|
isBike(): boolean;
|
|
29
29
|
isHrm(): boolean;
|
|
30
30
|
isPower(): boolean;
|
|
31
|
-
add(settings: DeviceSettings):
|
|
31
|
+
add(settings: DeviceSettings): any;
|
|
32
32
|
scan(props: KettlerRacerScanProps): void;
|
|
33
33
|
checkDevice(port: string): boolean;
|
|
34
34
|
doScan(port: string): Promise<void>;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
package/lib/modes/power-meter.js
CHANGED
|
@@ -59,11 +59,11 @@ class PowerMeterCyclingMode extends power_base_1.default {
|
|
|
59
59
|
data.slope = slope;
|
|
60
60
|
if (power === 0 && speed < MIN_SPEED) {
|
|
61
61
|
data.speed = Math.round(prevData.speed - 1) < 0 ? 0 : Math.round(prevData.speed - 1);
|
|
62
|
-
data.distanceInternal =
|
|
62
|
+
data.distanceInternal = distanceInternal + data.speed / 3.6 * t;
|
|
63
63
|
}
|
|
64
64
|
else {
|
|
65
65
|
data.speed = (power === 0 && speed < MIN_SPEED) ? 0 : speed;
|
|
66
|
-
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ?
|
|
66
|
+
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ? distanceInternal : distanceInternal + distance;
|
|
67
67
|
}
|
|
68
68
|
if (props.log)
|
|
69
69
|
this.logger.logEvent({ message: "updateData result", data, bikeData, prevSpeed: prevData.speed, stopped: speed < MIN_SPEED });
|
package/lib/modes/simulator.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { EventLogger } from "gd-eventlog";
|
|
2
|
-
import
|
|
2
|
+
import { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../CyclingMode";
|
|
3
3
|
import { Simulator } from "../simulator/Simulator";
|
|
4
|
+
import PowerBasedCyclingModeBase from "./power-base";
|
|
4
5
|
export declare type ERGEvent = {
|
|
5
6
|
rpmUpdated?: boolean;
|
|
6
7
|
gearUpdated?: boolean;
|
|
7
8
|
starting?: boolean;
|
|
8
9
|
tsStart?: number;
|
|
9
10
|
};
|
|
10
|
-
export default class SimulatorCyclingMode extends
|
|
11
|
+
export default class SimulatorCyclingMode extends PowerBasedCyclingModeBase {
|
|
11
12
|
logger: EventLogger;
|
|
12
13
|
data: IncyclistBikeData;
|
|
13
14
|
prevRequest: UpdateRequest;
|
package/lib/modes/simulator.js
CHANGED
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
7
7
|
const CyclingMode_1 = require("../CyclingMode");
|
|
8
|
-
const
|
|
8
|
+
const power_base_1 = __importDefault(require("./power-base"));
|
|
9
9
|
const config = {
|
|
10
10
|
name: "Simulator",
|
|
11
11
|
description: "Simulates a ride with constant speed or power output",
|
|
@@ -14,9 +14,10 @@ const config = {
|
|
|
14
14
|
{ key: 'delay', name: 'Start Delay', description: 'Delay (in s) at start of training', type: CyclingMode_1.CyclingModeProperyType.Integer, default: 2, min: 0, max: 30 },
|
|
15
15
|
{ key: 'power', name: 'Power', description: 'Power (in W) at start of training', condition: (s) => !s.mode || s.mode === 'Power', type: CyclingMode_1.CyclingModeProperyType.Integer, default: 150, min: 25, max: 800 },
|
|
16
16
|
{ key: 'speed', name: 'Speed', description: 'Speed (in km/h) at start of training', condition: (s) => s.mode === 'Speed', type: CyclingMode_1.CyclingModeProperyType.Integer, default: 30, min: 5, max: 50 },
|
|
17
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: CyclingMode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' }
|
|
17
18
|
]
|
|
18
19
|
};
|
|
19
|
-
class SimulatorCyclingMode extends
|
|
20
|
+
class SimulatorCyclingMode extends power_base_1.default {
|
|
20
21
|
constructor(adapter, props) {
|
|
21
22
|
super(adapter, props);
|
|
22
23
|
this.prevUpdateTS = 0;
|
|
@@ -62,41 +63,52 @@ class SimulatorCyclingMode extends CyclingMode_1.CyclingModeBase {
|
|
|
62
63
|
const prevSpeed = prevData.speed;
|
|
63
64
|
const prevRequest = this.prevRequest || {};
|
|
64
65
|
const data = this.data || {};
|
|
66
|
+
const bikeType = (this.getSetting('bikeType') || 'Race').toLowerCase();
|
|
65
67
|
const mode = this.getSetting('mode');
|
|
66
68
|
delete this.event.gearUpdated;
|
|
67
69
|
delete this.event.rpmUpdated;
|
|
68
70
|
try {
|
|
69
71
|
let rpm = 90;
|
|
70
|
-
let power = (mode === '
|
|
72
|
+
let power = (!mode || mode.toLowerCase() === 'power') ? Number(this.getSetting('power')) : bikeData.power || 0;
|
|
71
73
|
let slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
|
|
72
|
-
let speed = mode === '
|
|
73
|
-
let m =
|
|
74
|
+
let speed = mode.toLowerCase() === 'speed' ? Number(this.getSetting('speed')) : bikeData.speed || 0;
|
|
75
|
+
let m = this.getWeight();
|
|
74
76
|
let distanceInternal = prevData.distanceInternal || 0;
|
|
75
77
|
let ts = Date.now();
|
|
76
78
|
let duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
const t = this.getTimeSinceLastUpdate();
|
|
80
|
+
let distance = 0;
|
|
81
|
+
if (!mode || mode.toLowerCase() === 'power') {
|
|
82
|
+
const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
83
|
+
speed = res.speed;
|
|
84
|
+
distance = res.distance;
|
|
79
85
|
}
|
|
80
|
-
else if (mode === '
|
|
81
|
-
|
|
86
|
+
else if (mode.toLowerCase() === 'speed') {
|
|
87
|
+
const res = this.calculatePowerAndDistance(speed, slope, m, t, { bikeType });
|
|
88
|
+
power = res.power;
|
|
89
|
+
distance = res.distance;
|
|
82
90
|
}
|
|
83
91
|
if (prevRequest.targetPower) {
|
|
84
92
|
power = prevRequest.targetPower;
|
|
85
|
-
|
|
93
|
+
const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
94
|
+
speed = res.speed;
|
|
95
|
+
distance = res.distance;
|
|
86
96
|
}
|
|
87
97
|
if (prevRequest.maxPower && power > prevRequest.maxPower) {
|
|
88
98
|
power = prevRequest.maxPower;
|
|
89
|
-
|
|
99
|
+
const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
100
|
+
speed = res.speed;
|
|
101
|
+
distance = res.distance;
|
|
90
102
|
}
|
|
91
103
|
else if (prevRequest.minPower && power < prevRequest.minPower) {
|
|
92
104
|
power = prevRequest.minPower;
|
|
93
|
-
|
|
105
|
+
const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
106
|
+
speed = res.speed;
|
|
107
|
+
distance = res.distance;
|
|
94
108
|
}
|
|
95
|
-
|
|
96
|
-
distanceInternal += Math.round(v * duration);
|
|
97
|
-
data.speed = parseFloat(speed.toFixed(1));
|
|
109
|
+
data.speed = speed;
|
|
98
110
|
data.power = Math.round(power);
|
|
99
|
-
data.distanceInternal = distanceInternal;
|
|
111
|
+
data.distanceInternal = distanceInternal + distance;
|
|
100
112
|
data.slope = slope;
|
|
101
113
|
data.pedalRpm = rpm;
|
|
102
114
|
if (data.time !== undefined)
|
|
@@ -24,6 +24,12 @@ export declare class Simulator extends DeviceAdapter {
|
|
|
24
24
|
data: IncyclistBikeData;
|
|
25
25
|
isBot: boolean;
|
|
26
26
|
ignoreHrm: boolean;
|
|
27
|
+
userSettings: {
|
|
28
|
+
weight?: number;
|
|
29
|
+
};
|
|
30
|
+
bikeSettings: {
|
|
31
|
+
weight?: number;
|
|
32
|
+
};
|
|
27
33
|
constructor(protocol?: DeviceProtocol, props?: SimulatorSettings);
|
|
28
34
|
isBike(): boolean;
|
|
29
35
|
isHrm(): boolean;
|
|
@@ -32,6 +38,7 @@ export declare class Simulator extends DeviceAdapter {
|
|
|
32
38
|
getID(): string;
|
|
33
39
|
getName(): string;
|
|
34
40
|
getPort(): string;
|
|
41
|
+
getWeight(): number;
|
|
35
42
|
setIgnoreHrm(ignore: any): void;
|
|
36
43
|
getSupportedCyclingModes(): Array<any>;
|
|
37
44
|
getDefaultCyclingMode(): CyclingMode;
|
|
@@ -51,7 +58,7 @@ export declare class Simulator extends DeviceAdapter {
|
|
|
51
58
|
export default class SimulatorProtocol extends DeviceProtocolBase {
|
|
52
59
|
static NAME: string;
|
|
53
60
|
constructor();
|
|
54
|
-
add(settings: SimulatorSettings):
|
|
61
|
+
add(settings: SimulatorSettings): any;
|
|
55
62
|
getName(): string;
|
|
56
63
|
getInterfaces(): string[];
|
|
57
64
|
isBike(): boolean;
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
9
5
|
}) : (function(o, m, k, k2) {
|
|
10
6
|
if (k2 === undefined) k2 = k;
|
|
11
7
|
o[k2] = m[k];
|
|
@@ -41,6 +37,7 @@ const DeviceRegistry_1 = __importDefault(require("../DeviceRegistry"));
|
|
|
41
37
|
const Device_1 = __importDefault(require("../Device"));
|
|
42
38
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
43
39
|
const simulator_1 = __importDefault(require("../modes/simulator"));
|
|
40
|
+
const Device_2 = require("../Device");
|
|
44
41
|
const DEFAULT_SETTINGS = { name: 'Simulator', port: '', isBot: false };
|
|
45
42
|
class Simulator extends Device_1.default {
|
|
46
43
|
constructor(protocol, props = DEFAULT_SETTINGS) {
|
|
@@ -76,6 +73,17 @@ class Simulator extends Device_1.default {
|
|
|
76
73
|
getID() { return Simulator.NAME; }
|
|
77
74
|
getName() { return Simulator.NAME; }
|
|
78
75
|
getPort() { return 'local'; }
|
|
76
|
+
getWeight() {
|
|
77
|
+
let userWeight = Device_2.DEFAULT_USER_WEIGHT;
|
|
78
|
+
let bikeWeight = Device_2.DEFAULT_BIKE_WEIGHT;
|
|
79
|
+
if (this.userSettings && this.userSettings.weight) {
|
|
80
|
+
userWeight = Number(this.userSettings.weight);
|
|
81
|
+
}
|
|
82
|
+
if (this.bikeSettings && this.bikeSettings.weight) {
|
|
83
|
+
bikeWeight = Number(this.bikeSettings.weight);
|
|
84
|
+
}
|
|
85
|
+
return bikeWeight + userWeight;
|
|
86
|
+
}
|
|
79
87
|
setIgnoreHrm(ignore) {
|
|
80
88
|
this.ignoreHrm = ignore;
|
|
81
89
|
}
|
|
@@ -112,6 +120,10 @@ class Simulator extends Device_1.default {
|
|
|
112
120
|
start(props) {
|
|
113
121
|
return __awaiter(this, void 0, void 0, function* () {
|
|
114
122
|
this.startProps = props;
|
|
123
|
+
if (props && props.user)
|
|
124
|
+
this.userSettings = props.user;
|
|
125
|
+
if (props && props.bikeSettings)
|
|
126
|
+
this.bikeSettings = props.bikeSettings;
|
|
115
127
|
return new Promise((resolve) => {
|
|
116
128
|
if (!this.isBot)
|
|
117
129
|
this.logger.logEvent({ message: 'start', iv: this.iv });
|
|
@@ -121,6 +133,12 @@ class Simulator extends Device_1.default {
|
|
|
121
133
|
this.started = true;
|
|
122
134
|
this.time = Date.now();
|
|
123
135
|
this.startTS = this.time;
|
|
136
|
+
if (this.isBot) {
|
|
137
|
+
this.startTS = props.activity ? Date.parse(props.activity.startTime) : this.startTS - 1500;
|
|
138
|
+
const sm = this.getCyclingMode();
|
|
139
|
+
sm.prevUpdateTS = this.startTS;
|
|
140
|
+
this.update();
|
|
141
|
+
}
|
|
124
142
|
if (this.iv !== undefined) {
|
|
125
143
|
clearInterval(this.iv);
|
|
126
144
|
this.iv = undefined;
|
|
@@ -196,8 +214,9 @@ class Simulator extends Device_1.default {
|
|
|
196
214
|
update() {
|
|
197
215
|
const startDelay = this.getCyclingMode().getSetting('delay');
|
|
198
216
|
const timeSinceStart = Date.now() - this.startTS;
|
|
199
|
-
if (startDelay && timeSinceStart < startDelay * 1000)
|
|
217
|
+
if (!this.isBot && startDelay && timeSinceStart < startDelay * 1000) {
|
|
200
218
|
return;
|
|
219
|
+
}
|
|
201
220
|
const prevDist = this.data.distanceInternal;
|
|
202
221
|
this.data = this.getCyclingMode().updateData(this.data);
|
|
203
222
|
let data = {
|
|
@@ -208,7 +227,7 @@ class Simulator extends Device_1.default {
|
|
|
208
227
|
distance: this.data.distanceInternal - prevDist,
|
|
209
228
|
heartrate: Math.round(this.data.power - 10 + Math.random() * 20),
|
|
210
229
|
timestamp: Date.now(),
|
|
211
|
-
deviceTime:
|
|
230
|
+
deviceTime: (Date.now() - this.startTS) / 1000,
|
|
212
231
|
deviceDistanceCounter: this.data.distanceInternal
|
|
213
232
|
};
|
|
214
233
|
this.paused = (this.data.speed === 0);
|