incyclist-devices 2.1.38 → 2.1.40
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/factories/interfaces.d.ts +1 -1
- package/lib/modes/antble-smarttrainer.d.ts +13 -2
- package/lib/modes/antble-smarttrainer.js +9 -1
- package/lib/modes/daum-erg.d.ts +1 -0
- package/lib/modes/daum-erg.js +18 -3
- package/lib/modes/power-base.js +2 -0
- package/lib/modes/simulator.js +7 -2
- package/lib/modes/types.d.ts +1 -0
- package/lib/serial/daum/DaumAdapter.js +3 -0
- package/lib/serial/daum/classic/comms.d.ts +1 -0
- package/lib/serial/daum/classic/comms.js +10 -0
- package/lib/serial/daum/premium/comms.d.ts +1 -0
- package/lib/serial/daum/premium/comms.js +10 -0
- package/lib/serial/daum/types.d.ts +1 -0
- package/lib/simulator/Simulator.d.ts +1 -0
- package/lib/simulator/Simulator.js +9 -2
- package/package.json +1 -1
|
@@ -3,5 +3,5 @@ import { SerialInterface } from "../serial";
|
|
|
3
3
|
import AntInterface from "../antv2/base/interface";
|
|
4
4
|
import { BleInterface } from "../ble";
|
|
5
5
|
export default class InterfaceFactory {
|
|
6
|
-
static create(ifaceName: string, props?: InterfaceProps):
|
|
6
|
+
static create(ifaceName: string, props?: InterfaceProps): BleInterface | AntInterface | SerialInterface;
|
|
7
7
|
}
|
|
@@ -5,14 +5,25 @@ export default class SmartTrainerCyclingMode extends PowerBasedCyclingModeBase i
|
|
|
5
5
|
protected static config: {
|
|
6
6
|
name: string;
|
|
7
7
|
description: string;
|
|
8
|
-
properties: {
|
|
8
|
+
properties: ({
|
|
9
9
|
key: string;
|
|
10
10
|
name: string;
|
|
11
11
|
description: string;
|
|
12
12
|
type: CyclingModeProperyType;
|
|
13
13
|
options: string[];
|
|
14
14
|
default: string;
|
|
15
|
-
|
|
15
|
+
min?: undefined;
|
|
16
|
+
max?: undefined;
|
|
17
|
+
} | {
|
|
18
|
+
key: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
type: CyclingModeProperyType;
|
|
22
|
+
default: number;
|
|
23
|
+
min: number;
|
|
24
|
+
max: number;
|
|
25
|
+
options?: undefined;
|
|
26
|
+
})[];
|
|
16
27
|
};
|
|
17
28
|
constructor(adapter: IAdapter, props?: any);
|
|
18
29
|
getBikeInitRequest(): UpdateRequest;
|
|
@@ -27,6 +27,13 @@ class SmartTrainerCyclingMode extends power_base_1.default {
|
|
|
27
27
|
if (request.slope !== undefined) {
|
|
28
28
|
newRequest.slope = parseFloat(request.slope.toFixed(1));
|
|
29
29
|
this.data.slope = newRequest.slope;
|
|
30
|
+
try {
|
|
31
|
+
const slopeAdj = this.getSetting('slopeAdj');
|
|
32
|
+
if (slopeAdj !== undefined)
|
|
33
|
+
newRequest.slope = newRequest.slope * slopeAdj / 100;
|
|
34
|
+
}
|
|
35
|
+
catch (_a) {
|
|
36
|
+
}
|
|
30
37
|
}
|
|
31
38
|
}
|
|
32
39
|
checkEmptyRequest(newRequest) {
|
|
@@ -59,7 +66,8 @@ SmartTrainerCyclingMode.config = {
|
|
|
59
66
|
name: "Smart Trainer",
|
|
60
67
|
description: "Calculates speed based on power and slope. Slope is set to the device",
|
|
61
68
|
properties: [
|
|
62
|
-
{ key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' }
|
|
69
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' },
|
|
70
|
+
{ key: 'slopeAdj', name: 'Slope Adjustment', description: 'Percentage of slope that should be sent to the SmartTrainer. Should be used in case the slopes are feeling too hard', type: types_1.CyclingModeProperyType.Integer, default: 100, min: 0, max: 200 }
|
|
63
71
|
]
|
|
64
72
|
};
|
|
65
73
|
exports.default = SmartTrainerCyclingMode;
|
package/lib/modes/daum-erg.d.ts
CHANGED
|
@@ -46,4 +46,5 @@ export default class ERGCyclingMode extends PowerBasedCyclingModeBase implements
|
|
|
46
46
|
private cleanupPrevEvents;
|
|
47
47
|
private checkIsStarting;
|
|
48
48
|
calculateTargetPower(request: any, updateMode?: boolean): any;
|
|
49
|
+
protected checkForTempPowerAdjustments(request: UpdateRequest): void;
|
|
49
50
|
}
|
package/lib/modes/daum-erg.js
CHANGED
|
@@ -39,7 +39,8 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
39
39
|
this.data = {};
|
|
40
40
|
this.data.slope = request.slope;
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
this.checkForTempPowerAdjustments(request);
|
|
43
|
+
if (request.targetPower !== undefined || request.gear !== undefined) {
|
|
43
44
|
delete request.slope;
|
|
44
45
|
delete request.refresh;
|
|
45
46
|
}
|
|
@@ -77,11 +78,15 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
77
78
|
if (request.maxPower !== undefined && request.minPower !== undefined && request.maxPower === request.minPower) {
|
|
78
79
|
request.targetPower = request.maxPower;
|
|
79
80
|
}
|
|
80
|
-
if (request.targetPower === undefined) {
|
|
81
|
+
if (request.targetPower === undefined && request.gear === undefined) {
|
|
81
82
|
newRequest.targetPower = this.calculateTargetPower(request);
|
|
82
83
|
}
|
|
83
84
|
else {
|
|
84
|
-
|
|
85
|
+
if (!request.gear || request.targetPower !== undefined)
|
|
86
|
+
newRequest.targetPower = request.targetPower;
|
|
87
|
+
}
|
|
88
|
+
if (request.gear) {
|
|
89
|
+
newRequest.gear = request.gear;
|
|
85
90
|
}
|
|
86
91
|
delete request.slope;
|
|
87
92
|
if (request.maxPower !== undefined) {
|
|
@@ -169,6 +174,16 @@ class ERGCyclingMode extends power_base_1.default {
|
|
|
169
174
|
}
|
|
170
175
|
return target;
|
|
171
176
|
}
|
|
177
|
+
checkForTempPowerAdjustments(request) {
|
|
178
|
+
const data = this.getData();
|
|
179
|
+
if (request.targetPowerDelta && (data === null || data === void 0 ? void 0 : data.gear)) {
|
|
180
|
+
if (Math.abs(request.targetPowerDelta) === 5)
|
|
181
|
+
request.gear = data.gear + Math.sign(request.targetPowerDelta);
|
|
182
|
+
if (Math.abs(request.targetPowerDelta) === 50)
|
|
183
|
+
request.gear = data.gear + Math.sign(request.targetPowerDelta) * 5;
|
|
184
|
+
delete request.targetPowerDelta;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
172
187
|
}
|
|
173
188
|
ERGCyclingMode.config = {
|
|
174
189
|
isERG: true,
|
package/lib/modes/power-base.js
CHANGED
package/lib/modes/simulator.js
CHANGED
|
@@ -26,7 +26,7 @@ class SimulatorCyclingMode extends power_base_1.default {
|
|
|
26
26
|
delete this.event.gearUpdated;
|
|
27
27
|
delete this.event.rpmUpdated;
|
|
28
28
|
try {
|
|
29
|
-
let rpm = 90;
|
|
29
|
+
let rpm = bikeData.pedalRpm === undefined ? 90 : bikeData.pedalRpm;
|
|
30
30
|
let power = (!mode || mode.toLowerCase() === 'power') ? Number(this.getSetting('power')) : bikeData.power || 0;
|
|
31
31
|
let slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
|
|
32
32
|
let speed = mode.toLowerCase() === 'speed' ? Number(this.getSetting('speed')) : bikeData.speed || 0;
|
|
@@ -37,11 +37,15 @@ class SimulatorCyclingMode extends power_base_1.default {
|
|
|
37
37
|
const t = this.getTimeSinceLastUpdate();
|
|
38
38
|
let distance = 0;
|
|
39
39
|
if (!mode || mode.toLowerCase() === 'power') {
|
|
40
|
+
if (rpm === 0)
|
|
41
|
+
power = 0;
|
|
40
42
|
const res = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
|
|
41
43
|
speed = res.speed;
|
|
42
44
|
distance = res.distance;
|
|
43
45
|
}
|
|
44
46
|
else if (mode.toLowerCase() === 'speed') {
|
|
47
|
+
if (rpm === 0)
|
|
48
|
+
speed = 0;
|
|
45
49
|
const res = this.calculatePowerAndDistance(speed, slope, m, t, { bikeType });
|
|
46
50
|
power = res.power;
|
|
47
51
|
distance = res.distance;
|
|
@@ -72,7 +76,8 @@ class SimulatorCyclingMode extends power_base_1.default {
|
|
|
72
76
|
data.speed = speed;
|
|
73
77
|
data.distanceInternal = distanceInternal + distance;
|
|
74
78
|
}
|
|
75
|
-
data.speed
|
|
79
|
+
if (data.speed < 0.1)
|
|
80
|
+
data.speed = 0;
|
|
76
81
|
data.power = Math.round(power);
|
|
77
82
|
data.distanceInternal = distanceInternal + distance;
|
|
78
83
|
data.slope = slope;
|
package/lib/modes/types.d.ts
CHANGED
|
@@ -490,6 +490,9 @@ class DaumAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
490
490
|
if (request.targetPower !== undefined) {
|
|
491
491
|
yield bike.setTargetPower(request.targetPower);
|
|
492
492
|
}
|
|
493
|
+
if (request.gear !== undefined) {
|
|
494
|
+
yield bike.setTargetGear(request.gear);
|
|
495
|
+
}
|
|
493
496
|
this.requestBusy = false;
|
|
494
497
|
return request;
|
|
495
498
|
}
|
|
@@ -39,4 +39,5 @@ export default class Daum8008 extends SerialPortComms<DaumClassicCommsState, Dau
|
|
|
39
39
|
setSlope(slope: number, bike?: number): Promise<SetSlopeRepsonse>;
|
|
40
40
|
setTargetSlope(slope: number): Promise<void>;
|
|
41
41
|
setTargetPower(power: number): Promise<void>;
|
|
42
|
+
setTargetGear(gear: number): Promise<void>;
|
|
42
43
|
}
|
|
@@ -249,5 +249,15 @@ class Daum8008 extends comms_1.default {
|
|
|
249
249
|
yield this.setPower(power);
|
|
250
250
|
});
|
|
251
251
|
}
|
|
252
|
+
setTargetGear(gear) {
|
|
253
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
254
|
+
let target = gear;
|
|
255
|
+
if (target < 2)
|
|
256
|
+
target = 1;
|
|
257
|
+
if (target > 28)
|
|
258
|
+
target = 28;
|
|
259
|
+
yield this.setGear(target);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
252
262
|
}
|
|
253
263
|
exports.default = Daum8008;
|
|
@@ -24,6 +24,7 @@ export default class Daum8i extends SerialPortComms<DaumPremiumCommsState, DaumP
|
|
|
24
24
|
sendNAK(logPayload: any): Promise<void>;
|
|
25
25
|
setTargetPower(power: number): Promise<void>;
|
|
26
26
|
setTargetSlope(_slope: number): Promise<void>;
|
|
27
|
+
setTargetGear(gear: number): Promise<void>;
|
|
27
28
|
getProtocolVersion(): Promise<string>;
|
|
28
29
|
getDashboardVersion(): Promise<string>;
|
|
29
30
|
getDeviceType(): Promise<string>;
|
|
@@ -293,6 +293,16 @@ class Daum8i extends comms_1.default {
|
|
|
293
293
|
setTargetSlope(_slope) {
|
|
294
294
|
return;
|
|
295
295
|
}
|
|
296
|
+
setTargetGear(gear) {
|
|
297
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
298
|
+
let target = gear;
|
|
299
|
+
if (target < 2)
|
|
300
|
+
target = 1;
|
|
301
|
+
if (target > 28)
|
|
302
|
+
target = 28;
|
|
303
|
+
yield this.setGear(target);
|
|
304
|
+
});
|
|
305
|
+
}
|
|
296
306
|
getProtocolVersion() {
|
|
297
307
|
return __awaiter(this, void 0, void 0, function* () {
|
|
298
308
|
const data = yield this.sendStrCommand('getProtocolVersion', 'V00');
|
|
@@ -8,6 +8,7 @@ export declare abstract class DaumSerialComms {
|
|
|
8
8
|
abstract close(): Promise<boolean>;
|
|
9
9
|
abstract setTargetSlope(slope: number): Promise<void>;
|
|
10
10
|
abstract setTargetPower(power: number): Promise<void>;
|
|
11
|
+
abstract setTargetGear(gear: number): Promise<void>;
|
|
11
12
|
}
|
|
12
13
|
export declare class ResponseTimeout extends Error {
|
|
13
14
|
constructor();
|
|
@@ -41,6 +41,7 @@ export declare class Simulator extends IncyclistDevice<SimulatorProperties> {
|
|
|
41
41
|
pause(): Promise<boolean>;
|
|
42
42
|
resume(): Promise<boolean>;
|
|
43
43
|
toggle(): Promise<boolean>;
|
|
44
|
+
adjustCadence(delta: any): void;
|
|
44
45
|
faster(): void;
|
|
45
46
|
slower(): void;
|
|
46
47
|
update(): void;
|
|
@@ -121,6 +121,12 @@ class Simulator extends adpater_1.default {
|
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
+
adjustCadence(delta) {
|
|
125
|
+
this.cadence += delta;
|
|
126
|
+
if (this.cadence < 0)
|
|
127
|
+
this.cadence = 0;
|
|
128
|
+
this.logger.logEvent({ message: 'cadence adjusted', device: this.getName(), cadence: this.cadence });
|
|
129
|
+
}
|
|
124
130
|
faster() {
|
|
125
131
|
if (this.speed < 15)
|
|
126
132
|
this.speed += 5;
|
|
@@ -154,12 +160,13 @@ class Simulator extends adpater_1.default {
|
|
|
154
160
|
const prevDist = this.data.distanceInternal;
|
|
155
161
|
const d = this.data;
|
|
156
162
|
const prevTime = d.deviceTime;
|
|
163
|
+
this.data.pedalRpm = this.cadence;
|
|
157
164
|
this.data = this.getCyclingMode().updateData(this.data);
|
|
158
165
|
let data = {
|
|
159
166
|
speed: this.data.speed,
|
|
160
167
|
slope: this.data.slope,
|
|
161
|
-
power: this.data.power,
|
|
162
|
-
cadence: this.
|
|
168
|
+
power: this.cadence === 0 ? 0 : this.data.power,
|
|
169
|
+
cadence: this.cadence,
|
|
163
170
|
distance: this.data.distanceInternal - prevDist,
|
|
164
171
|
heartrate: Math.round(this.data.power - 10 + Math.random() * 20),
|
|
165
172
|
timestamp: Date.now(),
|