incyclist-devices 1.4.53 → 1.4.56
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/DeviceSupport.js +1 -5
- package/lib/ant/AntScanner.js +1 -5
- package/lib/ant/antfe/AntFEAdapter.d.ts +43 -2
- package/lib/ant/antfe/AntFEAdapter.js +75 -38
- package/lib/ant/antfe/ant-fe-erg-mode.d.ts +5 -0
- package/lib/ant/antfe/ant-fe-erg-mode.js +13 -0
- package/lib/ant/antfe/ant-fe-st-mode.d.ts +7 -0
- package/lib/ant/antfe/ant-fe-st-mode.js +52 -0
- package/lib/ble/ble-erg-mode.d.ts +2 -2
- package/lib/ble/ble-erg-mode.js +2 -2
- package/lib/ble/ble-st-mode.d.ts +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/wahoo-kickr.js +1 -5
- package/lib/daum/DaumAdapter.js +1 -5
- package/lib/daum/ERGCyclingMode.js +1 -1
- package/lib/daum/SmartTrainerCyclingMode.js +2 -2
- 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/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.js +1 -1
- package/lib/simulator/Simulator.d.ts +1 -1
- package/lib/simulator/Simulator.js +1 -5
- package/package.json +1 -1
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/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];
|
|
@@ -1,5 +1,41 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import AntAdapter from '../AntAdapter';
|
|
2
3
|
import { Queue } from '../../utils';
|
|
4
|
+
import CyclingMode, { IncyclistBikeData } from '../../CyclingMode';
|
|
5
|
+
export declare type AntFEDeviceData = {
|
|
6
|
+
DeviceID: number;
|
|
7
|
+
Temperature?: number;
|
|
8
|
+
ZeroOffset?: number;
|
|
9
|
+
SpinDownTime?: number;
|
|
10
|
+
EquipmentType?: 'Treadmill' | 'Elliptical' | 'StationaryBike' | 'Rower' | 'Climber' | 'NordicSkier' | 'Trainer' | 'General';
|
|
11
|
+
ElapsedTime?: number;
|
|
12
|
+
Distance?: number;
|
|
13
|
+
RealSpeed?: number;
|
|
14
|
+
VirtualSpeed?: number;
|
|
15
|
+
HeartRate?: number;
|
|
16
|
+
HeartRateSource?: 'HandContact' | 'EM' | 'ANT+';
|
|
17
|
+
State?: 'OFF' | 'READY' | 'IN_USE' | 'FINISHED';
|
|
18
|
+
CycleLength?: number;
|
|
19
|
+
Incline?: number;
|
|
20
|
+
Resistance?: number;
|
|
21
|
+
METs?: number;
|
|
22
|
+
CaloricBurnRate?: number;
|
|
23
|
+
Calories?: number;
|
|
24
|
+
_EventCount0x19?: number;
|
|
25
|
+
Cadence?: number;
|
|
26
|
+
AccumulatedPower?: number;
|
|
27
|
+
InstantaneousPower?: number;
|
|
28
|
+
AveragePower?: number;
|
|
29
|
+
TrainerStatus?: number;
|
|
30
|
+
TargetStatus?: 'OnTarget' | 'LowSpeed' | 'HighSpeed';
|
|
31
|
+
HwVersion?: number;
|
|
32
|
+
ManId?: number;
|
|
33
|
+
ModelNum?: number;
|
|
34
|
+
SwVersion?: number;
|
|
35
|
+
SerialNumber?: number;
|
|
36
|
+
PairedDevices?: any[];
|
|
37
|
+
RawData: Buffer;
|
|
38
|
+
};
|
|
3
39
|
export default class AntFEAdapter extends AntAdapter {
|
|
4
40
|
started: boolean;
|
|
5
41
|
starting: boolean;
|
|
@@ -8,6 +44,7 @@ export default class AntFEAdapter extends AntAdapter {
|
|
|
8
44
|
queue?: Queue<any>;
|
|
9
45
|
workerId?: any;
|
|
10
46
|
currentCmd?: any;
|
|
47
|
+
cyclingMode: CyclingMode;
|
|
11
48
|
constructor(DeviceID: any, port: any, stick: any, protocol: any);
|
|
12
49
|
isBike(): boolean;
|
|
13
50
|
isHrm(): boolean;
|
|
@@ -15,11 +52,15 @@ export default class AntFEAdapter extends AntAdapter {
|
|
|
15
52
|
getProfile(): string;
|
|
16
53
|
getName(): string;
|
|
17
54
|
getDisplayName(): string;
|
|
55
|
+
getSupportedCyclingModes(): Array<any>;
|
|
56
|
+
setCyclingMode(mode: string | CyclingMode, settings?: any): void;
|
|
57
|
+
getCyclingMode(): CyclingMode;
|
|
58
|
+
getDefaultCyclingMode(): CyclingMode;
|
|
18
59
|
onAttached(): void;
|
|
19
60
|
getLogData(data: any, excludeList: any): any;
|
|
20
|
-
onDeviceData(deviceData:
|
|
61
|
+
onDeviceData(deviceData: AntFEDeviceData): void;
|
|
62
|
+
mapData(deviceData: AntFEDeviceData): IncyclistBikeData;
|
|
21
63
|
onDeviceEvent(data: any): void;
|
|
22
|
-
updateData(data: any, deviceData: any): any;
|
|
23
64
|
transformData(bikeData: any): any;
|
|
24
65
|
start(props?: any): Promise<any>;
|
|
25
66
|
stop(): Promise<boolean>;
|
|
@@ -16,6 +16,8 @@ const gd_eventlog_1 = require("gd-eventlog");
|
|
|
16
16
|
const AntAdapter_1 = __importDefault(require("../AntAdapter"));
|
|
17
17
|
const utils_1 = require("../utils");
|
|
18
18
|
const utils_2 = require("../../utils");
|
|
19
|
+
const ant_fe_st_mode_1 = __importDefault(require("./ant-fe-st-mode"));
|
|
20
|
+
const ant_fe_erg_mode_1 = __importDefault(require("./ant-fe-erg-mode"));
|
|
19
21
|
const floatVal = (d) => d ? parseFloat(d) : d;
|
|
20
22
|
const intVal = (d) => d ? parseInt(d) : d;
|
|
21
23
|
const hex = (v) => Math.abs(v).toString(16).toUpperCase();
|
|
@@ -23,7 +25,8 @@ const TIMEOUT_ACK = 5000;
|
|
|
23
25
|
const TIMEOUT_START = 10000;
|
|
24
26
|
const TIMEOUT_ATTACH = 3000;
|
|
25
27
|
const DEFAULT_USER_WEIGHT = 75;
|
|
26
|
-
const DEFAULT_BIKE_WEIGHT =
|
|
28
|
+
const DEFAULT_BIKE_WEIGHT = 10;
|
|
29
|
+
const DEFAULT_BIKE_WEIGHT_MOUNTAIN = 14.5;
|
|
27
30
|
class AntFEAdapter extends AntAdapter_1.default {
|
|
28
31
|
constructor(DeviceID, port, stick, protocol) {
|
|
29
32
|
super(protocol);
|
|
@@ -54,6 +57,34 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
54
57
|
const hrmStr = ComputedHeartRate ? ` (${ComputedHeartRate})` : '';
|
|
55
58
|
return `${(0, utils_1.getBrand)(ManId)} FE ${DeviceID}${hrmStr}`;
|
|
56
59
|
}
|
|
60
|
+
getSupportedCyclingModes() {
|
|
61
|
+
return [ant_fe_st_mode_1.default, ant_fe_erg_mode_1.default];
|
|
62
|
+
}
|
|
63
|
+
setCyclingMode(mode, settings) {
|
|
64
|
+
let selectedMode;
|
|
65
|
+
if (typeof mode === 'string') {
|
|
66
|
+
const supported = this.getSupportedCyclingModes();
|
|
67
|
+
const CyclingModeClass = supported.find(M => { const m = new M(this); return m.getName() === mode; });
|
|
68
|
+
if (CyclingModeClass) {
|
|
69
|
+
this.cyclingMode = new CyclingModeClass(this, settings);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
selectedMode = this.getDefaultCyclingMode();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
selectedMode = mode;
|
|
76
|
+
}
|
|
77
|
+
this.cyclingMode = selectedMode;
|
|
78
|
+
this.cyclingMode.setSettings(settings);
|
|
79
|
+
}
|
|
80
|
+
getCyclingMode() {
|
|
81
|
+
if (!this.cyclingMode)
|
|
82
|
+
this.cyclingMode = this.getDefaultCyclingMode();
|
|
83
|
+
return this.cyclingMode;
|
|
84
|
+
}
|
|
85
|
+
getDefaultCyclingMode() {
|
|
86
|
+
return new ant_fe_st_mode_1.default(this);
|
|
87
|
+
}
|
|
57
88
|
onAttached() {
|
|
58
89
|
this.logger.logEvent({ message: 'Device connected' });
|
|
59
90
|
this.connected = true;
|
|
@@ -74,8 +105,9 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
74
105
|
if (!this.lastUpdate || (Date.now() - this.lastUpdate) > this.updateFrequency) {
|
|
75
106
|
const logData = this.getLogData(deviceData, ['PairedDevices', 'RawData']);
|
|
76
107
|
this.logger.logEvent({ message: 'onDeviceData', data: logData });
|
|
77
|
-
|
|
78
|
-
|
|
108
|
+
let incyclistData = this.mapData(deviceData);
|
|
109
|
+
incyclistData = this.getCyclingMode().updateData(incyclistData);
|
|
110
|
+
const data = this.transformData(incyclistData);
|
|
79
111
|
this.onDataFn(data);
|
|
80
112
|
this.lastUpdate = Date.now();
|
|
81
113
|
}
|
|
@@ -84,6 +116,25 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
84
116
|
catch (err) {
|
|
85
117
|
}
|
|
86
118
|
}
|
|
119
|
+
mapData(deviceData) {
|
|
120
|
+
const data = {
|
|
121
|
+
isPedalling: false,
|
|
122
|
+
power: 0,
|
|
123
|
+
pedalRpm: undefined,
|
|
124
|
+
speed: 0,
|
|
125
|
+
heartrate: 0,
|
|
126
|
+
distanceInternal: 0,
|
|
127
|
+
slope: undefined,
|
|
128
|
+
time: undefined
|
|
129
|
+
};
|
|
130
|
+
data.speed = (deviceData.VirtualSpeed !== undefined ? deviceData.VirtualSpeed : (deviceData.RealSpeed || 0)) * 3.6;
|
|
131
|
+
data.slope = (deviceData.Incline !== undefined ? deviceData.Incline : data.slope);
|
|
132
|
+
data.power = (deviceData.InstantaneousPower !== undefined ? deviceData.InstantaneousPower : data.power);
|
|
133
|
+
data.time = (deviceData.ElapsedTime !== undefined ? deviceData.ElapsedTime : data.time);
|
|
134
|
+
data.pedalRpm = (deviceData.Cadence !== undefined ? deviceData.Cadence : data.pedalRpm);
|
|
135
|
+
data.isPedalling = data.pedalRpm > 0 || (data.pedalRpm === undefined && data.power > 0);
|
|
136
|
+
return data;
|
|
137
|
+
}
|
|
87
138
|
onDeviceEvent(data) {
|
|
88
139
|
try {
|
|
89
140
|
const cmdInfo = this.currentCmd;
|
|
@@ -127,43 +178,21 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
127
178
|
this.logger.logEvent({ message: 'Error', fn: 'parseEvent', event: { message: hex(data.message), code: hex(data.code) }, error: err.message || err });
|
|
128
179
|
}
|
|
129
180
|
}
|
|
130
|
-
updateData(data, deviceData) {
|
|
131
|
-
if (data.distanceOffs === undefined)
|
|
132
|
-
data.distanceOffs = 0;
|
|
133
|
-
data.speed = (deviceData.VirtualSpeed !== undefined ? deviceData.VirtualSpeed : deviceData.RealSpeed) * 3.6;
|
|
134
|
-
data.slope = (deviceData.Incline !== undefined ? deviceData.Incline : data.slope);
|
|
135
|
-
data.power = (deviceData.InstantaneousPower !== undefined ? deviceData.InstantaneousPower : data.power);
|
|
136
|
-
data.pedalRpm = (deviceData.Cadence !== undefined ? deviceData.Cadence : data.pedalRpm);
|
|
137
|
-
data.heartrate = (deviceData.HeartRate !== undefined ? deviceData.HeartRate : data.heartrate);
|
|
138
|
-
if (deviceData.Distance !== undefined && deviceData.Distance !== 0) {
|
|
139
|
-
data.distanceInternal = deviceData.Distance - data.distanceOffs;
|
|
140
|
-
data.distance = data.distanceInternal / 1000;
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
if (this.lastUpdate && deviceData.Cadence !== undefined && deviceData.Cadence > 0 && data.speed) {
|
|
144
|
-
const t = (Date.now() - this.lastUpdate) / 1000;
|
|
145
|
-
const prevDistance = data.distanceInternal || 0;
|
|
146
|
-
data.distanceInternal = Math.round(data.speed / 3.6 * t) + prevDistance;
|
|
147
|
-
data.distance = data.distanceInternal / 1000;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return data;
|
|
151
|
-
}
|
|
152
181
|
transformData(bikeData) {
|
|
153
182
|
if (bikeData === undefined)
|
|
154
183
|
return;
|
|
155
184
|
let distance = 0;
|
|
156
185
|
if (this.distanceInternal !== undefined && bikeData.distanceInternal !== undefined) {
|
|
157
|
-
distance =
|
|
186
|
+
distance = Math.round(bikeData.distanceInternal - this.distanceInternal);
|
|
158
187
|
}
|
|
159
188
|
if (bikeData.distanceInternal !== undefined)
|
|
160
189
|
this.distanceInternal = bikeData.distanceInternal;
|
|
161
190
|
let data = {
|
|
162
|
-
speed:
|
|
163
|
-
slope:
|
|
164
|
-
power:
|
|
165
|
-
cadence:
|
|
166
|
-
heartrate:
|
|
191
|
+
speed: bikeData.speed,
|
|
192
|
+
slope: bikeData.slope,
|
|
193
|
+
power: bikeData.power !== undefined ? Math.round(bikeData.power) : undefined,
|
|
194
|
+
cadence: bikeData.pedalRpm !== undefined ? Math.round(bikeData.pedalRpm) : undefined,
|
|
195
|
+
heartrate: bikeData.heartrate !== undefined ? Math.round(bikeData.heartrate) : undefined,
|
|
167
196
|
distance,
|
|
168
197
|
timestamp: Date.now()
|
|
169
198
|
};
|
|
@@ -186,7 +215,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
186
215
|
yield _super.start.call(this, props);
|
|
187
216
|
this.logger.logEvent({ message: 'start()', props });
|
|
188
217
|
const opts = props || {};
|
|
189
|
-
const { args = {} } = opts;
|
|
218
|
+
const { args = {}, user = {} } = opts;
|
|
190
219
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
191
220
|
if (this.ignoreHrm && this.ignoreBike && this.ignorePower) {
|
|
192
221
|
this.logger.logEvent({ message: 'start() not done: bike disabled' });
|
|
@@ -241,8 +270,13 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
241
270
|
yield this.sendTrackResistance(0.0);
|
|
242
271
|
status.trackResistanceSent = true;
|
|
243
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;
|
|
244
276
|
if (!status.userSent) {
|
|
245
|
-
|
|
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);
|
|
246
280
|
status.userSent = true;
|
|
247
281
|
}
|
|
248
282
|
this.started = true;
|
|
@@ -295,14 +329,17 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
295
329
|
}
|
|
296
330
|
sendUpdate(request) {
|
|
297
331
|
return __awaiter(this, void 0, void 0, function* () {
|
|
298
|
-
this.
|
|
332
|
+
if (this.paused)
|
|
333
|
+
return;
|
|
334
|
+
const update = this.getCyclingMode().sendBikeUpdate(request);
|
|
335
|
+
this.logger.logEvent({ message: 'send bike update requested', update, request });
|
|
299
336
|
try {
|
|
300
337
|
const isReset = (!request || request.reset || Object.keys(request).length === 0);
|
|
301
|
-
if (
|
|
302
|
-
yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTrackResistance(
|
|
338
|
+
if (update.slope !== undefined) {
|
|
339
|
+
yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTrackResistance(update.slope); }), 2, 100);
|
|
303
340
|
}
|
|
304
|
-
if (
|
|
305
|
-
yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(
|
|
341
|
+
if (update.targetPower !== undefined) {
|
|
342
|
+
yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(update.targetPower); }), 2, 100);
|
|
306
343
|
}
|
|
307
344
|
else if (request.maxPower !== undefined) {
|
|
308
345
|
if (this.data.power && this.data.power > request.maxPower)
|
|
@@ -0,0 +1,13 @@
|
|
|
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_erg_mode_1 = __importDefault(require("../../ble/ble-erg-mode"));
|
|
7
|
+
class AntFeERGCyclingMode extends ble_erg_mode_1.default {
|
|
8
|
+
constructor(adapter, props) {
|
|
9
|
+
super(adapter, props);
|
|
10
|
+
this.initLogger('AntERGMode');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = AntFeERGCyclingMode;
|
|
@@ -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,52 @@
|
|
|
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
|
+
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;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.default = AntStCyclingMode;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import CyclingMode, { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../CyclingMode";
|
|
2
|
+
import { DeviceAdapter } from "../Device";
|
|
2
3
|
import PowerBasedCyclingModeBase from "../modes/power-base";
|
|
3
|
-
import { FmAdapter } from "./fm";
|
|
4
4
|
export default class BleERGCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
|
|
5
5
|
prevRequest: UpdateRequest;
|
|
6
6
|
hasBikeUpdate: boolean;
|
|
7
7
|
chain: number[];
|
|
8
8
|
cassette: number[];
|
|
9
|
-
constructor(adapter:
|
|
9
|
+
constructor(adapter: DeviceAdapter, props?: any);
|
|
10
10
|
getName(): string;
|
|
11
11
|
getDescription(): string;
|
|
12
12
|
getProperties(): CyclingModeProperty[];
|
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.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import CyclingMode, { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../CyclingMode";
|
|
2
|
+
import { DeviceAdapter } from "../Device";
|
|
2
3
|
import PowerBasedCyclingModeBase from "../modes/power-base";
|
|
3
|
-
import { FmAdapter } from "./fm";
|
|
4
4
|
export default class FtmsCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
|
|
5
5
|
prevRequest: UpdateRequest;
|
|
6
6
|
hasBikeUpdate: boolean;
|
|
7
|
-
constructor(adapter:
|
|
7
|
+
constructor(adapter: DeviceAdapter, props?: any);
|
|
8
8
|
getName(): string;
|
|
9
9
|
getDescription(): string;
|
|
10
10
|
getProperties(): CyclingModeProperty[];
|
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/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];
|
|
@@ -149,7 +149,7 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
149
149
|
const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
150
150
|
data.speed = parseFloat(speed.toFixed(1));
|
|
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);
|
|
@@ -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));
|
|
@@ -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.js
CHANGED
|
@@ -93,7 +93,7 @@ class SimulatorCyclingMode extends CyclingMode_1.CyclingModeBase {
|
|
|
93
93
|
speed = calculations_1.default.calculateSpeed(m, power, slope, { bikeType: 'race' });
|
|
94
94
|
}
|
|
95
95
|
let v = speed / 3.6;
|
|
96
|
-
distanceInternal +=
|
|
96
|
+
distanceInternal += (v * duration);
|
|
97
97
|
data.speed = parseFloat(speed.toFixed(1));
|
|
98
98
|
data.power = Math.round(power);
|
|
99
99
|
data.distanceInternal = distanceInternal;
|
|
@@ -51,7 +51,7 @@ export declare class Simulator extends DeviceAdapter {
|
|
|
51
51
|
export default class SimulatorProtocol extends DeviceProtocolBase {
|
|
52
52
|
static NAME: string;
|
|
53
53
|
constructor();
|
|
54
|
-
add(settings: SimulatorSettings):
|
|
54
|
+
add(settings: SimulatorSettings): any;
|
|
55
55
|
getName(): string;
|
|
56
56
|
getInterfaces(): string[];
|
|
57
57
|
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];
|