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 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;
@@ -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];
@@ -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;
@@ -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);
@@ -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];
@@ -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 = 12.75;
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
- 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);
274
280
  status.userSent = true;
275
281
  }
276
282
  this.started = true;
@@ -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;
@@ -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];
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 = __importDefault(require("../Device"));
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);
@@ -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];
@@ -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 = (0, utils_1.intVal)(this.cyclingData.distanceInternal - this.distanceInternal);
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: (0, utils_1.floatVal)(this.cyclingData.speed),
331
- slope: (0, utils_1.floatVal)(this.cyclingData.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', fn: 'sendRequest()', error: err.message || err });
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 = parseFloat(speed.toFixed(1));
150
+ data.speed = speed;
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);
@@ -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 } = props;
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 += 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));
@@ -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
- 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 });
@@ -1,13 +1,14 @@
1
1
  import { EventLogger } from "gd-eventlog";
2
- import CyclingMode, { CyclingModeBase, CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../CyclingMode";
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 CyclingModeBase implements CyclingMode {
11
+ export default class SimulatorCyclingMode extends PowerBasedCyclingModeBase {
11
12
  logger: EventLogger;
12
13
  data: IncyclistBikeData;
13
14
  prevRequest: UpdateRequest;
@@ -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 calculations_1 = __importDefault(require("../calculations"));
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 CyclingMode_1.CyclingModeBase {
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 === 'Power' || !mode) ? Number(this.getSetting('power')) : bikeData.power || 0;
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 === 'Speed' ? Number(this.getSetting('speed')) : bikeData.speed || 0;
73
- let m = 75;
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
- if (mode === 'Power' || !mode) {
78
- speed = calculations_1.default.calculateSpeed(m, power, slope, { bikeType: 'race' });
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 === 'Speed') {
81
- power = calculations_1.default.calculatePower(m, speed / 3.6, slope, { bikeType: 'race' });
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
- speed = calculations_1.default.calculateSpeed(m, power, slope, { bikeType: 'race' });
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
- speed = calculations_1.default.calculateSpeed(m, power, slope, { bikeType: 'race' });
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
- speed = calculations_1.default.calculateSpeed(m, power, slope, { bikeType: 'race' });
105
+ const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
106
+ speed = res.speed;
107
+ distance = res.distance;
94
108
  }
95
- let v = speed / 3.6;
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): Simulator;
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
- 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];
@@ -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: Math.round((Date.now() - this.startTS) / 1000),
230
+ deviceTime: (Date.now() - this.startTS) / 1000,
212
231
  deviceDistanceCounter: this.data.distanceInternal
213
232
  };
214
233
  this.paused = (this.data.speed === 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "1.4.54",
3
+ "version": "1.4.57",
4
4
  "dependencies": {
5
5
  "@serialport/parser-byte-length": "^9.0.1",
6
6
  "@serialport/parser-delimiter": "^9.0.1",