incyclist-devices 1.4.77 → 1.4.79

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.
@@ -316,7 +316,7 @@ class BleDevice extends ble_1.BleDeviceClass {
316
316
  return;
317
317
  }
318
318
  if (withoutResponse) {
319
- this.logEvent({ message: 'writing' });
319
+ this.logEvent({ message: 'writing', data: data.toString('hex'), withoutResponse });
320
320
  characteristic.write(data, withoutResponse);
321
321
  resolve(new ArrayBuffer(0));
322
322
  return;
@@ -0,0 +1,7 @@
1
+ export declare const TACX_FE_C_BLE = "6e40fec1";
2
+ export declare const TACX_FE_C_RX = "6e40fec2";
3
+ export declare const TACX_FE_C_TX = "6e40fec3";
4
+ export declare const FTMS = "1826";
5
+ export declare const FTMS_CP = "2ad9";
6
+ export declare const FTMS_STATUS = "2ada";
7
+ export declare const INDOOR_BIKE_DATA = "2ad2";
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INDOOR_BIKE_DATA = exports.FTMS_STATUS = exports.FTMS_CP = exports.FTMS = exports.TACX_FE_C_TX = exports.TACX_FE_C_RX = exports.TACX_FE_C_BLE = void 0;
4
+ exports.TACX_FE_C_BLE = '6e40fec1';
5
+ exports.TACX_FE_C_RX = '6e40fec2';
6
+ exports.TACX_FE_C_TX = '6e40fec3';
7
+ exports.FTMS = '1826';
8
+ exports.FTMS_CP = '2ad9';
9
+ exports.FTMS_STATUS = '2ada';
10
+ exports.INDOOR_BIKE_DATA = '2ad2';
package/lib/ble/fm.d.ts CHANGED
@@ -8,9 +8,6 @@ import { DeviceProtocol } from '../DeviceProtocol';
8
8
  import { EventLogger } from 'gd-eventlog';
9
9
  import CyclingMode from '../CyclingMode';
10
10
  import { IncyclistBikeData } from '../CyclingMode';
11
- export declare const FTMS_CP = "2ad9";
12
- export declare const FTMS_STATUS = "2ada";
13
- export declare const INDOOR_BIKE_DATA = "2ad2";
14
11
  declare type PowerData = {
15
12
  instantaneousPower?: number;
16
13
  balance?: number;
package/lib/ble/fm.js CHANGED
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.FmAdapter = exports.INDOOR_BIKE_DATA = exports.FTMS_STATUS = exports.FTMS_CP = void 0;
15
+ exports.FmAdapter = void 0;
16
16
  const ble_device_1 = require("./ble-device");
17
17
  const ble_interface_1 = __importDefault(require("./ble-interface"));
18
18
  const Device_1 = __importDefault(require("../Device"));
@@ -20,9 +20,7 @@ const gd_eventlog_1 = require("gd-eventlog");
20
20
  const power_meter_1 = __importDefault(require("../modes/power-meter"));
21
21
  const ble_st_mode_1 = __importDefault(require("./ble-st-mode"));
22
22
  const ble_erg_mode_1 = __importDefault(require("./ble-erg-mode"));
23
- exports.FTMS_CP = '2ad9';
24
- exports.FTMS_STATUS = '2ada';
25
- exports.INDOOR_BIKE_DATA = '2ad2';
23
+ const consts_1 = require("./consts");
26
24
  const cwABike = {
27
25
  race: 0.35,
28
26
  triathlon: 0.29,
@@ -99,9 +97,10 @@ class BleFitnessMachineDevice extends ble_device_1.BleDevice {
99
97
  isMatching(characteristics) {
100
98
  if (!characteristics)
101
99
  return false;
102
- const hasStatus = characteristics.find(c => c === exports.FTMS_STATUS) !== undefined;
103
- const hasCP = characteristics.find(c => c === exports.FTMS_CP) !== undefined;
104
- const hasIndoorBike = characteristics.find(c => c === exports.INDOOR_BIKE_DATA) !== undefined;
100
+ const hasStatus = characteristics.find(c => c === consts_1.FTMS_STATUS) !== undefined;
101
+ const hasCP = characteristics.find(c => c === consts_1.FTMS_CP) !== undefined;
102
+ const hasIndoorBike = characteristics.find(c => c === consts_1.INDOOR_BIKE_DATA) !== undefined;
103
+ const hasTacx = characteristics.find(c => c === consts_1.TACX_FE_C_RX) !== undefined && characteristics.find(c => c === consts_1.TACX_FE_C_TX) !== undefined;
105
104
  return hasStatus && hasCP && hasIndoorBike;
106
105
  }
107
106
  subscribeWriteResponse(cuuid) {
@@ -131,7 +130,7 @@ class BleFitnessMachineDevice extends ble_device_1.BleDevice {
131
130
  });
132
131
  return __awaiter(this, void 0, void 0, function* () {
133
132
  try {
134
- yield this.subscribeWriteResponse(exports.FTMS_CP);
133
+ yield this.subscribeWriteResponse(consts_1.FTMS_CP);
135
134
  yield _super.initDevice.call(this);
136
135
  yield this.getFitnessMachineFeatures();
137
136
  this.logEvent({ message: 'device info', deviceInfo: this.deviceInfo, features: this.features });
@@ -310,13 +309,13 @@ class BleFitnessMachineDevice extends ble_device_1.BleDevice {
310
309
  const uuid = characteristic.toLocaleLowerCase();
311
310
  let res = undefined;
312
311
  switch (uuid) {
313
- case exports.INDOOR_BIKE_DATA:
312
+ case consts_1.INDOOR_BIKE_DATA:
314
313
  res = this.parseIndoorBikeData(data);
315
314
  break;
316
315
  case '2a37':
317
316
  res = this.parseHrm(data);
318
317
  break;
319
- case exports.FTMS_STATUS:
318
+ case consts_1.FTMS_STATUS:
320
319
  res = this.parseFitnessMachineStatus(data);
321
320
  break;
322
321
  case '2a63':
@@ -334,7 +333,7 @@ class BleFitnessMachineDevice extends ble_device_1.BleDevice {
334
333
  return __awaiter(this, void 0, void 0, function* () {
335
334
  try {
336
335
  this.logEvent({ message: 'fmts:write', data: data.toString('hex') });
337
- const res = yield this.write(exports.FTMS_CP, data);
336
+ const res = yield this.write(consts_1.FTMS_CP, data);
338
337
  const responseData = Buffer.from(res);
339
338
  const opCode = responseData.readUInt8(0);
340
339
  const request = responseData.readUInt8(1);
@@ -485,8 +484,8 @@ class BleFitnessMachineDevice extends ble_device_1.BleDevice {
485
484
  }
486
485
  }
487
486
  exports.default = BleFitnessMachineDevice;
488
- BleFitnessMachineDevice.services = ['1826'];
489
- BleFitnessMachineDevice.characteristics = ['2acc', exports.INDOOR_BIKE_DATA, '2ad6', '2ad8', exports.FTMS_CP, exports.FTMS_STATUS];
487
+ BleFitnessMachineDevice.services = [consts_1.FTMS];
488
+ BleFitnessMachineDevice.characteristics = ['2acc', consts_1.INDOOR_BIKE_DATA, '2ad6', '2ad8', consts_1.FTMS_CP, consts_1.FTMS_STATUS];
490
489
  ble_interface_1.default.register('BleFitnessMachineDevice', 'fm', BleFitnessMachineDevice, BleFitnessMachineDevice.services);
491
490
  class FmAdapter extends Device_1.default {
492
491
  constructor(device, protocol) {
package/lib/ble/tacx.d.ts CHANGED
@@ -24,6 +24,14 @@ declare type CrankData = {
24
24
  time?: number;
25
25
  cntUpdateMissing?: number;
26
26
  };
27
+ declare type MessageInfo = {
28
+ message: string;
29
+ ts: number;
30
+ uuid: string;
31
+ };
32
+ declare type MessageLog = {
33
+ [uuid: string]: MessageInfo;
34
+ };
27
35
  export default class TacxAdvancedFitnessMachineDevice extends BleFitnessMachineDevice {
28
36
  static services: string[];
29
37
  static characteristics: string[];
@@ -34,6 +42,8 @@ export default class TacxAdvancedFitnessMachineDevice extends BleFitnessMachineD
34
42
  tsPrevWrite: any;
35
43
  data: BleFeBikeData;
36
44
  hasFECData: boolean;
45
+ prevMessages: MessageLog;
46
+ messageCnt: number;
37
47
  constructor(props?: any);
38
48
  isMatching(characteristics: string[]): boolean;
39
49
  init(): Promise<boolean>;
@@ -44,6 +54,9 @@ export default class TacxAdvancedFitnessMachineDevice extends BleFitnessMachineD
44
54
  isHrm(): boolean;
45
55
  requestControl(): Promise<boolean>;
46
56
  parseCrankData(crankData: any): {
57
+ rpm?: undefined;
58
+ time?: undefined;
59
+ } | {
47
60
  rpm: number;
48
61
  time: any;
49
62
  };
package/lib/ble/tacx.js CHANGED
@@ -36,9 +36,7 @@ const ble_interface_1 = __importDefault(require("./ble-interface"));
36
36
  const Device_1 = require("../Device");
37
37
  const gd_eventlog_1 = require("gd-eventlog");
38
38
  const fm_1 = __importStar(require("./fm"));
39
- const TACX_FE_C_BLE = '6e40fec1';
40
- const TACX_FE_C_RX = '6e40fec2';
41
- const TACX_FE_C_TX = '6e40fec3';
39
+ const consts_1 = require("./consts");
42
40
  const SYNC_BYTE = 0xA4;
43
41
  const DEFAULT_CHANNEL = 5;
44
42
  const ACKNOWLEDGED_DATA = 0x4F;
@@ -76,13 +74,15 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
76
74
  this.tsPrevWrite = undefined;
77
75
  this.data = {};
78
76
  this.hasFECData = false;
77
+ this.messageCnt = 0;
78
+ this.prevMessages = {};
79
79
  }
80
80
  isMatching(characteristics) {
81
81
  if (!characteristics)
82
82
  return false;
83
- const hasTacxCP = characteristics.find(c => c === TACX_FE_C_RX) !== undefined && characteristics.find(c => c === TACX_FE_C_TX) !== undefined;
84
- const hasFTMS = characteristics.find(c => c === fm_1.FTMS_CP) !== undefined;
85
- return hasTacxCP && !hasFTMS;
83
+ const hasTacxCP = characteristics.find(c => c === consts_1.TACX_FE_C_RX) !== undefined && characteristics.find(c => c === consts_1.TACX_FE_C_TX) !== undefined;
84
+ const hasFTMS = characteristics.find(c => c === consts_1.FTMS_CP) !== undefined;
85
+ return hasTacxCP;
86
86
  }
87
87
  init() {
88
88
  const _super = Object.create(null, {
@@ -120,8 +120,10 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
120
120
  });
121
121
  }
122
122
  parseCrankData(crankData) {
123
- if (!this.prevCrankData)
124
- this.prevCrankData = { revolutions: 0, time: 0, cntUpdateMissing: -1 };
123
+ if (!this.prevCrankData) {
124
+ this.prevCrankData = Object.assign(Object.assign({}, crankData), { cntUpdateMissing: -1 });
125
+ return {};
126
+ }
125
127
  const c = this.currentCrankData = crankData;
126
128
  const p = this.prevCrankData;
127
129
  let rpm = this.data.cadence;
@@ -372,6 +374,8 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
372
374
  break;
373
375
  }
374
376
  this.parseFEState(flagStateBF);
377
+ if (power !== undefined && cadence !== undefined)
378
+ this.hasFECData = true;
375
379
  return this.data;
376
380
  }
377
381
  parseProductInformation(data) {
@@ -421,8 +425,18 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
421
425
  onData(characteristic, data) {
422
426
  try {
423
427
  const uuid = characteristic.toLocaleLowerCase();
428
+ const message = data.toString('hex');
429
+ const ts = Date.now();
430
+ if (this.prevMessages[uuid]) {
431
+ const prev = this.prevMessages[uuid];
432
+ if (prev.message === message && prev.ts > ts - 500) {
433
+ return;
434
+ }
435
+ }
436
+ this.prevMessages[uuid] = { uuid, ts, message };
437
+ this.messageCnt++;
424
438
  let res = undefined;
425
- if (uuid && uuid.startsWith(TACX_FE_C_RX)) {
439
+ if (uuid && uuid.startsWith(consts_1.TACX_FE_C_RX)) {
426
440
  res = this.parseFECMessage(data);
427
441
  }
428
442
  else {
@@ -439,7 +453,8 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
439
453
  res = this.parseHrm(data);
440
454
  break;
441
455
  case '2a5b':
442
- res = this.parseCSC(data);
456
+ if (!this.hasFECData)
457
+ res = this.parseCSC(data);
443
458
  break;
444
459
  case '2ada':
445
460
  if (!this.hasFECData)
@@ -477,7 +492,7 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
477
492
  }
478
493
  sendMessage(message) {
479
494
  return __awaiter(this, void 0, void 0, function* () {
480
- yield this.write(TACX_FE_C_TX, message, true);
495
+ yield this.write(consts_1.TACX_FE_C_TX, message, true);
481
496
  return true;
482
497
  });
483
498
  }
@@ -629,8 +644,8 @@ class TacxAdvancedFitnessMachineDevice extends fm_1.default {
629
644
  }
630
645
  }
631
646
  exports.default = TacxAdvancedFitnessMachineDevice;
632
- TacxAdvancedFitnessMachineDevice.services = [TACX_FE_C_BLE];
633
- TacxAdvancedFitnessMachineDevice.characteristics = ['2acc', '2ad2', '2ad6', '2ad8', '2ad9', '2ada', TACX_FE_C_RX, TACX_FE_C_TX];
647
+ TacxAdvancedFitnessMachineDevice.services = [consts_1.TACX_FE_C_BLE];
648
+ TacxAdvancedFitnessMachineDevice.characteristics = ['2acc', '2ad2', '2ad6', '2ad8', '2ad9', '2ada', consts_1.TACX_FE_C_RX, consts_1.TACX_FE_C_TX];
634
649
  TacxAdvancedFitnessMachineDevice.PROFILE = PROFILE_ID;
635
650
  ble_interface_1.default.register('TacxBleFEDevice', 'tacx-ble-fec', TacxAdvancedFitnessMachineDevice, TacxAdvancedFitnessMachineDevice.services);
636
651
  class TacxBleFEAdapter extends fm_1.FmAdapter {
@@ -36,6 +36,7 @@ const ble_interface_1 = __importDefault(require("./ble-interface"));
36
36
  const Device_1 = require("../Device");
37
37
  const gd_eventlog_1 = require("gd-eventlog");
38
38
  const fm_1 = __importStar(require("./fm"));
39
+ const consts_1 = require("./consts");
39
40
  const WAHOO_ADVANCED_FTMS = 'a026ee0b';
40
41
  const WAHOO_ADVANCED_TRAINER_CP = 'a026e005';
41
42
  const cwABike = {
@@ -59,7 +60,7 @@ class WahooAdvancedFitnessMachineDevice extends fm_1.default {
59
60
  if (!characteristics)
60
61
  return false;
61
62
  const hasWahooCP = characteristics.find(c => c === WAHOO_ADVANCED_TRAINER_CP) !== undefined;
62
- const hasFTMS = characteristics.find(c => c === fm_1.FTMS_CP) !== undefined;
63
+ const hasFTMS = characteristics.find(c => c === consts_1.FTMS_CP) !== undefined;
63
64
  return hasWahooCP && !hasFTMS;
64
65
  }
65
66
  init() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "1.4.77",
3
+ "version": "1.4.79",
4
4
  "dependencies": {
5
5
  "@serialport/parser-byte-length": "^9.0.1",
6
6
  "@serialport/parser-delimiter": "^9.0.1",