incyclist-devices 2.3.39 → 2.3.42

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';
@@ -49,8 +49,8 @@ class AntFEAdapter extends adapter_1.default {
49
49
  if (this.promiseStop)
50
50
  return;
51
51
  if (this.promiseSendUpdate !== undefined) {
52
- this.logEvent({ message: 'send bike update skipped', device: this.getName(), request, reason: 'busy' });
53
- return;
52
+ yield this.promiseSendUpdate;
53
+ this.promiseSendUpdate = undefined;
54
54
  }
55
55
  let isReset = request.reset && Object.keys(request).length === 1;
56
56
  const update = isReset ? this.getCyclingMode().getBikeInitRequest() : this.getCyclingMode().buildUpdate(request);
@@ -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,15 @@ 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
+ return { interface: DirectConnectInterface.INTERFACE_NAME, name, protocol, address, services };
73
79
  }
74
- catch (_a) {
80
+ catch (_c) {
75
81
  return null;
76
82
  }
77
83
  }
@@ -81,6 +87,12 @@ class DirectConnectInterface extends events_1.default {
81
87
  return null;
82
88
  return this.createPeripheral(info.service);
83
89
  }
90
+ addKnownDevice(settings) {
91
+ const announcement = this.createAnnouncementFromSettings(settings);
92
+ if (announcement) {
93
+ this.addService(announcement, 'known-device');
94
+ }
95
+ }
84
96
  getLogger() {
85
97
  return this.logger;
86
98
  }
@@ -243,15 +255,21 @@ class DirectConnectInterface extends events_1.default {
243
255
  }
244
256
  addService(service, source) {
245
257
  var _a, _b;
258
+ const src = source === 'known-device' ? 'known-device' : 'mdns';
246
259
  try {
247
260
  service.transport = this.getName();
248
261
  const existing = this.find(service);
249
262
  if (existing) {
250
263
  const idx = this.services.indexOf(existing);
251
264
  this.services[idx] = { ts: Date.now(), service };
265
+ if (src !== 'known-device' && existing.source === 'known-device') {
266
+ this.services[idx].source = src;
267
+ this.logEvent({ message: 'device re-announced', device: service.name, announcement: service, source });
268
+ this.emitDevice(service);
269
+ }
252
270
  }
253
271
  else {
254
- this.services.push({ ts: Date.now(), service });
272
+ this.services.push({ ts: Date.now(), service, source: src });
255
273
  if (!((_a = service.serviceUUIDs) === null || _a === void 0 ? void 0 : _a.length))
256
274
  return;
257
275
  this.logEvent({ message: 'device announced', device: service.name, announcement: service, source });
@@ -306,6 +324,41 @@ class DirectConnectInterface extends events_1.default {
306
324
  details.sort((a, b) => b.priority - a.priority);
307
325
  return details[0].class;
308
326
  }
327
+ createAnnouncementFromSettings(settings) {
328
+ if (settings.protocol && settings.address) {
329
+ const announcement = {
330
+ name: settings.name,
331
+ address: settings.address,
332
+ protocol: 'tcp',
333
+ port: DC_PORT,
334
+ type: DC_TYPE,
335
+ transport: 'wifi',
336
+ serviceUUIDs: this.getServiceUUIDs(settings),
337
+ };
338
+ return announcement;
339
+ }
340
+ }
341
+ getServiceUUIDs(settings) {
342
+ if (settings.services && settings.services.length > 0) {
343
+ return settings.services.split(',').map(s => s.trim());
344
+ }
345
+ switch (settings.protocol) {
346
+ case 'fm':
347
+ return ['1826'];
348
+ case 'hr':
349
+ return ['180d'];
350
+ case 'wahoo':
351
+ return [consts_1.CSP, consts_2.WAHOO_ADVANCED_FTMS];
352
+ case 'cp':
353
+ return [consts_1.CSP];
354
+ case 'csc':
355
+ return [consts_1.CSC];
356
+ case 'zwift-play':
357
+ return ['0000000119ca465186e5fa29dcdd09d1'];
358
+ default:
359
+ return [];
360
+ }
361
+ }
309
362
  getAdapterFactory() {
310
363
  return ble_1.BleAdapterFactory.getInstance('wifi');
311
364
  }
@@ -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.42",
4
4
  "dependencies": {
5
5
  "@protobuf-ts/runtime": "^2.11.1",
6
6
  "@serialport/bindings-interface": "^1.2.2",
@@ -26,7 +26,7 @@
26
26
  "bonjour-service": "^1.3.0",
27
27
  "eslint": "^9.35.0",
28
28
  "jest": "^30.1.3",
29
- "npm": "^11.6.1",
29
+ "npm": "^11.6.4",
30
30
  "protoc": "^32.1.0",
31
31
  "ts-jest": "^29.4.1",
32
32
  "typescript": "^5.9.2"