incyclist-devices 2.3.10 → 2.3.12

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 (44) hide show
  1. package/lib/ble/fm/adapter.d.ts +2 -1
  2. package/lib/ble/fm/adapter.js +32 -14
  3. package/lib/ble/fm/sensor.js +9 -2
  4. package/lib/ble/wahoo/sensor.d.ts +1 -0
  5. package/lib/ble/wahoo/sensor.js +18 -0
  6. package/package.json +1 -1
  7. package/lib/ble/adapter-factory.d.ts +0 -34
  8. package/lib/ble/adapter-factory.js +0 -110
  9. package/lib/ble/base/comms-utils.d.ts +0 -7
  10. package/lib/ble/base/comms-utils.js +0 -90
  11. package/lib/ble/base/comms.d.ts +0 -75
  12. package/lib/ble/base/comms.js +0 -599
  13. package/lib/ble/ble-interface.d.ts +0 -84
  14. package/lib/ble/ble-interface.js +0 -622
  15. package/lib/ble/ble-peripheral.d.ts +0 -39
  16. package/lib/ble/ble-peripheral.js +0 -252
  17. package/lib/ble/cp/comm.d.ts +0 -30
  18. package/lib/ble/cp/comm.js +0 -126
  19. package/lib/ble/elite/adapter.d.ts +0 -21
  20. package/lib/ble/elite/adapter.js +0 -118
  21. package/lib/ble/elite/comms.d.ts +0 -31
  22. package/lib/ble/elite/comms.js +0 -127
  23. package/lib/ble/elite/index.d.ts +0 -3
  24. package/lib/ble/elite/index.js +0 -10
  25. package/lib/ble/fm/comms.d.ts +0 -49
  26. package/lib/ble/fm/comms.js +0 -506
  27. package/lib/ble/hr/comm.d.ts +0 -19
  28. package/lib/ble/hr/comm.js +0 -65
  29. package/lib/ble/peripheral-cache.d.ts +0 -45
  30. package/lib/ble/peripheral-cache.js +0 -109
  31. package/lib/ble/tacx/comms.d.ts +0 -59
  32. package/lib/ble/tacx/comms.js +0 -634
  33. package/lib/ble/wahoo/comms.d.ts +0 -64
  34. package/lib/ble/wahoo/comms.js +0 -399
  35. package/lib/direct-connect/base/comms.d.ts +0 -3
  36. package/lib/direct-connect/base/comms.js +0 -7
  37. package/lib/direct-connect/base/sensor.d.ts +0 -3
  38. package/lib/direct-connect/base/sensor.js +0 -7
  39. package/lib/direct-connect/utils.d.ts +0 -5
  40. package/lib/direct-connect/utils.js +0 -73
  41. package/lib/factories/index.d.ts +0 -3
  42. package/lib/factories/index.js +0 -10
  43. package/lib/utils/operation.d.ts +0 -17
  44. package/lib/utils/operation.js +0 -20
@@ -1,634 +0,0 @@
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
- const consts_1 = require("../consts");
16
- const comms_1 = __importDefault(require("../fm/comms"));
17
- const utils_1 = require("../utils");
18
- var ANTMessages;
19
- (function (ANTMessages) {
20
- ANTMessages[ANTMessages["calibrationCommand"] = 1] = "calibrationCommand";
21
- ANTMessages[ANTMessages["calibrationStatus"] = 2] = "calibrationStatus";
22
- ANTMessages[ANTMessages["generalFE"] = 16] = "generalFE";
23
- ANTMessages[ANTMessages["generalSettings"] = 17] = "generalSettings";
24
- ANTMessages[ANTMessages["trainerData"] = 25] = "trainerData";
25
- ANTMessages[ANTMessages["basicResistance"] = 48] = "basicResistance";
26
- ANTMessages[ANTMessages["targetPower"] = 49] = "targetPower";
27
- ANTMessages[ANTMessages["windResistance"] = 50] = "windResistance";
28
- ANTMessages[ANTMessages["trackResistance"] = 51] = "trackResistance";
29
- ANTMessages[ANTMessages["feCapabilities"] = 54] = "feCapabilities";
30
- ANTMessages[ANTMessages["userConfiguration"] = 55] = "userConfiguration";
31
- ANTMessages[ANTMessages["requestData"] = 70] = "requestData";
32
- ANTMessages[ANTMessages["commandStatus"] = 71] = "commandStatus";
33
- ANTMessages[ANTMessages["manufactererData"] = 80] = "manufactererData";
34
- ANTMessages[ANTMessages["productInformation"] = 81] = "productInformation";
35
- })(ANTMessages || (ANTMessages = {}));
36
- const PROFILE_ID = 'Tacx SmartTrainer';
37
- const SYNC_BYTE = 0xA4;
38
- const DEFAULT_CHANNEL = 5;
39
- const ACKNOWLEDGED_DATA = 0x4F;
40
- class TacxAdvancedFitnessMachineDevice extends comms_1.default {
41
- constructor(props) {
42
- super(props);
43
- this.prevCrankData = undefined;
44
- this.currentCrankData = undefined;
45
- this.timeOffset = 0;
46
- this.tsPrevWrite = undefined;
47
- this.data = {};
48
- this.hasFECData = false;
49
- this.messageCnt = 0;
50
- this.tacxRx = consts_1.TACX_FE_C_RX;
51
- this.tacxTx = consts_1.TACX_FE_C_TX;
52
- }
53
- static isMatching(characteristics) {
54
- if (!characteristics)
55
- return false;
56
- const announced = characteristics.map(c => (0, utils_1.uuid)(c));
57
- const hasTacxCP = announced.find(c => (0, utils_1.matches)(c, consts_1.TACX_FE_C_RX)) !== undefined &&
58
- announced.find(c => (0, utils_1.matches)(c, consts_1.TACX_FE_C_TX)) !== undefined;
59
- return hasTacxCP;
60
- }
61
- setCharacteristicUUIDs(uuids) {
62
- uuids.forEach(c => {
63
- if ((0, utils_1.matches)(c, consts_1.TACX_FE_C_RX))
64
- this.tacxRx = c;
65
- if ((0, utils_1.matches)(c, consts_1.TACX_FE_C_TX))
66
- this.tacxTx = c;
67
- });
68
- }
69
- subscribeAll(conn) {
70
- const characteristics = [consts_1.CSC_MEASUREMENT, consts_1.CSP_MEASUREMENT, consts_1.INDOOR_BIKE_DATA, consts_1.FTMS_STATUS, consts_1.FTMS_CP, consts_1.TACX_FE_C_RX];
71
- return this.subscribeMultiple(characteristics, conn);
72
- }
73
- init() {
74
- const _super = Object.create(null, {
75
- initDevice: { get: () => super.initDevice }
76
- });
77
- return __awaiter(this, void 0, void 0, function* () {
78
- try {
79
- return yield _super.initDevice.call(this);
80
- }
81
- catch (err) {
82
- this.logEvent({ message: 'error', fn: 'TacxAdvancedFitnessMachineDevice.init()', error: err.message || err, stack: err.stack });
83
- return false;
84
- }
85
- });
86
- }
87
- getProfile() {
88
- return 'Smart Trainer';
89
- }
90
- getProtocol() {
91
- return TacxAdvancedFitnessMachineDevice.protocol;
92
- }
93
- getServiceUUids() {
94
- return TacxAdvancedFitnessMachineDevice.services;
95
- }
96
- requestControl() {
97
- return __awaiter(this, void 0, void 0, function* () {
98
- return true;
99
- });
100
- }
101
- parseCrankData(crankData) {
102
- if (!this.prevCrankData) {
103
- this.prevCrankData = Object.assign(Object.assign({}, crankData), { cntUpdateMissing: -1 });
104
- return {};
105
- }
106
- const c = this.currentCrankData = crankData;
107
- const p = this.prevCrankData;
108
- let rpm = this.data.cadence;
109
- let hasUpdate = c.time !== p.time;
110
- if (hasUpdate) {
111
- let time = c.time - p.time;
112
- let revs = c.revolutions - p.revolutions;
113
- if (c.time < p.time) {
114
- time += 0x10000;
115
- this.timeOffset += 0x10000;
116
- }
117
- if (c.revolutions < p.revolutions)
118
- revs += 0x10000;
119
- rpm = 1024 * 60 * revs / time;
120
- }
121
- else {
122
- if (p.cntUpdateMissing < 0 || p.cntUpdateMissing > 2) {
123
- rpm = 0;
124
- }
125
- }
126
- const cntUpdateMissing = p.cntUpdateMissing;
127
- this.prevCrankData = this.currentCrankData;
128
- if (hasUpdate)
129
- this.prevCrankData.cntUpdateMissing = 0;
130
- else
131
- this.prevCrankData.cntUpdateMissing = cntUpdateMissing + 1;
132
- return { rpm, time: this.timeOffset + c.time };
133
- }
134
- parseCSC(_data, logOnly = false) {
135
- const data = Buffer.from(_data);
136
- this.logEvent({ message: 'BLE CSC message', data: data.toString('hex') });
137
- if (logOnly)
138
- return this.data;
139
- let offset = 0;
140
- const flags = data.readUInt8(offset);
141
- offset++;
142
- if (flags & 0x01) {
143
- offset += 6;
144
- }
145
- if (flags & 0x02) {
146
- const crankData = {
147
- revolutions: data.readUInt16LE(offset),
148
- time: data.readUInt16LE(offset + 2)
149
- };
150
- const { rpm, time } = this.parseCrankData(crankData);
151
- this.data.cadence = rpm;
152
- this.data.time = time;
153
- offset += 4;
154
- }
155
- return this.data;
156
- }
157
- parsePower(_data, logOnly = false) {
158
- const data = Buffer.from(_data);
159
- this.logEvent({ message: 'BLE CSP message', data: data.toString('hex') });
160
- if (logOnly)
161
- return this.data;
162
- try {
163
- let offset = 4;
164
- const flags = data.readUInt16LE(0);
165
- this.data.instantaneousPower = data.readUInt16LE(2);
166
- if (flags & 0x1)
167
- data.readUInt8(offset++);
168
- if (flags & 0x4) {
169
- offset += 2;
170
- }
171
- if (flags & 0x10) {
172
- offset += 6;
173
- }
174
- if (flags & 0x20) {
175
- const crankData = {
176
- revolutions: data.readUInt16LE(offset),
177
- time: data.readUInt16LE(offset + 2)
178
- };
179
- const { rpm, time } = this.parseCrankData(crankData);
180
- this.data.cadence = rpm;
181
- this.data.time = time;
182
- offset += 4;
183
- }
184
- }
185
- catch (err) {
186
- this.logEvent({ message: 'error', fn: 'parsePower()', error: err.message || err, stack: err.stack });
187
- }
188
- const { instantaneousPower, cadence, time } = this.data;
189
- return { instantaneousPower, cadence, time, raw: data.toString('hex') };
190
- }
191
- parseIndoorBikeData(_data, logOnly) {
192
- this.logEvent({ message: 'BLE INDOOR_BIKE_DATA message', data: _data.toString('hex') });
193
- if (logOnly)
194
- return this.data;
195
- return super.parseIndoorBikeData(_data);
196
- }
197
- resetState() {
198
- const state = this.data;
199
- delete state.time;
200
- delete state.totalDistance;
201
- delete state.RealSpeed;
202
- delete state.VirtualSpeed;
203
- delete state.heartrate;
204
- delete state.HeartRateSource;
205
- delete state.EventCount;
206
- delete state.cadence;
207
- delete state.AccumulatedPower;
208
- delete state.instantaneousPower;
209
- delete state.averagePower;
210
- delete state.TrainerStatus;
211
- delete state.TargetStatus;
212
- }
213
- parseFEState(capStateBF) {
214
- switch ((capStateBF & 0x70) >> 4) {
215
- case 1:
216
- this.data.State = 'OFF';
217
- break;
218
- case 2:
219
- this.data.State = 'READY';
220
- this.resetState();
221
- break;
222
- case 3:
223
- this.data.State = 'IN_USE';
224
- break;
225
- case 4:
226
- this.data.State = 'FINISHED';
227
- break;
228
- default:
229
- delete this.data.State;
230
- break;
231
- }
232
- if (capStateBF & 0x80) {
233
- }
234
- }
235
- parseGeneralFE(data) {
236
- const equipmentTypeBF = data.readUInt8(1);
237
- let elapsedTime = data.readUInt8(2);
238
- let distance = data.readUInt8(3);
239
- const speed = data.readUInt16LE(4);
240
- const heartRate = data.readUInt8(6);
241
- const capStateBF = data.readUInt8(7);
242
- switch (equipmentTypeBF & 0x1F) {
243
- case 19:
244
- this.data.EquipmentType = 'Treadmill';
245
- break;
246
- case 20:
247
- this.data.EquipmentType = 'Elliptical';
248
- break;
249
- case 21:
250
- this.data.EquipmentType = 'StationaryBike';
251
- break;
252
- case 22:
253
- this.data.EquipmentType = 'Rower';
254
- break;
255
- case 23:
256
- this.data.EquipmentType = 'Climber';
257
- break;
258
- case 24:
259
- this.data.EquipmentType = 'NordicSkier';
260
- break;
261
- case 25:
262
- this.data.EquipmentType = 'Trainer';
263
- break;
264
- default:
265
- this.data.EquipmentType = 'General';
266
- break;
267
- }
268
- if (heartRate !== 0xFF) {
269
- switch (capStateBF & 0x03) {
270
- case 3: {
271
- this.data.heartrate = heartRate;
272
- this.data.HeartRateSource = 'HandContact';
273
- break;
274
- }
275
- case 2: {
276
- this.data.heartrate = heartRate;
277
- this.data.HeartRateSource = 'EM';
278
- break;
279
- }
280
- case 1: {
281
- this.data.heartrate = heartRate;
282
- this.data.HeartRateSource = 'ANT+';
283
- break;
284
- }
285
- default: {
286
- delete this.data.heartrate;
287
- delete this.data.HeartRateSource;
288
- break;
289
- }
290
- }
291
- }
292
- elapsedTime /= 4;
293
- const oldElapsedTime = (this.data.time || 0) % 64;
294
- if (elapsedTime !== oldElapsedTime) {
295
- if (oldElapsedTime > elapsedTime) {
296
- elapsedTime += 64;
297
- }
298
- }
299
- this.data.time = (this.data.time || 0) + elapsedTime - oldElapsedTime;
300
- if (capStateBF & 0x04) {
301
- const oldDistance = (this.data.time || 0) % 256;
302
- if (distance !== oldDistance) {
303
- if (oldDistance > distance) {
304
- distance += 256;
305
- }
306
- }
307
- this.data.totalDistance = (this.data.totalDistance || 0) + distance - oldDistance;
308
- }
309
- else {
310
- delete this.data.totalDistance;
311
- }
312
- this.data.speed = speed / 1000;
313
- if (capStateBF & 0x08) {
314
- this.data.VirtualSpeed = speed / 1000;
315
- delete this.data.RealSpeed;
316
- }
317
- else {
318
- delete this.data.VirtualSpeed;
319
- this.data.RealSpeed = speed / 1000;
320
- }
321
- this.parseFEState(capStateBF);
322
- return this.data;
323
- }
324
- parseTrainerData(data) {
325
- const oldEventCount = this.data.EventCount || 0;
326
- let eventCount = data.readUInt8(1);
327
- const cadence = data.readUInt8(2);
328
- let accPower = data.readUInt16LE(3);
329
- const power = data.readUInt16LE(5) & 0xFFF;
330
- const trainerStatus = data.readUInt8(6) >> 4;
331
- const flagStateBF = data.readUInt8(7);
332
- if (eventCount !== oldEventCount) {
333
- this.data.EventCount = eventCount;
334
- if (oldEventCount > eventCount) {
335
- eventCount += 255;
336
- }
337
- }
338
- if (cadence !== 0xFF) {
339
- this.data.cadence = cadence;
340
- }
341
- if (power !== 0xFFF) {
342
- this.data.instantaneousPower = power;
343
- const oldAccPower = (this.data.AccumulatedPower || 0) % 65536;
344
- if (accPower !== oldAccPower) {
345
- if (oldAccPower > accPower) {
346
- accPower += 65536;
347
- }
348
- }
349
- this.data.AccumulatedPower = (this.data.AccumulatedPower || 0) + accPower - oldAccPower;
350
- this.data.averagePower = (accPower - oldAccPower) / (eventCount - oldEventCount);
351
- }
352
- this.data.TrainerStatus = trainerStatus;
353
- switch (flagStateBF & 0x03) {
354
- case 0:
355
- this.data.TargetStatus = 'OnTarget';
356
- break;
357
- case 1:
358
- this.data.TargetStatus = 'LowSpeed';
359
- break;
360
- case 2:
361
- this.data.TargetStatus = 'HighSpeed';
362
- break;
363
- default:
364
- delete this.data.TargetStatus;
365
- break;
366
- }
367
- this.parseFEState(flagStateBF);
368
- if (power !== undefined && cadence !== undefined)
369
- this.hasFECData = true;
370
- return this.data;
371
- }
372
- parseProductInformation(data) {
373
- const swRevSup = data.readUInt8(2);
374
- const swRevMain = data.readUInt8(3);
375
- const serial = data.readInt32LE(4);
376
- this.data.SwVersion = swRevMain;
377
- if (swRevSup !== 0xFF) {
378
- this.data.SwVersion += swRevSup / 1000;
379
- }
380
- if (serial !== 0xFFFFFFFF) {
381
- this.data.SerialNumber = serial;
382
- }
383
- return this.data;
384
- }
385
- parseFECMessage(_data) {
386
- const data = Buffer.from(_data);
387
- this.logEvent({ message: 'FE-C message', data: data.toString('hex') });
388
- const c = data.readUInt8(0);
389
- if (c !== SYNC_BYTE) {
390
- this.logEvent({ message: 'SYNC missing', raw: data.toString('hex') });
391
- return;
392
- }
393
- const len = data.readUInt8(1);
394
- const messageId = data.readUInt8(4);
395
- let res;
396
- try {
397
- switch (messageId) {
398
- case ANTMessages.generalFE:
399
- res = this.parseGeneralFE(data.slice(4, len + 3));
400
- break;
401
- case ANTMessages.trainerData:
402
- res = this.parseTrainerData(data.slice(4, len + 3));
403
- break;
404
- case ANTMessages.productInformation:
405
- res = this.parseProductInformation(data.slice(4, len + 3));
406
- break;
407
- }
408
- if (res)
409
- res.raw = data.toString('hex');
410
- }
411
- catch (err) {
412
- this.logEvent({ message: 'error', fn: 'parseFECMessage()', error: err.message || err, stack: err.stack });
413
- }
414
- return res;
415
- }
416
- onData(characteristic, data) {
417
- const isDuplicate = this.checkForDuplicate(characteristic, data);
418
- if (isDuplicate)
419
- return;
420
- this.messageCnt++;
421
- try {
422
- const uuid = characteristic.toLocaleLowerCase();
423
- let res = undefined;
424
- if (uuid && (0, utils_1.matches)(uuid, this.tacxRx)) {
425
- res = this.parseFECMessage(data);
426
- }
427
- else {
428
- switch (uuid) {
429
- case consts_1.CSP_MEASUREMENT:
430
- res = this.parsePower(data, this.hasFECData);
431
- break;
432
- case consts_1.INDOOR_BIKE_DATA:
433
- res = this.parseIndoorBikeData(data, this.hasFECData);
434
- break;
435
- case '2a37':
436
- res = this.parseHrm(data);
437
- break;
438
- case consts_1.CSC_MEASUREMENT:
439
- res = this.parseCSC(data, this.hasFECData);
440
- break;
441
- case consts_1.FTMS_STATUS:
442
- if (!this.hasFECData)
443
- res = this.parseFitnessMachineStatus(data);
444
- break;
445
- default:
446
- break;
447
- }
448
- }
449
- if (res)
450
- this.emit('data', res);
451
- return res;
452
- }
453
- catch (err) {
454
- this.logEvent({ message: 'error', fn: 'tacx.onData()', error: err.message || err, stack: err.stack });
455
- }
456
- }
457
- getChecksum(message) {
458
- let checksum = 0;
459
- message.forEach((byte) => {
460
- checksum = (checksum ^ byte) % 0xFF;
461
- });
462
- return checksum;
463
- }
464
- buildMessage(payload = [], msgID = 0x00) {
465
- const m = [];
466
- m.push(SYNC_BYTE);
467
- m.push(payload.length);
468
- m.push(msgID);
469
- payload.forEach((byte) => {
470
- m.push(byte);
471
- });
472
- m.push(this.getChecksum(m));
473
- return Buffer.from(m);
474
- }
475
- sendMessage(message) {
476
- return __awaiter(this, void 0, void 0, function* () {
477
- this.logEvent({ message: 'write', characteristic: this.tacxTx, data: message.toString('hex') });
478
- yield this.write(this.tacxTx, message, { withoutResponse: true });
479
- return true;
480
- });
481
- }
482
- sendUserConfiguration(userWeight, bikeWeight, wheelDiameter, gearRatio) {
483
- return __awaiter(this, void 0, void 0, function* () {
484
- const logStr = `sendUserConfiguration(${userWeight},${bikeWeight},${wheelDiameter},${gearRatio})`;
485
- this.logEvent({ message: logStr });
486
- var m = userWeight === undefined ? 0xFFFF : userWeight;
487
- var mb = bikeWeight === undefined ? 0xFFF : bikeWeight;
488
- var d = wheelDiameter === undefined ? 0xFF : wheelDiameter;
489
- var gr = gearRatio === undefined ? 0x00 : gearRatio;
490
- var dOffset = 0xFF;
491
- if (m !== 0xFFFF)
492
- m = Math.trunc(m * 100);
493
- if (mb !== 0xFFF)
494
- mb = Math.trunc(mb * 20);
495
- if (d !== 0xFF) {
496
- d = d * 1000;
497
- dOffset = d % 10;
498
- d = Math.trunc(d / 10);
499
- }
500
- if (gr !== 0x00) {
501
- gr = Math.trunc(gr / 0.03);
502
- }
503
- var payload = [];
504
- payload.push(DEFAULT_CHANNEL);
505
- payload.push(0x37);
506
- payload.push(m & 0xFF);
507
- payload.push((m >> 8) & 0xFF);
508
- payload.push(0xFF);
509
- payload.push(((mb & 0xF) << 4) | (dOffset & 0xF));
510
- payload.push((mb >> 4) & 0xF);
511
- payload.push(d & 0xFF);
512
- payload.push(gr & 0xFF);
513
- const data = this.buildMessage(payload, ACKNOWLEDGED_DATA);
514
- return yield this.sendMessage(data);
515
- });
516
- }
517
- sendBasicResistance(resistance) {
518
- return __awaiter(this, void 0, void 0, function* () {
519
- const logStr = `sendBasicResistance(${resistance})`;
520
- this.logEvent({ message: logStr });
521
- var res = resistance === undefined ? 0 : resistance;
522
- res = res / 0.5;
523
- var payload = [];
524
- payload.push(DEFAULT_CHANNEL);
525
- payload.push(0x30);
526
- payload.push(0xFF);
527
- payload.push(0xFF);
528
- payload.push(0xFF);
529
- payload.push(0xFF);
530
- payload.push(0xFF);
531
- payload.push(0xFF);
532
- payload.push(res & 0xFF);
533
- const data = this.buildMessage(payload, ACKNOWLEDGED_DATA);
534
- return yield this.sendMessage(data);
535
- });
536
- }
537
- sendTargetPower(power) {
538
- return __awaiter(this, void 0, void 0, function* () {
539
- const logStr = `sendTargetPower(${power})`;
540
- this.logEvent({ message: logStr });
541
- var p = power === undefined ? 0x00 : power;
542
- p = p * 4;
543
- var payload = [];
544
- payload.push(DEFAULT_CHANNEL);
545
- payload.push(0x31);
546
- payload.push(0xFF);
547
- payload.push(0xFF);
548
- payload.push(0xFF);
549
- payload.push(0xFF);
550
- payload.push(0xFF);
551
- payload.push(p & 0xFF);
552
- payload.push((p >> 8) & 0xFF);
553
- const data = this.buildMessage(payload, ACKNOWLEDGED_DATA);
554
- return yield this.sendMessage(data);
555
- });
556
- }
557
- sendWindResistance(windCoeff, windSpeed, draftFactor) {
558
- return __awaiter(this, void 0, void 0, function* () {
559
- const logStr = `sendWindResistance(${windCoeff},${windSpeed},${draftFactor})`;
560
- this.logEvent({ message: logStr });
561
- var wc = windCoeff === undefined ? 0xFF : windCoeff;
562
- var ws = windSpeed === undefined ? 0xFF : windSpeed;
563
- var df = draftFactor === undefined ? 0xFF : draftFactor;
564
- if (wc !== 0xFF) {
565
- wc = Math.trunc(wc / 0.01);
566
- }
567
- if (ws !== 0xFF) {
568
- ws = Math.trunc(ws + 127);
569
- }
570
- if (df !== 0xFF) {
571
- df = Math.trunc(df / 0.01);
572
- }
573
- var payload = [];
574
- payload.push(DEFAULT_CHANNEL);
575
- payload.push(0x32);
576
- payload.push(0xFF);
577
- payload.push(0xFF);
578
- payload.push(0xFF);
579
- payload.push(0xFF);
580
- payload.push(wc & 0xFF);
581
- payload.push(ws & 0xFF);
582
- payload.push(df & 0xFF);
583
- const data = this.buildMessage(payload, ACKNOWLEDGED_DATA);
584
- return yield this.sendMessage(data);
585
- });
586
- }
587
- sendTrackResistance(slope, rrCoeff) {
588
- return __awaiter(this, void 0, void 0, function* () {
589
- const logStr = `sendTrackResistance(${slope},${rrCoeff})`;
590
- this.logEvent({ message: logStr });
591
- var s = slope === undefined ? 0xFFFF : slope;
592
- var rr = rrCoeff === undefined ? 0xFF : rrCoeff;
593
- if (s !== 0xFFFF) {
594
- s = Math.trunc((s + 200) / 0.01);
595
- }
596
- if (rr !== 0xFF) {
597
- rr = Math.trunc(rr / 0.00005);
598
- }
599
- var payload = [];
600
- payload.push(DEFAULT_CHANNEL);
601
- payload.push(0x33);
602
- payload.push(0xFF);
603
- payload.push(0xFF);
604
- payload.push(0xFF);
605
- payload.push(0xFF);
606
- payload.push(s & 0xFF);
607
- payload.push((s >> 8) & 0xFF);
608
- payload.push(rr & 0xFF);
609
- const data = this.buildMessage(payload, ACKNOWLEDGED_DATA);
610
- return yield this.sendMessage(data);
611
- });
612
- }
613
- setTargetPower(power) {
614
- return __awaiter(this, void 0, void 0, function* () {
615
- if (this.data.targetPower !== undefined && this.data.targetPower === power)
616
- return true;
617
- return yield this.sendTargetPower(power);
618
- });
619
- }
620
- setSlope(slope) {
621
- return __awaiter(this, void 0, void 0, function* () {
622
- return yield this.sendTrackResistance(slope, this.crr);
623
- });
624
- }
625
- reset() {
626
- this.data = {};
627
- }
628
- }
629
- TacxAdvancedFitnessMachineDevice.protocol = 'tacx';
630
- TacxAdvancedFitnessMachineDevice.services = [consts_1.TACX_FE_C_BLE];
631
- TacxAdvancedFitnessMachineDevice.characteristics = ['2acc', '2ad2', '2ad6', '2ad8', '2ad9', '2ada', consts_1.TACX_FE_C_RX, consts_1.TACX_FE_C_TX];
632
- TacxAdvancedFitnessMachineDevice.PROFILE = PROFILE_ID;
633
- TacxAdvancedFitnessMachineDevice.detectionPriority = 10;
634
- exports.default = TacxAdvancedFitnessMachineDevice;
@@ -1,64 +0,0 @@
1
- import { LegacyProfile } from "../../antv2/types";
2
- import { CrankData } from "../cp";
3
- import { IndoorBikeData } from "../fm";
4
- import BleFitnessMachineDevice from "../fm/comms";
5
- import { BleProtocol, BleWriteProps, IBlePeripheralConnector } from "../types";
6
- export declare const enum OpCode {
7
- unlock = 32,
8
- setResistanceMode = 64,
9
- setStandardMode = 65,
10
- setErgMode = 66,
11
- setSimMode = 67,
12
- setSimCRR = 68,
13
- setSimWindResistance = 69,
14
- setSimGrade = 70,
15
- setSimWindSpeed = 71,
16
- setWheelCircumference = 72
17
- }
18
- export default class BleWahooDevice extends BleFitnessMachineDevice {
19
- static protocol: BleProtocol;
20
- static services: string[];
21
- static characteristics: string[];
22
- static detectionPriority: number;
23
- prevCrankData: CrankData;
24
- currentCrankData: CrankData;
25
- timeOffset: number;
26
- tsPrevWrite: any;
27
- prevSlope: any;
28
- wahooCP: string;
29
- isSimMode: boolean;
30
- isRequestControlBusy: boolean;
31
- weight: number;
32
- simModeSettings: {
33
- weight: number;
34
- crr: number;
35
- cw: number;
36
- };
37
- constructor(props?: any);
38
- static isMatching(characteristics: string[]): boolean;
39
- init(): Promise<boolean>;
40
- setCharacteristicUUIDs(uuids: string[]): void;
41
- getProfile(): LegacyProfile;
42
- getProtocol(): BleProtocol;
43
- getServiceUUids(): string[];
44
- parseCrankData(crankData: any): {
45
- rpm: number;
46
- time: any;
47
- };
48
- parsePower(_data: Buffer): IndoorBikeData;
49
- onData(characteristic: string, data: Buffer): boolean;
50
- subscribeAll(conn?: IBlePeripheralConnector): Promise<void>;
51
- writeWahooFtmsMessage(requestedOpCode: number, data: Buffer, props?: BleWriteProps): Promise<boolean>;
52
- requestControl(): Promise<boolean>;
53
- setPowerAdjusting(): void;
54
- isPowerAdjusting(): boolean;
55
- setErgMode(power: number): Promise<boolean>;
56
- setSimMode(weight: number, crr: number, cw: number): Promise<boolean>;
57
- setSimCRR(crr: number): Promise<boolean>;
58
- setSimWindResistance(cw: number): Promise<boolean>;
59
- setSimGrade(slope: number): Promise<boolean>;
60
- setSimWindSpeed(v: number): Promise<boolean>;
61
- setTargetPower(power: number): Promise<boolean>;
62
- setSlope(slope: any): Promise<boolean>;
63
- reset(): void;
64
- }