incyclist-devices 2.0.37 → 2.1.0

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.
Files changed (103) hide show
  1. package/lib/antv2/adapter-factory.d.ts +4 -2
  2. package/lib/antv2/adapter.d.ts +3 -20
  3. package/lib/antv2/adapter.js +7 -93
  4. package/lib/antv2/fe/adapter.d.ts +9 -5
  5. package/lib/antv2/fe/adapter.js +25 -14
  6. package/lib/antv2/hr/adapter.d.ts +2 -1
  7. package/lib/antv2/pwr/adapter.d.ts +9 -5
  8. package/lib/antv2/pwr/adapter.js +19 -8
  9. package/lib/antv2/types.d.ts +2 -1
  10. package/lib/base/adpater.d.ts +31 -13
  11. package/lib/base/adpater.js +84 -28
  12. package/lib/ble/adapter-factory.d.ts +10 -9
  13. package/lib/ble/base/adapter.d.ts +9 -20
  14. package/lib/ble/base/adapter.js +15 -72
  15. package/lib/ble/ble-interface.d.ts +5 -4
  16. package/lib/ble/cp/adapter.d.ts +5 -8
  17. package/lib/ble/cp/adapter.js +26 -10
  18. package/lib/ble/elite/adapter.d.ts +6 -5
  19. package/lib/ble/elite/adapter.js +26 -2
  20. package/lib/ble/fm/adapter.d.ts +10 -9
  21. package/lib/ble/fm/adapter.js +38 -11
  22. package/lib/ble/hr/adapter.d.ts +5 -3
  23. package/lib/ble/peripheral-cache.d.ts +3 -2
  24. package/lib/ble/tacx/adapter.d.ts +2 -2
  25. package/lib/ble/wahoo/adapter.d.ts +2 -2
  26. package/lib/index.d.ts +5 -5
  27. package/lib/index.js +4 -2
  28. package/lib/interfaces.d.ts +1 -1
  29. package/lib/modes/ant-fe-adv-st-mode.d.ts +12 -0
  30. package/lib/modes/ant-fe-adv-st-mode.js +83 -0
  31. package/lib/modes/antble-erg.d.ts +31 -0
  32. package/lib/modes/antble-erg.js +28 -0
  33. package/lib/modes/antble-smarttrainer.d.ts +23 -0
  34. package/lib/modes/antble-smarttrainer.js +65 -0
  35. package/lib/modes/base.d.ts +29 -0
  36. package/lib/modes/{cycling-mode.js → base.js} +23 -26
  37. package/lib/modes/daum-classic-standard.d.ts +16 -0
  38. package/lib/modes/daum-classic-standard.js +54 -0
  39. package/lib/modes/daum-erg.d.ts +49 -0
  40. package/lib/{serial/daum/ERGCyclingMode.js → modes/daum-erg.js} +45 -73
  41. package/lib/modes/daum-power.d.ts +5 -0
  42. package/lib/{serial/daum/DaumPowerMeterCyclingMode.js → modes/daum-power.js} +1 -10
  43. package/lib/modes/daum-premium-standard.d.ts +23 -0
  44. package/lib/{serial/daum/premium/modes/daum-classic.js → modes/daum-premium-standard.js} +26 -38
  45. package/lib/modes/daum-smarttrainer.d.ts +82 -0
  46. package/lib/{serial/daum/SmartTrainerCyclingMode.js → modes/daum-smarttrainer.js} +23 -26
  47. package/lib/modes/kettler-erg.d.ts +44 -0
  48. package/lib/{serial/kettler/ergo-racer/modes/erg.js → modes/kettler-erg.js} +12 -23
  49. package/lib/modes/power-base.d.ts +28 -3
  50. package/lib/modes/power-base.js +182 -5
  51. package/lib/modes/power-meter.d.ts +10 -16
  52. package/lib/modes/power-meter.js +15 -54
  53. package/lib/modes/simulator.d.ts +37 -10
  54. package/lib/modes/simulator.js +14 -46
  55. package/lib/modes/{cycling-mode.d.ts → types.d.ts} +22 -19
  56. package/lib/modes/types.js +56 -0
  57. package/lib/serial/adapter-factory.d.ts +7 -5
  58. package/lib/serial/adapter.d.ts +2 -2
  59. package/lib/serial/adapter.js +5 -2
  60. package/lib/serial/daum/DaumAdapter.d.ts +27 -24
  61. package/lib/serial/daum/DaumAdapter.js +200 -128
  62. package/lib/serial/daum/classic/adapter.d.ts +20 -21
  63. package/lib/serial/daum/classic/adapter.js +83 -157
  64. package/lib/serial/daum/classic/comms.d.ts +19 -13
  65. package/lib/serial/daum/classic/comms.js +39 -12
  66. package/lib/serial/daum/classic/mock.d.ts +4 -0
  67. package/lib/serial/daum/classic/mock.js +14 -4
  68. package/lib/serial/daum/premium/adapter.d.ts +16 -11
  69. package/lib/serial/daum/premium/adapter.js +98 -95
  70. package/lib/serial/daum/premium/comms.d.ts +4 -1
  71. package/lib/serial/daum/premium/comms.js +25 -17
  72. package/lib/serial/daum/premium/mock.d.ts +4 -0
  73. package/lib/serial/daum/premium/mock.js +15 -5
  74. package/lib/serial/daum/types.d.ts +11 -0
  75. package/lib/serial/daum/types.js +5 -0
  76. package/lib/serial/kettler/ergo-racer/adapter.d.ts +10 -8
  77. package/lib/serial/kettler/ergo-racer/adapter.js +17 -7
  78. package/lib/serial/serial-interface.js +1 -2
  79. package/lib/simulator/Simulator.d.ts +14 -17
  80. package/lib/simulator/Simulator.js +18 -47
  81. package/lib/types/adapter.d.ts +29 -8
  82. package/lib/types/adapter.js +68 -0
  83. package/lib/utils/utils.d.ts +1 -1
  84. package/package.json +3 -3
  85. package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +0 -9
  86. package/lib/antv2/modes/ant-fe-adv-st-mode.js +0 -51
  87. package/lib/antv2/modes/ant-fe-erg-mode.d.ts +0 -6
  88. package/lib/antv2/modes/ant-fe-erg-mode.js +0 -14
  89. package/lib/antv2/modes/ant-fe-st-mode.d.ts +0 -5
  90. package/lib/antv2/modes/ant-fe-st-mode.js +0 -13
  91. package/lib/modes/ble-erg-mode.d.ts +0 -18
  92. package/lib/modes/ble-erg-mode.js +0 -148
  93. package/lib/modes/ble-st-mode.d.ts +0 -15
  94. package/lib/modes/ble-st-mode.js +0 -96
  95. package/lib/serial/daum/DaumPowerMeterCyclingMode.d.ts +0 -8
  96. package/lib/serial/daum/ERGCyclingMode.d.ts +0 -26
  97. package/lib/serial/daum/SmartTrainerCyclingMode.d.ts +0 -42
  98. package/lib/serial/daum/classic/modes/daum-classic.d.ts +0 -13
  99. package/lib/serial/daum/classic/modes/daum-classic.js +0 -97
  100. package/lib/serial/daum/premium/modes/daum-classic.d.ts +0 -14
  101. package/lib/serial/kettler/ergo-racer/modes/erg.d.ts +0 -25
  102. /package/lib/serial/daum/{constants.d.ts → consts.d.ts} +0 -0
  103. /package/lib/serial/daum/{constants.js → consts.js} +0 -0
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
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);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -14,17 +37,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
37
  Object.defineProperty(exports, "__esModule", { value: true });
15
38
  const gd_eventlog_1 = require("gd-eventlog");
16
39
  const power_meter_1 = __importDefault(require("../../modes/power-meter"));
17
- const ble_st_mode_1 = __importDefault(require("../../modes/ble-st-mode"));
18
- const ble_erg_mode_1 = __importDefault(require("../../modes/ble-erg-mode"));
40
+ const antble_smarttrainer_1 = __importDefault(require("../../modes/antble-smarttrainer"));
41
+ const antble_erg_1 = __importDefault(require("../../modes/antble-erg"));
19
42
  const comms_1 = __importDefault(require("./comms"));
20
- const adapter_1 = require("../base/adapter");
43
+ const adapter_1 = __importStar(require("../base/adapter"));
21
44
  const consts_1 = require("./consts");
22
45
  const utils_1 = require("../../utils/utils");
23
46
  const capabilities_1 = require("../../types/capabilities");
24
- class BleFmAdapter extends adapter_1.BleControllableAdapter {
47
+ class BleFmAdapter extends adapter_1.default {
25
48
  constructor(settings, props) {
26
49
  super(settings, props);
27
50
  this.distanceInternal = 0;
51
+ this.setControl(new adapter_1.BlePowerControl(this, props));
28
52
  this.logger = new gd_eventlog_1.EventLogger('BLE-FM');
29
53
  const { id, address, name } = settings;
30
54
  const logger = this.logger;
@@ -54,22 +78,22 @@ class BleFmAdapter extends adapter_1.BleControllableAdapter {
54
78
  const modes = [power_meter_1.default];
55
79
  const features = (_a = this.getComms()) === null || _a === void 0 ? void 0 : _a.features;
56
80
  if (!features)
57
- return [power_meter_1.default, ble_st_mode_1.default, ble_erg_mode_1.default];
81
+ return [power_meter_1.default, antble_smarttrainer_1.default, antble_erg_1.default];
58
82
  if (features.setPower === undefined || features.setPower)
59
- modes.push(ble_erg_mode_1.default);
83
+ modes.push(antble_erg_1.default);
60
84
  if (features.setSlope === undefined || features.setSlope)
61
- modes.push(ble_st_mode_1.default);
85
+ modes.push(antble_smarttrainer_1.default);
62
86
  return modes;
63
87
  }
64
88
  getDefaultCyclingMode() {
65
89
  var _a;
66
90
  const features = (_a = this.getComms()) === null || _a === void 0 ? void 0 : _a.features;
67
91
  if (!features)
68
- return new ble_st_mode_1.default(this);
92
+ return new antble_smarttrainer_1.default(this);
69
93
  if (features.setSlope === undefined || features.setSlope)
70
- return new ble_st_mode_1.default(this);
94
+ return new antble_smarttrainer_1.default(this);
71
95
  if (features.setPower === undefined || features.setPower)
72
- return new ble_erg_mode_1.default(this);
96
+ return new antble_erg_1.default(this);
73
97
  return new power_meter_1.default(this);
74
98
  }
75
99
  mapData(deviceData) {
@@ -227,6 +251,9 @@ class BleFmAdapter extends adapter_1.BleControllableAdapter {
227
251
  }
228
252
  }
229
253
  catch (err) {
254
+ if (err.message === 'not connected') {
255
+ this.logEvent({ message: 'send bike update failed', reason: 'not connected' });
256
+ }
230
257
  this.logEvent({ message: 'error', fn: 'sendUpdate()', request, error: err.message, stack: err.stack });
231
258
  }
232
259
  });
@@ -235,7 +262,7 @@ class BleFmAdapter extends adapter_1.BleControllableAdapter {
235
262
  return __awaiter(this, void 0, void 0, function* () {
236
263
  if (this.started && !this.stopped) {
237
264
  try {
238
- if (this.getCyclingMode() instanceof ble_erg_mode_1.default) {
265
+ if (this.getCyclingMode() instanceof antble_erg_1.default) {
239
266
  const power = this.data.power;
240
267
  const request = power ? { targetPower: power } : this.getCyclingMode().getBikeInitRequest();
241
268
  yield this.sendUpdate(request, true);
@@ -1,12 +1,14 @@
1
1
  import BleAdapter from '../base/adapter';
2
2
  import { DeviceProperties } from '../../types/device';
3
- import { BleDeviceSettings } from '../types';
3
+ import { BleDeviceProperties, BleDeviceSettings } from '../types';
4
4
  import { HrmData } from './types';
5
5
  import { DeviceData } from '../../types/data';
6
- export default class HrmAdapter extends BleAdapter {
6
+ import { NonControllableDevice } from '../../base/adpater';
7
+ import { IncyclistDeviceAdapter } from '../../types/adapter';
8
+ export default class HrmAdapter extends BleAdapter<NonControllableDevice<BleDeviceProperties>> {
7
9
  ignore: boolean;
8
10
  constructor(settings: BleDeviceSettings, props?: DeviceProperties);
9
- isSame(device: BleAdapter): boolean;
11
+ isSame(device: IncyclistDeviceAdapter): boolean;
10
12
  getProfile(): string;
11
13
  getName(): string;
12
14
  getDisplayName(): string;
@@ -1,6 +1,7 @@
1
+ import { Controllable } from "../types/adapter";
1
2
  import BleAdapter from "./base/adapter";
2
3
  import BlePeripheralConnector from "./ble-peripheral";
3
- import { BleCharacteristic, BlePeripheral } from "./types";
4
+ import { BleCharacteristic, BleDeviceProperties, BlePeripheral } from "./types";
4
5
  export interface PeripheralState {
5
6
  isLoading: boolean;
6
7
  isConfigured: boolean;
@@ -18,7 +19,7 @@ export interface PeripheralCacheItem {
18
19
  }
19
20
  export default class BlePeripheralCache {
20
21
  peripherals: PeripheralCacheItem[];
21
- findAdapter(adapter: BleAdapter): PeripheralCacheItem;
22
+ findAdapter(adapter: BleAdapter<Controllable<BleDeviceProperties>>): PeripheralCacheItem;
22
23
  getConnector(peripheral: BlePeripheral): BlePeripheralConnector;
23
24
  getPeripheral(query: {
24
25
  id?: string;
@@ -1,10 +1,10 @@
1
1
  import { BleFmAdapter } from '../fm';
2
- import BleAdapter from '../base/adapter';
3
2
  import { DeviceProperties } from '../../types/device';
4
3
  import { BleDeviceSettings, BleStartProperties } from '../types';
4
+ import { IncyclistDeviceAdapter } from '../../types/adapter';
5
5
  export default class BleTacxFEAdapter extends BleFmAdapter {
6
6
  constructor(settings: BleDeviceSettings, props?: DeviceProperties);
7
- isSame(device: BleAdapter): boolean;
7
+ isSame(device: IncyclistDeviceAdapter): boolean;
8
8
  getProfile(): string;
9
9
  start(props?: BleStartProperties): Promise<any>;
10
10
  }
@@ -1,9 +1,9 @@
1
1
  import { BleFmAdapter } from '../fm';
2
- import BleAdapter from '../base/adapter';
3
2
  import { BleDeviceProperties, BleDeviceSettings, BleStartProperties } from '../types';
3
+ import { IncyclistDeviceAdapter } from '../../types/adapter';
4
4
  export default class BleWahooAdapter extends BleFmAdapter {
5
5
  constructor(settings: BleDeviceSettings, props?: BleDeviceProperties);
6
- isSame(device: BleAdapter): boolean;
6
+ isSame(device: IncyclistDeviceAdapter): boolean;
7
7
  getProfile(): string;
8
8
  start(props?: BleStartProperties): Promise<any>;
9
9
  }
package/lib/index.d.ts CHANGED
@@ -2,15 +2,15 @@ import { INTERFACE } from './types/device';
2
2
  import InterfaceFactory from './interfaces';
3
3
  import AdapterFactory from './adapters';
4
4
  import { IncyclistInterface, InterfaceProps } from './types/interface';
5
- import { IncyclistDeviceAdapter, Bike as Controllable } from './types/adapter';
5
+ import { IncyclistDeviceAdapter, Controllable } from './types/adapter';
6
6
  import { ControllableDevice as ControllableDeviceAdapter } from './base/adpater';
7
7
  import { IncyclistCapability } from './types/capabilities';
8
8
  import { DeviceData } from './types/data';
9
- import { DeviceSettings } from './types/device';
10
- import CyclingMode from './modes/cycling-mode';
9
+ import { DeviceSettings, DeviceProperties } from './types/device';
10
+ import ICyclingMode from './modes/types';
11
11
  import calc from './utils/calculations';
12
- export * from './modes/cycling-mode';
12
+ export * from './modes/types';
13
13
  export * from './serial';
14
14
  export * from './ble';
15
15
  export * from './antv2';
16
- export { IncyclistInterface, INTERFACE, InterfaceFactory, InterfaceProps, DeviceSettings, CyclingMode, AdapterFactory, IncyclistDeviceAdapter, Controllable, ControllableDeviceAdapter, DeviceData, IncyclistCapability, calc, };
16
+ export { IncyclistInterface, INTERFACE, InterfaceFactory, InterfaceProps, DeviceSettings, DeviceProperties, ICyclingMode, AdapterFactory, IncyclistDeviceAdapter, Controllable, ControllableDeviceAdapter, DeviceData, IncyclistCapability, calc, };
package/lib/index.js CHANGED
@@ -17,20 +17,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.calc = exports.IncyclistCapability = exports.ControllableDeviceAdapter = exports.AdapterFactory = exports.InterfaceFactory = exports.INTERFACE = void 0;
20
+ exports.calc = exports.IncyclistCapability = exports.ControllableDeviceAdapter = exports.Controllable = exports.AdapterFactory = exports.InterfaceFactory = exports.INTERFACE = void 0;
21
21
  const device_1 = require("./types/device");
22
22
  Object.defineProperty(exports, "INTERFACE", { enumerable: true, get: function () { return device_1.INTERFACE; } });
23
23
  const interfaces_1 = __importDefault(require("./interfaces"));
24
24
  exports.InterfaceFactory = interfaces_1.default;
25
25
  const adapters_1 = __importDefault(require("./adapters"));
26
26
  exports.AdapterFactory = adapters_1.default;
27
+ const adapter_1 = require("./types/adapter");
28
+ Object.defineProperty(exports, "Controllable", { enumerable: true, get: function () { return adapter_1.Controllable; } });
27
29
  const adpater_1 = require("./base/adpater");
28
30
  Object.defineProperty(exports, "ControllableDeviceAdapter", { enumerable: true, get: function () { return adpater_1.ControllableDevice; } });
29
31
  const capabilities_1 = require("./types/capabilities");
30
32
  Object.defineProperty(exports, "IncyclistCapability", { enumerable: true, get: function () { return capabilities_1.IncyclistCapability; } });
31
33
  const calculations_1 = __importDefault(require("./utils/calculations"));
32
34
  exports.calc = calculations_1.default;
33
- __exportStar(require("./modes/cycling-mode"), exports);
35
+ __exportStar(require("./modes/types"), exports);
34
36
  __exportStar(require("./serial"), exports);
35
37
  __exportStar(require("./ble"), exports);
36
38
  __exportStar(require("./antv2"), exports);
@@ -3,5 +3,5 @@ import { SerialInterface } from "./serial";
3
3
  import AntInterface from "./antv2/ant-interface";
4
4
  import { BleInterface } from "./ble";
5
5
  export default class InterfaceFactory {
6
- static create(ifaceName: string, props?: InterfaceProps): SerialInterface | BleInterface | AntInterface;
6
+ static create(ifaceName: string, props?: InterfaceProps): AntInterface | SerialInterface | BleInterface;
7
7
  }
@@ -0,0 +1,12 @@
1
+ import { IncyclistDeviceAdapter } from "..";
2
+ import SmartTrainerCyclingMode from "./antble-smarttrainer";
3
+ import { UpdateRequest } from "./types";
4
+ export default class AntAdvSimCyclingMode extends SmartTrainerCyclingMode {
5
+ constructor(adapter: IncyclistDeviceAdapter, props?: any);
6
+ getName(): string;
7
+ getDescription(): string;
8
+ checkForResetOrEmpty(request: UpdateRequest): UpdateRequest | undefined;
9
+ protected checkForTempPowerAdjustments(request: UpdateRequest, newRequest?: UpdateRequest): void;
10
+ protected checkEmptyRequest(newRequest: UpdateRequest): void;
11
+ sendBikeUpdate(incoming: UpdateRequest): UpdateRequest;
12
+ }
@@ -0,0 +1,83 @@
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 antble_smarttrainer_1 = __importDefault(require("./antble-smarttrainer"));
7
+ const MAX_DEVIATION = 10;
8
+ class AntAdvSimCyclingMode extends antble_smarttrainer_1.default {
9
+ constructor(adapter, props) {
10
+ super(adapter, props);
11
+ this.initLogger('AdvmartTrainerMode');
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
+ checkForResetOrEmpty(request) {
20
+ if (!request || request.reset) {
21
+ this.prevRequest = {};
22
+ return { reset: true };
23
+ }
24
+ if (request.slope === undefined && request.targetPowerDelta === undefined && request.targetPower === undefined && request.refresh && this.prevRequest) {
25
+ return this.prevRequest;
26
+ }
27
+ }
28
+ checkForTempPowerAdjustments(request, newRequest = {}) {
29
+ if (request.targetPowerDelta && this.prevRequest && this.prevRequest.targetPower) {
30
+ newRequest.targetPower = this.prevRequest.targetPower + request.targetPowerDelta;
31
+ if (newRequest.targetPower < 10)
32
+ newRequest.targetPower = this.prevRequest.targetPower;
33
+ delete request.targetPowerDelta;
34
+ }
35
+ }
36
+ checkEmptyRequest(newRequest) {
37
+ if (Object.keys(newRequest).length === 0) {
38
+ if (this.prevRequest) {
39
+ newRequest.slope = this.prevRequest.slope;
40
+ newRequest.targetPower = this.prevRequest.targetPower;
41
+ newRequest.refresh = true;
42
+ }
43
+ }
44
+ }
45
+ sendBikeUpdate(incoming) {
46
+ var _a;
47
+ this.logger.logEvent({ message: "processing update request", request: incoming, prev: this.prevRequest, data: this.getData() });
48
+ let newRequest = {};
49
+ const request = Object.assign({}, incoming);
50
+ try {
51
+ const req = this.checkForResetOrEmpty(request);
52
+ if (req)
53
+ return req;
54
+ this.checkSlope(request, newRequest);
55
+ let data = this.getData();
56
+ if (data.power) {
57
+ const { minPower, maxPower } = request;
58
+ let targetPower = request.targetPower;
59
+ if (minPower !== undefined && maxPower !== undefined && minPower === maxPower)
60
+ targetPower = maxPower;
61
+ if (targetPower !== undefined && Math.abs(data.power - targetPower) > MAX_DEVIATION)
62
+ newRequest.targetPower = targetPower;
63
+ else if (minPower !== undefined && data.power < minPower)
64
+ newRequest.targetPower = minPower;
65
+ else if (request.maxPower !== undefined && data.power > request.maxPower)
66
+ newRequest.targetPower = maxPower;
67
+ else if ((_a = this.prevRequest) === null || _a === void 0 ? void 0 : _a.targetPower) {
68
+ newRequest.targetPower = this.prevRequest.targetPower;
69
+ }
70
+ if (newRequest.targetPower) {
71
+ this.checkForTempPowerAdjustments(request, newRequest);
72
+ }
73
+ }
74
+ this.checkEmptyRequest(newRequest);
75
+ this.prevRequest = JSON.parse(JSON.stringify(newRequest));
76
+ }
77
+ catch (err) {
78
+ this.logger.logEvent({ message: "error", fn: 'sendBikeUpdate()', error: err.message, stack: err.stack });
79
+ }
80
+ return newRequest;
81
+ }
82
+ }
83
+ exports.default = AntAdvSimCyclingMode;
@@ -0,0 +1,31 @@
1
+ import { IncyclistDeviceAdapter } from "..";
2
+ import ICyclingMode, { CyclingModeProperyType, UpdateRequest } from "./types";
3
+ import PowerBasedCyclingModeBase from "./power-base";
4
+ export default class ERGCyclingMode extends PowerBasedCyclingModeBase implements ICyclingMode {
5
+ protected static config: {
6
+ isERG: boolean;
7
+ name: string;
8
+ description: string;
9
+ properties: ({
10
+ key: string;
11
+ name: string;
12
+ description: string;
13
+ type: CyclingModeProperyType;
14
+ options: string[];
15
+ default: string;
16
+ min?: undefined;
17
+ max?: undefined;
18
+ } | {
19
+ key: string;
20
+ name: string;
21
+ description: string;
22
+ type: CyclingModeProperyType;
23
+ default: number;
24
+ min: number;
25
+ max: number;
26
+ options?: undefined;
27
+ })[];
28
+ };
29
+ constructor(adapter: IncyclistDeviceAdapter, props?: any);
30
+ getBikeInitRequest(): UpdateRequest;
31
+ }
@@ -0,0 +1,28 @@
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 types_1 = require("./types");
7
+ const power_base_1 = __importDefault(require("./power-base"));
8
+ class ERGCyclingMode extends power_base_1.default {
9
+ constructor(adapter, props) {
10
+ super(adapter, props);
11
+ this.initLogger('ERGMode');
12
+ }
13
+ getBikeInitRequest() {
14
+ const startPower = Number(this.getSetting('startPower'));
15
+ this.prevRequest = { targetPower: startPower };
16
+ return { targetPower: startPower };
17
+ }
18
+ }
19
+ ERGCyclingMode.config = {
20
+ isERG: true,
21
+ name: "ERG",
22
+ description: "Calculates speed based on power and slope. Power targets are set by workout or remain stable throughout the workout",
23
+ properties: [
24
+ { key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
25
+ { key: 'startPower', name: 'Starting Power', description: 'Initial power in Watts at start of training', type: types_1.CyclingModeProperyType.Integer, default: 50, min: 25, max: 800 },
26
+ ]
27
+ };
28
+ exports.default = ERGCyclingMode;
@@ -0,0 +1,23 @@
1
+ import ICyclingMode, { CyclingModeProperyType, UpdateRequest } from "./types";
2
+ import PowerBasedCyclingModeBase from "./power-base";
3
+ import { IncyclistDeviceAdapter } from "../types/adapter";
4
+ export default class SmartTrainerCyclingMode extends PowerBasedCyclingModeBase implements ICyclingMode {
5
+ protected static config: {
6
+ name: string;
7
+ description: string;
8
+ properties: {
9
+ key: string;
10
+ name: string;
11
+ description: string;
12
+ type: CyclingModeProperyType;
13
+ options: string[];
14
+ default: string;
15
+ }[];
16
+ };
17
+ constructor(adapter: IncyclistDeviceAdapter, props?: any);
18
+ getBikeInitRequest(): UpdateRequest;
19
+ checkForResetOrEmpty(request: UpdateRequest): UpdateRequest | undefined;
20
+ protected checkSlope(request: UpdateRequest, newRequest?: UpdateRequest): void;
21
+ protected checkEmptyRequest(newRequest: UpdateRequest): void;
22
+ sendBikeUpdate(incoming: UpdateRequest): UpdateRequest;
23
+ }
@@ -0,0 +1,65 @@
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 types_1 = require("./types");
7
+ const power_base_1 = __importDefault(require("./power-base"));
8
+ class SmartTrainerCyclingMode extends power_base_1.default {
9
+ constructor(adapter, props) {
10
+ super(adapter, props);
11
+ this.initLogger('SmartTrainerMode');
12
+ }
13
+ getBikeInitRequest() {
14
+ this.prevRequest = { slope: 0 };
15
+ return { slope: 0 };
16
+ }
17
+ checkForResetOrEmpty(request) {
18
+ if (!request || request.reset) {
19
+ this.prevRequest = {};
20
+ return { reset: true };
21
+ }
22
+ if (request.slope === undefined && request.refresh && this.prevRequest) {
23
+ return this.prevRequest;
24
+ }
25
+ }
26
+ checkSlope(request, newRequest = {}) {
27
+ if (request.slope !== undefined) {
28
+ newRequest.slope = parseFloat(request.slope.toFixed(1));
29
+ this.data.slope = newRequest.slope;
30
+ }
31
+ }
32
+ checkEmptyRequest(newRequest) {
33
+ if (Object.keys(newRequest).length === 0) {
34
+ if (this.prevRequest) {
35
+ newRequest.slope = this.prevRequest.slope;
36
+ newRequest.refresh = true;
37
+ }
38
+ }
39
+ }
40
+ sendBikeUpdate(incoming) {
41
+ this.logger.logEvent({ message: "processing update request", request: incoming, prev: this.prevRequest, data: this.getData() });
42
+ let newRequest = {};
43
+ const request = Object.assign({}, incoming);
44
+ try {
45
+ const req = this.checkForResetOrEmpty(request);
46
+ if (req)
47
+ return req;
48
+ this.checkSlope(request, newRequest);
49
+ this.checkEmptyRequest(newRequest);
50
+ this.prevRequest = JSON.parse(JSON.stringify(newRequest));
51
+ }
52
+ catch (err) {
53
+ this.logger.logEvent({ message: "error", fn: 'sendBikeUpdate()', error: err.message, stack: err.stack });
54
+ }
55
+ return newRequest;
56
+ }
57
+ }
58
+ SmartTrainerCyclingMode.config = {
59
+ name: "Smart Trainer",
60
+ description: "Calculates speed based on power and slope. Slope is set to the device",
61
+ properties: [
62
+ { key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' }
63
+ ]
64
+ };
65
+ exports.default = SmartTrainerCyclingMode;
@@ -0,0 +1,29 @@
1
+ import { IncyclistDeviceAdapter } from "../types/adapter";
2
+ import ICyclingMode, { CyclingMode, CyclingModeConfig, CyclingModeProperty, IncyclistBikeData, Settings, UpdateRequest } from "./types";
3
+ export declare abstract class CyclingModeBase extends CyclingMode implements ICyclingMode {
4
+ adapter: IncyclistDeviceAdapter;
5
+ settings: Settings;
6
+ properties: Settings;
7
+ localConfig: CyclingModeConfig;
8
+ protected static config: CyclingModeConfig;
9
+ protected static isERG: boolean;
10
+ static supportsERGMode(): boolean;
11
+ constructor(adapter: IncyclistDeviceAdapter, props?: any);
12
+ setAdapter(adapter: IncyclistDeviceAdapter): void;
13
+ setConfig(config: CyclingModeConfig): void;
14
+ getConfig(): CyclingModeConfig;
15
+ getName(): string;
16
+ getDescription(): string;
17
+ getProperties(): CyclingModeProperty[];
18
+ getProperty(name: string): CyclingModeProperty;
19
+ setSettings(settings?: any): void;
20
+ setSetting(name: string, value: any): void;
21
+ getSetting(name: string): any;
22
+ getSettingDefault(name: string): any;
23
+ getSettings(): Settings;
24
+ setModeProperty(name: string, value: any): void;
25
+ getModeProperty(name: string): any;
26
+ abstract getBikeInitRequest(): UpdateRequest;
27
+ abstract sendBikeUpdate(request: UpdateRequest): UpdateRequest;
28
+ abstract updateData(data: IncyclistBikeData): IncyclistBikeData;
29
+ }
@@ -1,47 +1,41 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CyclingModeBase = exports.CyclingModeProperyType = void 0;
4
- var CyclingModeProperyType;
5
- (function (CyclingModeProperyType) {
6
- CyclingModeProperyType["Integer"] = "Integer";
7
- CyclingModeProperyType["Boolean"] = "Boolean";
8
- CyclingModeProperyType["Float"] = "Float";
9
- CyclingModeProperyType["String"] = "String";
10
- CyclingModeProperyType["SingleSelect"] = "SingleSelect";
11
- CyclingModeProperyType["MultiSelect"] = "MultiSelect";
12
- })(CyclingModeProperyType || (exports.CyclingModeProperyType = CyclingModeProperyType = {}));
13
- class CyclingModeBase {
3
+ exports.CyclingModeBase = void 0;
4
+ const types_1 = require("./types");
5
+ class CyclingModeBase extends types_1.CyclingMode {
6
+ static supportsERGMode() {
7
+ return this.config.isERG === true;
8
+ }
14
9
  constructor(adapter, props) {
10
+ super(adapter, props);
15
11
  this.settings = {};
16
12
  this.properties = {};
17
- if (!adapter)
18
- throw new Error('IllegalArgument: adapter is null');
19
13
  this.setAdapter(adapter);
20
14
  this.setSettings(props);
21
15
  }
22
16
  setAdapter(adapter) {
23
17
  this.adapter = adapter;
24
18
  }
25
- getBikeInitRequest() {
26
- return {};
19
+ setConfig(config) {
20
+ this.localConfig = config;
21
+ }
22
+ getConfig() {
23
+ if (this.localConfig)
24
+ return this.localConfig;
25
+ let cm = this.constructor;
26
+ return cm.config;
27
27
  }
28
28
  getName() {
29
- throw new Error("Method not implemented.");
29
+ return this.getConfig().name;
30
30
  }
31
31
  getDescription() {
32
- throw new Error("Method not implemented.");
33
- }
34
- sendBikeUpdate(request) {
35
- throw new Error("Method not implemented.");
36
- }
37
- updateData(data) {
38
- throw new Error("Method not implemented.");
32
+ return this.getConfig().description;
39
33
  }
40
34
  getProperties() {
41
- throw new Error("Method not implemented.");
35
+ return this.getConfig().properties;
42
36
  }
43
37
  getProperty(name) {
44
- throw new Error("Method not implemented.");
38
+ return this.getConfig().properties.find(p => p.name === name);
45
39
  }
46
40
  setSettings(settings) {
47
41
  if (settings) {
@@ -55,10 +49,12 @@ class CyclingModeBase {
55
49
  const res = this.settings[name];
56
50
  if (res !== undefined)
57
51
  return res;
52
+ return this.getSettingDefault(name);
53
+ }
54
+ getSettingDefault(name) {
58
55
  const prop = this.getProperties().find(p => p.key === name);
59
56
  if (prop && prop.default !== undefined)
60
57
  return prop.default;
61
- return undefined;
62
58
  }
63
59
  getSettings() {
64
60
  return this.settings;
@@ -77,3 +73,4 @@ class CyclingModeBase {
77
73
  }
78
74
  }
79
75
  exports.CyclingModeBase = CyclingModeBase;
76
+ CyclingModeBase.config = { name: '', description: '', properties: [] };
@@ -0,0 +1,16 @@
1
+ import ICyclingMode, { IncyclistBikeData, Settings, UpdateRequest } from "./types";
2
+ import { IncyclistDeviceAdapter } from "../types/adapter";
3
+ import SmartTrainerCyclingMode from "./antble-smarttrainer";
4
+ type DaumClassicEvent = {
5
+ noData?: boolean;
6
+ slopeUpdate?: boolean;
7
+ initialCall?: boolean;
8
+ };
9
+ export default class DaumClassicCyclingMode extends SmartTrainerCyclingMode implements ICyclingMode {
10
+ event: DaumClassicEvent;
11
+ constructor(adapter: IncyclistDeviceAdapter, props?: Settings);
12
+ getBikeInitRequest(): UpdateRequest;
13
+ checkForResetOrEmpty(request: UpdateRequest): UpdateRequest | undefined;
14
+ protected updateSpeedAndDistance(_power: number, _slope: any, _bikeType: any, data: IncyclistBikeData, prevData: any): number;
15
+ }
16
+ export {};
@@ -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 gd_eventlog_1 = require("gd-eventlog");
7
+ const types_1 = require("./types");
8
+ const antble_smarttrainer_1 = __importDefault(require("./antble-smarttrainer"));
9
+ const config = {
10
+ name: "Daum Classic",
11
+ description: "The device calculates speed and power based on slope. Incyclist will not modify any values recived from the device\nThis mode will not respect maximum power and/or workout limits",
12
+ properties: [
13
+ { key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain'], default: 'Race' },
14
+ ]
15
+ };
16
+ class DaumClassicCyclingMode extends antble_smarttrainer_1.default {
17
+ constructor(adapter, props) {
18
+ super(adapter, props);
19
+ this.logger = adapter ? adapter.getLogger() : undefined;
20
+ if (!this.logger)
21
+ this.logger = new gd_eventlog_1.EventLogger('DaumClassic');
22
+ this.setConfig(config);
23
+ this.event = { noData: true, initialCall: true, slopeUpdate: false };
24
+ }
25
+ getBikeInitRequest() {
26
+ return { slope: 0 };
27
+ }
28
+ checkForResetOrEmpty(request) {
29
+ if (!request || request.reset) {
30
+ this.prevRequest = {};
31
+ return {};
32
+ }
33
+ if (Object.keys(request).length === 0 && this.prevRequest) {
34
+ return { slope: this.prevRequest.slope, refresh: true };
35
+ }
36
+ if (request.slope === undefined && request.refresh && this.prevRequest) {
37
+ return this.prevRequest;
38
+ }
39
+ }
40
+ updateSpeedAndDistance(_power, _slope, _bikeType, data, prevData) {
41
+ const distanceInternal = prevData.distanceInternal || 0;
42
+ const t = this.getTimeSinceLastUpdate();
43
+ if (data.pedalRpm === 0 || data.isPedalling === false) {
44
+ data.speed = 0;
45
+ data.power = 0;
46
+ }
47
+ else {
48
+ let v = data.speed / 3.6;
49
+ data.distanceInternal = distanceInternal + v * t;
50
+ }
51
+ return t;
52
+ }
53
+ }
54
+ exports.default = DaumClassicCyclingMode;