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.
@@ -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): AntInterface | BleInterface | SerialInterface;
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;
@@ -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
  }
@@ -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
- if (request.targetPower !== undefined) {
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
- newRequest.targetPower = request.targetPower;
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,
@@ -148,6 +148,8 @@ class PowerBasedCyclingModeBase extends base_1.CyclingModeBase {
148
148
  data.speed = speed;
149
149
  data.distanceInternal = distanceInternal + distance;
150
150
  }
151
+ if (data.speed < 0.1)
152
+ data.speed = 0;
151
153
  return t;
152
154
  }
153
155
  getCalcBasics(bikeData) {
@@ -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 = 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;
@@ -8,6 +8,7 @@ export type UpdateRequest = {
8
8
  reset?: boolean;
9
9
  refresh?: boolean;
10
10
  init?: boolean;
11
+ gear?: number;
11
12
  };
12
13
  export declare enum CyclingModeProperyType {
13
14
  Integer = "Integer",
@@ -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.data.pedalRpm,
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(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "2.1.38",
3
+ "version": "2.1.40",
4
4
  "dependencies": {
5
5
  "@serialport/bindings-interface": "^1.2.2",
6
6
  "@serialport/parser-byte-length": "^9.0.1",