incyclist-devices 2.3.39 → 2.3.41

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.
@@ -2,7 +2,7 @@ import EventEmitter from "events";
2
2
  import { EventLogger } from "gd-eventlog";
3
3
  import { Channel, IAntDevice, IChannel, ISensor } from "incyclist-ant-plus";
4
4
  import { AntDeviceSettings, AntScanProps, AntInterfaceProps } from "../types";
5
- import { IncyclistInterface } from "../../types";
5
+ import { DeviceSettings, IncyclistInterface } from "../../types";
6
6
  import AntDeviceBinding from "./binding";
7
7
  type ChannelUsage = 'scan' | 'sensor';
8
8
  interface ChannelInfo {
@@ -52,5 +52,6 @@ export default class AntInterface extends EventEmitter implements IncyclistInter
52
52
  private blockChannel;
53
53
  private unblockChannel;
54
54
  stopSensor(sensor: ISensor): Promise<boolean>;
55
+ addKnownDevice(_settings: DeviceSettings): void;
55
56
  }
56
57
  export {};
@@ -412,6 +412,8 @@ class AntInterface extends events_1.default {
412
412
  }
413
413
  });
414
414
  }
415
+ addKnownDevice(_settings) {
416
+ }
415
417
  }
416
418
  AntInterface._instance = undefined;
417
419
  AntInterface.INTERFACE_NAME = 'ant';
@@ -94,6 +94,7 @@ export declare class BleInterface extends EventEmitter implements IBleInterface<
94
94
  protected find(service: BlePeripheralAnnouncement): Announcement;
95
95
  protected getAll(): Announcement[];
96
96
  setDebug(enabled: boolean): void;
97
+ addKnownDevice(_settings: BleDeviceSettings): void;
97
98
  protected connectBle(): Promise<boolean>;
98
99
  protected waitForBleConnected(): Promise<boolean>;
99
100
  protected onError(err: Error): void;
@@ -583,6 +583,8 @@ class BleInterface extends events_1.default {
583
583
  setDebug(enabled) {
584
584
  this.debug = enabled;
585
585
  }
586
+ addKnownDevice(_settings) {
587
+ }
586
588
  connectBle() {
587
589
  return __awaiter(this, void 0, void 0, function* () {
588
590
  this.currentBleState = this.getBinding().state;
@@ -72,6 +72,7 @@ export interface BleDeviceSettings extends DeviceSettings {
72
72
  profile?: string;
73
73
  address?: string;
74
74
  name?: string;
75
+ services?: string;
75
76
  }
76
77
  export interface BleDeviceProperties extends DeviceProperties {
77
78
  wheelDiameter?: number;
@@ -11,6 +11,7 @@ import { InterfaceFactory } from "../../ble/base/types";
11
11
  interface Announcement {
12
12
  service: MulticastDnsAnnouncement;
13
13
  ts: number;
14
+ source?: string;
14
15
  }
15
16
  export default class DirectConnectInterface extends EventEmitter implements IBleInterface<MulticastDnsAnnouncement> {
16
17
  protected static _instance: DirectConnectInterface;
@@ -33,6 +34,7 @@ export default class DirectConnectInterface extends EventEmitter implements IBle
33
34
  createPeripheral(announcement: MulticastDnsAnnouncement): IBlePeripheral;
34
35
  createDeviceSetting(service: MulticastDnsAnnouncement): BleDeviceSettings;
35
36
  createPeripheralFromSettings(settings: DeviceSettings): IBlePeripheral;
37
+ addKnownDevice(settings: BleDeviceSettings): void;
36
38
  getLogger(): EventLogger;
37
39
  setLogger(logger: EventLogger): void;
38
40
  getName(): string;
@@ -66,6 +68,8 @@ export default class DirectConnectInterface extends EventEmitter implements IBle
66
68
  logError(err: Error, fn: string, args?: any): void;
67
69
  protected getProtocol(announcement: MulticastDnsAnnouncement): BleProtocol;
68
70
  protected getBestDeviceMatch(DeviceClasses: (typeof TBleSensor)[]): typeof TBleSensor;
71
+ protected createAnnouncementFromSettings(settings: BleDeviceSettings): MulticastDnsAnnouncement;
72
+ protected getServiceUUIDs(settings: BleDeviceSettings): string[];
69
73
  protected getAdapterFactory(): BleAdapterFactory<any>;
70
74
  }
71
75
  export declare class DirectConnectInterfaceFactory extends InterfaceFactory {
@@ -19,7 +19,10 @@ const task_1 = require("../../utils/task");
19
19
  const peripheral_1 = require("./peripheral");
20
20
  const ble_1 = require("../../ble");
21
21
  const types_1 = require("../../ble/base/types");
22
+ const consts_1 = require("../../ble/consts");
23
+ const consts_2 = require("../../ble/wahoo/consts");
22
24
  const DC_TYPE = 'wahoo-fitness-tnp';
25
+ const DC_PORT = 36866;
23
26
  const DC_EXPIRATION_TIMEOUT = 10 * 1000 * 60;
24
27
  let instanceId = 0;
25
28
  class DirectConnectInterface extends events_1.default {
@@ -66,12 +69,16 @@ class DirectConnectInterface extends events_1.default {
66
69
  return peripheral_1.DirectConnectPeripheral.create(announcement);
67
70
  }
68
71
  createDeviceSetting(service) {
72
+ var _a, _b;
69
73
  try {
70
74
  const name = service.name;
71
75
  const protocol = this.getProtocol(service);
72
- return { interface: DirectConnectInterface.INTERFACE_NAME, name, protocol };
76
+ const address = service.address;
77
+ const services = (_b = (_a = service.serviceUUIDs) === null || _a === void 0 ? void 0 : _a.map(uuid => (0, ble_1.beautifyUUID)(uuid, false))) === null || _b === void 0 ? void 0 : _b.join(',');
78
+ console.log('# created device setting from announcement', name, service.serviceUUIDs, services);
79
+ return { interface: DirectConnectInterface.INTERFACE_NAME, name, protocol, address, services };
73
80
  }
74
- catch (_a) {
81
+ catch (_c) {
75
82
  return null;
76
83
  }
77
84
  }
@@ -81,6 +88,12 @@ class DirectConnectInterface extends events_1.default {
81
88
  return null;
82
89
  return this.createPeripheral(info.service);
83
90
  }
91
+ addKnownDevice(settings) {
92
+ const announcement = this.createAnnouncementFromSettings(settings);
93
+ if (announcement) {
94
+ this.addService(announcement, 'known-device');
95
+ }
96
+ }
84
97
  getLogger() {
85
98
  return this.logger;
86
99
  }
@@ -236,6 +249,7 @@ class DirectConnectInterface extends events_1.default {
236
249
  const device = this.createDeviceSetting(service);
237
250
  if (!device)
238
251
  return;
252
+ console.log('# emitting device', device, service);
239
253
  this.emit('device', device, service);
240
254
  }
241
255
  buildDeviceSettings(matching = []) {
@@ -243,15 +257,22 @@ class DirectConnectInterface extends events_1.default {
243
257
  }
244
258
  addService(service, source) {
245
259
  var _a, _b;
260
+ console.log(`# DirectConnectInterface.addService from ${source}`, service.name, service.serviceUUIDs);
261
+ const src = source === 'known-device' ? 'known-device' : 'mdns';
246
262
  try {
247
263
  service.transport = this.getName();
248
264
  const existing = this.find(service);
249
265
  if (existing) {
250
266
  const idx = this.services.indexOf(existing);
251
267
  this.services[idx] = { ts: Date.now(), service };
268
+ if (src !== 'known-device' && existing.source === 'known-device') {
269
+ this.services[idx].source = src;
270
+ this.logEvent({ message: 'device re-announced', device: service.name, announcement: service, source });
271
+ this.emitDevice(service);
272
+ }
252
273
  }
253
274
  else {
254
- this.services.push({ ts: Date.now(), service });
275
+ this.services.push({ ts: Date.now(), service, source: src });
255
276
  if (!((_a = service.serviceUUIDs) === null || _a === void 0 ? void 0 : _a.length))
256
277
  return;
257
278
  this.logEvent({ message: 'device announced', device: service.name, announcement: service, source });
@@ -306,6 +327,42 @@ class DirectConnectInterface extends events_1.default {
306
327
  details.sort((a, b) => b.priority - a.priority);
307
328
  return details[0].class;
308
329
  }
330
+ createAnnouncementFromSettings(settings) {
331
+ if (settings.protocol && settings.address) {
332
+ const announcement = {
333
+ name: settings.name,
334
+ address: settings.address,
335
+ protocol: 'tcp',
336
+ port: DC_PORT,
337
+ type: DC_TYPE,
338
+ transport: 'wifi',
339
+ serviceUUIDs: this.getServiceUUIDs(settings),
340
+ };
341
+ console.log('# created announcement from settings', announcement);
342
+ return announcement;
343
+ }
344
+ }
345
+ getServiceUUIDs(settings) {
346
+ if (settings.services && settings.services.length > 0) {
347
+ return settings.services.split(',').map(s => s.trim());
348
+ }
349
+ switch (settings.protocol) {
350
+ case 'fm':
351
+ return ['1826'];
352
+ case 'hr':
353
+ return ['180d'];
354
+ case 'wahoo':
355
+ return [consts_1.CSP, consts_2.WAHOO_ADVANCED_FTMS];
356
+ case 'cp':
357
+ return [consts_1.CSP];
358
+ case 'csc':
359
+ return [consts_1.CSC];
360
+ case 'zwift-play':
361
+ return ['0000000119ca465186e5fa29dcdd09d1'];
362
+ default:
363
+ return [];
364
+ }
365
+ }
309
366
  getAdapterFactory() {
310
367
  return ble_1.BleAdapterFactory.getInstance('wifi');
311
368
  }
@@ -2,7 +2,7 @@ import EventEmitter from "events";
2
2
  import { BindingInterface } from "@serialport/bindings-interface";
3
3
  import { SerialPortStream } from '@serialport/stream';
4
4
  import { SerialDeviceSettings, SerialScannerProps, PortMapping, SerialInterfaceProps } from "../types";
5
- import { IncyclistInterface } from "../../types";
5
+ import { DeviceSettings, IncyclistInterface } from "../../types";
6
6
  import { EventLogger } from "gd-eventlog";
7
7
  export default class SerialInterface extends EventEmitter implements IncyclistInterface {
8
8
  ifaceName: string;
@@ -31,4 +31,5 @@ export default class SerialInterface extends EventEmitter implements IncyclistIn
31
31
  closePort(path: string): Promise<Boolean>;
32
32
  scan(props: SerialScannerProps): Promise<SerialDeviceSettings[]>;
33
33
  stopScan(): Promise<boolean>;
34
+ addKnownDevice(_settings: DeviceSettings): void;
34
35
  }
@@ -289,6 +289,8 @@ class SerialInterface extends events_1.default {
289
289
  return true;
290
290
  });
291
291
  }
292
+ addKnownDevice(_settings) {
293
+ }
292
294
  }
293
295
  SerialInterface._instances = [];
294
296
  exports.default = SerialInterface;
@@ -15,4 +15,5 @@ export interface IncyclistInterface extends EventEmitter {
15
15
  isConnected(): boolean;
16
16
  scan(props: IncyclistScanProps): Promise<DeviceSettings[]>;
17
17
  stopScan(): Promise<boolean>;
18
+ addKnownDevice?(settings: DeviceSettings): void;
18
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "2.3.39",
3
+ "version": "2.3.41",
4
4
  "dependencies": {
5
5
  "@protobuf-ts/runtime": "^2.11.1",
6
6
  "@serialport/bindings-interface": "^1.2.2",