incyclist-devices 2.0.0-beta.1 → 2.0.1
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 +1 -0
- package/lib/adapters.js +19 -0
- package/lib/antv2/adapter-factory.d.ts +8 -7
- package/lib/antv2/adapter-factory.js +4 -2
- package/lib/antv2/adapter.d.ts +3 -2
- package/lib/antv2/adapter.js +15 -4
- package/lib/antv2/ant-interface.d.ts +6 -2
- package/lib/antv2/ant-interface.js +27 -21
- package/lib/antv2/binding.d.ts +1 -1
- package/lib/antv2/binding.js +1 -1
- package/lib/antv2/fe/adapter.d.ts +12 -9
- package/lib/antv2/fe/adapter.js +67 -27
- package/lib/antv2/hr/adapter.d.ts +6 -5
- package/lib/antv2/hr/adapter.js +19 -16
- package/lib/antv2/index.d.ts +2 -2
- package/lib/antv2/pwr/adapter.d.ts +6 -4
- package/lib/antv2/pwr/adapter.js +24 -16
- package/lib/antv2/sensor-factory.d.ts +2 -2
- package/lib/antv2/types.d.ts +5 -2
- package/lib/antv2/types.js +3 -0
- package/lib/antv2/utils.d.ts +3 -0
- package/lib/antv2/utils.js +12 -1
- package/lib/base/adpater.d.ts +14 -2
- package/lib/base/adpater.js +43 -4
- package/lib/ble/adapter-factory.d.ts +18 -16
- package/lib/ble/adapter-factory.js +54 -45
- package/lib/ble/base/adapter.d.ts +53 -0
- package/lib/ble/{adapter.js → base/adapter.js} +111 -9
- package/lib/ble/base/comms-utils.d.ts +7 -0
- package/lib/ble/base/comms-utils.js +91 -0
- package/lib/ble/{ble-comms.d.ts → base/comms.d.ts} +27 -17
- package/lib/ble/{ble-comms.js → base/comms.js} +179 -53
- 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 +34 -46
- package/lib/ble/ble-interface.js +242 -345
- package/lib/ble/ble-peripheral.d.ts +4 -2
- package/lib/ble/ble-peripheral.js +39 -8
- package/lib/ble/consts.d.ts +1 -0
- package/lib/ble/consts.js +2 -1
- package/lib/ble/cp/adapter.d.ts +1 -2
- package/lib/ble/cp/adapter.js +2 -15
- package/lib/ble/cp/comm.d.ts +8 -5
- package/lib/ble/cp/comm.js +12 -27
- package/lib/ble/elite/adapter.d.ts +1 -2
- package/lib/ble/elite/adapter.js +12 -19
- package/lib/ble/elite/comms.d.ts +8 -4
- package/lib/ble/elite/comms.js +12 -25
- package/lib/ble/fm/adapter.d.ts +3 -2
- package/lib/ble/fm/adapter.js +129 -70
- package/lib/ble/fm/comms.d.ts +8 -8
- package/lib/ble/fm/comms.js +33 -55
- package/lib/ble/fm/types.d.ts +5 -0
- package/lib/ble/hr/adapter.d.ts +1 -4
- package/lib/ble/hr/adapter.js +1 -18
- package/lib/ble/hr/comm.d.ts +6 -2
- package/lib/ble/hr/comm.js +6 -2
- package/lib/ble/hr/mock.d.ts +7 -0
- package/lib/ble/hr/mock.js +47 -0
- package/lib/ble/index.d.ts +2 -1
- package/lib/ble/index.js +5 -5
- package/lib/ble/peripheral-cache.d.ts +43 -0
- package/lib/ble/peripheral-cache.js +107 -0
- package/lib/ble/tacx/adapter.d.ts +1 -1
- package/lib/ble/tacx/adapter.js +20 -14
- package/lib/ble/tacx/comms.d.ts +6 -6
- package/lib/ble/tacx/comms.js +10 -43
- package/lib/ble/types.d.ts +54 -27
- package/lib/ble/types.js +0 -17
- package/lib/ble/utils.d.ts +15 -5
- package/lib/ble/utils.js +25 -66
- package/lib/ble/wahoo/adapter.d.ts +1 -1
- package/lib/ble/wahoo/adapter.js +12 -10
- package/lib/ble/wahoo/comms.d.ts +7 -6
- package/lib/ble/wahoo/comms.js +15 -17
- package/lib/index.d.ts +10 -7
- package/lib/index.js +21 -25
- package/lib/interfaces.d.ts +2 -1
- package/lib/interfaces.js +4 -0
- package/lib/modes/power-base.js +4 -0
- package/lib/serial/adapter.d.ts +5 -0
- package/lib/serial/adapter.js +19 -0
- package/lib/serial/bindings/tcp.d.ts +2 -1
- package/lib/serial/bindings/tcp.js +19 -5
- package/lib/serial/daum/DaumAdapter.d.ts +1 -1
- package/lib/serial/daum/DaumAdapter.js +16 -10
- package/lib/serial/daum/premium/adapter.d.ts +1 -0
- package/lib/serial/daum/premium/adapter.js +9 -2
- package/lib/serial/daum/premium/comms.js +10 -3
- package/lib/serial/daum/premium/mock.js +0 -1
- package/lib/serial/index.d.ts +3 -3
- package/lib/serial/index.js +2 -2
- package/lib/serial/kettler/ergo-racer/adapter.d.ts +1 -4
- package/lib/serial/kettler/ergo-racer/adapter.js +15 -39
- package/lib/serial/serial-interface.d.ts +3 -1
- package/lib/serial/serial-interface.js +43 -17
- package/lib/simulator/Simulator.d.ts +2 -0
- package/lib/simulator/Simulator.js +8 -5
- package/lib/types/adapter.d.ts +10 -3
- package/lib/types/device.d.ts +3 -0
- package/lib/types/interface.d.ts +7 -3
- package/package.json +3 -5
- package/lib/ble/adapter.d.ts +0 -41
- package/lib/ble/ble.d.ts +0 -57
- package/lib/ble/ble.js +0 -48
- package/lib/device.d.ts +0 -0
- package/lib/device.js +0 -0
package/lib/serial/index.js
CHANGED
|
@@ -34,8 +34,6 @@ const serial_interface_1 = __importDefault(require("./serial-interface"));
|
|
|
34
34
|
exports.SerialInterface = serial_interface_1.default;
|
|
35
35
|
const adapter_factory_1 = __importDefault(require("./adapter-factory"));
|
|
36
36
|
exports.SerialAdapterFactory = adapter_factory_1.default;
|
|
37
|
-
var tcp_1 = require("./bindings/tcp");
|
|
38
|
-
Object.defineProperty(exports, "TCPBinding", { enumerable: true, get: function () { return tcp_1.TCPBinding; } });
|
|
39
37
|
const adapter_1 = require("./adapter");
|
|
40
38
|
Object.defineProperty(exports, "SerialIncyclistDevice", { enumerable: true, get: function () { return adapter_1.SerialIncyclistDevice; } });
|
|
41
39
|
const adapter_2 = __importDefault(require("./daum/classic/adapter"));
|
|
@@ -44,6 +42,8 @@ const adapter_3 = __importDefault(require("./daum/premium/adapter"));
|
|
|
44
42
|
exports.DaumPremiumAdapter = adapter_3.default;
|
|
45
43
|
const adapter_4 = __importDefault(require("./kettler/ergo-racer/adapter"));
|
|
46
44
|
exports.KettlerRacerAdapter = adapter_4.default;
|
|
45
|
+
var tcp_1 = require("./bindings/tcp");
|
|
46
|
+
Object.defineProperty(exports, "TCPBinding", { enumerable: true, get: function () { return tcp_1.TCPBinding; } });
|
|
47
47
|
adapter_factory_1.default.getInstance().registerAdapter('Daum Classic', adapter_2.default);
|
|
48
48
|
adapter_factory_1.default.getInstance().registerAdapter('Daum Premium', adapter_3.default);
|
|
49
49
|
adapter_factory_1.default.getInstance().registerAdapter('Kettler Racer', adapter_4.default);
|
|
@@ -44,9 +44,6 @@ export default class KettlerRacerAdapter extends SerialIncyclistDevice {
|
|
|
44
44
|
getID(): string;
|
|
45
45
|
getName(): string;
|
|
46
46
|
getPort(): string;
|
|
47
|
-
setIgnoreHrm(ignore: boolean): void;
|
|
48
|
-
setIgnorePower(ignore: boolean): void;
|
|
49
|
-
setIgnoreBike(ignore: boolean): void;
|
|
50
47
|
_getComms(): SerialComms<KettlerRacerCommand>;
|
|
51
48
|
_setComms(comms: SerialComms<KettlerRacerCommand>): void;
|
|
52
49
|
getLogger(): EventLogger;
|
|
@@ -70,6 +67,7 @@ export default class KettlerRacerAdapter extends SerialIncyclistDevice {
|
|
|
70
67
|
check(): Promise<boolean>;
|
|
71
68
|
start(props?: any): Promise<boolean>;
|
|
72
69
|
startUpdatePull(): void;
|
|
70
|
+
canSendUpdate(): boolean;
|
|
73
71
|
stop(): Promise<boolean>;
|
|
74
72
|
mapData(bikeData: KettlerBikeData): IncyclistBikeData;
|
|
75
73
|
transformData(internalData: IncyclistBikeData, bikeData: KettlerBikeData): DeviceData;
|
|
@@ -78,7 +76,6 @@ export default class KettlerRacerAdapter extends SerialIncyclistDevice {
|
|
|
78
76
|
sendRequests(): Promise<void>;
|
|
79
77
|
bikeSync(): Promise<void>;
|
|
80
78
|
sendUpdate(request: any): Promise<unknown>;
|
|
81
|
-
sendData(): void;
|
|
82
79
|
refreshRequests(): void;
|
|
83
80
|
processClientRequest(request: any): Promise<unknown>;
|
|
84
81
|
connect(): Promise<boolean>;
|
|
@@ -25,9 +25,6 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
25
25
|
super(settings, props);
|
|
26
26
|
this.requests = [];
|
|
27
27
|
this.logger = new gd_eventlog_1.EventLogger('KettlerRacer');
|
|
28
|
-
this.ignoreHrm = false;
|
|
29
|
-
this.ignorePower = false;
|
|
30
|
-
this.ignoreBike = false;
|
|
31
28
|
this.paused = false;
|
|
32
29
|
this.iv = null;
|
|
33
30
|
this.comms = new comms_1.default({ interface: settings.interface, port: settings.port, logger: this.logger });
|
|
@@ -61,15 +58,6 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
61
58
|
const settings = this.settings;
|
|
62
59
|
return settings.port;
|
|
63
60
|
}
|
|
64
|
-
setIgnoreHrm(ignore) {
|
|
65
|
-
this.ignoreHrm = ignore;
|
|
66
|
-
}
|
|
67
|
-
setIgnorePower(ignore) {
|
|
68
|
-
this.ignorePower = ignore;
|
|
69
|
-
}
|
|
70
|
-
setIgnoreBike(ignore) {
|
|
71
|
-
this.ignoreBike = ignore;
|
|
72
|
-
}
|
|
73
61
|
_getComms() {
|
|
74
62
|
return this.comms;
|
|
75
63
|
}
|
|
@@ -329,20 +317,21 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
329
317
|
if (this.iv)
|
|
330
318
|
return;
|
|
331
319
|
this.logEvent({ message: 'start regular device update' });
|
|
332
|
-
if (this.ignoreBike && this.ignoreHrm && this.ignorePower)
|
|
333
|
-
return;
|
|
334
320
|
const ivSync = setInterval(() => {
|
|
335
321
|
this.bikeSync();
|
|
336
|
-
},
|
|
322
|
+
}, this.pullFrequency);
|
|
337
323
|
const ivUpdate = setInterval(() => {
|
|
338
|
-
this.
|
|
324
|
+
this.emitData(this.data);
|
|
339
325
|
this.refreshRequests();
|
|
340
|
-
},
|
|
326
|
+
}, this.pullFrequency);
|
|
341
327
|
this.iv = {
|
|
342
328
|
sync: ivSync,
|
|
343
329
|
update: ivUpdate
|
|
344
330
|
};
|
|
345
331
|
}
|
|
332
|
+
canSendUpdate() {
|
|
333
|
+
return !this.isPaused();
|
|
334
|
+
}
|
|
346
335
|
stop() {
|
|
347
336
|
this.logEvent({ message: 'stop request' });
|
|
348
337
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -386,21 +375,13 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
386
375
|
data.heartrate = internalData.heartrate;
|
|
387
376
|
data.timestamp = Date.now();
|
|
388
377
|
data.deviceTime = bikeData.time;
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
this.prevDistance = internalData.distanceInternal;
|
|
397
|
-
}
|
|
398
|
-
if (this.ignoreHrm)
|
|
399
|
-
delete this.data.heartrate;
|
|
400
|
-
if (this.ignorePower) {
|
|
401
|
-
delete this.data.power;
|
|
402
|
-
delete this.data.cadence;
|
|
403
|
-
}
|
|
378
|
+
data.speed = internalData.speed;
|
|
379
|
+
data.power = internalData.power;
|
|
380
|
+
data.cadence = internalData.pedalRpm;
|
|
381
|
+
data.distance = distance;
|
|
382
|
+
data.deviceDistanceCounter = bikeData.distance;
|
|
383
|
+
data.internalDistanceCounter = internalData.distanceInternal;
|
|
384
|
+
this.prevDistance = internalData.distanceInternal;
|
|
404
385
|
return data;
|
|
405
386
|
}
|
|
406
387
|
update() {
|
|
@@ -415,6 +396,7 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
415
396
|
data = this.getCyclingMode().updateData(data);
|
|
416
397
|
this.internalData = data;
|
|
417
398
|
this.data = this.transformData(data, bikeData);
|
|
399
|
+
this.emitData(this.data);
|
|
418
400
|
}
|
|
419
401
|
catch (err) {
|
|
420
402
|
this.logEvent({ message: 'bike update error', error: err.message });
|
|
@@ -486,9 +468,7 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
486
468
|
return;
|
|
487
469
|
}
|
|
488
470
|
this.logEvent({ message: 'bikeSync' });
|
|
489
|
-
|
|
490
|
-
yield this.sendRequests();
|
|
491
|
-
}
|
|
471
|
+
yield this.sendRequests();
|
|
492
472
|
yield this.update();
|
|
493
473
|
});
|
|
494
474
|
}
|
|
@@ -500,10 +480,6 @@ class KettlerRacerAdapter extends adapter_1.SerialIncyclistDevice {
|
|
|
500
480
|
return yield this.processClientRequest(request);
|
|
501
481
|
});
|
|
502
482
|
}
|
|
503
|
-
sendData() {
|
|
504
|
-
if (this.onDataFn)
|
|
505
|
-
this.onDataFn(this.data);
|
|
506
|
-
}
|
|
507
483
|
refreshRequests() {
|
|
508
484
|
if (this.kettlerData.cadence === 0)
|
|
509
485
|
return;
|
|
@@ -43,14 +43,16 @@ export default class SerialInterface extends EventEmitter implements IncyclistIn
|
|
|
43
43
|
scanEvents: EventEmitter;
|
|
44
44
|
logger: EventLogger;
|
|
45
45
|
toScan: NodeJS.Timeout;
|
|
46
|
+
connected: boolean;
|
|
46
47
|
static _instances: SerialInterface[];
|
|
47
48
|
static getInstance(props: SerialInterfaceProps): SerialInterface;
|
|
48
49
|
static _add(instance: SerialInterface): void;
|
|
49
50
|
constructor(props: SerialInterfaceProps);
|
|
50
51
|
setBinding(binding: BindingInterface): void;
|
|
51
52
|
getName(): string;
|
|
53
|
+
isConnected(): boolean;
|
|
52
54
|
connect(): Promise<boolean>;
|
|
53
|
-
disconnect(): Promise<
|
|
55
|
+
disconnect(): Promise<boolean>;
|
|
54
56
|
openPort(path: string): Promise<SerialPortStream | null>;
|
|
55
57
|
closePort(path: string): Promise<Boolean>;
|
|
56
58
|
scan(props: SerialScannerProps): Promise<SerialDeviceSettings[]>;
|
|
@@ -42,6 +42,7 @@ class SinglePathScanner {
|
|
|
42
42
|
}
|
|
43
43
|
scan() {
|
|
44
44
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
console.log('~~~ start SERIAL Scan', this.isScanning);
|
|
45
46
|
if (this.isScanning)
|
|
46
47
|
return;
|
|
47
48
|
this.isScanning = true;
|
|
@@ -52,6 +53,7 @@ class SinglePathScanner {
|
|
|
52
53
|
let found = false;
|
|
53
54
|
while (!found && this.isScanning) {
|
|
54
55
|
try {
|
|
56
|
+
console.log('~~~ adapter check attempt');
|
|
55
57
|
const { protocol } = this.props;
|
|
56
58
|
let host, port;
|
|
57
59
|
if (this.serial.getName() === exports.SerialInterfaceType.TCPIP) {
|
|
@@ -60,17 +62,19 @@ class SinglePathScanner {
|
|
|
60
62
|
else {
|
|
61
63
|
port = this.path;
|
|
62
64
|
}
|
|
63
|
-
const adapterSettings = { interface: this.serial, host, port, protocol };
|
|
65
|
+
const adapterSettings = { interface: this.serial.getName(), host, port, protocol };
|
|
64
66
|
const adapter = adapters_1.default.create(adapterSettings);
|
|
65
67
|
found = yield adapter.check();
|
|
66
68
|
if (found) {
|
|
67
69
|
const name = adapter.getName();
|
|
68
70
|
resolve(Object.assign(Object.assign({}, adapterSettings), { name }));
|
|
69
|
-
yield this.serial.closePort(this.path).catch();
|
|
70
71
|
}
|
|
72
|
+
yield (0, utils_1.sleep)(100);
|
|
71
73
|
}
|
|
72
74
|
catch (err) {
|
|
75
|
+
console.log('~~~ERROR', err);
|
|
73
76
|
this.logger.logEvent({ message: 'error', fn: 'scan()', error: err.message || err, stack: err.stack });
|
|
77
|
+
yield (0, utils_1.sleep)(100);
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
}));
|
|
@@ -110,6 +114,7 @@ class SerialInterface extends events_1.default {
|
|
|
110
114
|
this.isStopScanRequested = false;
|
|
111
115
|
this.scanEvents = new events_1.default();
|
|
112
116
|
this.logger = props.logger || new gd_eventlog_1.EventLogger(`Serial:${ifaceName}`);
|
|
117
|
+
this.connected = false;
|
|
113
118
|
this.logger.logEvent({ message: 'new serial interface', ifaceName });
|
|
114
119
|
if (binding) {
|
|
115
120
|
this.setBinding(binding);
|
|
@@ -123,28 +128,37 @@ class SerialInterface extends events_1.default {
|
|
|
123
128
|
getName() {
|
|
124
129
|
return this.ifaceName;
|
|
125
130
|
}
|
|
131
|
+
isConnected() {
|
|
132
|
+
return this.connected;
|
|
133
|
+
}
|
|
126
134
|
connect() {
|
|
127
135
|
return __awaiter(this, void 0, void 0, function* () {
|
|
128
136
|
const binding = serialport_1.default.getInstance().getBinding(this.ifaceName);
|
|
129
|
-
if (!binding || !this.binding)
|
|
137
|
+
if (!binding || !this.binding) {
|
|
138
|
+
this.connected = false;
|
|
130
139
|
return false;
|
|
140
|
+
}
|
|
131
141
|
try {
|
|
132
142
|
const SerialPort = this.binding;
|
|
133
|
-
yield SerialPort.list();
|
|
143
|
+
const res = yield SerialPort.list();
|
|
144
|
+
this.connected = true;
|
|
134
145
|
return true;
|
|
135
146
|
}
|
|
136
147
|
catch (err) {
|
|
148
|
+
this.connected = false;
|
|
137
149
|
return false;
|
|
138
150
|
}
|
|
139
151
|
});
|
|
140
152
|
}
|
|
141
153
|
disconnect() {
|
|
142
154
|
return __awaiter(this, void 0, void 0, function* () {
|
|
155
|
+
this.connected = false;
|
|
143
156
|
return true;
|
|
144
157
|
});
|
|
145
158
|
}
|
|
146
159
|
openPort(path) {
|
|
147
160
|
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
console.log('~~~ SerialPort.openPort', this.ifaceName, path);
|
|
148
162
|
this.logger.logEvent({ message: 'opening port', path });
|
|
149
163
|
const port = serialport_1.default.getInstance().getSerialPort(this.ifaceName, { path });
|
|
150
164
|
if (!port) {
|
|
@@ -160,16 +174,16 @@ class SerialInterface extends events_1.default {
|
|
|
160
174
|
}
|
|
161
175
|
}
|
|
162
176
|
return new Promise((resolve) => {
|
|
163
|
-
port.
|
|
177
|
+
port.once('error', (err) => {
|
|
164
178
|
this.logger.logEvent({ message: 'error', path, error: err || err.message });
|
|
165
|
-
resolve(null);
|
|
166
179
|
port.removeAllListeners();
|
|
180
|
+
resolve(null);
|
|
167
181
|
});
|
|
168
182
|
port.once('open', () => {
|
|
169
183
|
this.logger.logEvent({ message: 'port opened', path });
|
|
170
|
-
resolve(port);
|
|
171
184
|
port.removeAllListeners();
|
|
172
185
|
this.ports.push({ path, port });
|
|
186
|
+
resolve(port);
|
|
173
187
|
});
|
|
174
188
|
port.open();
|
|
175
189
|
});
|
|
@@ -177,6 +191,7 @@ class SerialInterface extends events_1.default {
|
|
|
177
191
|
}
|
|
178
192
|
closePort(path) {
|
|
179
193
|
return __awaiter(this, void 0, void 0, function* () {
|
|
194
|
+
console.log('~~~ SerialPort.closePort', this.ifaceName, path);
|
|
180
195
|
const existing = this.ports.findIndex(p => p.path === path);
|
|
181
196
|
if (existing === -1)
|
|
182
197
|
return true;
|
|
@@ -200,8 +215,11 @@ class SerialInterface extends events_1.default {
|
|
|
200
215
|
}
|
|
201
216
|
scan(props) {
|
|
202
217
|
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
+
console.log('~~serial scan', this.isScanning, this.isConnected());
|
|
203
219
|
if (this.isScanning)
|
|
204
220
|
return [];
|
|
221
|
+
if (!this.isConnected())
|
|
222
|
+
yield this.connect();
|
|
205
223
|
const binding = serialport_1.default.getInstance().getBinding(this.ifaceName);
|
|
206
224
|
if (!binding || !this.binding)
|
|
207
225
|
return [];
|
|
@@ -212,28 +230,34 @@ class SerialInterface extends events_1.default {
|
|
|
212
230
|
let toExpiresAt = Date.now() + timeout;
|
|
213
231
|
if (timeout) {
|
|
214
232
|
this.toScan = setTimeout(() => {
|
|
215
|
-
console.log('~~~ TIMEOUT');
|
|
216
233
|
timeOutExpired = true;
|
|
217
234
|
this.scanEvents.emit('timeout');
|
|
218
235
|
}, timeout);
|
|
219
236
|
}
|
|
237
|
+
this.logger.logEvent({ message: 'checking for ports ' });
|
|
220
238
|
this.isScanning = true;
|
|
221
239
|
do {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
240
|
+
try {
|
|
241
|
+
if (this.getName() === 'tcpip') {
|
|
242
|
+
const _binding = binding;
|
|
243
|
+
paths = (yield _binding.list(port)) || [];
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
paths = (yield binding.list()) || [];
|
|
247
|
+
}
|
|
225
248
|
}
|
|
226
|
-
|
|
227
|
-
|
|
249
|
+
catch (err) {
|
|
250
|
+
console.log('~~~ERROR', err);
|
|
228
251
|
}
|
|
229
|
-
if (paths.length === 0) {
|
|
252
|
+
if (!paths || paths.length === 0) {
|
|
230
253
|
this.logger.logEvent({ message: 'scanning: no ports detected', interface: this.ifaceName, paths: paths.map(p => p.path), timeout });
|
|
231
|
-
(0, utils_1.sleep)(1000);
|
|
254
|
+
yield (0, utils_1.sleep)(1000);
|
|
232
255
|
}
|
|
233
256
|
if (Date.now() > toExpiresAt)
|
|
234
257
|
timeOutExpired = true;
|
|
235
258
|
} while (this.isScanning && !timeOutExpired && paths.length === 0);
|
|
236
259
|
if (paths.length === 0) {
|
|
260
|
+
this.logger.logEvent({ message: 'nothing to scan ' });
|
|
237
261
|
if (this.toScan) {
|
|
238
262
|
clearTimeout(this.toScan);
|
|
239
263
|
this.toScan = null;
|
|
@@ -245,8 +269,10 @@ class SerialInterface extends events_1.default {
|
|
|
245
269
|
try {
|
|
246
270
|
yield Promise.all(scanners.map(s => s.scan()
|
|
247
271
|
.then(device => {
|
|
248
|
-
|
|
249
|
-
|
|
272
|
+
if (device) {
|
|
273
|
+
detected.push(device);
|
|
274
|
+
this.emit('device', device);
|
|
275
|
+
}
|
|
250
276
|
})
|
|
251
277
|
.catch()));
|
|
252
278
|
}
|
|
@@ -35,6 +35,7 @@ export declare class Simulator extends ControllableDevice {
|
|
|
35
35
|
isSame(device: DeviceAdapter): boolean;
|
|
36
36
|
getID(): string;
|
|
37
37
|
getName(): string;
|
|
38
|
+
getUniqueName(): string;
|
|
38
39
|
setIgnoreHrm(ignore: any): void;
|
|
39
40
|
getSupportedCyclingModes(): Array<any>;
|
|
40
41
|
getDefaultCyclingMode(): CyclingMode;
|
|
@@ -48,6 +49,7 @@ export declare class Simulator extends ControllableDevice {
|
|
|
48
49
|
faster(): void;
|
|
49
50
|
slower(): void;
|
|
50
51
|
update(): void;
|
|
52
|
+
canSendUpdate(): boolean;
|
|
51
53
|
calculateDistance(speedKps: any, timeS: any): number;
|
|
52
54
|
sendUpdate(request: any): import("../modes/cycling-mode").UpdateRequest;
|
|
53
55
|
}
|
|
@@ -17,7 +17,6 @@ const adpater_1 = require("../base/adpater");
|
|
|
17
17
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
18
18
|
const simulator_1 = __importDefault(require("../modes/simulator"));
|
|
19
19
|
const capabilities_1 = require("../types/capabilities");
|
|
20
|
-
const DEFAULT_SETTINGS = { name: 'Simulator', protocol: 'Simulator', port: '' };
|
|
21
20
|
const DEFAULT_PROPS = { isBot: false };
|
|
22
21
|
class Simulator extends adpater_1.ControllableDevice {
|
|
23
22
|
constructor(settings, props = DEFAULT_PROPS) {
|
|
@@ -55,6 +54,7 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
55
54
|
}
|
|
56
55
|
getID() { return Simulator.NAME; }
|
|
57
56
|
getName() { return Simulator.NAME; }
|
|
57
|
+
getUniqueName() { return Simulator.NAME; }
|
|
58
58
|
setIgnoreHrm(ignore) {
|
|
59
59
|
this.ignoreHrm = ignore;
|
|
60
60
|
}
|
|
@@ -91,6 +91,7 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
91
91
|
start(props) {
|
|
92
92
|
return __awaiter(this, void 0, void 0, function* () {
|
|
93
93
|
this.startProps = props;
|
|
94
|
+
this.paused = false;
|
|
94
95
|
if (props)
|
|
95
96
|
this.setBikeProps(props);
|
|
96
97
|
return new Promise((resolve) => {
|
|
@@ -186,6 +187,8 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
186
187
|
if (!this.isBot && startDelay && timeSinceStart < startDelay * 1000) {
|
|
187
188
|
return;
|
|
188
189
|
}
|
|
190
|
+
if (this.paused)
|
|
191
|
+
return;
|
|
189
192
|
const prevDist = this.data.distanceInternal;
|
|
190
193
|
const d = this.data;
|
|
191
194
|
const prevTime = d.deviceTime;
|
|
@@ -204,12 +207,12 @@ class Simulator extends adpater_1.ControllableDevice {
|
|
|
204
207
|
if (this.isBot) {
|
|
205
208
|
this.logger.logEvent(Object.assign({ message: 'Coach update', prevDist, prevTime }, data));
|
|
206
209
|
}
|
|
207
|
-
this.paused = (this.data.speed === 0);
|
|
208
210
|
if (this.ignoreHrm)
|
|
209
211
|
delete data.heartrate;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
212
|
+
this.emitData(data);
|
|
213
|
+
}
|
|
214
|
+
canSendUpdate() {
|
|
215
|
+
return true;
|
|
213
216
|
}
|
|
214
217
|
calculateDistance(speedKps, timeS) {
|
|
215
218
|
return timeS * speedKps / 3.6;
|
package/lib/types/adapter.d.ts
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import EventEmitter from "events";
|
|
1
3
|
import CyclingMode from "../modes/cycling-mode";
|
|
2
4
|
import { IncyclistCapability } from "./capabilities";
|
|
3
5
|
import { DeviceData } from "./data";
|
|
4
6
|
import { DeviceProperties, DeviceSettings } from "./device";
|
|
5
7
|
import { User } from "./user";
|
|
6
8
|
export type OnDeviceDataCallback = (data: DeviceData) => void;
|
|
7
|
-
export interface IncyclistDeviceAdapter {
|
|
9
|
+
export interface IncyclistDeviceAdapter extends EventEmitter {
|
|
8
10
|
connect(): Promise<boolean>;
|
|
9
11
|
close(): Promise<boolean>;
|
|
10
12
|
check(): Promise<boolean>;
|
|
11
|
-
isEqual(settings: DeviceSettings):
|
|
13
|
+
isEqual(settings: DeviceSettings): boolean;
|
|
12
14
|
getCapabilities(): IncyclistCapability[];
|
|
13
|
-
hasCapability(capability: IncyclistCapability):
|
|
15
|
+
hasCapability(capability: IncyclistCapability): boolean;
|
|
16
|
+
addCapability(capability: IncyclistCapability): void;
|
|
17
|
+
isControllable(): boolean;
|
|
14
18
|
getName(): string;
|
|
19
|
+
getUniqueName(): string;
|
|
15
20
|
getSettings(): DeviceSettings;
|
|
16
21
|
getDisplayName(): string;
|
|
17
22
|
update(): any;
|
|
@@ -20,6 +25,8 @@ export interface IncyclistDeviceAdapter {
|
|
|
20
25
|
pause(): Promise<boolean>;
|
|
21
26
|
resume(): Promise<boolean>;
|
|
22
27
|
sendUpdate(request: any): any;
|
|
28
|
+
getMaxUpdateFrequency(): any;
|
|
29
|
+
setMaxUpdateFrequency(value: number): any;
|
|
23
30
|
onData(callback: OnDeviceDataCallback): any;
|
|
24
31
|
}
|
|
25
32
|
export interface Bike {
|
package/lib/types/device.d.ts
CHANGED
|
@@ -19,6 +19,9 @@ export type DeviceProperties = {
|
|
|
19
19
|
userWeight?: number;
|
|
20
20
|
bikeWeight?: number;
|
|
21
21
|
};
|
|
22
|
+
export interface DeviceStartProperties extends DeviceProperties {
|
|
23
|
+
timeout?: number;
|
|
24
|
+
}
|
|
22
25
|
export type IncyclistScanProps = {
|
|
23
26
|
timeout?: number;
|
|
24
27
|
logger?: EventLogger;
|
package/lib/types/interface.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import EventEmitter from "events";
|
|
1
3
|
import { EventLogger } from "gd-eventlog";
|
|
2
4
|
import { IncyclistScanProps, DeviceSettings } from "./device";
|
|
3
5
|
export type InterfaceProps = {
|
|
@@ -5,10 +7,12 @@ export type InterfaceProps = {
|
|
|
5
7
|
logger?: EventLogger;
|
|
6
8
|
log?: boolean;
|
|
7
9
|
};
|
|
8
|
-
export
|
|
10
|
+
export interface IncyclistInterface extends EventEmitter {
|
|
9
11
|
getName(): string;
|
|
10
12
|
setBinding(binding: any): void;
|
|
11
13
|
connect(): Promise<boolean>;
|
|
12
|
-
disconnect(): Promise<
|
|
14
|
+
disconnect(): Promise<boolean>;
|
|
15
|
+
isConnected(): boolean;
|
|
13
16
|
scan(props: IncyclistScanProps): Promise<DeviceSettings[]>;
|
|
14
|
-
|
|
17
|
+
stopScan(): Promise<boolean>;
|
|
18
|
+
}
|
package/package.json
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "incyclist-devices",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@serialport/bindings-interface": "^1.2.2",
|
|
6
6
|
"@serialport/parser-byte-length": "^9.0.1",
|
|
7
7
|
"@serialport/parser-delimiter": "^9.0.1",
|
|
8
8
|
"@serialport/parser-readline": "^10.5.0",
|
|
9
9
|
"@serialport/stream": "^10.5.0",
|
|
10
|
-
"
|
|
11
|
-
"gd-ant-plus": "^0.0.33",
|
|
12
|
-
"incyclist-ant-plus": "^0.1.15",
|
|
10
|
+
"incyclist-ant-plus": "^0.1.18",
|
|
13
11
|
"win32filetime": "^1.0.2"
|
|
14
12
|
},
|
|
15
13
|
"peerDependencies": {
|
|
@@ -30,7 +28,7 @@
|
|
|
30
28
|
"lint": "eslint . --ext .ts",
|
|
31
29
|
"build": "tsc",
|
|
32
30
|
"test": "jest --coverage",
|
|
33
|
-
"dev": "
|
|
31
|
+
"dev": "tsc --watch"
|
|
34
32
|
},
|
|
35
33
|
"files": [
|
|
36
34
|
"lib/"
|
package/lib/ble/adapter.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import IncyclistDevice from "../base/adpater";
|
|
2
|
-
import CyclingMode from "../modes/cycling-mode";
|
|
3
|
-
import { Bike } from "../types/adapter";
|
|
4
|
-
import { DeviceData } from "../types/data";
|
|
5
|
-
import { DeviceProperties } from "../types/device";
|
|
6
|
-
import { User } from "../types/user";
|
|
7
|
-
import { BleComms } from "./ble-comms";
|
|
8
|
-
import BleInterface from "./ble-interface";
|
|
9
|
-
import { BleDeviceSettings } from "./types";
|
|
10
|
-
export default class BleAdapter extends IncyclistDevice {
|
|
11
|
-
ble: BleInterface;
|
|
12
|
-
deviceData: any;
|
|
13
|
-
data: DeviceData;
|
|
14
|
-
dataMsgCount: number;
|
|
15
|
-
lastUpdate?: number;
|
|
16
|
-
lastDataTS: number;
|
|
17
|
-
updateFrequency: number;
|
|
18
|
-
device: BleComms;
|
|
19
|
-
constructor(settings: BleDeviceSettings, props?: DeviceProperties);
|
|
20
|
-
isEqual(settings: BleDeviceSettings): boolean;
|
|
21
|
-
resetData(): void;
|
|
22
|
-
getInterface(): string;
|
|
23
|
-
getProtocolName(): string;
|
|
24
|
-
getID(): string;
|
|
25
|
-
getName(): string;
|
|
26
|
-
onDeviceData(deviceData: any): void;
|
|
27
|
-
start(props?: DeviceProperties): Promise<any>;
|
|
28
|
-
stop(): Promise<boolean>;
|
|
29
|
-
}
|
|
30
|
-
export declare class BleControllableAdapter extends BleAdapter implements Bike {
|
|
31
|
-
cyclingMode: CyclingMode;
|
|
32
|
-
user?: User;
|
|
33
|
-
constructor(settings: BleDeviceSettings, props?: DeviceProperties);
|
|
34
|
-
setUser(user: User): void;
|
|
35
|
-
setBikeProps(props: DeviceProperties): void;
|
|
36
|
-
getWeight(): number;
|
|
37
|
-
getSupportedCyclingModes(): any[];
|
|
38
|
-
getDefaultCyclingMode(): CyclingMode;
|
|
39
|
-
setCyclingMode(mode: CyclingMode | string, settings?: any): void;
|
|
40
|
-
getCyclingMode(): CyclingMode;
|
|
41
|
-
}
|
package/lib/ble/ble.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import EventEmitter from "events";
|
|
3
|
-
import { BleComms } from "./ble-comms";
|
|
4
|
-
import BlePeripheralConnector from "./ble-peripheral";
|
|
5
|
-
import { BleDeviceCommsClass, BleDeviceSettings, BlePeripheral, ConnectProps } from "./types";
|
|
6
|
-
export interface BleBinding extends EventEmitter {
|
|
7
|
-
startScanning(serviceUUIDs?: string[], allowDuplicates?: boolean, callback?: (error?: Error) => void): void;
|
|
8
|
-
stopScanning(callback?: () => void): void;
|
|
9
|
-
_bindings: any;
|
|
10
|
-
state: string;
|
|
11
|
-
}
|
|
12
|
-
export type BleScanProps = {
|
|
13
|
-
timeout?: number;
|
|
14
|
-
deviceTypes?: (typeof BleComms)[];
|
|
15
|
-
requested?: BleComms | BleDeviceSettings;
|
|
16
|
-
isBackgroundScan?: boolean;
|
|
17
|
-
};
|
|
18
|
-
export declare class BleBindingWrapper {
|
|
19
|
-
protected binding: BleBinding;
|
|
20
|
-
constructor(binding: BleBinding);
|
|
21
|
-
open(): {
|
|
22
|
-
err: Error;
|
|
23
|
-
opened: boolean;
|
|
24
|
-
};
|
|
25
|
-
get(): BleBinding;
|
|
26
|
-
}
|
|
27
|
-
export declare abstract class BleInterfaceClass extends EventEmitter {
|
|
28
|
-
binding: BleBinding;
|
|
29
|
-
constructor(props?: {
|
|
30
|
-
binding?: BleBinding;
|
|
31
|
-
});
|
|
32
|
-
abstract connect(props: ConnectProps): Promise<boolean>;
|
|
33
|
-
abstract scan(props: BleScanProps): Promise<BleDeviceCommsClass[]>;
|
|
34
|
-
abstract stopScan(): Promise<boolean>;
|
|
35
|
-
abstract disconnect(): Promise<boolean>;
|
|
36
|
-
abstract onDisconnect(peripheral: BlePeripheral): void;
|
|
37
|
-
abstract isScanning(): boolean;
|
|
38
|
-
abstract addConnectedDevice(device: BleDeviceCommsClass): void;
|
|
39
|
-
abstract removeConnectedDevice(device: BleDeviceCommsClass): void;
|
|
40
|
-
abstract findConnected(device: BleDeviceCommsClass | BlePeripheral): BleDeviceCommsClass;
|
|
41
|
-
abstract getConnector(peripheral: BlePeripheral): BlePeripheralConnector;
|
|
42
|
-
abstract findPeripheral(peripheral: BlePeripheral | {
|
|
43
|
-
id?: string;
|
|
44
|
-
address?: string;
|
|
45
|
-
name?: string;
|
|
46
|
-
}): BlePeripheral;
|
|
47
|
-
getBinding(): BleBinding;
|
|
48
|
-
setBinding(binding: BleBinding): void;
|
|
49
|
-
}
|
|
50
|
-
export declare enum BleState {
|
|
51
|
-
UNKNOWN = "unknown",
|
|
52
|
-
RESETTING = "resetting",
|
|
53
|
-
UNSUPPORTED = "unsupported",
|
|
54
|
-
UNAUTHORIZED = "unauthorized",
|
|
55
|
-
POWERED_OFF = "poweredOff",
|
|
56
|
-
POWERED_ON = "poweredOn"
|
|
57
|
-
}
|
package/lib/ble/ble.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.BleState = exports.BleInterfaceClass = exports.BleBindingWrapper = void 0;
|
|
7
|
-
const events_1 = __importDefault(require("events"));
|
|
8
|
-
class BleBindingWrapper {
|
|
9
|
-
constructor(binding) {
|
|
10
|
-
this.binding = binding;
|
|
11
|
-
this.binding = binding;
|
|
12
|
-
}
|
|
13
|
-
open() {
|
|
14
|
-
const binding = this.binding._bindings;
|
|
15
|
-
const binding_init = binding.init.bind(binding);
|
|
16
|
-
try {
|
|
17
|
-
binding_init();
|
|
18
|
-
return { err: null, opened: true };
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
const error = err;
|
|
22
|
-
const opened = false;
|
|
23
|
-
return { err: error, opened };
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
get() {
|
|
27
|
-
return this.binding;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
exports.BleBindingWrapper = BleBindingWrapper;
|
|
31
|
-
class BleInterfaceClass extends events_1.default {
|
|
32
|
-
constructor(props = {}) {
|
|
33
|
-
super();
|
|
34
|
-
this.setBinding(props.binding);
|
|
35
|
-
}
|
|
36
|
-
getBinding() { return this.binding; }
|
|
37
|
-
setBinding(binding) { this.binding = binding; }
|
|
38
|
-
}
|
|
39
|
-
exports.BleInterfaceClass = BleInterfaceClass;
|
|
40
|
-
var BleState;
|
|
41
|
-
(function (BleState) {
|
|
42
|
-
BleState["UNKNOWN"] = "unknown";
|
|
43
|
-
BleState["RESETTING"] = "resetting";
|
|
44
|
-
BleState["UNSUPPORTED"] = "unsupported";
|
|
45
|
-
BleState["UNAUTHORIZED"] = "unauthorized";
|
|
46
|
-
BleState["POWERED_OFF"] = "poweredOff";
|
|
47
|
-
BleState["POWERED_ON"] = "poweredOn";
|
|
48
|
-
})(BleState = exports.BleState || (exports.BleState = {}));
|
package/lib/device.d.ts
DELETED
|
File without changes
|
package/lib/device.js
DELETED
|
File without changes
|