incyclist-devices 3.0.30 → 3.0.32

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.
@@ -718,6 +718,9 @@ class BleInterface extends node_events_1.EventEmitter {
718
718
  getExpectedServices() {
719
719
  return this.getAdapterFactory().getAllSupportedServices();
720
720
  }
721
+ getSupportedServices() {
722
+ return this.expectedServices;
723
+ }
721
724
  logEvent(event) {
722
725
  if (this.logDisabled && event.message !== 'Error')
723
726
  return;
@@ -4,6 +4,7 @@ exports.BlePeripheral = void 0;
4
4
  const utils_js_1 = require("../../utils/utils.js");
5
5
  const utils_js_2 = require("../utils.js");
6
6
  const interface_js_1 = require("./interface.js");
7
+ const SERVICE_COMPLETENESS_WHITELIST = ['MRK-R15'];
7
8
  class BlePeripheral {
8
9
  announcement;
9
10
  connected = false;
@@ -159,7 +160,7 @@ class BlePeripheral {
159
160
  const promise = this.discoverServicesPromise;
160
161
  const res = await promise;
161
162
  (0, utils_js_1.sleep)(0).then(() => { delete this.discoverServicesPromise; });
162
- const isComplete = this.checkAnnouncedServices(res);
163
+ const isComplete = !this.isServiceCompletenessCheckApplicable() || this.checkAnnouncedServices(res);
163
164
  this.serviceDiscoveryIncomplete = !isComplete;
164
165
  if (!isComplete) {
165
166
  const { name, address } = this.getInfo();
@@ -168,8 +169,13 @@ class BlePeripheral {
168
169
  }
169
170
  return res;
170
171
  }
172
+ isServiceCompletenessCheckApplicable() {
173
+ const { name } = this.getInfo();
174
+ return !!name && SERVICE_COMPLETENESS_WHITELIST.some(prefix => name.startsWith(prefix));
175
+ }
171
176
  checkAnnouncedServices(discovered) {
172
- const announced = this.getAnnouncedServices();
177
+ const expected = this.ble.getSupportedServices();
178
+ const announced = this.getAnnouncedServices().filter(a => expected.some(e => (0, utils_js_2.isSameServiceFamily)(a, e)));
173
179
  const toBeChecked = discovered.map(x => (0, utils_js_2.beautifyUUID)(x));
174
180
  const cntAnnounced = announced.length;
175
181
  let cntVerified = 0;
@@ -41,6 +41,7 @@ class CscMeasurement {
41
41
  const { rpm } = this.parseCrankData(crankData);
42
42
  this.data.cadence = rpm;
43
43
  }
44
+ this.data.raw = data.toString('hex');
44
45
  return this.data;
45
46
  }
46
47
  parseCrankData(crankData) {
@@ -49,6 +49,10 @@ class BleCyclingSpeedCadenceDevice extends sensor_js_1.TBleSensor {
49
49
  }
50
50
  const parsed = parser.parse(data);
51
51
  this.data = { ...this.data, ...parsed };
52
+ if (this.data.speed < 0) {
53
+ this.logEvent({ message: 'error', fn: 'onData', error: 'speed<0', speed: this.data.speed, raw: this.data.raw });
54
+ return false;
55
+ }
52
56
  this.emit('data', this.data);
53
57
  return true;
54
58
  }
@@ -66,6 +66,9 @@ class DirectConnectInterface extends node_events_1.EventEmitter {
66
66
  createPeripheral(announcement) {
67
67
  return peripheral_js_1.DirectConnectPeripheral.create(announcement);
68
68
  }
69
+ getSupportedServices() {
70
+ return [];
71
+ }
69
72
  createDeviceSetting(service) {
70
73
  try {
71
74
  const name = service.name;
@@ -715,6 +715,9 @@ export class BleInterface extends EventEmitter {
715
715
  getExpectedServices() {
716
716
  return this.getAdapterFactory().getAllSupportedServices();
717
717
  }
718
+ getSupportedServices() {
719
+ return this.expectedServices;
720
+ }
718
721
  logEvent(event) {
719
722
  if (this.logDisabled && event.message !== 'Error')
720
723
  return;
@@ -1,6 +1,7 @@
1
1
  import { sleep } from "../../utils/utils.js";
2
2
  import { beautifyUUID, fullUUID, isSameServiceFamily, matches } from "../utils.js";
3
3
  import { BleInterface } from "./interface.js";
4
+ const SERVICE_COMPLETENESS_WHITELIST = ['MRK-R15'];
4
5
  export class BlePeripheral {
5
6
  announcement;
6
7
  connected = false;
@@ -156,7 +157,7 @@ export class BlePeripheral {
156
157
  const promise = this.discoverServicesPromise;
157
158
  const res = await promise;
158
159
  sleep(0).then(() => { delete this.discoverServicesPromise; });
159
- const isComplete = this.checkAnnouncedServices(res);
160
+ const isComplete = !this.isServiceCompletenessCheckApplicable() || this.checkAnnouncedServices(res);
160
161
  this.serviceDiscoveryIncomplete = !isComplete;
161
162
  if (!isComplete) {
162
163
  const { name, address } = this.getInfo();
@@ -165,8 +166,13 @@ export class BlePeripheral {
165
166
  }
166
167
  return res;
167
168
  }
169
+ isServiceCompletenessCheckApplicable() {
170
+ const { name } = this.getInfo();
171
+ return !!name && SERVICE_COMPLETENESS_WHITELIST.some(prefix => name.startsWith(prefix));
172
+ }
168
173
  checkAnnouncedServices(discovered) {
169
- const announced = this.getAnnouncedServices();
174
+ const expected = this.ble.getSupportedServices();
175
+ const announced = this.getAnnouncedServices().filter(a => expected.some(e => isSameServiceFamily(a, e)));
170
176
  const toBeChecked = discovered.map(x => beautifyUUID(x));
171
177
  const cntAnnounced = announced.length;
172
178
  let cntVerified = 0;
@@ -38,6 +38,7 @@ export class CscMeasurement {
38
38
  const { rpm } = this.parseCrankData(crankData);
39
39
  this.data.cadence = rpm;
40
40
  }
41
+ this.data.raw = data.toString('hex');
41
42
  return this.data;
42
43
  }
43
44
  parseCrankData(crankData) {
@@ -46,6 +46,10 @@ export class BleCyclingSpeedCadenceDevice extends TBleSensor {
46
46
  }
47
47
  const parsed = parser.parse(data);
48
48
  this.data = { ...this.data, ...parsed };
49
+ if (this.data.speed < 0) {
50
+ this.logEvent({ message: 'error', fn: 'onData', error: 'speed<0', speed: this.data.speed, raw: this.data.raw });
51
+ return false;
52
+ }
49
53
  this.emit('data', this.data);
50
54
  return true;
51
55
  }
@@ -63,6 +63,9 @@ export default class DirectConnectInterface extends EventEmitter {
63
63
  createPeripheral(announcement) {
64
64
  return DirectConnectPeripheral.create(announcement);
65
65
  }
66
+ getSupportedServices() {
67
+ return [];
68
+ }
66
69
  createDeviceSetting(service) {
67
70
  try {
68
71
  const name = service.name;
@@ -110,6 +110,7 @@ export declare class BleInterface extends EventEmitter implements IBleInterface<
110
110
  protected getAdapterFactory(): BleAdapterFactory<TBleSensor>;
111
111
  protected getConnectTimeout(): number;
112
112
  protected getExpectedServices(): string[];
113
+ getSupportedServices(): string[];
113
114
  logEvent(event: any): void;
114
115
  logError(err: Error, fn: string, args?: any): void;
115
116
  protected reset(): Promise<void>;
@@ -35,6 +35,7 @@ export declare class BlePeripheral implements IBlePeripheral {
35
35
  protected onPeripheralDisconnect(): Promise<void>;
36
36
  protected onPeripheralError(err: Error): void;
37
37
  discoverServices(): Promise<string[]>;
38
+ protected isServiceCompletenessCheckApplicable(): boolean;
38
39
  protected checkAnnouncedServices(discovered: string[]): boolean;
39
40
  protected _discoverServices(): Promise<string[]>;
40
41
  discoverCharacteristics(serviceUUID: string): Promise<BleCharacteristic[]>;
@@ -3,6 +3,7 @@ import { CharacteristicParser, Feature } from "../types.js";
3
3
  export type CyclingCadenceAndSpeed = {
4
4
  cadence?: number;
5
5
  speed?: number;
6
+ raw?: string;
6
7
  };
7
8
  export declare class CscMeasurement implements CharacteristicParser<CyclingCadenceAndSpeed> {
8
9
  protected data: CyclingCadenceAndSpeed;
@@ -150,6 +150,7 @@ export interface IBleInterface<T extends PeripheralAnnouncement> extends Incycli
150
150
  waitForPeripheral(settings: DeviceSettings): Promise<IBlePeripheral>;
151
151
  pauseDiscovery?(): Promise<void>;
152
152
  resumeDiscovery?(): Promise<void>;
153
+ getSupportedServices(): string[];
153
154
  }
154
155
  export interface IBlePeripheral {
155
156
  services: BleService[];
@@ -32,6 +32,7 @@ export default class DirectConnectInterface extends EventEmitter implements IBle
32
32
  constructor(props: InterfaceProps);
33
33
  setProps(props: InterfaceProps): void;
34
34
  createPeripheral(announcement: MulticastDnsAnnouncement): IBlePeripheral;
35
+ getSupportedServices(): string[];
35
36
  createDeviceSetting(service: MulticastDnsAnnouncement): BleDeviceSettings;
36
37
  createPeripheralFromSettings(settings: DeviceSettings): IBlePeripheral;
37
38
  addKnownDevice(settings: BleDeviceSettings): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "3.0.30",
3
+ "version": "3.0.32",
4
4
  "scripts": {
5
5
  "lint": "eslint . --ext .ts",
6
6
  "build": "npm run build:esm && npm run build:cjs",