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.
Files changed (192) hide show
  1. package/lib/adapters.d.ts +1 -1
  2. package/lib/antv2/adapter-factory.d.ts +4 -13
  3. package/lib/antv2/adapter.d.ts +16 -33
  4. package/lib/antv2/adapter.js +68 -112
  5. package/lib/antv2/ant-interface.d.ts +3 -11
  6. package/lib/antv2/ant-interface.js +1 -1
  7. package/lib/antv2/base/adapter.d.ts +62 -0
  8. package/lib/antv2/base/adapter.js +360 -0
  9. package/lib/antv2/base/ant-interface.d.ts +35 -0
  10. package/lib/antv2/base/ant-interface.js +285 -0
  11. package/lib/antv2/base/binding.d.ts +13 -0
  12. package/lib/antv2/base/binding.js +27 -0
  13. package/lib/antv2/cad/adapter.d.ts +10 -0
  14. package/lib/antv2/cad/adapter.js +25 -0
  15. package/lib/antv2/cad/index.d.ts +2 -0
  16. package/lib/antv2/cad/index.js +7 -0
  17. package/lib/antv2/consts.d.ts +2 -0
  18. package/lib/antv2/consts.js +5 -0
  19. package/lib/antv2/factories/adapter-factory.d.ts +14 -0
  20. package/lib/antv2/factories/adapter-factory.js +65 -0
  21. package/lib/antv2/factories/sensor-factory.d.ts +5 -0
  22. package/lib/antv2/factories/sensor-factory.js +22 -0
  23. package/lib/antv2/fe/adapter.d.ts +25 -26
  24. package/lib/antv2/fe/adapter.js +212 -218
  25. package/lib/antv2/hr/adapter.d.ts +6 -14
  26. package/lib/antv2/hr/adapter.js +7 -55
  27. package/lib/antv2/hr copy/adapter.d.ts +11 -0
  28. package/lib/antv2/hr copy/adapter.js +30 -0
  29. package/lib/antv2/hr copy/index.d.ts +2 -0
  30. package/lib/antv2/hr copy/index.js +7 -0
  31. package/lib/antv2/index.d.ts +5 -4
  32. package/lib/antv2/index.js +4 -2
  33. package/lib/antv2/pwr/adapter.d.ts +9 -29
  34. package/lib/antv2/pwr/adapter.js +20 -130
  35. package/lib/antv2/types.d.ts +23 -3
  36. package/lib/base/adpater.d.ts +42 -45
  37. package/lib/base/adpater.js +144 -110
  38. package/lib/base/consts.d.ts +4 -0
  39. package/lib/base/consts.js +9 -0
  40. package/lib/ble/adapter-factory.d.ts +4 -4
  41. package/lib/ble/base/adapter.d.ts +6 -24
  42. package/lib/ble/base/adapter.js +4 -94
  43. package/lib/ble/ble-interface.d.ts +2 -3
  44. package/lib/ble/cp/adapter.d.ts +6 -11
  45. package/lib/ble/cp/adapter.js +9 -12
  46. package/lib/ble/elite/adapter.d.ts +8 -8
  47. package/lib/ble/elite/adapter.js +6 -2
  48. package/lib/ble/fm/adapter.d.ts +11 -11
  49. package/lib/ble/fm/adapter.js +26 -20
  50. package/lib/ble/hr/adapter.d.ts +3 -4
  51. package/lib/ble/hr/adapter.js +2 -2
  52. package/lib/ble/tacx/adapter.d.ts +2 -3
  53. package/lib/ble/tacx/adapter.js +8 -8
  54. package/lib/ble/types.d.ts +1 -2
  55. package/lib/ble/wahoo/adapter.d.ts +2 -2
  56. package/lib/ble/wahoo/adapter.js +6 -6
  57. package/lib/ble/wahoo/comms.js +16 -16
  58. package/lib/factories/adapters.d.ts +7 -0
  59. package/lib/factories/adapters.js +49 -0
  60. package/lib/factories/index.d.ts +3 -0
  61. package/lib/factories/index.js +10 -0
  62. package/lib/factories/interfaces.d.ts +7 -0
  63. package/lib/factories/interfaces.js +27 -0
  64. package/lib/index.d.ts +8 -9
  65. package/lib/index.js +5 -8
  66. package/lib/interfaces.d.ts +1 -1
  67. package/lib/modes/ant-fe-adv-st-mode.d.ts +12 -0
  68. package/lib/modes/ant-fe-adv-st-mode.js +83 -0
  69. package/lib/modes/antble-erg.d.ts +31 -0
  70. package/lib/modes/antble-erg.js +28 -0
  71. package/lib/modes/antble-smarttrainer.d.ts +23 -0
  72. package/lib/modes/antble-smarttrainer.js +65 -0
  73. package/lib/modes/base.d.ts +29 -0
  74. package/lib/modes/{cycling-mode.js → base.js} +23 -26
  75. package/lib/modes/daum-classic-standard.d.ts +17 -0
  76. package/lib/modes/daum-classic-standard.js +54 -0
  77. package/lib/modes/daum-erg.d.ts +49 -0
  78. package/lib/{serial/daum/ERGCyclingMode.js → modes/daum-erg.js} +45 -73
  79. package/lib/modes/daum-power.d.ts +5 -0
  80. package/lib/{serial/daum/DaumPowerMeterCyclingMode.js → modes/daum-power.js} +1 -10
  81. package/lib/modes/daum-premium-standard.d.ts +24 -0
  82. package/lib/{serial/daum/premium/modes/daum-classic.js → modes/daum-premium-standard.js} +26 -38
  83. package/lib/modes/daum-smarttrainer.d.ts +83 -0
  84. package/lib/{serial/daum/SmartTrainerCyclingMode.js → modes/daum-smarttrainer.js} +23 -26
  85. package/lib/modes/kettler-erg.d.ts +44 -0
  86. package/lib/{serial/kettler/ergo-racer/modes/erg.js → modes/kettler-erg.js} +12 -23
  87. package/lib/modes/power-base.d.ts +28 -3
  88. package/lib/modes/power-base.js +184 -7
  89. package/lib/modes/power-meter.d.ts +11 -16
  90. package/lib/modes/power-meter.js +15 -54
  91. package/lib/modes/simulator.d.ts +38 -10
  92. package/lib/modes/simulator.js +14 -46
  93. package/lib/modes/{cycling-mode.d.ts → types.d.ts} +22 -30
  94. package/lib/modes/types.js +56 -0
  95. package/lib/serial/SinglePathScanner.d.ts +17 -0
  96. package/lib/serial/SinglePathScanner.js +87 -0
  97. package/lib/serial/adapter-factory.d.ts +8 -6
  98. package/lib/serial/adapter.d.ts +6 -11
  99. package/lib/serial/adapter.js +5 -2
  100. package/lib/serial/base/adapter.d.ts +17 -0
  101. package/lib/serial/base/adapter.js +67 -0
  102. package/lib/serial/base/comms.d.ts +62 -0
  103. package/lib/serial/base/comms.js +280 -0
  104. package/lib/serial/base/serial-interface.d.ts +36 -0
  105. package/lib/serial/base/serial-interface.js +288 -0
  106. package/lib/serial/base/serial-scanner.d.ts +16 -0
  107. package/lib/serial/base/serial-scanner.js +87 -0
  108. package/lib/serial/base/serialport.d.ts +17 -0
  109. package/lib/serial/base/serialport.js +87 -0
  110. package/lib/serial/comms.d.ts +2 -2
  111. package/lib/serial/daum/DaumAdapter.d.ts +26 -35
  112. package/lib/serial/daum/DaumAdapter.js +214 -161
  113. package/lib/serial/daum/classic/PROTOCOL_NAME.d.ts +2 -0
  114. package/lib/serial/daum/classic/PROTOCOL_NAME.js +5 -0
  115. package/lib/serial/daum/classic/adapter.d.ts +13 -26
  116. package/lib/serial/daum/classic/adapter.js +72 -176
  117. package/lib/serial/daum/classic/comms.d.ts +21 -17
  118. package/lib/serial/daum/classic/comms.js +41 -14
  119. package/lib/serial/daum/classic/consts.d.ts +2 -0
  120. package/lib/serial/daum/classic/consts.js +5 -0
  121. package/lib/serial/daum/classic/mock.d.ts +4 -0
  122. package/lib/serial/daum/classic/mock.js +18 -7
  123. package/lib/serial/daum/classic/types.d.ts +8 -10
  124. package/lib/serial/daum/classic/utils.d.ts +1 -2
  125. package/lib/serial/daum/consts.d.ts +0 -0
  126. package/lib/serial/daum/consts.js +0 -0
  127. package/lib/serial/daum/premium/adapter.d.ts +17 -15
  128. package/lib/serial/daum/premium/adapter.js +86 -109
  129. package/lib/serial/daum/premium/comms.d.ts +7 -7
  130. package/lib/serial/daum/premium/comms.js +25 -16
  131. package/lib/serial/daum/premium/mock.d.ts +5 -1
  132. package/lib/serial/daum/premium/mock.js +17 -7
  133. package/lib/serial/daum/premium/types.d.ts +32 -17
  134. package/lib/serial/daum/premium/types.js +8 -8
  135. package/lib/serial/daum/premium/utils.d.ts +2 -3
  136. package/lib/serial/daum/premium/utils.js +3 -3
  137. package/lib/serial/daum/types.d.ts +14 -0
  138. package/lib/serial/daum/types.js +13 -0
  139. package/lib/serial/factories/adapter-factory.d.ts +14 -0
  140. package/lib/serial/factories/adapter-factory.js +30 -0
  141. package/lib/serial/index.d.ts +8 -5
  142. package/lib/serial/index.js +15 -15
  143. package/lib/serial/kettler/comms.d.ts +1 -1
  144. package/lib/serial/kettler/ergo-racer/adapter.d.ts +11 -16
  145. package/lib/serial/kettler/ergo-racer/adapter.js +10 -12
  146. package/lib/serial/kettler/types.d.ts +8 -0
  147. package/lib/serial/kettler/types.js +2 -0
  148. package/lib/serial/serial-interface.d.ts +2 -32
  149. package/lib/serial/serial-interface.js +4 -78
  150. package/lib/serial/serial-scanner.d.ts +16 -0
  151. package/lib/serial/serial-scanner.js +87 -0
  152. package/lib/serial/serialport.d.ts +1 -13
  153. package/lib/serial/types.d.ts +45 -0
  154. package/lib/serial/types.js +9 -0
  155. package/lib/simulator/Simulator.d.ts +13 -19
  156. package/lib/simulator/Simulator.js +10 -51
  157. package/lib/types/Command.d.ts +8 -0
  158. package/lib/types/Command.js +2 -0
  159. package/lib/types/adapter.d.ts +34 -24
  160. package/lib/types/command.d.ts +0 -8
  161. package/lib/types/command.js +0 -2
  162. package/lib/types/data.d.ts +12 -1
  163. package/lib/types/device.d.ts +8 -23
  164. package/lib/types/device.js +9 -8
  165. package/lib/types/index.d.ts +6 -0
  166. package/lib/types/index.js +22 -0
  167. package/lib/types/route.d.ts +0 -19
  168. package/lib/types/route.js +0 -2
  169. package/lib/types/types.d.ts +8 -0
  170. package/lib/types/types.js +2 -0
  171. package/lib/utils/utils.d.ts +2 -1
  172. package/lib/utils/utils.js +22 -4
  173. package/package.json +3 -3
  174. package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +0 -9
  175. package/lib/antv2/modes/ant-fe-adv-st-mode.js +0 -51
  176. package/lib/antv2/modes/ant-fe-erg-mode.d.ts +0 -6
  177. package/lib/antv2/modes/ant-fe-erg-mode.js +0 -14
  178. package/lib/antv2/modes/ant-fe-st-mode.d.ts +0 -5
  179. package/lib/antv2/modes/ant-fe-st-mode.js +0 -13
  180. package/lib/modes/ble-erg-mode.d.ts +0 -18
  181. package/lib/modes/ble-erg-mode.js +0 -148
  182. package/lib/modes/ble-st-mode.d.ts +0 -15
  183. package/lib/modes/ble-st-mode.js +0 -96
  184. package/lib/serial/daum/DaumPowerMeterCyclingMode.d.ts +0 -8
  185. package/lib/serial/daum/ERGCyclingMode.d.ts +0 -26
  186. package/lib/serial/daum/SmartTrainerCyclingMode.d.ts +0 -42
  187. package/lib/serial/daum/classic/modes/daum-classic.d.ts +0 -13
  188. package/lib/serial/daum/classic/modes/daum-classic.js +0 -97
  189. package/lib/serial/daum/constants.d.ts +0 -19
  190. package/lib/serial/daum/constants.js +0 -22
  191. package/lib/serial/daum/premium/modes/daum-classic.d.ts +0 -14
  192. 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 cycling_mode_1 = require("../../../../modes/cycling-mode");
8
- const DaumPowerMeterCyclingMode_1 = __importDefault(require("../../DaumPowerMeterCyclingMode"));
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: 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 = this.data || {};
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 = prevData.distanceInternal || 0;
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: '~~~ distance overflow', distanceBike, distancePrev });
40
+ this.logger.logEvent({ message: 'distance overflow', distanceBike, distancePrev });
68
41
  let v = speed / 3.6;
69
- let duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
70
- distanceInternal = distancePrev + v * duration;
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 cycling_mode_1 = require("../../modes/cycling-mode");
9
- const calculations_1 = __importDefault(require("../../utils/calculations"));
10
- const utils_1 = require("./classic/utils");
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 cycling_mode_1.CyclingModeBase {
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
- getName() {
39
- return config.name;
40
- }
41
- getDescription() {
42
- return config.description;
28
+ getData() {
29
+ return this.data;
43
30
  }
44
- getProperties() {
45
- return config.properties;
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 cycling_mode_1 = require("../../../../modes/cycling-mode");
7
- const power_base_1 = __importDefault(require("../../../../modes/power-base"));
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.isERG = true;
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 { IncyclistBikeData, Settings, CyclingModeBase } from './cycling-mode';
1
+ import { CyclingModeConfig, Settings, UpdateRequest } from './types';
2
+ import { IncyclistBikeData, IAdapter } from "../types";
2
3
  import { EventLogger } from 'gd-eventlog';
3
- import { ControllableDeviceAdapter } from '..';
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
- constructor(adapter: ControllableDeviceAdapter, props?: Settings);
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
  }