incyclist-devices 1.5.38 → 2.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.
- package/README.MD +238 -0
- package/lib/adapters.d.ts +7 -0
- package/lib/adapters.js +49 -0
- package/lib/antv2/adapter-factory.d.ts +21 -10
- package/lib/antv2/adapter-factory.js +51 -33
- package/lib/antv2/adapter.d.ts +65 -0
- package/lib/antv2/adapter.js +310 -0
- package/lib/antv2/ant-interface.d.ts +17 -11
- package/lib/antv2/ant-interface.js +41 -31
- package/lib/antv2/{ant-binding.d.ts → binding.d.ts} +1 -1
- package/lib/antv2/{ant-binding.js → binding.js} +1 -1
- package/lib/antv2/fe/adapter.d.ts +28 -0
- package/lib/antv2/{fe.js → fe/adapter.js} +106 -90
- package/lib/antv2/fe/index.d.ts +2 -0
- package/lib/antv2/fe/index.js +7 -0
- package/lib/antv2/hr/adapter.d.ts +15 -0
- package/lib/antv2/hr/adapter.js +76 -0
- package/lib/antv2/hr/index.d.ts +2 -0
- package/lib/antv2/hr/index.js +7 -0
- package/lib/antv2/index.d.ts +7 -0
- package/lib/antv2/index.js +20 -0
- package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +9 -0
- package/lib/{ant/antfe → antv2/modes}/ant-fe-adv-st-mode.js +1 -1
- package/lib/antv2/modes/ant-fe-erg-mode.d.ts +6 -0
- package/lib/{ant/antfe → antv2/modes}/ant-fe-erg-mode.js +1 -1
- package/lib/antv2/modes/ant-fe-st-mode.d.ts +5 -0
- package/lib/{ant/antfe → antv2/modes}/ant-fe-st-mode.js +1 -1
- package/lib/antv2/pwr/adapter.d.ts +24 -0
- package/lib/antv2/pwr/adapter.js +141 -0
- package/lib/antv2/pwr/index.d.ts +2 -0
- package/lib/antv2/pwr/index.js +7 -0
- package/lib/antv2/sensor-factory.d.ts +2 -2
- package/lib/antv2/types.d.ts +22 -0
- package/lib/antv2/types.js +5 -0
- package/lib/antv2/utils.d.ts +4 -0
- package/lib/antv2/utils.js +192 -0
- package/lib/base/adpater.d.ts +68 -0
- package/lib/base/adpater.js +183 -0
- package/lib/ble/adapter-factory.d.ts +33 -0
- package/lib/ble/adapter-factory.js +105 -0
- package/lib/ble/base/adapter.d.ts +53 -0
- package/lib/ble/base/adapter.js +290 -0
- package/lib/ble/base/comms-utils.d.ts +7 -0
- package/lib/ble/base/comms-utils.js +91 -0
- package/lib/ble/{ble-device.d.ts → base/comms.d.ts} +31 -16
- package/lib/ble/{ble-device.js → base/comms.js} +193 -55
- package/lib/ble/bindings/index.d.ts +2 -0
- package/lib/ble/bindings/index.js +8 -0
- package/lib/ble/bindings/linux.d.ts +15 -0
- package/lib/ble/bindings/linux.js +39 -0
- package/lib/ble/bindings/mock.d.ts +9 -0
- package/lib/ble/bindings/mock.js +108 -0
- package/lib/ble/bindings/types.d.ts +57 -0
- package/lib/ble/bindings/types.js +96 -0
- package/lib/ble/ble-interface.d.ts +38 -59
- package/lib/ble/ble-interface.js +254 -462
- package/lib/ble/ble-peripheral.d.ts +7 -5
- package/lib/ble/ble-peripheral.js +52 -21
- package/lib/ble/consts.d.ts +3 -0
- package/lib/ble/consts.js +4 -1
- package/lib/ble/cp/adapter.d.ts +22 -0
- package/lib/ble/cp/adapter.js +111 -0
- package/lib/ble/cp/comm.d.ts +31 -0
- package/lib/ble/cp/comm.js +125 -0
- package/lib/ble/cp/index.d.ts +4 -0
- package/lib/ble/cp/index.js +10 -0
- package/lib/ble/cp/types.d.ts +13 -0
- package/lib/ble/cp/types.js +2 -0
- package/lib/ble/elite/adapter.d.ts +19 -0
- package/lib/ble/elite/adapter.js +120 -0
- package/lib/ble/elite/comms.d.ts +32 -0
- package/lib/ble/elite/comms.js +126 -0
- package/lib/ble/elite/index.d.ts +3 -0
- package/lib/ble/elite/index.js +10 -0
- package/lib/ble/fm/adapter.d.ts +22 -0
- package/lib/ble/fm/adapter.js +249 -0
- package/lib/ble/fm/comms.d.ts +50 -0
- package/lib/ble/{fm.js → fm/comms.js} +34 -277
- package/lib/ble/fm/consts.d.ts +6 -0
- package/lib/ble/fm/consts.js +9 -0
- package/lib/ble/fm/index.d.ts +5 -0
- package/lib/ble/fm/index.js +13 -0
- package/lib/ble/fm/types.d.ts +30 -0
- package/lib/ble/fm/types.js +2 -0
- package/lib/ble/hr/adapter.d.ts +14 -0
- package/lib/ble/hr/adapter.js +45 -0
- package/lib/ble/hr/comm.d.ts +19 -0
- package/lib/ble/hr/comm.js +56 -0
- package/lib/ble/hr/index.d.ts +4 -0
- package/lib/ble/hr/index.js +10 -0
- package/lib/ble/hr/mock.d.ts +7 -0
- package/lib/ble/hr/mock.js +47 -0
- package/lib/ble/hr/types.d.ts +5 -0
- package/lib/ble/hr/types.js +2 -0
- package/lib/ble/index.d.ts +9 -0
- package/lib/ble/index.js +26 -0
- package/lib/ble/peripheral-cache.d.ts +43 -0
- package/lib/ble/peripheral-cache.js +107 -0
- package/lib/ble/tacx/adapter.d.ts +10 -0
- package/lib/ble/tacx/adapter.js +99 -0
- package/lib/ble/{tacx.d.ts → tacx/comms.d.ts} +11 -43
- package/lib/ble/{tacx.js → tacx/comms.js} +23 -155
- package/lib/ble/tacx/index.d.ts +4 -0
- package/lib/ble/tacx/index.js +10 -0
- package/lib/ble/tacx/types.d.ts +25 -0
- package/lib/ble/tacx/types.js +2 -0
- package/lib/ble/types.d.ts +128 -0
- package/lib/ble/types.js +2 -0
- package/lib/ble/utils.d.ts +17 -0
- package/lib/ble/utils.js +54 -0
- package/lib/ble/wahoo/adapter.d.ts +9 -0
- package/lib/ble/wahoo/adapter.js +95 -0
- package/lib/ble/{wahoo-kickr.d.ts → wahoo/comms.d.ts} +11 -44
- package/lib/ble/{wahoo-kickr.js → wahoo/comms.js} +29 -129
- package/lib/ble/wahoo/index.d.ts +4 -0
- package/lib/ble/wahoo/index.js +10 -0
- package/lib/ble/wahoo/types.d.ts +19 -0
- package/lib/ble/wahoo/types.js +2 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.js +34 -0
- package/lib/interfaces.d.ts +7 -0
- package/lib/interfaces.js +27 -0
- package/lib/{ble → modes}/ble-erg-mode.d.ts +4 -4
- package/lib/{ble → modes}/ble-erg-mode.js +2 -2
- package/lib/{ble → modes}/ble-st-mode.d.ts +3 -3
- package/lib/{ble → modes}/ble-st-mode.js +1 -1
- package/lib/{cycling-mode.d.ts → modes/cycling-mode.d.ts} +8 -8
- package/lib/modes/power-base.d.ts +3 -3
- package/lib/modes/power-base.js +8 -4
- package/lib/modes/power-meter.d.ts +3 -3
- package/lib/modes/simulator.d.ts +2 -2
- package/lib/modes/simulator.js +1 -1
- package/lib/serial/adapter-factory.d.ts +12 -0
- package/lib/serial/adapter-factory.js +30 -0
- package/lib/serial/adapter.d.ts +21 -0
- package/lib/serial/adapter.js +61 -0
- package/lib/serial/bindings/tcp.d.ts +45 -0
- package/lib/serial/bindings/tcp.js +284 -0
- package/lib/serial/comm.d.ts +7 -0
- package/lib/serial/comm.js +2 -0
- package/lib/{daum → serial/daum}/DaumAdapter.d.ts +14 -23
- package/lib/{daum → serial/daum}/DaumAdapter.js +57 -97
- package/lib/{daum → serial/daum}/DaumPowerMeterCyclingMode.d.ts +2 -2
- package/lib/{daum → serial/daum}/DaumPowerMeterCyclingMode.js +1 -1
- package/lib/{daum → serial/daum}/ERGCyclingMode.d.ts +3 -3
- package/lib/{daum → serial/daum}/ERGCyclingMode.js +3 -3
- package/lib/{daum → serial/daum}/SmartTrainerCyclingMode.d.ts +3 -3
- package/lib/{daum → serial/daum}/SmartTrainerCyclingMode.js +4 -3
- package/lib/serial/daum/classic/adapter.d.ts +29 -0
- package/lib/{daum/classic/DaumClassicAdapter.js → serial/daum/classic/adapter.js} +77 -50
- package/lib/{daum/classic/bike.d.ts → serial/daum/classic/comms.d.ts} +14 -16
- package/lib/{daum/classic/bike.js → serial/daum/classic/comms.js} +68 -152
- package/lib/serial/daum/classic/mock.d.ts +96 -0
- package/lib/serial/daum/classic/mock.js +365 -0
- package/lib/{daum/classic/DaumClassicCyclingMode.d.ts → serial/daum/classic/modes/daum-classic.d.ts} +3 -3
- package/lib/{daum/classic/DaumClassicCyclingMode.js → serial/daum/classic/modes/daum-classic.js} +2 -2
- package/lib/{daum → serial/daum}/classic/utils.d.ts +1 -1
- package/lib/serial/daum/premium/adapter.d.ts +25 -0
- package/lib/{daum/premium/DaumPremiumAdapter.js → serial/daum/premium/adapter.js} +107 -47
- package/lib/{daum/premium/bike.d.ts → serial/daum/premium/comms.d.ts} +26 -54
- package/lib/{daum/premium/bike.js → serial/daum/premium/comms.js} +215 -420
- package/lib/serial/daum/premium/mock.d.ts +75 -0
- package/lib/serial/daum/premium/mock.js +289 -0
- package/lib/{daum/premium/DaumClassicCyclingMode.d.ts → serial/daum/premium/modes/daum-classic.d.ts} +3 -3
- package/lib/{daum/premium/DaumClassicCyclingMode.js → serial/daum/premium/modes/daum-classic.js} +2 -2
- package/lib/serial/daum/premium/types.d.ts +12 -0
- package/lib/serial/daum/premium/types.js +2 -0
- package/lib/{daum → serial/daum}/premium/utils.d.ts +8 -11
- package/lib/{daum → serial/daum}/premium/utils.js +22 -63
- package/lib/serial/index.d.ts +9 -0
- package/lib/serial/index.js +49 -0
- package/lib/{kettler → serial/kettler}/comms.d.ts +8 -6
- package/lib/{kettler → serial/kettler}/comms.js +71 -32
- package/lib/{kettler → serial/kettler}/ergo-racer/adapter.d.ts +14 -28
- package/lib/{kettler → serial/kettler}/ergo-racer/adapter.js +102 -169
- package/lib/serial/kettler/ergo-racer/mock.d.ts +66 -0
- package/lib/serial/kettler/ergo-racer/mock.js +216 -0
- package/lib/{kettler/ergo-racer/ERGCyclingMode.d.ts → serial/kettler/ergo-racer/modes/erg.d.ts} +4 -4
- package/lib/{kettler/ergo-racer/ERGCyclingMode.js → serial/kettler/ergo-racer/modes/erg.js} +2 -2
- package/lib/serial/serial-interface.d.ts +60 -0
- package/lib/serial/serial-interface.js +309 -0
- package/lib/simulator/Simulator.d.ts +12 -25
- package/lib/simulator/Simulator.js +26 -87
- package/lib/types/adapter.d.ts +39 -0
- package/lib/types/adapter.js +2 -0
- package/lib/types/capabilities.d.ts +8 -0
- package/lib/types/capabilities.js +12 -0
- package/lib/types/data.d.ts +12 -0
- package/lib/types/data.js +2 -0
- package/lib/types/device.d.ts +32 -0
- package/lib/types/device.js +11 -0
- package/lib/types/interface.d.ts +18 -0
- package/lib/types/interface.js +2 -0
- package/lib/types/route.d.ts +2 -2
- package/lib/types/user.d.ts +1 -1
- package/lib/{utils.d.ts → utils/utils.d.ts} +1 -0
- package/lib/{utils.js → utils/utils.js} +5 -1
- package/package.json +16 -14
- package/lib/DeviceSupport.d.ts +0 -36
- package/lib/DeviceSupport.js +0 -82
- package/lib/ant/AntAdapter.d.ts +0 -50
- package/lib/ant/AntAdapter.js +0 -109
- package/lib/ant/AntScanner.d.ts +0 -60
- package/lib/ant/AntScanner.js +0 -651
- package/lib/ant/antfe/AntFEAdapter.d.ts +0 -83
- package/lib/ant/antfe/AntFEAdapter.js +0 -652
- package/lib/ant/antfe/ant-fe-adv-st-mode.d.ts +0 -9
- package/lib/ant/antfe/ant-fe-erg-mode.d.ts +0 -6
- package/lib/ant/antfe/ant-fe-st-mode.d.ts +0 -5
- package/lib/ant/anthrm/AntHrmAdapter.d.ts +0 -16
- package/lib/ant/anthrm/AntHrmAdapter.js +0 -130
- package/lib/ant/antpwr/pwr-adapter.d.ts +0 -49
- package/lib/ant/antpwr/pwr-adapter.js +0 -251
- package/lib/ant/utils.d.ts +0 -1
- package/lib/ant/utils.js +0 -23
- package/lib/antv2/AntAdapter.d.ts +0 -48
- package/lib/antv2/AntAdapter.js +0 -104
- package/lib/antv2/ant-device.d.ts +0 -59
- package/lib/antv2/ant-device.js +0 -161
- package/lib/antv2/fe.d.ts +0 -32
- package/lib/antv2/hr.d.ts +0 -18
- package/lib/antv2/hr.js +0 -102
- package/lib/antv2/incyclist-protocol.d.ts +0 -37
- package/lib/antv2/incyclist-protocol.js +0 -126
- package/lib/antv2/pwr.d.ts +0 -28
- package/lib/antv2/pwr.js +0 -171
- package/lib/ble/ble.d.ts +0 -129
- package/lib/ble/ble.js +0 -86
- package/lib/ble/elite.d.ts +0 -90
- package/lib/ble/elite.js +0 -322
- package/lib/ble/fm.d.ts +0 -125
- package/lib/ble/hrm.d.ts +0 -48
- package/lib/ble/hrm.js +0 -134
- package/lib/ble/incyclist-protocol.d.ts +0 -31
- package/lib/ble/incyclist-protocol.js +0 -153
- package/lib/ble/pwr.d.ts +0 -89
- package/lib/ble/pwr.js +0 -322
- package/lib/daum/classic/DaumClassicAdapter.d.ts +0 -28
- package/lib/daum/classic/DaumClassicProtocol.d.ts +0 -27
- package/lib/daum/classic/DaumClassicProtocol.js +0 -185
- package/lib/daum/premium/DaumPremiumAdapter.d.ts +0 -16
- package/lib/daum/premium/DaumPremiumProtocol.d.ts +0 -32
- package/lib/daum/premium/DaumPremiumProtocol.js +0 -207
- package/lib/daum/premium/tcpserial.d.ts +0 -33
- package/lib/daum/premium/tcpserial.js +0 -123
- package/lib/device.d.ts +0 -94
- package/lib/device.js +0 -76
- package/lib/kettler/ergo-racer/protocol.d.ts +0 -41
- package/lib/kettler/ergo-racer/protocol.js +0 -203
- package/lib/protocol.d.ts +0 -74
- package/lib/protocol.js +0 -41
- package/lib/registry.d.ts +0 -8
- package/lib/registry.js +0 -33
- package/lib/serialport/bindings/tcp.d.ts +0 -20
- package/lib/serialport/bindings/tcp.js +0 -33
- package/lib/serialport/index.d.ts +0 -2
- package/lib/serialport/index.js +0 -29
- package/lib/serialport/serialport.d.ts +0 -29
- package/lib/serialport/serialport.js +0 -87
- /package/lib/{cycling-mode.js → modes/cycling-mode.js} +0 -0
- /package/lib/{daum → serial/daum}/classic/utils.js +0 -0
- /package/lib/{daum → serial/daum}/constants.d.ts +0 -0
- /package/lib/{daum → serial/daum}/constants.js +0 -0
- /package/lib/{serialport.d.ts → serial/serialport.d.ts} +0 -0
- /package/lib/{serialport.js → serial/serialport.js} +0 -0
- /package/lib/{calculations.d.ts → utils/calculations.d.ts} +0 -0
- /package/lib/{calculations.js → utils/calculations.js} +0 -0
|
@@ -0,0 +1,310 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.ControllableAntAdapter = exports.DEFAULT_UPDATE_FREQUENCY = void 0;
|
|
39
|
+
const ant_interface_1 = __importDefault(require("./ant-interface"));
|
|
40
|
+
const adpater_1 = __importStar(require("../base/adpater"));
|
|
41
|
+
const types_1 = require("./types");
|
|
42
|
+
const utils_1 = require("../utils/utils");
|
|
43
|
+
const capabilities_1 = require("../types/capabilities");
|
|
44
|
+
const adpater_2 = require("../base/adpater");
|
|
45
|
+
const utils_2 = require("./utils");
|
|
46
|
+
exports.DEFAULT_UPDATE_FREQUENCY = 1000;
|
|
47
|
+
const NO_DATA_TIMEOUT = 5000;
|
|
48
|
+
const INTERFACE_NAME = 'ant';
|
|
49
|
+
class AntAdapter extends adpater_1.default {
|
|
50
|
+
constructor(settings, props) {
|
|
51
|
+
super(settings, props);
|
|
52
|
+
this.startupRetryPause = 1000;
|
|
53
|
+
const antSettings = this.settings;
|
|
54
|
+
if ((0, types_1.isLegacyProfile)(antSettings.profile))
|
|
55
|
+
antSettings.profile = (0, utils_2.mapLegacyProfile)(antSettings.profile);
|
|
56
|
+
if (this.settings.interface !== 'ant')
|
|
57
|
+
throw new Error('Incorrect interface');
|
|
58
|
+
this.sensor = this.createSensor(settings);
|
|
59
|
+
this.deviceData = {};
|
|
60
|
+
this.data = {};
|
|
61
|
+
this.dataMsgCount = 0;
|
|
62
|
+
this.updateFrequency = exports.DEFAULT_UPDATE_FREQUENCY;
|
|
63
|
+
this.channel = undefined;
|
|
64
|
+
this.ant = ant_interface_1.default.getInstance();
|
|
65
|
+
}
|
|
66
|
+
createSensor(settings) {
|
|
67
|
+
throw new Error('Method not implemented.');
|
|
68
|
+
}
|
|
69
|
+
isEqual(settings) {
|
|
70
|
+
const as = this.settings;
|
|
71
|
+
if (as.interface !== settings.interface)
|
|
72
|
+
return false;
|
|
73
|
+
if (as.deviceID !== settings.deviceID || as.profile !== settings.profile)
|
|
74
|
+
return false;
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
connect() {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
const connected = yield ant_interface_1.default.getInstance().connect();
|
|
80
|
+
return connected;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
close() {
|
|
84
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
return true;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
resetData() {
|
|
89
|
+
this.dataMsgCount = 0;
|
|
90
|
+
const { DeviceID } = this.deviceData;
|
|
91
|
+
this.deviceData = { DeviceID };
|
|
92
|
+
this.lastDataTS = undefined;
|
|
93
|
+
}
|
|
94
|
+
isSame(device) {
|
|
95
|
+
if (!(device instanceof AntAdapter))
|
|
96
|
+
return false;
|
|
97
|
+
const adapter = device;
|
|
98
|
+
return (adapter.getID() === this.getID() && adapter.getProfile() === this.getProfile());
|
|
99
|
+
}
|
|
100
|
+
hasData() {
|
|
101
|
+
return this.dataMsgCount > 0;
|
|
102
|
+
}
|
|
103
|
+
onDeviceData(deviceData) {
|
|
104
|
+
const { ManId } = this.deviceData;
|
|
105
|
+
this.deviceData = Object.assign({}, deviceData);
|
|
106
|
+
if (!ManId && deviceData.ManId) {
|
|
107
|
+
this.emit('device-info', { device: this.getSettings(), manufacturer: (0, utils_2.getBrand)(deviceData.ManId) });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
waitForData(timeout) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
const startTs = Date.now();
|
|
113
|
+
const timeoutTs = startTs + timeout;
|
|
114
|
+
if (this.hasData())
|
|
115
|
+
return true;
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
if (this.ivWaitForData)
|
|
118
|
+
return reject(new Error('busy'));
|
|
119
|
+
this.ivWaitForData = setInterval(() => {
|
|
120
|
+
const nowTs = Date.now();
|
|
121
|
+
const hasData = this.hasData();
|
|
122
|
+
if (nowTs > timeoutTs && !hasData) {
|
|
123
|
+
clearInterval(this.ivWaitForData);
|
|
124
|
+
this.ivWaitForData = undefined;
|
|
125
|
+
reject(new Error('No Data Received'));
|
|
126
|
+
}
|
|
127
|
+
if (hasData) {
|
|
128
|
+
clearInterval(this.ivWaitForData);
|
|
129
|
+
this.ivWaitForData = undefined;
|
|
130
|
+
resolve(true);
|
|
131
|
+
}
|
|
132
|
+
}, 500);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
getID() {
|
|
137
|
+
return this.sensor.getDeviceID().toString();
|
|
138
|
+
}
|
|
139
|
+
getName() {
|
|
140
|
+
const deviceID = this.sensor.getDeviceID();
|
|
141
|
+
const profile = this.sensor.getProfile();
|
|
142
|
+
return `Ant+${profile} ${deviceID}`;
|
|
143
|
+
}
|
|
144
|
+
getInterface() {
|
|
145
|
+
return INTERFACE_NAME;
|
|
146
|
+
}
|
|
147
|
+
getProfile() {
|
|
148
|
+
const settings = this.settings;
|
|
149
|
+
if (settings.protocol === undefined)
|
|
150
|
+
return settings.profile;
|
|
151
|
+
else {
|
|
152
|
+
return (0, utils_2.mapLegacyProfile)(settings.profile);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
startDataTimeoutCheck() {
|
|
156
|
+
if (this.ivDataTimeout)
|
|
157
|
+
return;
|
|
158
|
+
this.ivDataTimeout = setInterval(() => {
|
|
159
|
+
if (!this.lastDataTS)
|
|
160
|
+
return;
|
|
161
|
+
if (this.lastDataTS + NO_DATA_TIMEOUT < Date.now()) {
|
|
162
|
+
this.emit('disconnected', Date.now() - this.lastDataTS);
|
|
163
|
+
}
|
|
164
|
+
}, 1000);
|
|
165
|
+
}
|
|
166
|
+
stopDataTimeoutCheck() {
|
|
167
|
+
if (!this.ivDataTimeout)
|
|
168
|
+
return;
|
|
169
|
+
clearInterval(this.ivDataTimeout);
|
|
170
|
+
this.ivDataTimeout = undefined;
|
|
171
|
+
this.lastDataTS = undefined;
|
|
172
|
+
this.dataMsgCount = 0;
|
|
173
|
+
}
|
|
174
|
+
check() {
|
|
175
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
176
|
+
try {
|
|
177
|
+
return yield this.start();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
checkCapabilities() {
|
|
185
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
return;
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
initControl() {
|
|
190
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
return;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
start(props = {}) {
|
|
195
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
+
if (this.started)
|
|
197
|
+
return true;
|
|
198
|
+
const connected = yield this.connect();
|
|
199
|
+
if (!connected)
|
|
200
|
+
throw new Error(`could not start device, reason:could not connect`);
|
|
201
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
202
|
+
this.resetData();
|
|
203
|
+
this.stopped = false;
|
|
204
|
+
const { startupTimeout = 20000 } = props;
|
|
205
|
+
let to = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
|
206
|
+
try {
|
|
207
|
+
yield this.stop();
|
|
208
|
+
}
|
|
209
|
+
catch (_a) { }
|
|
210
|
+
this.started = false;
|
|
211
|
+
reject(new Error(`could not start device, reason:timeout`));
|
|
212
|
+
}), startupTimeout);
|
|
213
|
+
let started = false;
|
|
214
|
+
do {
|
|
215
|
+
started = yield this.ant.startSensor(this.sensor, (data) => {
|
|
216
|
+
this.onDeviceData(data);
|
|
217
|
+
});
|
|
218
|
+
if (!started)
|
|
219
|
+
yield (0, utils_1.sleep)(this.startupRetryPause);
|
|
220
|
+
} while (!started);
|
|
221
|
+
try {
|
|
222
|
+
yield this.waitForData(startupTimeout - 100);
|
|
223
|
+
yield this.checkCapabilities();
|
|
224
|
+
if (this.hasCapability(capabilities_1.IncyclistCapability.Control))
|
|
225
|
+
yield this.initControl();
|
|
226
|
+
this.started = true;
|
|
227
|
+
if (to)
|
|
228
|
+
clearTimeout(to);
|
|
229
|
+
resolve(true);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
}
|
|
233
|
+
}));
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
stop() {
|
|
237
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
+
this.stopDataTimeoutCheck();
|
|
239
|
+
let stopped = yield this.ant.stopSensor(this.sensor);
|
|
240
|
+
if (!stopped)
|
|
241
|
+
return false;
|
|
242
|
+
this.started = false;
|
|
243
|
+
this.stopped = true;
|
|
244
|
+
this.removeAllListeners();
|
|
245
|
+
return true;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.default = AntAdapter;
|
|
250
|
+
class ControllableAntAdapter extends AntAdapter {
|
|
251
|
+
constructor(settings, props) {
|
|
252
|
+
super(settings, props);
|
|
253
|
+
this.cyclingMode = this.getDefaultCyclingMode();
|
|
254
|
+
this.user = {};
|
|
255
|
+
}
|
|
256
|
+
isControllable() {
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
setUser(user) {
|
|
260
|
+
this.user = user;
|
|
261
|
+
if (!user.weight)
|
|
262
|
+
this.user.weight = adpater_2.DEFAULT_USER_WEIGHT;
|
|
263
|
+
}
|
|
264
|
+
setBikeProps(props) {
|
|
265
|
+
const { user, userWeight } = props || {};
|
|
266
|
+
if (user)
|
|
267
|
+
this.setUser(user);
|
|
268
|
+
if (userWeight)
|
|
269
|
+
this.user.weight = userWeight;
|
|
270
|
+
const keys = Object.keys(props);
|
|
271
|
+
keys.forEach(k => {
|
|
272
|
+
const p = props[k];
|
|
273
|
+
if (p === null)
|
|
274
|
+
delete this.props[k];
|
|
275
|
+
else if (p !== undefined)
|
|
276
|
+
this.props[k] = p;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
getWeight() {
|
|
280
|
+
const { user = {}, props = adpater_2.DEFAULT_PROPS } = this;
|
|
281
|
+
const userWeight = user.weight || props.userWeight || adpater_2.DEFAULT_USER_WEIGHT;
|
|
282
|
+
const bikeWeight = props.bikeWeight || adpater_1.DEFAULT_BIKE_WEIGHT;
|
|
283
|
+
return userWeight + bikeWeight;
|
|
284
|
+
}
|
|
285
|
+
getSupportedCyclingModes() { throw new Error('not implemented'); }
|
|
286
|
+
getDefaultCyclingMode() { throw new Error('not implemented'); }
|
|
287
|
+
setCyclingMode(mode, settings) {
|
|
288
|
+
let selectedMode;
|
|
289
|
+
if (typeof mode === 'string') {
|
|
290
|
+
const supported = this.getSupportedCyclingModes();
|
|
291
|
+
const CyclingModeClass = supported.find(M => { const m = new M(this); return m.getName() === mode; });
|
|
292
|
+
if (CyclingModeClass) {
|
|
293
|
+
this.cyclingMode = new CyclingModeClass(this, settings);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
selectedMode = this.getDefaultCyclingMode();
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
selectedMode = mode;
|
|
300
|
+
}
|
|
301
|
+
this.cyclingMode = selectedMode;
|
|
302
|
+
this.cyclingMode.setSettings(settings);
|
|
303
|
+
}
|
|
304
|
+
getCyclingMode() {
|
|
305
|
+
if (!this.cyclingMode)
|
|
306
|
+
this.setCyclingMode(this.getDefaultCyclingMode());
|
|
307
|
+
return this.cyclingMode;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
exports.ControllableAntAdapter = ControllableAntAdapter;
|
|
@@ -2,34 +2,40 @@
|
|
|
2
2
|
import EventEmitter from "events";
|
|
3
3
|
import { EventLogger } from "gd-eventlog";
|
|
4
4
|
import { IAntDevice, IChannel, ISensor } from "incyclist-ant-plus";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
import { InterfaceProps } from "../types/interface";
|
|
6
|
+
import AntDeviceBinding from "./binding";
|
|
7
|
+
import { IncyclistInterface } from "../types/interface";
|
|
8
|
+
import { AntDeviceSettings, AntScanProps } from "./types";
|
|
9
|
+
export interface AntInterfaceProps extends InterfaceProps {
|
|
10
10
|
startupTimeout?: number;
|
|
11
|
-
}
|
|
12
|
-
export
|
|
11
|
+
}
|
|
12
|
+
export interface ConnectState {
|
|
13
|
+
connected: boolean;
|
|
14
|
+
connecting: boolean;
|
|
15
|
+
}
|
|
16
|
+
export default class AntInterface extends EventEmitter implements IncyclistInterface {
|
|
13
17
|
static _instance: AntInterface;
|
|
18
|
+
static INTERFACE_NAME: string;
|
|
14
19
|
static getInstance(props?: AntInterfaceProps): AntInterface;
|
|
15
20
|
static hasInstance(): boolean;
|
|
16
21
|
protected logger: EventLogger;
|
|
17
22
|
protected device: IAntDevice;
|
|
18
23
|
protected Binding: typeof AntDeviceBinding;
|
|
19
|
-
protected
|
|
20
|
-
protected isConnecting: boolean;
|
|
24
|
+
protected connectState: ConnectState;
|
|
21
25
|
protected props: AntInterfaceProps;
|
|
22
26
|
protected activeScan: IChannel;
|
|
23
27
|
constructor(props: AntInterfaceProps);
|
|
28
|
+
getName(): string;
|
|
24
29
|
getBinding(): typeof AntDeviceBinding;
|
|
25
30
|
setBinding(binding: typeof AntDeviceBinding): void;
|
|
26
31
|
setLogger(logger: EventLogger): void;
|
|
27
32
|
logEvent(event: any): void;
|
|
28
|
-
|
|
33
|
+
isConnected(): boolean;
|
|
34
|
+
connect(): Promise<boolean>;
|
|
29
35
|
disconnect(): Promise<boolean>;
|
|
30
36
|
onError(profile: any, error: any): void;
|
|
31
37
|
onData(profile: any, id: any, data: any, tag: any): void;
|
|
32
|
-
scan(props?:
|
|
38
|
+
scan(props?: AntScanProps): Promise<AntDeviceSettings[]>;
|
|
33
39
|
stopScan(): Promise<boolean>;
|
|
34
40
|
startSensor(sensor: ISensor, onDeviceData: (data: any) => void): Promise<boolean>;
|
|
35
41
|
stopSensor(sensor: ISensor): Promise<boolean>;
|
|
@@ -16,12 +16,22 @@ const events_1 = __importDefault(require("events"));
|
|
|
16
16
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
17
17
|
const sensor_factory_1 = __importDefault(require("./sensor-factory"));
|
|
18
18
|
class AntInterface extends events_1.default {
|
|
19
|
+
static getInstance(props = {}) {
|
|
20
|
+
if (AntInterface._instance === undefined)
|
|
21
|
+
AntInterface._instance = new AntInterface(props);
|
|
22
|
+
return AntInterface._instance;
|
|
23
|
+
}
|
|
24
|
+
static hasInstance() {
|
|
25
|
+
return AntInterface._instance !== undefined;
|
|
26
|
+
}
|
|
19
27
|
constructor(props) {
|
|
20
28
|
super();
|
|
21
29
|
this.props = props;
|
|
22
30
|
this.device = undefined;
|
|
23
|
-
this.
|
|
24
|
-
|
|
31
|
+
this.connectState = {
|
|
32
|
+
connected: false,
|
|
33
|
+
connecting: false
|
|
34
|
+
};
|
|
25
35
|
const { binding, logger } = props;
|
|
26
36
|
if (logger)
|
|
27
37
|
this.logger = logger;
|
|
@@ -32,13 +42,8 @@ class AntInterface extends events_1.default {
|
|
|
32
42
|
this.Binding = binding;
|
|
33
43
|
}
|
|
34
44
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
AntInterface._instance = new AntInterface(props);
|
|
38
|
-
return AntInterface._instance;
|
|
39
|
-
}
|
|
40
|
-
static hasInstance() {
|
|
41
|
-
return AntInterface._instance !== undefined;
|
|
45
|
+
getName() {
|
|
46
|
+
return AntInterface.INTERFACE_NAME;
|
|
42
47
|
}
|
|
43
48
|
getBinding() {
|
|
44
49
|
return this.Binding;
|
|
@@ -53,38 +58,42 @@ class AntInterface extends events_1.default {
|
|
|
53
58
|
if (this.logger)
|
|
54
59
|
this.logger.logEvent(event);
|
|
55
60
|
}
|
|
61
|
+
isConnected() {
|
|
62
|
+
return this.connectState.connected;
|
|
63
|
+
}
|
|
56
64
|
connect() {
|
|
57
65
|
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
if (this.isConnected)
|
|
66
|
+
if (this.isConnected())
|
|
59
67
|
return true;
|
|
60
|
-
if (!this.
|
|
61
|
-
this.
|
|
68
|
+
if (!this.connectState.connecting) {
|
|
69
|
+
this.connectState.connecting = true;
|
|
62
70
|
this.logEvent({ message: 'ANT+ connecting ...' });
|
|
63
71
|
try {
|
|
64
72
|
const device = new this.Binding(Object.assign(Object.assign({}, this.props), { logger: this.logger }));
|
|
65
73
|
const opened = yield device.open();
|
|
66
74
|
if (!opened) {
|
|
67
75
|
this.logEvent({ message: 'ANT+ not connected' });
|
|
68
|
-
this.
|
|
76
|
+
this.connectState.connecting = false;
|
|
69
77
|
return false;
|
|
70
78
|
}
|
|
71
79
|
this.device = device;
|
|
72
|
-
this.
|
|
73
|
-
this.
|
|
80
|
+
this.connectState.connected = true;
|
|
81
|
+
this.connectState.connecting = false;
|
|
74
82
|
this.logEvent({ message: 'ANT+ connected' });
|
|
75
83
|
return true;
|
|
76
84
|
}
|
|
77
85
|
catch (err) {
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
86
|
+
this.logEvent({ message: 'error', fn: 'connect', error: err.message, stack: err.stack });
|
|
87
|
+
this.connectState.connected = false;
|
|
88
|
+
this.connectState.connecting = false;
|
|
80
89
|
return false;
|
|
81
90
|
}
|
|
82
91
|
}
|
|
83
92
|
else {
|
|
84
93
|
return new Promise(resolve => {
|
|
85
94
|
setInterval(() => {
|
|
86
|
-
if (!this.
|
|
87
|
-
resolve(this.
|
|
95
|
+
if (!this.connectState.connecting)
|
|
96
|
+
resolve(this.connectState.connected);
|
|
88
97
|
}, 500);
|
|
89
98
|
});
|
|
90
99
|
}
|
|
@@ -94,10 +103,10 @@ class AntInterface extends events_1.default {
|
|
|
94
103
|
return __awaiter(this, void 0, void 0, function* () {
|
|
95
104
|
if (!this.device)
|
|
96
105
|
return true;
|
|
97
|
-
this.logEvent({ message: 'disconnecting ...' });
|
|
106
|
+
this.logEvent({ message: 'ANT+ disconnecting ...' });
|
|
98
107
|
const closed = yield this.device.close();
|
|
99
|
-
this.
|
|
100
|
-
this.logEvent({ message: 'disconnected' });
|
|
108
|
+
this.connectState.connected = !closed;
|
|
109
|
+
this.logEvent({ message: 'ANT+ disconnected' });
|
|
101
110
|
return closed;
|
|
102
111
|
});
|
|
103
112
|
}
|
|
@@ -111,16 +120,11 @@ class AntInterface extends events_1.default {
|
|
|
111
120
|
return __awaiter(this, void 0, void 0, function* () {
|
|
112
121
|
this.logEvent({ message: 'starting scan ..' });
|
|
113
122
|
const detected = [];
|
|
114
|
-
if (!this.isConnected) {
|
|
115
|
-
const connected = yield this.connect();
|
|
116
|
-
if (!connected)
|
|
117
|
-
return [];
|
|
118
|
-
}
|
|
119
123
|
const onDetected = (profile, deviceID) => {
|
|
120
124
|
if (deviceID && detected.find(s => s.deviceID === deviceID && s.profile === profile) === undefined) {
|
|
121
125
|
try {
|
|
122
|
-
detected.push({ profile, deviceID });
|
|
123
|
-
this.emit('
|
|
126
|
+
detected.push({ interface: this.getName(), profile, deviceID });
|
|
127
|
+
this.emit('device', { interface: 'ant', profile, deviceID });
|
|
124
128
|
}
|
|
125
129
|
catch (err) {
|
|
126
130
|
this.logEvent({ message: 'error', fn: 'onDerected', error: err.message, stack: err.stack });
|
|
@@ -129,6 +133,11 @@ class AntInterface extends events_1.default {
|
|
|
129
133
|
};
|
|
130
134
|
let channel;
|
|
131
135
|
if (!this.activeScan) {
|
|
136
|
+
while (!this.isConnected()) {
|
|
137
|
+
const connected = yield this.connect();
|
|
138
|
+
if (!connected)
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
132
141
|
channel = this.device.getChannel();
|
|
133
142
|
channel.setProps({ logger: this.logger });
|
|
134
143
|
if (!channel)
|
|
@@ -201,7 +210,7 @@ class AntInterface extends events_1.default {
|
|
|
201
210
|
}
|
|
202
211
|
startSensor(sensor, onDeviceData) {
|
|
203
212
|
return __awaiter(this, void 0, void 0, function* () {
|
|
204
|
-
if (!this.isConnected) {
|
|
213
|
+
if (!this.isConnected()) {
|
|
205
214
|
const connected = yield this.connect();
|
|
206
215
|
if (!connected)
|
|
207
216
|
return false;
|
|
@@ -232,7 +241,7 @@ class AntInterface extends events_1.default {
|
|
|
232
241
|
}
|
|
233
242
|
stopSensor(sensor) {
|
|
234
243
|
return __awaiter(this, void 0, void 0, function* () {
|
|
235
|
-
if (!this.isConnected || !this.device)
|
|
244
|
+
if (!this.isConnected() || !this.device)
|
|
236
245
|
return true;
|
|
237
246
|
const channel = sensor.getChannel();
|
|
238
247
|
if (channel) {
|
|
@@ -267,3 +276,4 @@ class AntInterface extends events_1.default {
|
|
|
267
276
|
}
|
|
268
277
|
exports.default = AntInterface;
|
|
269
278
|
AntInterface._instance = undefined;
|
|
279
|
+
AntInterface.INTERFACE_NAME = 'ant';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { IAntDevice, IChannel } from 'incyclist-ant-plus';
|
|
3
3
|
import { AntInterfaceProps } from './ant-interface';
|
|
4
4
|
export default class AntDeviceBinding implements IAntDevice {
|
|
5
|
-
constructor(
|
|
5
|
+
constructor(_props: AntInterfaceProps);
|
|
6
6
|
open(): Promise<boolean>;
|
|
7
7
|
close(): Promise<boolean>;
|
|
8
8
|
getMaxChannels(): number;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { FitnessEquipmentSensorState, ISensor, Profile } from "incyclist-ant-plus";
|
|
2
|
+
import { ControllableAntAdapter } from "../adapter";
|
|
3
|
+
import CyclingMode, { IncyclistBikeData, UpdateRequest } from '../../modes/cycling-mode';
|
|
4
|
+
import { AntDeviceProperties, AntDeviceSettings, LegacyProfile } from "../types";
|
|
5
|
+
export default class AntFEAdapter extends ControllableAntAdapter {
|
|
6
|
+
static INCYCLIST_PROFILE_NAME: LegacyProfile;
|
|
7
|
+
static ANT_PROFILE_NAME: Profile;
|
|
8
|
+
protected distanceInternal?: number;
|
|
9
|
+
protected startProps: AntDeviceProperties;
|
|
10
|
+
protected isReconnecting: boolean;
|
|
11
|
+
constructor(settings: AntDeviceSettings, props?: AntDeviceProperties);
|
|
12
|
+
createSensor(settings: AntDeviceSettings): ISensor;
|
|
13
|
+
getName(): string;
|
|
14
|
+
getUniqueName(): string;
|
|
15
|
+
getDisplayName(): string;
|
|
16
|
+
getSupportedCyclingModes(): Array<any>;
|
|
17
|
+
getDefaultCyclingMode(): CyclingMode;
|
|
18
|
+
getLogData(data: any, excludeList: any): any;
|
|
19
|
+
sendUpdate(request: UpdateRequest, forced?: boolean): Promise<void>;
|
|
20
|
+
onDeviceData(deviceData: FitnessEquipmentSensorState): void;
|
|
21
|
+
canSendUpdate(): boolean;
|
|
22
|
+
mapToCycleModeData(deviceData: FitnessEquipmentSensorState): IncyclistBikeData;
|
|
23
|
+
transformData(bikeData: IncyclistBikeData): any;
|
|
24
|
+
start(props?: any): Promise<any>;
|
|
25
|
+
setFEDefaultTimeout(): void;
|
|
26
|
+
reconnect(): Promise<boolean>;
|
|
27
|
+
setCyclingMode(mode: string | CyclingMode, settings?: any): void;
|
|
28
|
+
}
|