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
@@ -3,16 +3,24 @@ 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("./cycling-mode");
7
- const adpater_1 = require("../base/adpater");
6
+ const consts_1 = require("../base/consts");
8
7
  const calculations_1 = __importDefault(require("../utils/calculations"));
9
8
  const gd_eventlog_1 = require("gd-eventlog");
10
- class PowerBasedCyclingModeBase extends cycling_mode_1.CyclingModeBase {
9
+ const base_1 = require("./base");
10
+ const MIN_SPEED = 10;
11
+ class PowerBasedCyclingModeBase extends base_1.CyclingModeBase {
11
12
  constructor(adapter, props) {
12
13
  super(adapter, props);
13
14
  this.prevUpdateTS = 0;
14
15
  this.data = { speed: 0, power: 0, distanceInternal: 0, pedalRpm: 0, isPedalling: false, heartrate: 0 };
15
16
  }
17
+ getData() {
18
+ return this.data;
19
+ }
20
+ getSlope() {
21
+ const { slope } = this.data;
22
+ return slope || 0;
23
+ }
16
24
  initLogger(defaultLogName) {
17
25
  const a = this.adapter;
18
26
  this.logger = a.getLogger();
@@ -21,18 +29,93 @@ class PowerBasedCyclingModeBase extends cycling_mode_1.CyclingModeBase {
21
29
  }
22
30
  getWeight() {
23
31
  const a = this.adapter;
24
- const defaultWeight = adpater_1.DEFAULT_BIKE_WEIGHT + adpater_1.DEFAULT_USER_WEIGHT;
32
+ const defaultWeight = consts_1.DEFAULT_BIKE_WEIGHT + consts_1.DEFAULT_USER_WEIGHT;
25
33
  const m = (a) ? a.getWeight() || defaultWeight : defaultWeight;
26
34
  return m;
27
35
  }
28
36
  getTimeSinceLastUpdate() {
29
37
  const ts = Date.now();
30
38
  const duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
31
- this.prevUpdateTS = ts;
32
39
  return duration;
33
40
  }
41
+ checkForResetOrEmpty(request) {
42
+ if (!request || request.reset) {
43
+ this.prevRequest = {};
44
+ return { reset: true };
45
+ }
46
+ if (Object.keys(request).length === 0 && this.prevRequest) {
47
+ return { targetPower: this.prevRequest.targetPower, refresh: true };
48
+ }
49
+ }
50
+ checkForTempPowerAdjustments(request) {
51
+ if (request.targetPowerDelta && this.prevRequest && this.prevRequest.targetPower) {
52
+ request.targetPower = this.prevRequest.targetPower + request.targetPowerDelta;
53
+ if (request.targetPower < 10)
54
+ request.targetPower = this.prevRequest.targetPower;
55
+ delete request.targetPowerDelta;
56
+ }
57
+ }
58
+ checkRefresh(request, newRequest) {
59
+ if (request.refresh && request.targetPower === undefined) {
60
+ delete request.refresh;
61
+ if (this.prevRequest)
62
+ newRequest.targetPower = this.prevRequest.targetPower;
63
+ }
64
+ }
65
+ checkTargetPowerSet(request, newRequest) {
66
+ let target = undefined;
67
+ if (request.targetPower !== undefined)
68
+ target = request.targetPower;
69
+ if (request.targetPower === undefined && request.maxPower !== undefined && request.minPower !== undefined && request.maxPower === request.minPower) {
70
+ target = request.minPower;
71
+ }
72
+ if (target !== undefined) {
73
+ delete request.refresh;
74
+ newRequest.targetPower = Number(target);
75
+ }
76
+ }
77
+ checkSlope(request) {
78
+ if (request.slope !== undefined) {
79
+ this.data.slope = request.slope;
80
+ delete request.slope;
81
+ }
82
+ }
83
+ checkEmptyRequest(newRequest) {
84
+ if (Object.keys(newRequest).length === 0) {
85
+ if (this.prevRequest) {
86
+ newRequest.targetPower = this.prevRequest.targetPower;
87
+ newRequest.refresh = true;
88
+ }
89
+ }
90
+ }
91
+ checkMinPower(request, newRequest) {
92
+ if (request.minPower !== undefined) {
93
+ const target = newRequest.targetPower !== undefined ? newRequest.targetPower : this.prevRequest.targetPower;
94
+ if (target && target < request.minPower) {
95
+ newRequest.targetPower = request.minPower;
96
+ }
97
+ else {
98
+ if (this.prevRequest)
99
+ newRequest.targetPower = this.prevRequest.targetPower;
100
+ }
101
+ newRequest.minPower = request.minPower;
102
+ }
103
+ }
104
+ checkMaxPower(request, newRequest) {
105
+ if (request.maxPower !== undefined) {
106
+ const target = newRequest.targetPower !== undefined ? newRequest.targetPower : this.prevRequest.targetPower;
107
+ if (target && target > request.maxPower) {
108
+ newRequest.targetPower = request.maxPower;
109
+ }
110
+ else {
111
+ if (this.prevRequest)
112
+ newRequest.targetPower = this.prevRequest.targetPower;
113
+ }
114
+ newRequest.maxPower = request.maxPower;
115
+ }
116
+ }
34
117
  calculateSpeedAndDistance(power, slope, m, t, props = {}) {
35
- const prevData = this.data || {};
118
+ const prevData = this.getData();
36
119
  const vPrev = (prevData.speed || 0) / 3.6;
37
120
  const EkinPrev = 1 / 2 * m * vPrev * vPrev;
38
121
  let powerToMaintainSpeed = calculations_1.default.calculatePower(m, vPrev, slope, props);
@@ -57,8 +140,57 @@ class PowerBasedCyclingModeBase extends cycling_mode_1.CyclingModeBase {
57
140
  return { speed, distance };
58
141
  }
59
142
  }
143
+ updateSpeedAndDistance(power, slope, bikeType, data, prevData) {
144
+ const distanceInternal = prevData.distanceInternal || 0;
145
+ const m = this.getWeight();
146
+ const t = this.getTimeSinceLastUpdate();
147
+ const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t, { bikeType });
148
+ if (power === 0 && speed < MIN_SPEED) {
149
+ data.speed = prevData.speed < 1 ? 0 : prevData.speed - 1;
150
+ data.distanceInternal = distanceInternal || 0 + data.speed / 3.6 * t;
151
+ }
152
+ else {
153
+ data.speed = speed;
154
+ data.distanceInternal = distanceInternal + distance;
155
+ }
156
+ return t;
157
+ }
158
+ getCalcBasics(bikeData) {
159
+ var _a;
160
+ const prevData = JSON.parse(JSON.stringify(this.getData()));
161
+ const data = Object.assign({}, this.getData());
162
+ const prevRequest = this.prevRequest || {};
163
+ const bikeType = (_a = this.getSetting('bikeType')) === null || _a === void 0 ? void 0 : _a.toLowerCase();
164
+ const slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
165
+ this.copyBikeData(data, bikeData);
166
+ return { data, prevData, prevRequest, bikeType, slope };
167
+ }
168
+ copyBikeData(data, bikeData) {
169
+ var _a;
170
+ const keys = Object.keys(bikeData);
171
+ keys.forEach(key => {
172
+ if (bikeData[key] === null)
173
+ delete data[key];
174
+ if (key === 'slope')
175
+ return;
176
+ else if (bikeData[key] !== undefined)
177
+ data[key] = bikeData[key];
178
+ });
179
+ if (data.distanceInternal === undefined)
180
+ data.distanceInternal = 0;
181
+ if (data.time === undefined)
182
+ data.time = 0;
183
+ if (data.slope === undefined)
184
+ data.slope = 0;
185
+ if (bikeData.isPedalling === undefined)
186
+ data.isPedalling = data.pedalRpm > 0;
187
+ if (((_a = this.prevRequest) === null || _a === void 0 ? void 0 : _a.slope) !== undefined) {
188
+ data.slope = this.prevRequest.slope;
189
+ }
190
+ return data;
191
+ }
60
192
  calculatePowerAndDistance(speed, slope, m, t, props = {}) {
61
- const prevData = this.data || {};
193
+ const prevData = this.getData();
62
194
  const vPrev = (prevData.speed || 0) / 3.6;
63
195
  const EkinPrev = 1 / 2 * m * vPrev * vPrev;
64
196
  const vTarget = (speed || 0) / 3.6;
@@ -71,5 +203,50 @@ class PowerBasedCyclingModeBase extends cycling_mode_1.CyclingModeBase {
71
203
  this.data.power = power;
72
204
  return { power, distance };
73
205
  }
206
+ getBikeInitRequest() {
207
+ return {};
208
+ }
209
+ sendBikeUpdate(incoming) {
210
+ if (this.logger)
211
+ this.logger.logEvent({ message: "processing update request", request: incoming, prev: this.prevRequest, data: this.getData() });
212
+ let newRequest = {};
213
+ const request = Object.assign({}, incoming);
214
+ try {
215
+ const req = this.checkForResetOrEmpty(request);
216
+ if (req)
217
+ return req;
218
+ this.checkSlope(request);
219
+ this.checkForTempPowerAdjustments(request);
220
+ this.checkTargetPowerSet(request, newRequest);
221
+ this.checkRefresh(request, newRequest);
222
+ this.checkMaxPower(request, newRequest);
223
+ this.checkMinPower(request, newRequest);
224
+ this.checkEmptyRequest(newRequest);
225
+ this.prevRequest = JSON.parse(JSON.stringify(newRequest));
226
+ }
227
+ catch (err) {
228
+ if (this.logger)
229
+ this.logger.logEvent({ message: "error", fn: 'sendBikeUpdate()', error: err.message, stack: err.stack });
230
+ }
231
+ return newRequest;
232
+ }
233
+ updateData(bikeData, log = true) {
234
+ try {
235
+ const { data, prevData, slope, bikeType } = this.getCalcBasics(bikeData);
236
+ const t = this.updateSpeedAndDistance(data.power, slope, bikeType, data, prevData);
237
+ data.time = (data.speed > 0) ? data.time + t : data.time;
238
+ if (log && this.logger)
239
+ this.logger.logEvent({ message: "updateData result", mode: this.getName(), data, bikeData });
240
+ this.data = data;
241
+ this.prevUpdateTS = Date.now();
242
+ return data;
243
+ }
244
+ catch (err) {
245
+ if (this.logger)
246
+ this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
247
+ return this.getData();
248
+ }
249
+ }
74
250
  }
251
+ PowerBasedCyclingModeBase.config = { name: '', description: '', properties: [] };
75
252
  exports.default = PowerBasedCyclingModeBase;
@@ -1,20 +1,15 @@
1
- import CyclingMode, { CyclingModeProperty, IncyclistBikeData, Settings, UpdateRequest } from '../modes/cycling-mode';
1
+ import ICyclingMode, { Settings, UpdateRequest } from './types';
2
+ import { IncyclistBikeData } from "../types";
2
3
  import PowerBasedCyclingModeBase from './power-base';
3
- import { ControllableDeviceAdapter } from '..';
4
- export declare const config: {
5
- name: string;
6
- description: string;
7
- properties: any[];
8
- };
9
- export default class PowerMeterCyclingMode extends PowerBasedCyclingModeBase implements CyclingMode {
10
- constructor(adapter: ControllableDeviceAdapter, props?: Settings);
11
- getName(): string;
12
- getDescription(): string;
13
- getProperties(): CyclingModeProperty[];
14
- getProperty(name: string): CyclingModeProperty;
4
+ import { IncyclistDeviceAdapter } from '../base/adpater';
5
+ export default class PowerMeterCyclingMode extends PowerBasedCyclingModeBase implements ICyclingMode {
6
+ protected static config: {
7
+ name: string;
8
+ description: string;
9
+ properties: any[];
10
+ };
11
+ constructor(adapter: IncyclistDeviceAdapter, props?: Settings);
15
12
  getBikeInitRequest(): UpdateRequest;
16
13
  sendBikeUpdate(request?: UpdateRequest): UpdateRequest;
17
- updateData(bikeData: IncyclistBikeData, props?: {
18
- log: boolean;
19
- }): IncyclistBikeData;
14
+ copyBikeData(data: IncyclistBikeData, bikeData: IncyclistBikeData): IncyclistBikeData;
20
15
  }
@@ -3,76 +3,37 @@ 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
- exports.config = void 0;
7
6
  const power_base_1 = __importDefault(require("./power-base"));
8
- const MIN_SPEED = 10;
9
- exports.config = {
10
- name: 'PowerMeter',
11
- description: 'Power and cadence are taken from device. Speed is calculated from power and current slope\nThis mode will not respect maximum power and/or workout limits',
12
- properties: []
13
- };
14
7
  class PowerMeterCyclingMode extends power_base_1.default {
15
8
  constructor(adapter, props) {
16
9
  super(adapter, props);
17
10
  this.initLogger('PowerMeterMode');
18
- this.data = { speed: 0, slope: 0, power: 0, distanceInternal: 0, pedalRpm: 0, isPedalling: false, heartrate: 0 };
19
- }
20
- getName() {
21
- return exports.config.name;
22
- }
23
- getDescription() {
24
- return exports.config.description;
25
- }
26
- getProperties() {
27
- return exports.config.properties;
28
- }
29
- getProperty(name) {
30
- return exports.config.properties.find(p => p.name === name);
11
+ this.data.slope = 0;
31
12
  }
32
13
  getBikeInitRequest() {
33
14
  return {};
34
15
  }
35
16
  sendBikeUpdate(request = {}) {
36
- const prevData = this.data || {};
37
- const prevSlope = prevData.slope || 0;
17
+ this.logger.logEvent({ message: "processing update request", request });
18
+ const prevData = this.data;
19
+ const prevSlope = prevData.slope;
38
20
  if (request.slope && request.slope !== prevSlope) {
39
21
  this.data.slope = request.slope;
40
- this.updateData(this.data, { log: false });
22
+ this.updateData(this.data, false);
41
23
  }
42
- this.logger.logEvent({ message: "processing update request", request });
43
24
  return {};
44
25
  }
45
- updateData(bikeData, props = { log: true }) {
46
- try {
47
- const prevData = this.data || {};
48
- const data = JSON.parse(JSON.stringify(bikeData));
49
- let power = bikeData.power || 0;
50
- const slope = prevData.slope || 0;
51
- const distanceInternal = prevData.distanceInternal || 0;
52
- if (power > 0) {
53
- data.isPedalling = true;
54
- }
55
- const m = this.getWeight();
56
- const t = this.getTimeSinceLastUpdate();
57
- const { speed, distance } = this.calculateSpeedAndDistance(power, slope, m, t);
58
- data.power = Math.round(power);
59
- data.slope = slope;
60
- if (power === 0 && speed < MIN_SPEED) {
61
- data.speed = Math.round(prevData.speed - 1) < 0 ? 0 : Math.round(prevData.speed - 1);
62
- data.distanceInternal = distanceInternal + data.speed / 3.6 * t;
63
- }
64
- else {
65
- data.speed = speed;
66
- data.distanceInternal = distanceInternal + distance;
67
- }
68
- if (props.log)
69
- this.logger.logEvent({ message: "updateData result", data, bikeData, prevSpeed: prevData.speed, stopped: speed < MIN_SPEED });
70
- this.data = data;
26
+ copyBikeData(data, bikeData) {
27
+ const newData = super.copyBikeData(data, bikeData);
28
+ if (bikeData.power > 0) {
29
+ newData.isPedalling = true;
71
30
  }
72
- catch (err) {
73
- this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
74
- }
75
- return this.data;
31
+ return newData;
76
32
  }
77
33
  }
34
+ PowerMeterCyclingMode.config = {
35
+ name: 'PowerMeter',
36
+ description: 'Power and cadence are taken from device. Speed is calculated from power and current slope\nThis mode will not respect maximum power and/or workout limits',
37
+ properties: []
38
+ };
78
39
  exports.default = PowerMeterCyclingMode;
@@ -1,5 +1,6 @@
1
1
  import { EventLogger } from "gd-eventlog";
2
- import { CyclingModeProperty, IncyclistBikeData, UpdateRequest } from "../modes/cycling-mode";
2
+ import { CyclingModeProperyType, UpdateRequest } from "./types";
3
+ import { IncyclistBikeData } from "../types";
3
4
  import { Simulator } from "../simulator/Simulator";
4
5
  import PowerBasedCyclingModeBase from "./power-base";
5
6
  export type ERGEvent = {
@@ -9,21 +10,48 @@ export type ERGEvent = {
9
10
  tsStart?: number;
10
11
  };
11
12
  export default class SimulatorCyclingMode extends PowerBasedCyclingModeBase {
12
- static isERG: boolean;
13
+ protected static config: {
14
+ isERG: boolean;
15
+ name: string;
16
+ description: string;
17
+ properties: ({
18
+ key: string;
19
+ name: string;
20
+ description: string;
21
+ type: CyclingModeProperyType;
22
+ options: string[];
23
+ default: string;
24
+ min?: undefined;
25
+ max?: undefined;
26
+ condition?: undefined;
27
+ } | {
28
+ key: string;
29
+ name: string;
30
+ description: string;
31
+ type: CyclingModeProperyType;
32
+ default: number;
33
+ min: number;
34
+ max: number;
35
+ options?: undefined;
36
+ condition?: undefined;
37
+ } | {
38
+ key: string;
39
+ name: string;
40
+ description: string;
41
+ condition: (s: any) => boolean;
42
+ type: CyclingModeProperyType;
43
+ default: number;
44
+ min: number;
45
+ max: number;
46
+ options?: undefined;
47
+ })[];
48
+ };
13
49
  logger: EventLogger;
14
50
  data: IncyclistBikeData;
15
51
  prevRequest: UpdateRequest;
16
52
  prevUpdateTS: number;
17
- hasBikeUpdate: boolean;
18
- chain: number[];
19
- cassette: number[];
20
53
  event: ERGEvent;
21
54
  constructor(adapter: Simulator, props?: any);
22
- getName(): string;
23
- getDescription(): string;
24
- getProperties(): CyclingModeProperty[];
25
- getProperty(name: string): CyclingModeProperty;
26
55
  getBikeInitRequest(): UpdateRequest;
27
- sendBikeUpdate(request: UpdateRequest): UpdateRequest;
28
56
  updateData(bikeData: IncyclistBikeData): IncyclistBikeData;
29
57
  }
@@ -3,62 +3,19 @@ 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 gd_eventlog_1 = require("gd-eventlog");
7
- const cycling_mode_1 = require("../modes/cycling-mode");
6
+ const types_1 = require("./types");
8
7
  const power_base_1 = __importDefault(require("./power-base"));
9
8
  const MIN_SPEED = 10;
10
- const config = {
11
- name: "Simulator",
12
- description: "Simulates a ride with constant speed or power output",
13
- properties: [
14
- { key: 'mode', name: 'Simulation Type', description: '', type: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Speed', 'Power'], default: 'Power' },
15
- { key: 'delay', name: 'Start Delay', description: 'Delay (in s) at start of training', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 2, min: 0, max: 30 },
16
- { key: 'power', name: 'Power', description: 'Power (in W) at start of training', condition: (s) => !s.mode || s.mode === 'Power', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 150, min: 25, max: 800 },
17
- { key: 'speed', name: 'Speed', description: 'Speed (in km/h) at start of training', condition: (s) => s.mode === 'Speed', type: cycling_mode_1.CyclingModeProperyType.Integer, default: 30, min: 5, max: 50 },
18
- { key: 'bikeType', name: 'Bike Type', description: '', type: cycling_mode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' }
19
- ]
20
- };
21
9
  class SimulatorCyclingMode extends power_base_1.default {
22
10
  constructor(adapter, props) {
23
11
  super(adapter, props);
24
12
  this.prevUpdateTS = 0;
25
- this.hasBikeUpdate = false;
26
13
  this.event = {};
27
- this.logger = adapter.logger || new gd_eventlog_1.EventLogger('SIMMode');
28
- this.data = {};
29
- this.logger.logEvent({ message: 'constructor', props });
30
- }
31
- getName() {
32
- return config.name;
33
- }
34
- getDescription() {
35
- return config.description;
36
- }
37
- getProperties() {
38
- return config.properties;
39
- }
40
- getProperty(name) {
41
- return config.properties.find(p => p.name === name);
14
+ this.initLogger('SIMMode');
42
15
  }
43
16
  getBikeInitRequest() {
44
17
  return {};
45
18
  }
46
- sendBikeUpdate(request) {
47
- this.logger.logEvent({ message: 'bike update request', request });
48
- const r = request || { refresh: true };
49
- if (r.refresh) {
50
- if (Object.keys(r).length === 1)
51
- return this.prevRequest || {};
52
- delete r.refresh;
53
- }
54
- if (request.slope !== undefined) {
55
- if (!this.data)
56
- this.data = {};
57
- this.data.slope = request.slope;
58
- }
59
- this.prevRequest = request ? JSON.parse(JSON.stringify(request)) : {};
60
- return r;
61
- }
62
19
  updateData(bikeData) {
63
20
  const prevData = JSON.parse(JSON.stringify(this.data || {}));
64
21
  const prevSpeed = prevData.speed;
@@ -136,5 +93,16 @@ class SimulatorCyclingMode extends power_base_1.default {
136
93
  return data;
137
94
  }
138
95
  }
139
- SimulatorCyclingMode.isERG = true;
96
+ SimulatorCyclingMode.config = {
97
+ isERG: true,
98
+ name: "Simulator",
99
+ description: "Simulates a ride with constant speed or power output",
100
+ properties: [
101
+ { key: 'mode', name: 'Simulation Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Speed', 'Power'], default: 'Power' },
102
+ { key: 'delay', name: 'Start Delay', description: 'Delay (in s) at start of training', type: types_1.CyclingModeProperyType.Integer, default: 2, min: 0, max: 30 },
103
+ { key: 'power', name: 'Power', description: 'Power (in W) at start of training', condition: (s) => !s.mode || s.mode === 'Power', type: types_1.CyclingModeProperyType.Integer, default: 150, min: 25, max: 800 },
104
+ { key: 'speed', name: 'Speed', description: 'Speed (in km/h) at start of training', condition: (s) => s.mode === 'Speed', type: types_1.CyclingModeProperyType.Integer, default: 30, min: 5, max: 50 },
105
+ { key: 'bikeType', name: 'Bike Type', description: '', type: types_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain', 'Triathlon'], default: 'Race' }
106
+ ]
107
+ };
140
108
  exports.default = SimulatorCyclingMode;
@@ -1,4 +1,4 @@
1
- import { ControllableDeviceAdapter } from "..";
1
+ import { IAdapter, IncyclistBikeData } from "../types";
2
2
  export type UpdateRequest = {
3
3
  slope?: number;
4
4
  minPower?: number;
@@ -27,28 +27,17 @@ export type CyclingModeProperty = {
27
27
  default?: any;
28
28
  options?: any[];
29
29
  };
30
- export type IncyclistBikeData = {
31
- isPedalling?: boolean;
32
- power: number;
33
- pedalRpm: number;
34
- speed: number;
35
- heartrate?: number;
36
- distanceInternal?: number;
37
- time?: number;
38
- gear?: number;
39
- slope?: number;
40
- };
41
30
  export type Settings = {
42
31
  [key: string]: any;
43
32
  };
44
- export default interface CyclingMode {
33
+ export default interface ICyclingMode {
45
34
  getName(): string;
46
35
  getDescription(): string;
36
+ getProperties(): CyclingModeProperty[];
37
+ getProperty(name: string): CyclingModeProperty;
47
38
  getBikeInitRequest(): UpdateRequest;
48
39
  sendBikeUpdate(request: UpdateRequest): UpdateRequest;
49
40
  updateData(data: IncyclistBikeData): IncyclistBikeData;
50
- getProperties(): CyclingModeProperty[];
51
- getProperty(name: string): CyclingModeProperty;
52
41
  setSettings(settings: any): any;
53
42
  setSetting(name: string, value: any): void;
54
43
  getSetting(name: string): any;
@@ -56,23 +45,26 @@ export default interface CyclingMode {
56
45
  setModeProperty(name: string, value: any): void;
57
46
  getModeProperty(name: string): any;
58
47
  }
59
- export declare class CyclingModeBase implements CyclingMode {
60
- adapter: ControllableDeviceAdapter;
61
- settings: Settings;
62
- properties: Settings;
63
- constructor(adapter: ControllableDeviceAdapter, props?: any);
64
- setAdapter(adapter: ControllableDeviceAdapter): void;
65
- getBikeInitRequest(): UpdateRequest;
48
+ export type CyclingModeConfig = {
49
+ isERG?: boolean;
50
+ name: string;
51
+ description: string;
52
+ properties: CyclingModeProperty[];
53
+ };
54
+ export declare class CyclingMode implements ICyclingMode {
55
+ constructor(_adapter: IAdapter, _props?: any);
56
+ static supportsERGMode(): boolean;
66
57
  getName(): string;
67
58
  getDescription(): string;
68
- sendBikeUpdate(request: UpdateRequest): UpdateRequest;
69
- updateData(data: IncyclistBikeData): IncyclistBikeData;
70
59
  getProperties(): CyclingModeProperty[];
71
- getProperty(name: string): CyclingModeProperty;
72
- setSettings(settings?: any): void;
73
- setSetting(name: string, value: any): void;
74
- getSetting(name: string): any;
60
+ getProperty(_name: string): CyclingModeProperty;
61
+ getBikeInitRequest(): UpdateRequest;
62
+ sendBikeUpdate(_request: UpdateRequest): UpdateRequest;
63
+ updateData(_data: IncyclistBikeData): IncyclistBikeData;
64
+ setSettings(_settings: any): void;
65
+ setSetting(_name: string, _value: any): void;
66
+ getSetting(_name: string): void;
75
67
  getSettings(): Settings;
76
- setModeProperty(name: string, value: any): void;
77
- getModeProperty(name: string): any;
68
+ setModeProperty(_name: string, _value: any): void;
69
+ getModeProperty(_name: string): void;
78
70
  }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CyclingMode = exports.CyclingModeProperyType = void 0;
4
+ var CyclingModeProperyType;
5
+ (function (CyclingModeProperyType) {
6
+ CyclingModeProperyType["Integer"] = "Integer";
7
+ CyclingModeProperyType["Boolean"] = "Boolean";
8
+ CyclingModeProperyType["Float"] = "Float";
9
+ CyclingModeProperyType["String"] = "String";
10
+ CyclingModeProperyType["SingleSelect"] = "SingleSelect";
11
+ CyclingModeProperyType["MultiSelect"] = "MultiSelect";
12
+ })(CyclingModeProperyType || (exports.CyclingModeProperyType = CyclingModeProperyType = {}));
13
+ class CyclingMode {
14
+ constructor(_adapter, _props) { }
15
+ static supportsERGMode() { return false; }
16
+ getName() {
17
+ throw new Error("Method not implemented.");
18
+ }
19
+ getDescription() {
20
+ throw new Error("Method not implemented.");
21
+ }
22
+ getProperties() {
23
+ throw new Error("Method not implemented.");
24
+ }
25
+ getProperty(_name) {
26
+ throw new Error("Method not implemented.");
27
+ }
28
+ getBikeInitRequest() {
29
+ throw new Error("Method not implemented.");
30
+ }
31
+ sendBikeUpdate(_request) {
32
+ throw new Error("Method not implemented.");
33
+ }
34
+ updateData(_data) {
35
+ throw new Error("Method not implemented.");
36
+ }
37
+ setSettings(_settings) {
38
+ throw new Error("Method not implemented.");
39
+ }
40
+ setSetting(_name, _value) {
41
+ throw new Error("Method not implemented.");
42
+ }
43
+ getSetting(_name) {
44
+ throw new Error("Method not implemented.");
45
+ }
46
+ getSettings() {
47
+ throw new Error("Method not implemented.");
48
+ }
49
+ setModeProperty(_name, _value) {
50
+ throw new Error("Method not implemented.");
51
+ }
52
+ getModeProperty(_name) {
53
+ throw new Error("Method not implemented.");
54
+ }
55
+ }
56
+ exports.CyclingMode = CyclingMode;
@@ -0,0 +1,17 @@
1
+ import { SerialDeviceSettings } from './adapter';
2
+ import { EventLogger } from "gd-eventlog";
3
+ import { SerialScannerProps } from "./types";
4
+ import SerialInterface from "./serial-interface";
5
+ export declare class SinglePathScanner {
6
+ path: string;
7
+ serial: SerialInterface;
8
+ result: SerialDeviceSettings;
9
+ isScanning: boolean;
10
+ props: SerialScannerProps;
11
+ logger: EventLogger;
12
+ isFound: boolean;
13
+ constructor(path: string, serial: SerialInterface, props: SerialScannerProps);
14
+ logEvent(event: any): void;
15
+ onStopRequest(resolve: any): Promise<void>;
16
+ scan(): Promise<SerialDeviceSettings | undefined>;
17
+ }