incyclist-devices 1.4.73 → 1.4.76

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.
@@ -368,7 +368,7 @@ class BleInterface extends ble_1.BleInterfaceClass {
368
368
  this.logEvent({ message: 'trying to create device', peripheral: peripheral.address, characteristics: cids, profile: device.getProfile() });
369
369
  const existingDevice = this.devices.find(i => i.device.id === device.id && i.device.getProfile() === device.getProfile());
370
370
  if (existingDevice)
371
- return existingDevice;
371
+ return existingDevice.device;
372
372
  device.setInterface(this);
373
373
  if (characteristics && device.isMatching(cids)) {
374
374
  device.characteristics = characteristics;
package/lib/ble/tacx.d.ts CHANGED
@@ -13,6 +13,11 @@ interface BleFeBikeData extends IndoorBikeData {
13
13
  AccumulatedPower?: number;
14
14
  TrainerStatus?: number;
15
15
  TargetStatus?: 'OnTarget' | 'LowSpeed' | 'HighSpeed';
16
+ HwVersion?: number;
17
+ ManId?: number;
18
+ ModelNum?: number;
19
+ SwVersion?: number;
20
+ SerialNumber?: number;
16
21
  }
17
22
  declare type CrankData = {
18
23
  revolutions?: number;
@@ -37,6 +42,7 @@ export default class TacxAdvancedFitnessMachineDevice extends BleFitnessMachineD
37
42
  isBike(): boolean;
38
43
  isPower(): boolean;
39
44
  isHrm(): boolean;
45
+ requestControl(): Promise<boolean>;
40
46
  parseCrankData(crankData: any): {
41
47
  rpm: number;
42
48
  time: any;
@@ -46,8 +52,9 @@ export default class TacxAdvancedFitnessMachineDevice extends BleFitnessMachineD
46
52
  parseFEState(capStateBF: number): void;
47
53
  parseGeneralFE(data: Buffer): BleFeBikeData;
48
54
  parseTrainerData(data: Buffer): BleFeBikeData;
55
+ parseProductInformation(data: Buffer): BleFeBikeData;
49
56
  parseFECMessage(_data: Buffer): BleFeBikeData;
50
- onData(characteristic: string, data: Buffer): void;
57
+ onData(characteristic: string, data: Buffer): any;
51
58
  getChecksum(message: any[]): number;
52
59
  buildMessage(payload?: number[], msgID?: number): Buffer;
53
60
  sendMessage(message: Buffer): Promise<boolean>;
package/lib/ble/tacx.js CHANGED
@@ -114,6 +114,11 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
114
114
  isHrm() {
115
115
  return this.hasService('180d');
116
116
  }
117
+ requestControl() {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ return true;
120
+ });
121
+ }
117
122
  parseCrankData(crankData) {
118
123
  if (!this.prevCrankData)
119
124
  this.prevCrankData = { revolutions: 0, time: 0, cntUpdateMissing: -1 };
@@ -346,8 +351,22 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
346
351
  this.parseFEState(flagStateBF);
347
352
  return this.data;
348
353
  }
354
+ parseProductInformation(data) {
355
+ const swRevSup = data.readUInt8(2);
356
+ const swRevMain = data.readUInt8(3);
357
+ const serial = data.readInt32LE(4);
358
+ this.data.SwVersion = swRevMain;
359
+ if (swRevSup !== 0xFF) {
360
+ this.data.SwVersion += swRevSup / 1000;
361
+ }
362
+ if (serial !== 0xFFFFFFFF) {
363
+ this.data.SerialNumber = serial;
364
+ }
365
+ return this.data;
366
+ }
349
367
  parseFECMessage(_data) {
350
368
  const data = Buffer.from(_data);
369
+ this.logEvent({ message: 'FE-C message', data: data.toString('hex') });
351
370
  const c = data.readUInt8(0);
352
371
  if (c !== SYNC_BYTE) {
353
372
  this.logEvent({ message: 'SYNC missing', raw: data.toString('hex') });
@@ -359,45 +378,54 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
359
378
  let res;
360
379
  switch (messageId) {
361
380
  case ANTMessages.generalFE:
362
- res = this.parseGeneralFE(data.slice(4, len + 2));
381
+ res = this.parseGeneralFE(data.slice(4, len + 3));
363
382
  break;
364
383
  case ANTMessages.trainerData:
365
- res = this.parseTrainerData(data.slice(4, len + 2));
384
+ res = this.parseTrainerData(data.slice(4, len + 3));
385
+ break;
386
+ case ANTMessages.productInformation:
387
+ res = this.parseProductInformation(data.slice(4, len + 3));
366
388
  break;
367
389
  }
368
390
  res.raw = data.toString('hex');
369
391
  return res;
370
392
  }
371
393
  onData(characteristic, data) {
372
- super.onData(characteristic, data);
373
- const uuid = characteristic.toLocaleLowerCase();
374
- let res = undefined;
375
- if (uuid && uuid.startsWith(TACX_FE_C_RX)) {
376
- res = this.parseFECMessage(data);
377
- }
378
- else {
379
- switch (uuid) {
380
- case '2a63':
381
- if (!this.hasFECData)
382
- res = this.parsePower(data);
383
- break;
384
- case '2ad2':
385
- if (!this.hasFECData)
386
- res = this.parseIndoorBikeData(data);
387
- break;
388
- case '2a37':
389
- res = this.parseHrm(data);
390
- break;
391
- case '2ada':
392
- if (!this.hasFECData)
393
- res = this.parseFitnessMachineStatus(data);
394
- break;
395
- default:
396
- break;
394
+ try {
395
+ super.onData(characteristic, data);
396
+ const uuid = characteristic.toLocaleLowerCase();
397
+ let res = undefined;
398
+ if (uuid && uuid.startsWith(TACX_FE_C_RX)) {
399
+ res = this.parseFECMessage(data);
400
+ }
401
+ else {
402
+ switch (uuid) {
403
+ case '2a63':
404
+ if (!this.hasFECData)
405
+ res = this.parsePower(data);
406
+ break;
407
+ case '2ad2':
408
+ if (!this.hasFECData)
409
+ res = this.parseIndoorBikeData(data);
410
+ break;
411
+ case '2a37':
412
+ res = this.parseHrm(data);
413
+ break;
414
+ case '2ada':
415
+ if (!this.hasFECData)
416
+ res = this.parseFitnessMachineStatus(data);
417
+ break;
418
+ default:
419
+ break;
420
+ }
397
421
  }
422
+ if (res)
423
+ this.emit('data', res);
424
+ return res;
425
+ }
426
+ catch (err) {
427
+ this.logEvent({ message: 'error', fn: 'tacx.onData()', error: err.message || err, stack: err.stack });
398
428
  }
399
- if (res)
400
- this.emit('data', res);
401
429
  }
402
430
  getChecksum(message) {
403
431
  let checksum = 0;
@@ -60,7 +60,7 @@ class WahooAdvancedFitnessMachineDevice extends fm_1.default {
60
60
  return false;
61
61
  const hasWahooCP = characteristics.find(c => c === WAHOO_ADVANCED_TRAINER_CP) !== undefined;
62
62
  const hasFTMS = characteristics.find(c => c === fm_1.FTMS_CP) !== undefined;
63
- return hasWahooCP;
63
+ return hasWahooCP && !hasFTMS;
64
64
  }
65
65
  init() {
66
66
  const _super = Object.create(null, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "1.4.73",
3
+ "version": "1.4.76",
4
4
  "dependencies": {
5
5
  "@serialport/parser-byte-length": "^9.0.1",
6
6
  "@serialport/parser-delimiter": "^9.0.1",