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.
@@ -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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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,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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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: any): void;
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 = 12.75;
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
- this.data = this.updateData(this.data, deviceData);
78
- const data = this.transformData(this.data);
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 = intVal(bikeData.distanceInternal - this.distanceInternal);
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: floatVal(bikeData.speed),
163
- slope: floatVal(bikeData.slope),
164
- power: intVal(bikeData.power),
165
- cadence: intVal(bikeData.pedalRpm),
166
- heartrate: intVal(bikeData.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
- yield this.sendUserConfiguration(args.userWeight || DEFAULT_USER_WEIGHT, args.bikeWeight || DEFAULT_BIKE_WEIGHT, args.wheelDiameter, args.gearRatio);
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.logger.logEvent({ message: "sendBikeUpdate():", request });
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 (request.slope !== undefined) {
302
- yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTrackResistance(request.slope); }), 2, 100);
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 (request.targetPower !== undefined) {
305
- yield (0, utils_2.runWithRetries)(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(request.targetPower); }), 2, 100);
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,5 @@
1
+ import BleERGCyclingMode from "../../ble/ble-erg-mode";
2
+ import { DeviceAdapter } from "../../Device";
3
+ export default class AntFeERGCyclingMode extends BleERGCyclingMode {
4
+ constructor(adapter: DeviceAdapter, props?: any);
5
+ }
@@ -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: FmAdapter, props?: any);
9
+ constructor(adapter: DeviceAdapter, props?: any);
10
10
  getName(): string;
11
11
  getDescription(): string;
12
12
  getProperties(): CyclingModeProperty[];
@@ -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 = Math.round(distanceInternal + data.speed / 3.6 * t);
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) ? Math.round(distanceInternal) : Math.round(distanceInternal + distance);
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;
@@ -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: FmAdapter, props?: any);
7
+ constructor(adapter: DeviceAdapter, props?: any);
8
8
  getName(): string;
9
9
  getDescription(): string;
10
10
  getProperties(): CyclingModeProperty[];
@@ -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 = Math.round(distanceInternal + data.speed / 3.6 * t);
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) ? Math.round(distanceInternal) : Math.round(distanceInternal + distance);
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,5 +1,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import EventEmitter from "events";
4
3
  import BlePeripheralConnector from "./ble-peripheral";
5
4
  export declare type ConnectProps = {
@@ -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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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,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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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,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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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 = Math.round(distanceInternal + distance);
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 = Math.round(distanceInternal / 100);
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 += Math.round(v * duration);
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 += Math.round(v * duration);
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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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 + Math.round(v * duration);
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 = Math.round(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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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,4 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import { DeviceProtocol } from "../DeviceProtocol";
4
3
  import { EventLogger } from "gd-eventlog";
5
4
  import { Command } from "../types/command";
@@ -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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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): import("../../DeviceProtocol").Device;
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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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];
@@ -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 = Math.round(distanceInternal + data.speed / 3.6 * t);
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) ? Math.round(distanceInternal) : Math.round(distanceInternal + distance);
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 });
@@ -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 += Math.round(v * duration);
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): Simulator;
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
- var desc = Object.getOwnPropertyDescriptor(m, k);
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "1.4.53",
3
+ "version": "1.4.56",
4
4
  "dependencies": {
5
5
  "@serialport/parser-byte-length": "^9.0.1",
6
6
  "@serialport/parser-delimiter": "^9.0.1",