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.
- package/lib/antv2/adapter-factory.d.ts +4 -2
- package/lib/antv2/adapter.d.ts +3 -20
- package/lib/antv2/adapter.js +7 -93
- package/lib/antv2/fe/adapter.d.ts +9 -5
- package/lib/antv2/fe/adapter.js +25 -14
- package/lib/antv2/hr/adapter.d.ts +2 -1
- package/lib/antv2/pwr/adapter.d.ts +9 -5
- package/lib/antv2/pwr/adapter.js +19 -8
- package/lib/antv2/types.d.ts +2 -1
- package/lib/base/adpater.d.ts +31 -13
- package/lib/base/adpater.js +84 -28
- package/lib/ble/adapter-factory.d.ts +10 -9
- package/lib/ble/base/adapter.d.ts +9 -20
- package/lib/ble/base/adapter.js +15 -72
- package/lib/ble/ble-interface.d.ts +5 -4
- package/lib/ble/cp/adapter.d.ts +5 -8
- package/lib/ble/cp/adapter.js +26 -10
- package/lib/ble/elite/adapter.d.ts +6 -5
- package/lib/ble/elite/adapter.js +26 -2
- package/lib/ble/fm/adapter.d.ts +10 -9
- package/lib/ble/fm/adapter.js +38 -11
- package/lib/ble/hr/adapter.d.ts +5 -3
- package/lib/ble/peripheral-cache.d.ts +3 -2
- package/lib/ble/tacx/adapter.d.ts +2 -2
- package/lib/ble/wahoo/adapter.d.ts +2 -2
- package/lib/index.d.ts +5 -5
- package/lib/index.js +4 -2
- package/lib/interfaces.d.ts +1 -1
- package/lib/modes/ant-fe-adv-st-mode.d.ts +12 -0
- package/lib/modes/ant-fe-adv-st-mode.js +83 -0
- package/lib/modes/antble-erg.d.ts +31 -0
- package/lib/modes/antble-erg.js +28 -0
- package/lib/modes/antble-smarttrainer.d.ts +23 -0
- package/lib/modes/antble-smarttrainer.js +65 -0
- package/lib/modes/base.d.ts +29 -0
- package/lib/modes/{cycling-mode.js → base.js} +23 -26
- package/lib/modes/daum-classic-standard.d.ts +16 -0
- package/lib/modes/daum-classic-standard.js +54 -0
- package/lib/modes/daum-erg.d.ts +49 -0
- package/lib/{serial/daum/ERGCyclingMode.js → modes/daum-erg.js} +45 -73
- package/lib/modes/daum-power.d.ts +5 -0
- package/lib/{serial/daum/DaumPowerMeterCyclingMode.js → modes/daum-power.js} +1 -10
- package/lib/modes/daum-premium-standard.d.ts +23 -0
- package/lib/{serial/daum/premium/modes/daum-classic.js → modes/daum-premium-standard.js} +26 -38
- package/lib/modes/daum-smarttrainer.d.ts +82 -0
- package/lib/{serial/daum/SmartTrainerCyclingMode.js → modes/daum-smarttrainer.js} +23 -26
- package/lib/modes/kettler-erg.d.ts +44 -0
- package/lib/{serial/kettler/ergo-racer/modes/erg.js → modes/kettler-erg.js} +12 -23
- package/lib/modes/power-base.d.ts +28 -3
- package/lib/modes/power-base.js +182 -5
- package/lib/modes/power-meter.d.ts +10 -16
- package/lib/modes/power-meter.js +15 -54
- package/lib/modes/simulator.d.ts +37 -10
- package/lib/modes/simulator.js +14 -46
- package/lib/modes/{cycling-mode.d.ts → types.d.ts} +22 -19
- package/lib/modes/types.js +56 -0
- package/lib/serial/adapter-factory.d.ts +7 -5
- package/lib/serial/adapter.d.ts +2 -2
- package/lib/serial/adapter.js +5 -2
- package/lib/serial/daum/DaumAdapter.d.ts +27 -24
- package/lib/serial/daum/DaumAdapter.js +200 -128
- package/lib/serial/daum/classic/adapter.d.ts +20 -21
- package/lib/serial/daum/classic/adapter.js +83 -157
- package/lib/serial/daum/classic/comms.d.ts +19 -13
- package/lib/serial/daum/classic/comms.js +39 -12
- package/lib/serial/daum/classic/mock.d.ts +4 -0
- package/lib/serial/daum/classic/mock.js +14 -4
- package/lib/serial/daum/premium/adapter.d.ts +16 -11
- package/lib/serial/daum/premium/adapter.js +98 -95
- package/lib/serial/daum/premium/comms.d.ts +4 -1
- package/lib/serial/daum/premium/comms.js +25 -17
- package/lib/serial/daum/premium/mock.d.ts +4 -0
- package/lib/serial/daum/premium/mock.js +15 -5
- package/lib/serial/daum/types.d.ts +11 -0
- package/lib/serial/daum/types.js +5 -0
- package/lib/serial/kettler/ergo-racer/adapter.d.ts +10 -8
- package/lib/serial/kettler/ergo-racer/adapter.js +17 -7
- package/lib/serial/serial-interface.js +1 -2
- package/lib/simulator/Simulator.d.ts +14 -17
- package/lib/simulator/Simulator.js +18 -47
- package/lib/types/adapter.d.ts +29 -8
- package/lib/types/adapter.js +68 -0
- package/lib/utils/utils.d.ts +1 -1
- package/package.json +3 -3
- package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +0 -9
- package/lib/antv2/modes/ant-fe-adv-st-mode.js +0 -51
- package/lib/antv2/modes/ant-fe-erg-mode.d.ts +0 -6
- package/lib/antv2/modes/ant-fe-erg-mode.js +0 -14
- package/lib/antv2/modes/ant-fe-st-mode.d.ts +0 -5
- package/lib/antv2/modes/ant-fe-st-mode.js +0 -13
- package/lib/modes/ble-erg-mode.d.ts +0 -18
- package/lib/modes/ble-erg-mode.js +0 -148
- package/lib/modes/ble-st-mode.d.ts +0 -15
- package/lib/modes/ble-st-mode.js +0 -96
- package/lib/serial/daum/DaumPowerMeterCyclingMode.d.ts +0 -8
- package/lib/serial/daum/ERGCyclingMode.d.ts +0 -26
- package/lib/serial/daum/SmartTrainerCyclingMode.d.ts +0 -42
- package/lib/serial/daum/classic/modes/daum-classic.d.ts +0 -13
- package/lib/serial/daum/classic/modes/daum-classic.js +0 -97
- package/lib/serial/daum/premium/modes/daum-classic.d.ts +0 -14
- package/lib/serial/kettler/ergo-racer/modes/erg.d.ts +0 -25
- /package/lib/serial/daum/{constants.d.ts → consts.d.ts} +0 -0
- /package/lib/serial/daum/{constants.js → consts.js} +0 -0
|
@@ -1,29 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ControllableDevice } from '../base/adpater';
|
|
3
|
+
import ICyclingMode, { CyclingMode, IncyclistBikeData } from '../modes/types';
|
|
4
4
|
import { DeviceProperties, DeviceSettings } from '../types/device';
|
|
5
|
+
import IncyclistDevice from '../base/adpater';
|
|
6
|
+
import { IncyclistDeviceAdapter } from '../types/adapter';
|
|
5
7
|
interface SimulatorProperties extends DeviceProperties {
|
|
6
8
|
isBot?: boolean;
|
|
7
9
|
settings?: any;
|
|
8
10
|
activity?: any;
|
|
9
11
|
}
|
|
10
|
-
export declare class
|
|
12
|
+
export declare class SimulatorControl extends ControllableDevice<SimulatorProperties> {
|
|
13
|
+
getSupportedCyclingModes(): Array<typeof CyclingMode>;
|
|
14
|
+
getDefaultCyclingMode(): ICyclingMode;
|
|
15
|
+
sendInitCommands(): Promise<boolean>;
|
|
16
|
+
}
|
|
17
|
+
export declare class Simulator extends IncyclistDevice<SimulatorControl, SimulatorProperties> {
|
|
11
18
|
static NAME: string;
|
|
12
|
-
logger: EventLogger;
|
|
13
19
|
speed: number;
|
|
14
20
|
power: number;
|
|
15
21
|
cadence: number;
|
|
16
22
|
time: number;
|
|
17
|
-
iv: any;
|
|
18
|
-
started: boolean;
|
|
19
23
|
slope: number;
|
|
20
24
|
limit: any;
|
|
21
25
|
startProps?: any;
|
|
22
|
-
cyclingMode: CyclingMode;
|
|
23
26
|
startTS: number;
|
|
24
27
|
data: IncyclistBikeData;
|
|
25
28
|
isBot: boolean;
|
|
26
|
-
|
|
29
|
+
iv: NodeJS.Timeout;
|
|
27
30
|
userSettings: {
|
|
28
31
|
weight?: number;
|
|
29
32
|
};
|
|
@@ -32,16 +35,10 @@ export declare class Simulator extends ControllableDevice {
|
|
|
32
35
|
};
|
|
33
36
|
constructor(settings: DeviceSettings, props?: SimulatorProperties);
|
|
34
37
|
isEqual(settings: DeviceSettings): boolean;
|
|
35
|
-
isSame(device:
|
|
38
|
+
isSame(device: IncyclistDeviceAdapter): boolean;
|
|
36
39
|
getID(): string;
|
|
37
40
|
getName(): string;
|
|
38
41
|
getUniqueName(): string;
|
|
39
|
-
setIgnoreHrm(ignore: any): void;
|
|
40
|
-
getSupportedCyclingModes(): Array<any>;
|
|
41
|
-
getDefaultCyclingMode(): CyclingMode;
|
|
42
|
-
getCyclingMode(): CyclingMode;
|
|
43
|
-
setCyclingMode(mode: CyclingMode | string, settings?: any): void;
|
|
44
|
-
sendInitCommands(): Promise<boolean>;
|
|
45
42
|
start(props?: SimulatorProperties): Promise<boolean>;
|
|
46
43
|
stop(): Promise<boolean>;
|
|
47
44
|
pause(): Promise<boolean>;
|
|
@@ -52,6 +49,6 @@ export declare class Simulator extends ControllableDevice {
|
|
|
52
49
|
update(): void;
|
|
53
50
|
canSendUpdate(): boolean;
|
|
54
51
|
calculateDistance(speedKps: any, timeS: any): number;
|
|
55
|
-
sendUpdate(request: any): import("../modes/
|
|
52
|
+
sendUpdate(request: any): import("../modes/types").UpdateRequest;
|
|
56
53
|
}
|
|
57
54
|
export {};
|
|
@@ -12,30 +12,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Simulator = void 0;
|
|
15
|
+
exports.Simulator = exports.SimulatorControl = void 0;
|
|
16
16
|
const adpater_1 = require("../base/adpater");
|
|
17
17
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
18
18
|
const simulator_1 = __importDefault(require("../modes/simulator"));
|
|
19
19
|
const capabilities_1 = require("../types/capabilities");
|
|
20
|
+
const adpater_2 = __importDefault(require("../base/adpater"));
|
|
20
21
|
const DEFAULT_PROPS = { isBot: false };
|
|
21
|
-
class
|
|
22
|
+
class SimulatorControl extends adpater_1.ControllableDevice {
|
|
23
|
+
getSupportedCyclingModes() {
|
|
24
|
+
return [simulator_1.default];
|
|
25
|
+
}
|
|
26
|
+
getDefaultCyclingMode() {
|
|
27
|
+
return new simulator_1.default(this.adapter);
|
|
28
|
+
}
|
|
29
|
+
sendInitCommands() {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.SimulatorControl = SimulatorControl;
|
|
36
|
+
class Simulator extends adpater_2.default {
|
|
22
37
|
constructor(settings, props = DEFAULT_PROPS) {
|
|
23
38
|
super(settings, props);
|
|
24
39
|
this.logger = new gd_eventlog_1.EventLogger(Simulator.NAME);
|
|
40
|
+
this.setControl(new SimulatorControl(this, props));
|
|
25
41
|
this.speed = 0;
|
|
26
42
|
this.power = 0;
|
|
27
43
|
this.cadence = 90;
|
|
28
|
-
this.paused = undefined;
|
|
29
44
|
this.time = undefined;
|
|
30
|
-
this.iv = undefined;
|
|
31
|
-
this.started = false;
|
|
32
|
-
this.paused = false;
|
|
33
45
|
this.slope = 0;
|
|
34
46
|
this.limit = {};
|
|
35
47
|
this.startTS = undefined;
|
|
36
48
|
this.data = { isPedalling: false, power: 0, pedalRpm: 0, speed: 0, heartrate: 0, distanceInternal: 0 };
|
|
37
49
|
this.isBot = props.isBot || false;
|
|
38
|
-
this.ignoreHrm = false;
|
|
39
50
|
const name = this.getCyclingMode().getName();
|
|
40
51
|
const modeSettings = this.isBot ? props.settings : this.getCyclingMode().getSettings();
|
|
41
52
|
this.setCyclingMode(name, modeSettings);
|
|
@@ -55,44 +66,6 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
55
66
|
getID() { return Simulator.NAME; }
|
|
56
67
|
getName() { return Simulator.NAME; }
|
|
57
68
|
getUniqueName() { return Simulator.NAME; }
|
|
58
|
-
setIgnoreHrm(ignore) {
|
|
59
|
-
this.ignoreHrm = ignore;
|
|
60
|
-
}
|
|
61
|
-
getSupportedCyclingModes() {
|
|
62
|
-
const supported = [];
|
|
63
|
-
supported.push(simulator_1.default);
|
|
64
|
-
return supported;
|
|
65
|
-
}
|
|
66
|
-
getDefaultCyclingMode() {
|
|
67
|
-
return new simulator_1.default(this);
|
|
68
|
-
}
|
|
69
|
-
getCyclingMode() {
|
|
70
|
-
if (!this.cyclingMode)
|
|
71
|
-
this.setCyclingMode(this.getDefaultCyclingMode());
|
|
72
|
-
return this.cyclingMode;
|
|
73
|
-
}
|
|
74
|
-
setCyclingMode(mode, settings) {
|
|
75
|
-
let selectedMode;
|
|
76
|
-
if (typeof mode === 'string') {
|
|
77
|
-
const supported = this.getSupportedCyclingModes();
|
|
78
|
-
const CyclingModeClass = supported.find(M => { const m = new M(this); return m.getName() === mode; });
|
|
79
|
-
if (CyclingModeClass) {
|
|
80
|
-
this.cyclingMode = new CyclingModeClass(this, settings);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
selectedMode = this.getDefaultCyclingMode();
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
selectedMode = mode;
|
|
87
|
-
}
|
|
88
|
-
this.cyclingMode = selectedMode;
|
|
89
|
-
this.cyclingMode.setSettings(settings);
|
|
90
|
-
}
|
|
91
|
-
sendInitCommands() {
|
|
92
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
-
return true;
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
69
|
start(props) {
|
|
97
70
|
return __awaiter(this, void 0, void 0, function* () {
|
|
98
71
|
this.startProps = props;
|
|
@@ -212,8 +185,6 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
212
185
|
if (this.isBot) {
|
|
213
186
|
this.logger.logEvent(Object.assign({ message: 'Coach update', prevDist, prevTime }, data));
|
|
214
187
|
}
|
|
215
|
-
if (this.ignoreHrm)
|
|
216
|
-
delete data.heartrate;
|
|
217
188
|
this.emitData(data);
|
|
218
189
|
}
|
|
219
190
|
canSendUpdate() {
|
package/lib/types/adapter.d.ts
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import EventEmitter from "events";
|
|
3
|
-
import CyclingMode from "../modes/
|
|
3
|
+
import ICyclingMode, { CyclingMode } from "../modes/types";
|
|
4
4
|
import { IncyclistCapability } from "./capabilities";
|
|
5
5
|
import { DeviceData } from "./data";
|
|
6
6
|
import { DeviceProperties, DeviceSettings } from "./device";
|
|
7
7
|
import { User } from "./user";
|
|
8
8
|
import { EventLogger } from "gd-eventlog";
|
|
9
9
|
export type OnDeviceDataCallback = (data: DeviceData) => void;
|
|
10
|
-
export interface
|
|
10
|
+
export interface IBike {
|
|
11
|
+
isControllable(): boolean;
|
|
12
|
+
setCyclingMode(mode: ICyclingMode | string, settings?: any, sendInitCommands?: boolean): void;
|
|
13
|
+
getSupportedCyclingModes(): Array<typeof CyclingMode>;
|
|
14
|
+
getCyclingMode(): ICyclingMode;
|
|
15
|
+
getDefaultCyclingMode(): ICyclingMode;
|
|
16
|
+
setBikeProps(props: DeviceProperties): void;
|
|
17
|
+
sendInitCommands(): Promise<boolean>;
|
|
18
|
+
setUser(user: User): void;
|
|
19
|
+
getWeight(): number;
|
|
20
|
+
getUser(): User;
|
|
21
|
+
}
|
|
22
|
+
export interface IncyclistDeviceAdapter extends EventEmitter, IBike {
|
|
11
23
|
getLogger(): EventLogger;
|
|
12
24
|
connect(): Promise<boolean>;
|
|
13
25
|
close(): Promise<boolean>;
|
|
@@ -29,13 +41,22 @@ export interface IncyclistDeviceAdapter extends EventEmitter {
|
|
|
29
41
|
sendUpdate(request: any): any;
|
|
30
42
|
getMaxUpdateFrequency(): any;
|
|
31
43
|
setMaxUpdateFrequency(value: number): any;
|
|
44
|
+
getInterface(): string;
|
|
32
45
|
onData(callback: OnDeviceDataCallback): any;
|
|
33
46
|
}
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
export declare class Controllable<P extends DeviceProperties> implements IBike {
|
|
48
|
+
protected adapter: IncyclistDeviceAdapter;
|
|
49
|
+
protected props: P;
|
|
50
|
+
protected user: User;
|
|
51
|
+
constructor(adapter: IncyclistDeviceAdapter, props?: P);
|
|
52
|
+
isControllable(): boolean;
|
|
53
|
+
setCyclingMode(mode: string | ICyclingMode, settings?: any, sendInitCommands?: boolean): void;
|
|
54
|
+
getSupportedCyclingModes(): Array<typeof CyclingMode>;
|
|
55
|
+
getCyclingMode(): ICyclingMode;
|
|
56
|
+
getDefaultCyclingMode(): ICyclingMode;
|
|
57
|
+
sendInitCommands(): Promise<boolean>;
|
|
40
58
|
setUser(user: User): void;
|
|
59
|
+
getUser(): User;
|
|
60
|
+
setBikeProps(props: P): void;
|
|
61
|
+
getWeight(): number;
|
|
41
62
|
}
|
package/lib/types/adapter.js
CHANGED
|
@@ -1,2 +1,70 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Controllable = void 0;
|
|
13
|
+
const adpater_1 = require("../base/adpater");
|
|
14
|
+
class Controllable {
|
|
15
|
+
constructor(adapter, props) {
|
|
16
|
+
this.adapter = adapter;
|
|
17
|
+
this.props = props || {};
|
|
18
|
+
this.user = {};
|
|
19
|
+
}
|
|
20
|
+
isControllable() {
|
|
21
|
+
throw new Error("Method not implemented.");
|
|
22
|
+
}
|
|
23
|
+
setCyclingMode(mode, settings, sendInitCommands) {
|
|
24
|
+
throw new Error("Method not implemented.");
|
|
25
|
+
}
|
|
26
|
+
getSupportedCyclingModes() {
|
|
27
|
+
throw new Error("Method not implemented.");
|
|
28
|
+
}
|
|
29
|
+
getCyclingMode() {
|
|
30
|
+
throw new Error("Method not implemented.");
|
|
31
|
+
}
|
|
32
|
+
getDefaultCyclingMode() {
|
|
33
|
+
throw new Error("Method not implemented.");
|
|
34
|
+
}
|
|
35
|
+
sendInitCommands() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
throw new Error("Method not implemented.");
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
setUser(user) {
|
|
41
|
+
this.user = user;
|
|
42
|
+
if (!user.weight)
|
|
43
|
+
this.user.weight = adpater_1.DEFAULT_USER_WEIGHT;
|
|
44
|
+
}
|
|
45
|
+
getUser() {
|
|
46
|
+
return this.user;
|
|
47
|
+
}
|
|
48
|
+
setBikeProps(props) {
|
|
49
|
+
const { user, userWeight } = props || {};
|
|
50
|
+
if (user)
|
|
51
|
+
this.setUser(user);
|
|
52
|
+
if (userWeight)
|
|
53
|
+
this.user.weight = userWeight;
|
|
54
|
+
const keys = Object.keys(props);
|
|
55
|
+
keys.forEach(k => {
|
|
56
|
+
const p = props[k];
|
|
57
|
+
if (p === null)
|
|
58
|
+
delete this.props[k];
|
|
59
|
+
else if (p !== undefined)
|
|
60
|
+
this.props[k] = p;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
getWeight() {
|
|
64
|
+
const { user = {}, props = adpater_1.DEFAULT_PROPS } = this;
|
|
65
|
+
const userWeight = user.weight || props.userWeight || adpater_1.DEFAULT_USER_WEIGHT;
|
|
66
|
+
const bikeWeight = props.bikeWeight || adpater_1.DEFAULT_BIKE_WEIGHT;
|
|
67
|
+
return userWeight + bikeWeight;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.Controllable = Controllable;
|
package/lib/utils/utils.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const sleep: (ms: any) => Promise<unknown>;
|
|
2
2
|
export declare const resolveNextTick: () => Promise<void>;
|
|
3
|
-
export declare function runWithRetries(fn: any, maxRetries: any, timeBetween: any): Promise<
|
|
3
|
+
export declare function runWithRetries(fn: any, maxRetries: any, timeBetween: any): Promise<any>;
|
|
4
4
|
export declare function floatVal(d?: number | string): number;
|
|
5
5
|
export declare function intVal(d?: number | string): number;
|
|
6
6
|
export declare function hexstr(arr: any, start?: any, len?: any): string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "incyclist-devices",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@serialport/bindings-interface": "^1.2.2",
|
|
6
6
|
"@serialport/parser-byte-length": "^9.0.1",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"scripts": {
|
|
28
28
|
"lint": "eslint . --ext .ts",
|
|
29
29
|
"build": "tsc",
|
|
30
|
-
"test": "jest --coverage",
|
|
31
|
-
"test:ci": "jest --coverage --forceExit",
|
|
30
|
+
"test": "npx jest --coverage",
|
|
31
|
+
"test:ci": "npx jest --coverage --forceExit",
|
|
32
32
|
"dev": "tsc --watch",
|
|
33
33
|
"postversion": "git push && git push --tags"
|
|
34
34
|
},
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { ControllableDeviceAdapter } from "../..";
|
|
2
|
-
import FtmsCyclingMode from "../../modes/ble-st-mode";
|
|
3
|
-
import { UpdateRequest } from "../../modes/cycling-mode";
|
|
4
|
-
export default class AntAdvSimCyclingMode extends FtmsCyclingMode {
|
|
5
|
-
constructor(adapter: ControllableDeviceAdapter, props?: any);
|
|
6
|
-
getName(): string;
|
|
7
|
-
getDescription(): string;
|
|
8
|
-
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
9
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
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("../../modes/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,6 +0,0 @@
|
|
|
1
|
-
import { ControllableDeviceAdapter } from "../..";
|
|
2
|
-
import BleERGCyclingMode from "../../modes/ble-erg-mode";
|
|
3
|
-
export default class AntFeERGCyclingMode extends BleERGCyclingMode {
|
|
4
|
-
static isERG: boolean;
|
|
5
|
-
constructor(adapter: ControllableDeviceAdapter, props?: any);
|
|
6
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
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("../../modes/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
|
-
AntFeERGCyclingMode.isERG = true;
|
|
14
|
-
exports.default = AntFeERGCyclingMode;
|
|
@@ -1,13 +0,0 @@
|
|
|
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("../../modes/ble-st-mode"));
|
|
7
|
-
class AntStCyclingMode extends ble_st_mode_1.default {
|
|
8
|
-
constructor(adapter, props) {
|
|
9
|
-
super(adapter, props);
|
|
10
|
-
this.initLogger('AntSimMode');
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
exports.default = AntStCyclingMode;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ControllableDeviceAdapter } from "..";
|
|
2
|
-
import CyclingMode, { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "./cycling-mode";
|
|
3
|
-
import PowerBasedCyclingModeBase from "./power-base";
|
|
4
|
-
export default class BleERGCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
|
|
5
|
-
static isERG: boolean;
|
|
6
|
-
prevRequest: UpdateRequest;
|
|
7
|
-
hasBikeUpdate: boolean;
|
|
8
|
-
chain: number[];
|
|
9
|
-
cassette: number[];
|
|
10
|
-
constructor(adapter: ControllableDeviceAdapter, props?: any);
|
|
11
|
-
getName(): string;
|
|
12
|
-
getDescription(): string;
|
|
13
|
-
getProperties(): CyclingModeProperty[];
|
|
14
|
-
getProperty(name: string): CyclingModeProperty;
|
|
15
|
-
getBikeInitRequest(): UpdateRequest;
|
|
16
|
-
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
17
|
-
updateData(bikeData: IncyclistBikeData): any;
|
|
18
|
-
}
|
|
@@ -1,148 +0,0 @@
|
|
|
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 cycling_mode_1 = require("./cycling-mode");
|
|
7
|
-
const power_base_1 = __importDefault(require("./power-base"));
|
|
8
|
-
const config = {
|
|
9
|
-
name: "ERG",
|
|
10
|
-
description: "Calculates speed based on power and slope. Power targets are set by workout or remain stable throughout the workout",
|
|
11
|
-
properties: [
|
|
12
|
-
{ key: 'bikeType', name: 'Bike Type', description: '', type: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
13
|
-
{ key: 'startPower', name: 'Starting Power', description: 'Initial power in Watts at start of training', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 50, min: 25, max: 800 },
|
|
14
|
-
]
|
|
15
|
-
};
|
|
16
|
-
const MIN_SPEED = 10;
|
|
17
|
-
class BleERGCyclingMode extends power_base_1.default {
|
|
18
|
-
constructor(adapter, props) {
|
|
19
|
-
super(adapter, props);
|
|
20
|
-
this.hasBikeUpdate = false;
|
|
21
|
-
this.initLogger('ERGMode');
|
|
22
|
-
}
|
|
23
|
-
getName() {
|
|
24
|
-
return config.name;
|
|
25
|
-
}
|
|
26
|
-
getDescription() {
|
|
27
|
-
return config.description;
|
|
28
|
-
}
|
|
29
|
-
getProperties() {
|
|
30
|
-
return config.properties;
|
|
31
|
-
}
|
|
32
|
-
getProperty(name) {
|
|
33
|
-
return config.properties.find(p => p.name === name);
|
|
34
|
-
}
|
|
35
|
-
getBikeInitRequest() {
|
|
36
|
-
const startPower = Number(this.getSetting('startPower'));
|
|
37
|
-
this.prevRequest = { targetPower: startPower };
|
|
38
|
-
return { targetPower: startPower };
|
|
39
|
-
}
|
|
40
|
-
sendBikeUpdate(request) {
|
|
41
|
-
const getData = () => {
|
|
42
|
-
if (!this.data)
|
|
43
|
-
return {};
|
|
44
|
-
const { pedalRpm, slope, power, speed } = this.data;
|
|
45
|
-
return { pedalRpm, slope, power, speed };
|
|
46
|
-
};
|
|
47
|
-
this.logger.logEvent({ message: "processing update request", request, prev: this.prevRequest, data: getData() });
|
|
48
|
-
let newRequest = {};
|
|
49
|
-
try {
|
|
50
|
-
if (!request || request.reset) {
|
|
51
|
-
this.prevRequest = {};
|
|
52
|
-
return request.reset ? { reset: true } : {};
|
|
53
|
-
}
|
|
54
|
-
if (Object.keys(request).length === 0 && this.prevRequest) {
|
|
55
|
-
request.targetPower = this.prevRequest.targetPower;
|
|
56
|
-
}
|
|
57
|
-
const prevData = this.data || {};
|
|
58
|
-
if (request.slope !== undefined) {
|
|
59
|
-
if (!this.data)
|
|
60
|
-
this.data = {};
|
|
61
|
-
this.data.slope = request.slope;
|
|
62
|
-
}
|
|
63
|
-
delete request.slope;
|
|
64
|
-
if (request.targetPowerDelta && this.prevRequest && this.prevRequest.targetPower) {
|
|
65
|
-
request.targetPower = this.prevRequest.targetPower + request.targetPowerDelta;
|
|
66
|
-
if (request.targetPower < 10)
|
|
67
|
-
request.targetPower = this.prevRequest.targetPower;
|
|
68
|
-
delete request.targetPowerDelta;
|
|
69
|
-
}
|
|
70
|
-
if (request.targetPower !== undefined) {
|
|
71
|
-
delete request.refresh;
|
|
72
|
-
newRequest.targetPower = Number(request.targetPower);
|
|
73
|
-
}
|
|
74
|
-
if (request.refresh && request.targetPower === undefined) {
|
|
75
|
-
delete request.refresh;
|
|
76
|
-
newRequest.targetPower = this.prevRequest.targetPower;
|
|
77
|
-
}
|
|
78
|
-
if (request.targetPower === undefined && request.maxPower !== undefined && request.minPower !== undefined && request.maxPower === request.minPower) {
|
|
79
|
-
request.targetPower = request.maxPower;
|
|
80
|
-
newRequest.targetPower = request.targetPower;
|
|
81
|
-
}
|
|
82
|
-
if (request.maxPower !== undefined) {
|
|
83
|
-
if (newRequest.targetPower !== undefined && newRequest.targetPower > request.maxPower) {
|
|
84
|
-
newRequest.targetPower = request.maxPower;
|
|
85
|
-
}
|
|
86
|
-
newRequest.maxPower = request.maxPower;
|
|
87
|
-
}
|
|
88
|
-
if (request.minPower !== undefined) {
|
|
89
|
-
if (newRequest.targetPower !== undefined && newRequest.targetPower < request.minPower) {
|
|
90
|
-
newRequest.targetPower = request.minPower;
|
|
91
|
-
}
|
|
92
|
-
newRequest.minPower = request.minPower;
|
|
93
|
-
if (prevData.power && prevData.power < request.minPower)
|
|
94
|
-
newRequest.targetPower = request.minPower;
|
|
95
|
-
}
|
|
96
|
-
if (Object.keys(newRequest).length === 0) {
|
|
97
|
-
if (this.prevRequest)
|
|
98
|
-
newRequest.targetPower = this.prevRequest.targetPower;
|
|
99
|
-
newRequest.refresh = true;
|
|
100
|
-
}
|
|
101
|
-
this.prevRequest = JSON.parse(JSON.stringify(newRequest));
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
this.logger.logEvent({ message: "error", fn: 'sendBikeUpdate()', error: err.message || err, stack: err.stack });
|
|
105
|
-
}
|
|
106
|
-
return newRequest;
|
|
107
|
-
}
|
|
108
|
-
updateData(bikeData) {
|
|
109
|
-
const prevData = JSON.parse(JSON.stringify(this.data || {}));
|
|
110
|
-
const prevSpeed = prevData.speed;
|
|
111
|
-
const prevRequest = this.prevRequest || {};
|
|
112
|
-
const data = this.data || {};
|
|
113
|
-
const bikeType = this.getSetting('bikeType').toLowerCase();
|
|
114
|
-
try {
|
|
115
|
-
let power = bikeData.power || 0;
|
|
116
|
-
const slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
|
|
117
|
-
const distanceInternal = prevData.distanceInternal || 0;
|
|
118
|
-
const m = this.getWeight();
|
|
119
|
-
const t = this.getTimeSinceLastUpdate();
|
|
120
|
-
const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
121
|
-
if (power === 0 && speed < MIN_SPEED) {
|
|
122
|
-
data.speed = Math.round(prevData.speed - 1) < 0 ? 0 : Math.round(prevData.speed - 1);
|
|
123
|
-
data.distanceInternal = distanceInternal + data.speed / 3.6 * t;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
data.speed = (power === 0 && speed < MIN_SPEED) ? 0 : speed;
|
|
127
|
-
data.distanceInternal = (power === 0 && speed < MIN_SPEED) ? distanceInternal : distanceInternal + distance;
|
|
128
|
-
}
|
|
129
|
-
data.power = Math.round(power);
|
|
130
|
-
data.slope = slope;
|
|
131
|
-
data.pedalRpm = bikeData.pedalRpm || 0;
|
|
132
|
-
if (data.time !== undefined && data.speed > 0)
|
|
133
|
-
data.time += t;
|
|
134
|
-
else
|
|
135
|
-
data.time = 0;
|
|
136
|
-
data.heartrate = bikeData.heartrate;
|
|
137
|
-
data.isPedalling = bikeData.isPedalling;
|
|
138
|
-
}
|
|
139
|
-
catch (err) {
|
|
140
|
-
this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
|
|
141
|
-
}
|
|
142
|
-
this.logger.logEvent({ message: "updateData result", data, bikeData, prevRequest, prevSpeed });
|
|
143
|
-
this.data = data;
|
|
144
|
-
return data;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
BleERGCyclingMode.isERG = true;
|
|
148
|
-
exports.default = BleERGCyclingMode;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ControllableDeviceAdapter } from "..";
|
|
2
|
-
import CyclingMode, { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../modes/cycling-mode";
|
|
3
|
-
import PowerBasedCyclingModeBase from "../modes/power-base";
|
|
4
|
-
export default class FtmsCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
|
|
5
|
-
prevRequest: UpdateRequest;
|
|
6
|
-
hasBikeUpdate: boolean;
|
|
7
|
-
constructor(adapter: ControllableDeviceAdapter, props?: any);
|
|
8
|
-
getName(): string;
|
|
9
|
-
getDescription(): string;
|
|
10
|
-
getProperties(): CyclingModeProperty[];
|
|
11
|
-
getProperty(name: string): CyclingModeProperty;
|
|
12
|
-
getBikeInitRequest(): UpdateRequest;
|
|
13
|
-
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
14
|
-
updateData(bikeData: IncyclistBikeData): any;
|
|
15
|
-
}
|