incyclist-services 1.0.0

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.MD +28 -0
  3. package/lib/devices/access/index.d.ts +2 -0
  4. package/lib/devices/access/index.js +18 -0
  5. package/lib/devices/access/model.d.ts +24 -0
  6. package/lib/devices/access/model.js +2 -0
  7. package/lib/devices/access/service.d.ts +35 -0
  8. package/lib/devices/access/service.js +288 -0
  9. package/lib/devices/configuration/index.d.ts +2 -0
  10. package/lib/devices/configuration/index.js +18 -0
  11. package/lib/devices/configuration/model/app/index.d.ts +17 -0
  12. package/lib/devices/configuration/model/app/index.js +2 -0
  13. package/lib/devices/configuration/model/index.d.ts +3 -0
  14. package/lib/devices/configuration/model/index.js +19 -0
  15. package/lib/devices/configuration/model/repository/index.d.ts +35 -0
  16. package/lib/devices/configuration/model/repository/index.js +17 -0
  17. package/lib/devices/configuration/model/repository/legacy.d.ts +57 -0
  18. package/lib/devices/configuration/model/repository/legacy.js +2 -0
  19. package/lib/devices/configuration/model/service/index.d.ts +13 -0
  20. package/lib/devices/configuration/model/service/index.js +2 -0
  21. package/lib/devices/configuration/service.d.ts +53 -0
  22. package/lib/devices/configuration/service.js +585 -0
  23. package/lib/devices/consume/service.js +19 -0
  24. package/lib/devices/index.d.ts +3 -0
  25. package/lib/devices/index.js +19 -0
  26. package/lib/devices/ride/index.d.ts +2 -0
  27. package/lib/devices/ride/index.js +18 -0
  28. package/lib/devices/ride/model.d.ts +28 -0
  29. package/lib/devices/ride/model.js +2 -0
  30. package/lib/devices/ride/service.d.ts +44 -0
  31. package/lib/devices/ride/service.js +439 -0
  32. package/lib/index.d.ts +2 -0
  33. package/lib/index.js +23 -0
  34. package/lib/settings/index.d.ts +3 -0
  35. package/lib/settings/index.js +9 -0
  36. package/lib/settings/user/bindings/index.d.ts +2 -0
  37. package/lib/settings/user/bindings/index.js +5 -0
  38. package/lib/settings/user/bindings/json.d.ts +15 -0
  39. package/lib/settings/user/bindings/json.js +112 -0
  40. package/lib/settings/user/bindings/types.d.ts +13 -0
  41. package/lib/settings/user/bindings/types.js +9 -0
  42. package/lib/settings/user/service.d.ts +23 -0
  43. package/lib/settings/user/service.js +174 -0
  44. package/lib/utils/clone.d.ts +1 -0
  45. package/lib/utils/clone.js +6 -0
  46. package/lib/utils/merge.d.ts +1 -0
  47. package/lib/utils/merge.js +21 -0
  48. package/lib/utils/sleep.d.ts +1 -0
  49. package/lib/utils/sleep.js +14 -0
  50. package/lib/utils/valid.d.ts +1 -0
  51. package/lib/utils/valid.js +15 -0
  52. package/package.json +42 -0
@@ -0,0 +1,2 @@
1
+ export * from './service';
2
+ export * from './model';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./service"), exports);
18
+ __exportStar(require("./model"), exports);
@@ -0,0 +1,28 @@
1
+ import { DeviceProperties } from "incyclist-devices/lib/types/device";
2
+ import { AdapterInfo } from "../configuration";
3
+ export interface AdapterRideInfo extends AdapterInfo {
4
+ isStarted: boolean;
5
+ }
6
+ export interface RideServiceDeviceProperties extends DeviceProperties {
7
+ forceErgMode?: boolean;
8
+ startPos?: number;
9
+ realityFactor?: number;
10
+ rideMode?: string;
11
+ route?: any;
12
+ }
13
+ export interface Point {
14
+ elevation: number;
15
+ distance: number;
16
+ }
17
+ export interface PreparedRoute {
18
+ name: string;
19
+ description: string;
20
+ programId: number;
21
+ type: string;
22
+ totalDistance: number;
23
+ lapMode: boolean;
24
+ minElevation: number;
25
+ maxElevation: number;
26
+ sampleRate: number;
27
+ points: Point[];
28
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,44 @@
1
+ /// <reference types="node" />
2
+ import EventEmitter from "events";
3
+ import { DeviceData, DeviceSettings } from "incyclist-devices";
4
+ import { DeviceAccessService } from "../access/service";
5
+ import { AdapterInfo, DeviceConfigurationService } from "../configuration";
6
+ import CyclingMode, { UpdateRequest } from "incyclist-devices/lib/modes/cycling-mode";
7
+ import { AdapterRideInfo, PreparedRoute, RideServiceDeviceProperties } from "./model";
8
+ import { UserSettingsService } from "../../settings";
9
+ export declare class DeviceRideService extends EventEmitter {
10
+ protected static _instance: DeviceRideService;
11
+ protected configurationService: DeviceConfigurationService;
12
+ protected userSettings: UserSettingsService;
13
+ protected accessService: DeviceAccessService;
14
+ protected initizialized: boolean;
15
+ protected adapters: AdapterRideInfo[];
16
+ protected startPromises: Promise<boolean>[];
17
+ protected data: DeviceData;
18
+ protected simulatorEnforced: boolean;
19
+ protected deviceDataHandler: any;
20
+ static getInstance(): DeviceRideService;
21
+ constructor();
22
+ protected waitForInit(): Promise<void>;
23
+ lazyInit(): Promise<void>;
24
+ protected getAdapterStateInfo(adapterInfo: AdapterInfo): {
25
+ udid: string;
26
+ name: string;
27
+ isControl: boolean;
28
+ capabilities: import("../configuration").ExtendedIncyclistCapability[];
29
+ };
30
+ protected getAdapterList(): AdapterRideInfo[];
31
+ prepareEppRoute(props: RideServiceDeviceProperties): PreparedRoute;
32
+ start(props: RideServiceDeviceProperties): Promise<boolean>;
33
+ cancelStart(): Promise<boolean>;
34
+ startRide(_props: any): void;
35
+ stop(): Promise<boolean>;
36
+ pause(): void;
37
+ resume(): void;
38
+ onData(deviceSettings: DeviceSettings, data: DeviceData): void;
39
+ sendUpdate(request: UpdateRequest): void;
40
+ getCyclingMode(udid?: string): CyclingMode;
41
+ onCyclingModeChanged(udid: string, mode: string, settings: any): void;
42
+ enforceSimulator(enforced?: boolean): void;
43
+ }
44
+ export declare const useDeviceRide: () => DeviceRideService;
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.useDeviceRide = exports.DeviceRideService = void 0;
16
+ const events_1 = __importDefault(require("events"));
17
+ const incyclist_devices_1 = require("incyclist-devices");
18
+ const sleep_1 = require("../../utils/sleep");
19
+ const service_1 = require("../access/service");
20
+ const configuration_1 = require("../configuration");
21
+ const clone_1 = __importDefault(require("../../utils/clone"));
22
+ const settings_1 = require("../../settings");
23
+ class DeviceRideService extends events_1.default {
24
+ static getInstance() {
25
+ if (!DeviceRideService._instance)
26
+ DeviceRideService._instance = new DeviceRideService();
27
+ return DeviceRideService._instance;
28
+ }
29
+ constructor() {
30
+ super();
31
+ this.data = {};
32
+ this.deviceDataHandler = this.onData.bind(this);
33
+ this.initizialized = false;
34
+ this.simulatorEnforced = false;
35
+ }
36
+ waitForInit() {
37
+ return new Promise(done => {
38
+ this.accessService = (0, service_1.useDeviceAccess)();
39
+ this.configurationService = (0, configuration_1.useDeviceConfiguration)();
40
+ if (this.configurationService.isInitialized())
41
+ return done();
42
+ this.configurationService.once('initialized', done);
43
+ this.configurationService.init();
44
+ });
45
+ }
46
+ lazyInit() {
47
+ var _a;
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ if (!this.initizialized) {
50
+ yield this.waitForInit();
51
+ }
52
+ this.adapters = (_a = this.configurationService.getAdapters()) === null || _a === void 0 ? void 0 : _a.map(ai => Object.assign({}, Object.assign(Object.assign({}, ai), { isStarted: false })));
53
+ const handleModeChange = this.onCyclingModeChanged.bind(this);
54
+ this.configurationService.on('mode-changed', handleModeChange);
55
+ this.userSettings = (0, settings_1.useUserSettings)();
56
+ });
57
+ }
58
+ getAdapterStateInfo(adapterInfo) {
59
+ const { udid, adapter, capabilities } = adapterInfo;
60
+ const name = adapter.getUniqueName();
61
+ const isControl = adapter.hasCapability(incyclist_devices_1.IncyclistCapability.Control);
62
+ return { udid, name, isControl, capabilities };
63
+ }
64
+ getAdapterList() {
65
+ if (!this.simulatorEnforced)
66
+ return this.adapters;
67
+ const adapter = incyclist_devices_1.AdapterFactory.create({ interface: 'simulator', name: 'Simulator' });
68
+ return [{ adapter, udid: 'Simulator' + Date.now(), capabilities: adapter.getCapabilities(), isStarted: false }];
69
+ }
70
+ prepareEppRoute(props) {
71
+ const { route, startPos, realityFactor, rideMode } = props;
72
+ if (!route || !route.get()) {
73
+ return null;
74
+ }
75
+ let res;
76
+ const eppPreferences = (0, clone_1.default)(this.userSettings.get('eppPreferences', {}));
77
+ if (!eppPreferences.programId)
78
+ eppPreferences.programId = 1;
79
+ else {
80
+ eppPreferences.programId++;
81
+ if (eppPreferences.programId > 32767)
82
+ eppPreferences.programId = 1;
83
+ }
84
+ this.userSettings.update({ eppPreferences });
85
+ const routeData = route.get();
86
+ if (routeData.epp) {
87
+ const eppData = routeData.epp;
88
+ let points = eppData.programData;
89
+ const offset = startPos || 0;
90
+ if (startPos !== undefined && startPos !== 0) {
91
+ let idxBefore = 0;
92
+ let idxAfter = points.length - 1;
93
+ let done = false;
94
+ for (let i = 0; i < points.length && !done; i++) {
95
+ const p = points[i];
96
+ if (p.distance <= startPos)
97
+ idxBefore = i;
98
+ if (p.distance >= startPos) {
99
+ idxAfter = i;
100
+ done = true;
101
+ }
102
+ }
103
+ if (idxAfter > idxBefore) {
104
+ const originalPoints = points;
105
+ const distance = startPos - originalPoints[idxBefore].distance;
106
+ const distanceGain = originalPoints[idxAfter].distance - originalPoints[idxBefore].distance;
107
+ const elevationGain = originalPoints[idxAfter].elevation - originalPoints[idxBefore].elevation;
108
+ points = [];
109
+ points.push({ distance: offset, elevation: originalPoints[idxBefore].elevation + elevationGain * distance / distanceGain });
110
+ points = points.concat(originalPoints.slice(idxAfter));
111
+ if (route.isLap()) {
112
+ points = points.concat(originalPoints.slice(1, idxBefore + 1).map(p => { p.distance += routeData.distance; return p; }));
113
+ points.push({ distance: routeData.distance + offset, elevation: originalPoints[idxBefore].elevation + elevationGain * distance / distanceGain });
114
+ }
115
+ }
116
+ else {
117
+ const originalPoints = points;
118
+ points = originalPoints.slice(idxAfter);
119
+ if (route.isLap()) {
120
+ points = points.concat(originalPoints.slice(1, idxBefore + 1).map(p => { p.distance += routeData.distance; return p; }));
121
+ }
122
+ }
123
+ }
124
+ const pStart = points[0];
125
+ const elevationStart = pStart.elevation;
126
+ const totalDistance = route.isLap() ? routeData.distance : Math.ceil(routeData.distance - (startPos || 0));
127
+ res = {
128
+ name: eppData.name,
129
+ description: eppData.description,
130
+ programId: eppPreferences.programId,
131
+ type: rideMode || 'free ride',
132
+ totalDistance,
133
+ lapMode: route.isLap(),
134
+ minElevation: eppData.minElevation,
135
+ maxElevation: eppData.maxElevation,
136
+ sampleRate: eppData.sampleRate,
137
+ points: points.map(p => {
138
+ const adjustedElevation = realityFactor === undefined ? p.elevation : elevationStart + (p.elevation - elevationStart) * realityFactor / 100;
139
+ return {
140
+ elevation: adjustedElevation,
141
+ distance: p.distance,
142
+ };
143
+ })
144
+ };
145
+ }
146
+ else {
147
+ const sampleRate = 10;
148
+ let points = routeData.decoded;
149
+ let totalDistance = Math.ceil(routeData.distance);
150
+ if (startPos !== undefined && startPos !== 0) {
151
+ let idxBefore = 0;
152
+ let idxAfter = points.length - 1;
153
+ let done = false;
154
+ for (let i = 0; i < points.length && !done; i++) {
155
+ const p = points[i];
156
+ if (p.routeDistance <= startPos)
157
+ idxBefore = i;
158
+ if (p.routeDistance >= startPos) {
159
+ idxAfter = i;
160
+ done = true;
161
+ }
162
+ }
163
+ if (idxAfter > idxBefore) {
164
+ const originalPoints = points;
165
+ const distance = startPos - originalPoints[idxBefore].routeDistance;
166
+ const distanceGain = originalPoints[idxAfter].routeDistance - originalPoints[idxBefore].routeDistance;
167
+ const elevationGain = originalPoints[idxAfter].elevation - originalPoints[idxBefore].elevation;
168
+ points = [];
169
+ points.push({ routeDistance: startPos, elevation: originalPoints[idxBefore].elevation + elevationGain * distance / distanceGain });
170
+ points = points.concat(originalPoints.slice(idxAfter));
171
+ if (route.isLap()) {
172
+ points = points.concat(originalPoints.slice(1, idxBefore + 1).map(p => { p.routeDistance += routeData.distance; return p; }));
173
+ points.push({ routeDistance: routeData.distance, elevation: originalPoints[idxBefore].elevation + elevationGain * distance / distanceGain });
174
+ }
175
+ }
176
+ else {
177
+ const originalPoints = points;
178
+ points = originalPoints.slice(idxAfter);
179
+ if (route.isLap()) {
180
+ points = originalPoints.slice(1, idxBefore + 1).map(p => { p.routeDistance += routeData.distance; return p; });
181
+ }
182
+ }
183
+ totalDistance = route.isLap() ? routeData.distance : Math.ceil(routeData.distance - (startPos || 0));
184
+ }
185
+ res = {
186
+ name: routeData.title,
187
+ description: '',
188
+ programId: eppPreferences.programId,
189
+ type: rideMode || 'free ride',
190
+ totalDistance,
191
+ lapMode: route.isLap(),
192
+ minElevation: 0,
193
+ maxElevation: Math.ceil(Math.max(...points.map(p => p.elevation)) / 1000) * 1000,
194
+ sampleRate,
195
+ points: []
196
+ };
197
+ const offset = startPos || 0;
198
+ let d = offset;
199
+ let i = 0;
200
+ let pStart = points[0];
201
+ const elevationStart = pStart.elevation ? Math.round(pStart.elevation * 10) / 10 : 0;
202
+ const addPoint = (distanceValue, elevationValue, inc = true) => {
203
+ const distance = Math.round(distanceValue);
204
+ let elevation = elevationValue >= 0 ? Math.round(elevationValue * 10) / 10 : 0;
205
+ if (realityFactor !== undefined) {
206
+ elevation = elevationStart + (elevation - elevationStart) * realityFactor / 100;
207
+ }
208
+ res.points.push({
209
+ elevation,
210
+ distance
211
+ });
212
+ if (inc)
213
+ d += sampleRate;
214
+ };
215
+ while (d <= routeData.distance + offset && i < points.length) {
216
+ const p = points[i];
217
+ if (i === 0) {
218
+ addPoint(0, p.elevation, false);
219
+ i++;
220
+ }
221
+ else {
222
+ if (p.routeDistance < d) {
223
+ pStart = p;
224
+ i++;
225
+ }
226
+ else if (p.routeDistance === d + sampleRate) {
227
+ addPoint(p.routeDistance - offset, p.elevation);
228
+ i++;
229
+ }
230
+ else if (p.routeDistance > d + sampleRate) {
231
+ do {
232
+ const d1 = pStart.routeDistance;
233
+ const d2 = p.routeDistance;
234
+ const e1 = pStart.elevation;
235
+ const e2 = p.elevation;
236
+ const dT = d + sampleRate;
237
+ const e = e1 + (e2 - e1) * (dT - d1) / (d2 - d1);
238
+ addPoint(dT - offset, e);
239
+ } while (p.routeDistance > d + sampleRate);
240
+ if (p.routeDistance >= routeData.distance || i === points.length - 1) {
241
+ addPoint(p.routeDistance - offset, p.elevation);
242
+ i++;
243
+ }
244
+ else {
245
+ i++;
246
+ pStart = p;
247
+ }
248
+ }
249
+ else {
250
+ i++;
251
+ }
252
+ }
253
+ }
254
+ }
255
+ return res;
256
+ }
257
+ start(props) {
258
+ return __awaiter(this, void 0, void 0, function* () {
259
+ this.lazyInit();
260
+ const { forceErgMode, startPos, realityFactor, rideMode, route } = props;
261
+ while (this.startPromises) {
262
+ (0, sleep_1.sleep)(500);
263
+ }
264
+ const adapters = this.getAdapterList();
265
+ this.emit('start-request', adapters.map(this.getAdapterStateInfo));
266
+ this.startPromises = adapters.map(ai => {
267
+ const startProps = (0, clone_1.default)(props);
268
+ if (ai.adapter.isControllable()) {
269
+ const d = ai.adapter;
270
+ let mode, settings;
271
+ if (!this.simulatorEnforced) {
272
+ if (forceErgMode) {
273
+ const modes = d.getSupportedCyclingModes().filter(C => C.isERG);
274
+ if (modes.length > 0) {
275
+ mode = new modes[0](d);
276
+ const modeInfo = this.configurationService.getModeSettings(ai.udid, mode);
277
+ settings = modeInfo.settings;
278
+ }
279
+ }
280
+ if (!mode) {
281
+ const modeInfo = this.configurationService.getModeSettings(ai.udid);
282
+ mode = modeInfo.mode;
283
+ settings = modeInfo.settings;
284
+ }
285
+ }
286
+ if (!mode)
287
+ mode = d.getDefaultCyclingMode();
288
+ d.setCyclingMode(mode, settings);
289
+ if (d.getCyclingMode().getModeProperty('eppSupport')) {
290
+ startProps.route = this.prepareEppRoute({ route, startPos, realityFactor, rideMode });
291
+ startProps.onStatusUpdate = (completed, total) => {
292
+ this.emit('start-update', this.getAdapterStateInfo(ai), completed, total);
293
+ };
294
+ }
295
+ }
296
+ return ai.adapter.start(startProps)
297
+ .then(success => {
298
+ if (success) {
299
+ this.emit('start-success', this.getAdapterStateInfo(ai));
300
+ }
301
+ ai.isStarted = true;
302
+ return success;
303
+ })
304
+ .catch(err => {
305
+ ai.isStarted = false;
306
+ this.emit('start-error', this.getAdapterStateInfo(ai), err);
307
+ return false;
308
+ });
309
+ });
310
+ const status = yield Promise.all(this.startPromises);
311
+ const allOK = status.find(s => s === false) === undefined;
312
+ this.emit('start-result', allOK);
313
+ if (allOK) {
314
+ this.startRide(props);
315
+ }
316
+ this.startPromises = null;
317
+ return allOK;
318
+ });
319
+ }
320
+ cancelStart() {
321
+ return __awaiter(this, void 0, void 0, function* () {
322
+ const adapters = this.getAdapterList();
323
+ adapters.forEach(ai => {
324
+ const d = ai.adapter;
325
+ d.off('data', this.deviceDataHandler);
326
+ if (!ai.isStarted)
327
+ d.stop();
328
+ });
329
+ this.startPromises = null;
330
+ return true;
331
+ });
332
+ }
333
+ startRide(_props) {
334
+ const adapters = this.getAdapterList();
335
+ adapters.forEach(ai => {
336
+ ai.adapter.on('data', this.deviceDataHandler);
337
+ });
338
+ }
339
+ stop() {
340
+ return __awaiter(this, void 0, void 0, function* () {
341
+ const adapters = this.getAdapterList();
342
+ this.emit('stop-ride');
343
+ adapters.forEach(ai => {
344
+ ai.adapter.off('data', this.deviceDataHandler);
345
+ });
346
+ return true;
347
+ });
348
+ }
349
+ pause() {
350
+ const adapters = this.getAdapterList();
351
+ adapters.forEach(ai => {
352
+ ai.adapter.pause();
353
+ ai.adapter.off('data', this.deviceDataHandler);
354
+ });
355
+ }
356
+ resume() {
357
+ const adapters = this.getAdapterList();
358
+ adapters.forEach(ai => {
359
+ ai.adapter.resume();
360
+ ai.adapter.on('data', this.deviceDataHandler);
361
+ });
362
+ }
363
+ onData(deviceSettings, data) {
364
+ const adapters = this.getAdapterList();
365
+ const hasControl = adapters.find(ai => ai.capabilities.includes(incyclist_devices_1.IncyclistCapability.Control)) !== undefined;
366
+ const hasPower = adapters.find(ai => ai.capabilities.includes(incyclist_devices_1.IncyclistCapability.Power)) !== undefined;
367
+ const adapterInfo = adapters.find(ai => ai.adapter.isEqual(deviceSettings));
368
+ adapterInfo.capabilities.forEach(capability => {
369
+ switch (capability) {
370
+ case incyclist_devices_1.IncyclistCapability.HeartRate:
371
+ this.data.heartrate = data.heartrate;
372
+ break;
373
+ case incyclist_devices_1.IncyclistCapability.Power:
374
+ this.data.power = data.power;
375
+ this.data.speed = data.speed;
376
+ break;
377
+ case incyclist_devices_1.IncyclistCapability.Cadence:
378
+ this.data.cadence = data.cadence;
379
+ if (hasControl && !hasPower) {
380
+ this.data.speed = data.speed;
381
+ this.data.power = data.power;
382
+ }
383
+ break;
384
+ case incyclist_devices_1.IncyclistCapability.Control:
385
+ this.data.deviceDistanceCounter = data.deviceDistanceCounter;
386
+ this.data.deviceTime = data.deviceTime;
387
+ this.data.distance = data.distance;
388
+ this.data.internalDistanceCounter = data.internalDistanceCounter;
389
+ this.data.slope = data.slope;
390
+ this.data.timestamp = data.timestamp;
391
+ break;
392
+ }
393
+ });
394
+ this.emit('data', this.data);
395
+ }
396
+ sendUpdate(request) {
397
+ const adapters = this.getAdapterList();
398
+ adapters.forEach(ai => {
399
+ if (ai.adapter.isControllable()) {
400
+ const d = ai.adapter;
401
+ d.sendUpdate(request);
402
+ }
403
+ });
404
+ }
405
+ getCyclingMode(udid) {
406
+ var _a, _b;
407
+ const adapters = this.getAdapterList();
408
+ let adapter;
409
+ if (udid) {
410
+ adapter = (_a = adapters.find(ai => ai.udid === udid)) === null || _a === void 0 ? void 0 : _a.adapter;
411
+ }
412
+ else {
413
+ adapter = (_b = adapters.find(ai => ai.adapter.hasCapability(incyclist_devices_1.IncyclistCapability.Control))) === null || _b === void 0 ? void 0 : _b.adapter;
414
+ }
415
+ if (adapter)
416
+ return adapter.getCyclingMode();
417
+ }
418
+ onCyclingModeChanged(udid, mode, settings) {
419
+ var _a;
420
+ const currentMode = this.getCyclingMode(udid);
421
+ if (!currentMode || currentMode.getName() !== mode) {
422
+ const adapters = this.getAdapterList();
423
+ const adapter = (_a = adapters.find(ai => ai.udid === udid)) === null || _a === void 0 ? void 0 : _a.adapter;
424
+ if (adapter && adapter.isControllable()) {
425
+ const device = adapter;
426
+ device.setCyclingMode(mode, settings);
427
+ }
428
+ }
429
+ else {
430
+ currentMode.setSettings(settings);
431
+ }
432
+ }
433
+ enforceSimulator(enforced = true) {
434
+ this.simulatorEnforced = enforced;
435
+ }
436
+ }
437
+ exports.DeviceRideService = DeviceRideService;
438
+ const useDeviceRide = () => DeviceRideService.getInstance();
439
+ exports.useDeviceRide = useDeviceRide;
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './devices';
2
+ export { useUserSettings, initUserSettings, UserSettingsService, UserSettingsBinding, IUserSettingsBinding } from './settings';
package/lib/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.UserSettingsBinding = exports.UserSettingsService = exports.initUserSettings = exports.useUserSettings = void 0;
18
+ __exportStar(require("./devices"), exports);
19
+ var settings_1 = require("./settings");
20
+ Object.defineProperty(exports, "useUserSettings", { enumerable: true, get: function () { return settings_1.useUserSettings; } });
21
+ Object.defineProperty(exports, "initUserSettings", { enumerable: true, get: function () { return settings_1.initUserSettings; } });
22
+ Object.defineProperty(exports, "UserSettingsService", { enumerable: true, get: function () { return settings_1.UserSettingsService; } });
23
+ Object.defineProperty(exports, "UserSettingsBinding", { enumerable: true, get: function () { return settings_1.UserSettingsBinding; } });
@@ -0,0 +1,3 @@
1
+ import { UserSettingsService, useUserSettings, initUserSettings } from "./user/service";
2
+ import { UserSettingsBinding, IUserSettingsBinding } from './user/bindings';
3
+ export { UserSettingsService, useUserSettings, initUserSettings, UserSettingsBinding, IUserSettingsBinding };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserSettingsBinding = exports.initUserSettings = exports.useUserSettings = exports.UserSettingsService = void 0;
4
+ const service_1 = require("./user/service");
5
+ Object.defineProperty(exports, "UserSettingsService", { enumerable: true, get: function () { return service_1.UserSettingsService; } });
6
+ Object.defineProperty(exports, "useUserSettings", { enumerable: true, get: function () { return service_1.useUserSettings; } });
7
+ Object.defineProperty(exports, "initUserSettings", { enumerable: true, get: function () { return service_1.initUserSettings; } });
8
+ const bindings_1 = require("./user/bindings");
9
+ Object.defineProperty(exports, "UserSettingsBinding", { enumerable: true, get: function () { return bindings_1.UserSettingsBinding; } });
@@ -0,0 +1,2 @@
1
+ import { UserSettingsBinding, IUserSettingsBinding } from "./types";
2
+ export { UserSettingsBinding, IUserSettingsBinding };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserSettingsBinding = void 0;
4
+ const types_1 = require("./types");
5
+ Object.defineProperty(exports, "UserSettingsBinding", { enumerable: true, get: function () { return types_1.UserSettingsBinding; } });
@@ -0,0 +1,15 @@
1
+ import { UserSettingsBinding } from "./types";
2
+ export default class JSONFileBindig extends UserSettingsBinding {
3
+ static _instance: UserSettingsBinding;
4
+ path: string;
5
+ settings: any;
6
+ savePromise: Promise<boolean> | null;
7
+ static getInstance(path?: string): UserSettingsBinding;
8
+ constructor(path?: string);
9
+ getAll(): Promise<any>;
10
+ set(key: string, value: any): Promise<boolean>;
11
+ canOverwrite(): boolean;
12
+ save(settings?: any): Promise<boolean>;
13
+ waitForSaveFinished(): Promise<void>;
14
+ verify(settings: any): boolean;
15
+ }