incyclist-devices 2.0.38 → 2.1.1
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/adapters.d.ts +1 -1
- package/lib/antv2/adapter-factory.d.ts +4 -13
- package/lib/antv2/adapter.d.ts +16 -33
- package/lib/antv2/adapter.js +68 -112
- package/lib/antv2/ant-interface.d.ts +3 -11
- package/lib/antv2/ant-interface.js +1 -1
- package/lib/antv2/base/adapter.d.ts +62 -0
- package/lib/antv2/base/adapter.js +360 -0
- package/lib/antv2/base/ant-interface.d.ts +35 -0
- package/lib/antv2/base/ant-interface.js +285 -0
- package/lib/antv2/base/binding.d.ts +13 -0
- package/lib/antv2/base/binding.js +27 -0
- package/lib/antv2/cad/adapter.d.ts +10 -0
- package/lib/antv2/cad/adapter.js +25 -0
- package/lib/antv2/cad/index.d.ts +2 -0
- package/lib/antv2/cad/index.js +7 -0
- package/lib/antv2/consts.d.ts +2 -0
- package/lib/antv2/consts.js +5 -0
- package/lib/antv2/factories/adapter-factory.d.ts +14 -0
- package/lib/antv2/factories/adapter-factory.js +65 -0
- package/lib/antv2/factories/sensor-factory.d.ts +5 -0
- package/lib/antv2/factories/sensor-factory.js +22 -0
- package/lib/antv2/fe/adapter.d.ts +25 -26
- package/lib/antv2/fe/adapter.js +212 -218
- package/lib/antv2/hr/adapter.d.ts +6 -14
- package/lib/antv2/hr/adapter.js +7 -55
- package/lib/antv2/hr copy/adapter.d.ts +11 -0
- package/lib/antv2/hr copy/adapter.js +30 -0
- package/lib/antv2/hr copy/index.d.ts +2 -0
- package/lib/antv2/hr copy/index.js +7 -0
- package/lib/antv2/index.d.ts +5 -4
- package/lib/antv2/index.js +4 -2
- package/lib/antv2/pwr/adapter.d.ts +9 -29
- package/lib/antv2/pwr/adapter.js +20 -130
- package/lib/antv2/types.d.ts +23 -3
- package/lib/base/adpater.d.ts +42 -45
- package/lib/base/adpater.js +144 -110
- package/lib/base/consts.d.ts +4 -0
- package/lib/base/consts.js +9 -0
- package/lib/ble/adapter-factory.d.ts +4 -4
- package/lib/ble/base/adapter.d.ts +6 -24
- package/lib/ble/base/adapter.js +4 -94
- package/lib/ble/ble-interface.d.ts +2 -3
- package/lib/ble/cp/adapter.d.ts +6 -11
- package/lib/ble/cp/adapter.js +9 -12
- package/lib/ble/elite/adapter.d.ts +8 -8
- package/lib/ble/elite/adapter.js +6 -2
- package/lib/ble/fm/adapter.d.ts +11 -11
- package/lib/ble/fm/adapter.js +26 -20
- package/lib/ble/hr/adapter.d.ts +3 -4
- package/lib/ble/hr/adapter.js +2 -2
- package/lib/ble/tacx/adapter.d.ts +2 -3
- package/lib/ble/tacx/adapter.js +8 -8
- package/lib/ble/types.d.ts +1 -2
- package/lib/ble/wahoo/adapter.d.ts +2 -2
- package/lib/ble/wahoo/adapter.js +6 -6
- package/lib/ble/wahoo/comms.js +16 -16
- package/lib/factories/adapters.d.ts +7 -0
- package/lib/factories/adapters.js +49 -0
- package/lib/factories/index.d.ts +3 -0
- package/lib/factories/index.js +10 -0
- package/lib/factories/interfaces.d.ts +7 -0
- package/lib/factories/interfaces.js +27 -0
- package/lib/index.d.ts +8 -9
- package/lib/index.js +5 -8
- 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 +17 -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 +24 -0
- package/lib/{serial/daum/premium/modes/daum-classic.js → modes/daum-premium-standard.js} +26 -38
- package/lib/modes/daum-smarttrainer.d.ts +83 -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 +184 -7
- package/lib/modes/power-meter.d.ts +11 -16
- package/lib/modes/power-meter.js +15 -54
- package/lib/modes/simulator.d.ts +38 -10
- package/lib/modes/simulator.js +14 -46
- package/lib/modes/{cycling-mode.d.ts → types.d.ts} +22 -30
- package/lib/modes/types.js +56 -0
- package/lib/serial/SinglePathScanner.d.ts +17 -0
- package/lib/serial/SinglePathScanner.js +87 -0
- package/lib/serial/adapter-factory.d.ts +8 -6
- package/lib/serial/adapter.d.ts +6 -11
- package/lib/serial/adapter.js +5 -2
- package/lib/serial/base/adapter.d.ts +17 -0
- package/lib/serial/base/adapter.js +67 -0
- package/lib/serial/base/comms.d.ts +62 -0
- package/lib/serial/base/comms.js +280 -0
- package/lib/serial/base/serial-interface.d.ts +36 -0
- package/lib/serial/base/serial-interface.js +288 -0
- package/lib/serial/base/serial-scanner.d.ts +16 -0
- package/lib/serial/base/serial-scanner.js +87 -0
- package/lib/serial/base/serialport.d.ts +17 -0
- package/lib/serial/base/serialport.js +87 -0
- package/lib/serial/comms.d.ts +2 -2
- package/lib/serial/daum/DaumAdapter.d.ts +26 -35
- package/lib/serial/daum/DaumAdapter.js +214 -161
- package/lib/serial/daum/classic/PROTOCOL_NAME.d.ts +2 -0
- package/lib/serial/daum/classic/PROTOCOL_NAME.js +5 -0
- package/lib/serial/daum/classic/adapter.d.ts +13 -26
- package/lib/serial/daum/classic/adapter.js +72 -176
- package/lib/serial/daum/classic/comms.d.ts +21 -17
- package/lib/serial/daum/classic/comms.js +41 -14
- package/lib/serial/daum/classic/consts.d.ts +2 -0
- package/lib/serial/daum/classic/consts.js +5 -0
- package/lib/serial/daum/classic/mock.d.ts +4 -0
- package/lib/serial/daum/classic/mock.js +18 -7
- package/lib/serial/daum/classic/types.d.ts +8 -10
- package/lib/serial/daum/classic/utils.d.ts +1 -2
- package/lib/serial/daum/consts.d.ts +0 -0
- package/lib/serial/daum/consts.js +0 -0
- package/lib/serial/daum/premium/adapter.d.ts +17 -15
- package/lib/serial/daum/premium/adapter.js +86 -109
- package/lib/serial/daum/premium/comms.d.ts +7 -7
- package/lib/serial/daum/premium/comms.js +25 -16
- package/lib/serial/daum/premium/mock.d.ts +5 -1
- package/lib/serial/daum/premium/mock.js +17 -7
- package/lib/serial/daum/premium/types.d.ts +32 -17
- package/lib/serial/daum/premium/types.js +8 -8
- package/lib/serial/daum/premium/utils.d.ts +2 -3
- package/lib/serial/daum/premium/utils.js +3 -3
- package/lib/serial/daum/types.d.ts +14 -0
- package/lib/serial/daum/types.js +13 -0
- package/lib/serial/factories/adapter-factory.d.ts +14 -0
- package/lib/serial/factories/adapter-factory.js +30 -0
- package/lib/serial/index.d.ts +8 -5
- package/lib/serial/index.js +15 -15
- package/lib/serial/kettler/comms.d.ts +1 -1
- package/lib/serial/kettler/ergo-racer/adapter.d.ts +11 -16
- package/lib/serial/kettler/ergo-racer/adapter.js +10 -12
- package/lib/serial/kettler/types.d.ts +8 -0
- package/lib/serial/kettler/types.js +2 -0
- package/lib/serial/serial-interface.d.ts +2 -32
- package/lib/serial/serial-interface.js +4 -78
- package/lib/serial/serial-scanner.d.ts +16 -0
- package/lib/serial/serial-scanner.js +87 -0
- package/lib/serial/serialport.d.ts +1 -13
- package/lib/serial/types.d.ts +45 -0
- package/lib/serial/types.js +9 -0
- package/lib/simulator/Simulator.d.ts +13 -19
- package/lib/simulator/Simulator.js +10 -51
- package/lib/types/Command.d.ts +8 -0
- package/lib/types/Command.js +2 -0
- package/lib/types/adapter.d.ts +34 -24
- package/lib/types/command.d.ts +0 -8
- package/lib/types/command.js +0 -2
- package/lib/types/data.d.ts +12 -1
- package/lib/types/device.d.ts +8 -23
- package/lib/types/device.js +9 -8
- package/lib/types/index.d.ts +6 -0
- package/lib/types/index.js +22 -0
- package/lib/types/route.d.ts +0 -19
- package/lib/types/route.js +0 -2
- package/lib/types/types.d.ts +8 -0
- package/lib/types/types.js +2 -0
- package/lib/utils/utils.d.ts +2 -1
- package/lib/utils/utils.js +22 -4
- 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/constants.d.ts +0 -19
- package/lib/serial/daum/constants.js +0 -22
- package/lib/serial/daum/premium/modes/daum-classic.d.ts +0 -14
- package/lib/serial/kettler/ergo-racer/modes/erg.d.ts +0 -25
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import ICyclingMode, { CyclingModeProperyType, Settings, UpdateRequest } from "./types";
|
|
2
|
+
import { IncyclistBikeData } from "../types";
|
|
3
|
+
import PowerMeterCyclingMode from "./power-meter";
|
|
4
|
+
import { IncyclistDeviceAdapter } from "../base/adpater";
|
|
5
|
+
export default class DaumClassicCyclingMode extends PowerMeterCyclingMode implements ICyclingMode {
|
|
6
|
+
prevInternalDistance: number;
|
|
7
|
+
distanceOffset: number;
|
|
8
|
+
protected static config: {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
properties: {
|
|
12
|
+
key: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
type: CyclingModeProperyType;
|
|
16
|
+
options: string[];
|
|
17
|
+
default: string;
|
|
18
|
+
}[];
|
|
19
|
+
};
|
|
20
|
+
constructor(adapter: IncyclistDeviceAdapter, props?: Settings);
|
|
21
|
+
getBikeInitRequest(): UpdateRequest;
|
|
22
|
+
updateData(data: IncyclistBikeData): IncyclistBikeData;
|
|
23
|
+
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
24
|
+
}
|
|
@@ -4,16 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
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: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain'], default: 'Race' },
|
|
14
|
-
]
|
|
15
|
-
};
|
|
16
|
-
class DaumClassicCyclingMode extends DaumPowerMeterCyclingMode_1.default {
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const power_meter_1 = __importDefault(require("./power-meter"));
|
|
9
|
+
class DaumClassicCyclingMode extends power_meter_1.default {
|
|
17
10
|
constructor(adapter, props) {
|
|
18
11
|
super(adapter, props);
|
|
19
12
|
this.logger = adapter ? adapter.getLogger() : undefined;
|
|
@@ -22,65 +15,60 @@ class DaumClassicCyclingMode extends DaumPowerMeterCyclingMode_1.default {
|
|
|
22
15
|
this.setModeProperty('eppSupport', true);
|
|
23
16
|
this.setModeProperty('setPersonSupport', true);
|
|
24
17
|
}
|
|
25
|
-
getName() {
|
|
26
|
-
return config.name;
|
|
27
|
-
}
|
|
28
|
-
getDescription() {
|
|
29
|
-
return config.description;
|
|
30
|
-
}
|
|
31
|
-
getProperties() {
|
|
32
|
-
return config.properties;
|
|
33
|
-
}
|
|
34
|
-
getProperty(name) {
|
|
35
|
-
return config.properties.find(p => p.name === name);
|
|
36
|
-
}
|
|
37
18
|
getBikeInitRequest() {
|
|
38
19
|
return {};
|
|
39
20
|
}
|
|
40
|
-
getSettings() {
|
|
41
|
-
const settings = super.getSettings();
|
|
42
|
-
settings['setPerson'] = true;
|
|
43
|
-
return settings;
|
|
44
|
-
}
|
|
45
|
-
getSetting(name) {
|
|
46
|
-
if (name === 'setPerson')
|
|
47
|
-
return true;
|
|
48
|
-
return super.getSetting(name);
|
|
49
|
-
}
|
|
50
21
|
updateData(data) {
|
|
51
22
|
try {
|
|
52
|
-
const prevData =
|
|
23
|
+
const prevData = Object.assign({}, this.getData());
|
|
53
24
|
const prevRequest = this.prevRequest || {};
|
|
54
25
|
const bikeData = JSON.parse(JSON.stringify(data));
|
|
55
26
|
let power = data.power || 0;
|
|
56
27
|
let speed = data.speed || 0;
|
|
57
28
|
let slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
|
|
58
29
|
let distanceBike = data.distanceInternal || 0;
|
|
59
|
-
let distancePrev =
|
|
60
|
-
let distanceInternal = distanceBike;
|
|
30
|
+
let distancePrev = this.prevInternalDistance || 0;
|
|
31
|
+
let distanceInternal = distanceBike + (this.distanceOffset || 0);
|
|
32
|
+
let time = prevData.time || 0;
|
|
61
33
|
let ts = Date.now();
|
|
34
|
+
let t = this.getTimeSinceLastUpdate();
|
|
62
35
|
if (!bikeData.pedalRpm || bikeData.isPedalling === false) {
|
|
63
36
|
speed = 0;
|
|
64
37
|
power = 0;
|
|
65
38
|
}
|
|
66
39
|
if (distanceBike < distancePrev) {
|
|
67
|
-
this.logger.logEvent({ message: '
|
|
40
|
+
this.logger.logEvent({ message: 'distance overflow', distanceBike, distancePrev });
|
|
68
41
|
let v = speed / 3.6;
|
|
69
|
-
|
|
70
|
-
|
|
42
|
+
const calculateDistance = distancePrev + (this.distanceOffset || 0) + v * t;
|
|
43
|
+
this.distanceOffset = calculateDistance - distanceBike;
|
|
44
|
+
distanceInternal = calculateDistance;
|
|
71
45
|
}
|
|
72
46
|
data.speed = parseFloat(speed.toFixed(1));
|
|
73
47
|
data.power = Math.round(power);
|
|
74
48
|
data.distanceInternal = distanceInternal;
|
|
75
49
|
data.slope = slope;
|
|
50
|
+
data.time = speed > 0 ? time + t : time;
|
|
76
51
|
this.logger.logEvent({ message: "updateData result", data, bikeData, prevRequest: {}, prevSpeed: prevData.speed });
|
|
77
52
|
this.data = JSON.parse(JSON.stringify(data));
|
|
78
53
|
this.prevUpdateTS = ts;
|
|
54
|
+
this.prevInternalDistance = distanceBike;
|
|
79
55
|
}
|
|
80
56
|
catch (err) {
|
|
81
57
|
this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
|
|
82
58
|
}
|
|
83
59
|
return data;
|
|
84
60
|
}
|
|
61
|
+
sendBikeUpdate(request) {
|
|
62
|
+
super.sendBikeUpdate(request);
|
|
63
|
+
this.prevRequest = {};
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
85
66
|
}
|
|
67
|
+
DaumClassicCyclingMode.config = {
|
|
68
|
+
name: "Daum Classic",
|
|
69
|
+
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",
|
|
70
|
+
properties: [
|
|
71
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain'], default: 'Race' },
|
|
72
|
+
]
|
|
73
|
+
};
|
|
86
74
|
exports.default = DaumClassicCyclingMode;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { EventLogger } from "gd-eventlog";
|
|
2
|
+
import ICyclingMode, { CyclingModeProperyType, Settings, UpdateRequest } from "./types";
|
|
3
|
+
import { IncyclistBikeData } from "../types";
|
|
4
|
+
import { CyclingModeBase } from "./base";
|
|
5
|
+
import { IncyclistDeviceAdapter } from "../base/adpater";
|
|
6
|
+
interface STUpdateRequest extends UpdateRequest {
|
|
7
|
+
calculatedPower?: number;
|
|
8
|
+
delta?: number;
|
|
9
|
+
enforced?: boolean;
|
|
10
|
+
belowMin?: boolean;
|
|
11
|
+
aboveMax?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare enum direction {
|
|
14
|
+
up = "up",
|
|
15
|
+
down = "down"
|
|
16
|
+
}
|
|
17
|
+
interface STEvent {
|
|
18
|
+
gearUpdate?: direction;
|
|
19
|
+
rpmUpdate?: boolean;
|
|
20
|
+
targetNotReached?: number;
|
|
21
|
+
}
|
|
22
|
+
export default class SmartTrainerCyclingMode extends CyclingModeBase implements ICyclingMode {
|
|
23
|
+
logger: EventLogger;
|
|
24
|
+
data?: IncyclistBikeData;
|
|
25
|
+
prevRequest?: STUpdateRequest;
|
|
26
|
+
prevUpdateTS: number;
|
|
27
|
+
chain: number[];
|
|
28
|
+
cassette: number[];
|
|
29
|
+
event: STEvent;
|
|
30
|
+
protected static config: {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
properties: ({
|
|
34
|
+
key: string;
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
type: CyclingModeProperyType;
|
|
38
|
+
options: string[];
|
|
39
|
+
default: string;
|
|
40
|
+
validation?: undefined;
|
|
41
|
+
condition?: undefined;
|
|
42
|
+
} | {
|
|
43
|
+
key: string;
|
|
44
|
+
name: string;
|
|
45
|
+
description: string;
|
|
46
|
+
type: CyclingModeProperyType;
|
|
47
|
+
default: number;
|
|
48
|
+
options?: undefined;
|
|
49
|
+
validation?: undefined;
|
|
50
|
+
condition?: undefined;
|
|
51
|
+
} | {
|
|
52
|
+
key: string;
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
type: CyclingModeProperyType;
|
|
56
|
+
default: boolean;
|
|
57
|
+
options?: undefined;
|
|
58
|
+
validation?: undefined;
|
|
59
|
+
condition?: undefined;
|
|
60
|
+
} | {
|
|
61
|
+
key: string;
|
|
62
|
+
name: string;
|
|
63
|
+
description: string;
|
|
64
|
+
type: CyclingModeProperyType;
|
|
65
|
+
validation: string;
|
|
66
|
+
default: string;
|
|
67
|
+
condition: (s: any) => any;
|
|
68
|
+
options?: undefined;
|
|
69
|
+
})[];
|
|
70
|
+
};
|
|
71
|
+
constructor(adapter: IncyclistDeviceAdapter, props?: Settings);
|
|
72
|
+
getData(): IncyclistBikeData;
|
|
73
|
+
getSlope(): number;
|
|
74
|
+
getWeight(): number;
|
|
75
|
+
getBikeInitRequest(): STUpdateRequest;
|
|
76
|
+
useGearSimulation(): boolean;
|
|
77
|
+
getMinMaxGears(source: string): [number, number];
|
|
78
|
+
sendBikeUpdate(request: STUpdateRequest): STUpdateRequest;
|
|
79
|
+
updateData(bikeData: IncyclistBikeData): any;
|
|
80
|
+
calculateSpeed(gear: any, rpm: any, slope: any, bikeSpeed: any, props?: any): any;
|
|
81
|
+
calculateTargetPower(request: STUpdateRequest, speed?: number): STUpdateRequest;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
@@ -5,28 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.direction = void 0;
|
|
7
7
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
8
|
-
const
|
|
9
|
-
const calculations_1 = __importDefault(require("
|
|
10
|
-
const utils_1 = require("
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const calculations_1 = __importDefault(require("../utils/calculations"));
|
|
10
|
+
const utils_1 = require("../serial/daum/classic/utils");
|
|
11
|
+
const base_1 = require("./base");
|
|
11
12
|
const SEC_DELAY = 3;
|
|
12
|
-
const config = {
|
|
13
|
-
name: "SmartTrainer",
|
|
14
|
-
description: "Calculates power based on speed and slope.",
|
|
15
|
-
properties: [
|
|
16
|
-
{ key: 'bikeType', name: 'Bike Type', description: '', type: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
17
|
-
{ key: 'startPower', name: 'Starting Power', description: 'Initial power in Watts at start of training', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 50 },
|
|
18
|
-
{ key: 'minPower', name: 'Minimum Power', description: 'Minimum power in declines', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 50 },
|
|
19
|
-
{ key: 'simulation', name: 'Simulate ', description: 'Simulate ', type: cycling_mode_1.CyclingModeProperyType.Boolean, default: false },
|
|
20
|
-
{ key: 'chainRings', name: 'Chain Rings', description: 'Simulated chain rings (format: <min>-<max>)', type: cycling_mode_1.CyclingModeProperyType.String, validation: '', default: '36-52', condition: (s) => s.simulation },
|
|
21
|
-
{ key: 'cassetteRings', name: 'Cassette', description: 'Simulated cassette (format: <min>-<max>)', type: cycling_mode_1.CyclingModeProperyType.String, validation: '', default: '11-30', condition: (s) => s.simulation },
|
|
22
|
-
]
|
|
23
|
-
};
|
|
24
13
|
var direction;
|
|
25
14
|
(function (direction) {
|
|
26
15
|
direction["up"] = "up";
|
|
27
16
|
direction["down"] = "down";
|
|
28
17
|
})(direction || (exports.direction = direction = {}));
|
|
29
|
-
class SmartTrainerCyclingMode extends
|
|
18
|
+
class SmartTrainerCyclingMode extends base_1.CyclingModeBase {
|
|
30
19
|
constructor(adapter, props) {
|
|
31
20
|
super(adapter, props);
|
|
32
21
|
this.prevUpdateTS = 0;
|
|
@@ -34,18 +23,14 @@ class SmartTrainerCyclingMode extends cycling_mode_1.CyclingModeBase {
|
|
|
34
23
|
this.logger = adapter ? adapter.getLogger() : undefined;
|
|
35
24
|
if (!this.logger)
|
|
36
25
|
this.logger = new gd_eventlog_1.EventLogger('SmartTrainer');
|
|
26
|
+
this.data = { speed: 0, power: 0, distanceInternal: 0, pedalRpm: 0, isPedalling: false, heartrate: 0 };
|
|
37
27
|
}
|
|
38
|
-
|
|
39
|
-
return
|
|
40
|
-
}
|
|
41
|
-
getDescription() {
|
|
42
|
-
return config.description;
|
|
28
|
+
getData() {
|
|
29
|
+
return this.data;
|
|
43
30
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
getProperty(name) {
|
|
48
|
-
return config.properties.find(p => p.name === name);
|
|
31
|
+
getSlope() {
|
|
32
|
+
const { slope } = this.data;
|
|
33
|
+
return slope || 0;
|
|
49
34
|
}
|
|
50
35
|
getWeight() {
|
|
51
36
|
const a = this.adapter;
|
|
@@ -347,4 +332,16 @@ class SmartTrainerCyclingMode extends cycling_mode_1.CyclingModeBase {
|
|
|
347
332
|
return request;
|
|
348
333
|
}
|
|
349
334
|
}
|
|
335
|
+
SmartTrainerCyclingMode.config = {
|
|
336
|
+
name: "SmartTrainer",
|
|
337
|
+
description: "Calculates power based on speed and slope.",
|
|
338
|
+
properties: [
|
|
339
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
340
|
+
{ key: 'startPower', name: 'Starting Power', description: 'Initial power in Watts at start of training', type: types_1.CyclingModeProperyType.Integer, default: 50 },
|
|
341
|
+
{ key: 'minPower', name: 'Minimum Power', description: 'Minimum power in declines', type: types_1.CyclingModeProperyType.Integer, default: 50 },
|
|
342
|
+
{ key: 'simulation', name: 'Simulate ', description: 'Simulate ', type: types_1.CyclingModeProperyType.Boolean, default: false },
|
|
343
|
+
{ key: 'chainRings', name: 'Chain Rings', description: 'Simulated chain rings (format: <min>-<max>)', type: types_1.CyclingModeProperyType.String, validation: '', default: '36-52', condition: (s) => s.simulation },
|
|
344
|
+
{ key: 'cassetteRings', name: 'Cassette', description: 'Simulated cassette (format: <min>-<max>)', type: types_1.CyclingModeProperyType.String, validation: '', default: '11-30', condition: (s) => s.simulation },
|
|
345
|
+
]
|
|
346
|
+
};
|
|
350
347
|
exports.default = SmartTrainerCyclingMode;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import ICyclingMode, { CyclingModeProperyType, UpdateRequest } from './types';
|
|
2
|
+
import { IncyclistBikeData, IAdapter } from "../types";
|
|
3
|
+
import PowerBasedCyclingModeBase from './power-base';
|
|
4
|
+
export type ERGEvent = {
|
|
5
|
+
rpmUpdated?: boolean;
|
|
6
|
+
gearUpdated?: boolean;
|
|
7
|
+
starting?: boolean;
|
|
8
|
+
tsStart?: number;
|
|
9
|
+
};
|
|
10
|
+
export default class ERGCyclingMode extends PowerBasedCyclingModeBase implements ICyclingMode {
|
|
11
|
+
protected static config: {
|
|
12
|
+
isERG: boolean;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
properties: ({
|
|
16
|
+
key: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
type: CyclingModeProperyType;
|
|
20
|
+
options: string[];
|
|
21
|
+
default: string;
|
|
22
|
+
min?: undefined;
|
|
23
|
+
max?: undefined;
|
|
24
|
+
} | {
|
|
25
|
+
key: string;
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
type: CyclingModeProperyType;
|
|
29
|
+
default: number;
|
|
30
|
+
min: number;
|
|
31
|
+
max: number;
|
|
32
|
+
options?: undefined;
|
|
33
|
+
})[];
|
|
34
|
+
};
|
|
35
|
+
prevRequest: UpdateRequest;
|
|
36
|
+
hasBikeUpdate: boolean;
|
|
37
|
+
chain: number[];
|
|
38
|
+
cassette: number[];
|
|
39
|
+
event: ERGEvent;
|
|
40
|
+
constructor(adapter: IAdapter, props?: any);
|
|
41
|
+
getBikeInitRequest(): UpdateRequest;
|
|
42
|
+
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
43
|
+
updateData(bikeData: IncyclistBikeData): any;
|
|
44
|
+
}
|
|
@@ -3,17 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
7
|
-
const power_base_1 = __importDefault(require("
|
|
6
|
+
const types_1 = require("./types");
|
|
7
|
+
const power_base_1 = __importDefault(require("./power-base"));
|
|
8
8
|
const MIN_SPEED = 10;
|
|
9
|
-
const config = {
|
|
10
|
-
name: "ERG",
|
|
11
|
-
description: "Calculates speed based on power and slope. Power is either set by a workout",
|
|
12
|
-
properties: [
|
|
13
|
-
{ key: 'bikeType', name: 'Bike Type', description: '', type: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
14
|
-
{ 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 },
|
|
15
|
-
]
|
|
16
|
-
};
|
|
17
9
|
class ERGCyclingMode extends power_base_1.default {
|
|
18
10
|
constructor(adapter, props) {
|
|
19
11
|
super(adapter, props);
|
|
@@ -21,18 +13,6 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
21
13
|
this.event = {};
|
|
22
14
|
this.initLogger('ERGMode');
|
|
23
15
|
}
|
|
24
|
-
getName() {
|
|
25
|
-
return config.name;
|
|
26
|
-
}
|
|
27
|
-
getDescription() {
|
|
28
|
-
return config.description;
|
|
29
|
-
}
|
|
30
|
-
getProperties() {
|
|
31
|
-
return config.properties;
|
|
32
|
-
}
|
|
33
|
-
getProperty(name) {
|
|
34
|
-
return config.properties.find(p => p.name === name);
|
|
35
|
-
}
|
|
36
16
|
getBikeInitRequest() {
|
|
37
17
|
const startPower = this.getSetting('startPower');
|
|
38
18
|
return { targetPower: startPower };
|
|
@@ -131,6 +111,7 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
131
111
|
data.time = 0;
|
|
132
112
|
data.heartrate = bikeData.heartrate;
|
|
133
113
|
data.isPedalling = bikeData.isPedalling;
|
|
114
|
+
this.prevUpdateTS = Date.now();
|
|
134
115
|
}
|
|
135
116
|
catch (err) {
|
|
136
117
|
this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
|
|
@@ -140,5 +121,13 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
140
121
|
return data;
|
|
141
122
|
}
|
|
142
123
|
}
|
|
143
|
-
ERGCyclingMode.
|
|
124
|
+
ERGCyclingMode.config = {
|
|
125
|
+
isERG: true,
|
|
126
|
+
name: "ERG",
|
|
127
|
+
description: "Calculates speed based on power and slope. Power is either set by a workout",
|
|
128
|
+
properties: [
|
|
129
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
130
|
+
{ 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 },
|
|
131
|
+
]
|
|
132
|
+
};
|
|
144
133
|
exports.default = ERGCyclingMode;
|
|
@@ -1,20 +1,45 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CyclingModeConfig, Settings, UpdateRequest } from './types';
|
|
2
|
+
import { IncyclistBikeData, IAdapter } from "../types";
|
|
2
3
|
import { EventLogger } from 'gd-eventlog';
|
|
3
|
-
import {
|
|
4
|
+
import { CyclingModeBase } from './base';
|
|
4
5
|
export default class PowerBasedCyclingModeBase extends CyclingModeBase {
|
|
5
6
|
data: IncyclistBikeData;
|
|
6
7
|
prevUpdateTS: number;
|
|
7
8
|
logger: EventLogger;
|
|
8
|
-
|
|
9
|
+
prevRequest: UpdateRequest | undefined;
|
|
10
|
+
protected static config: CyclingModeConfig;
|
|
11
|
+
constructor(adapter: IAdapter, props?: Settings);
|
|
12
|
+
getData(): IncyclistBikeData;
|
|
13
|
+
getSlope(): number;
|
|
9
14
|
initLogger(defaultLogName: any): void;
|
|
10
15
|
getWeight(): number;
|
|
11
16
|
getTimeSinceLastUpdate(): number;
|
|
17
|
+
checkForResetOrEmpty(request: UpdateRequest): UpdateRequest | undefined;
|
|
18
|
+
protected checkForTempPowerAdjustments(request: UpdateRequest): void;
|
|
19
|
+
protected checkRefresh(request: UpdateRequest, newRequest: UpdateRequest): void;
|
|
20
|
+
protected checkTargetPowerSet(request: UpdateRequest, newRequest: UpdateRequest): void;
|
|
21
|
+
protected checkSlope(request: UpdateRequest): void;
|
|
22
|
+
protected checkEmptyRequest(newRequest: UpdateRequest): void;
|
|
23
|
+
protected checkMinPower(request: UpdateRequest, newRequest: UpdateRequest): void;
|
|
24
|
+
protected checkMaxPower(request: UpdateRequest, newRequest: UpdateRequest): void;
|
|
12
25
|
calculateSpeedAndDistance(power: number, slope: number, m: number, t: number, props?: {}): {
|
|
13
26
|
speed: number;
|
|
14
27
|
distance: number;
|
|
15
28
|
};
|
|
29
|
+
protected updateSpeedAndDistance(power: number, slope: any, bikeType: any, data: IncyclistBikeData, prevData: any): number;
|
|
30
|
+
protected getCalcBasics(bikeData: IncyclistBikeData): {
|
|
31
|
+
data: IncyclistBikeData;
|
|
32
|
+
prevData: any;
|
|
33
|
+
prevRequest: UpdateRequest;
|
|
34
|
+
bikeType: any;
|
|
35
|
+
slope: any;
|
|
36
|
+
};
|
|
37
|
+
copyBikeData(data: IncyclistBikeData, bikeData: IncyclistBikeData): IncyclistBikeData;
|
|
16
38
|
calculatePowerAndDistance(speed: number, slope: number, m: number, t: number, props?: {}): {
|
|
17
39
|
power: number;
|
|
18
40
|
distance: number;
|
|
19
41
|
};
|
|
42
|
+
getBikeInitRequest(): UpdateRequest;
|
|
43
|
+
sendBikeUpdate(incoming: UpdateRequest): UpdateRequest;
|
|
44
|
+
updateData(bikeData: IncyclistBikeData, log?: boolean): IncyclistBikeData;
|
|
20
45
|
}
|