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.
- package/lib/ble/ble-device.js +1 -1
- package/lib/ble/consts.d.ts +7 -0
- package/lib/ble/consts.js +10 -0
- package/lib/ble/fm.d.ts +0 -3
- package/lib/ble/fm.js +12 -13
- package/lib/ble/tacx.d.ts +13 -0
- package/lib/ble/tacx.js +28 -13
- package/lib/ble/wahoo-kickr.js +2 -1
- package/package.json +1 -1
package/lib/ble/ble-device.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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 ===
|
|
103
|
-
const hasCP = characteristics.find(c => c ===
|
|
104
|
-
const hasIndoorBike = characteristics.find(c => c ===
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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 = [
|
|
489
|
-
BleFitnessMachineDevice.characteristics = ['2acc',
|
|
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
|
|
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 ===
|
|
85
|
-
return hasTacxCP
|
|
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 = {
|
|
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
|
-
|
|
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 {
|
package/lib/ble/wahoo-kickr.js
CHANGED
|
@@ -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 ===
|
|
63
|
+
const hasFTMS = characteristics.find(c => c === consts_1.FTMS_CP) !== undefined;
|
|
63
64
|
return hasWahooCP && !hasFTMS;
|
|
64
65
|
}
|
|
65
66
|
init() {
|