incyclist-devices 1.4.95 → 1.4.96

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