incyclist-devices 1.5.22 → 1.5.24

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.
@@ -31,12 +31,15 @@ export default class AntAdapter extends IncyclistDevice implements Device {
31
31
  onDataFn: OnDeviceDataCallback;
32
32
  protected ivDataTimeout: NodeJS.Timer;
33
33
  protected lastDataTS: number;
34
+ protected dataMsgCount: number;
35
+ private ivWaitForData;
34
36
  constructor(sensor: ISensor, protocol: AntProtocol, settings?: any);
35
37
  isBike(): boolean;
36
38
  isPower(): boolean;
37
39
  isHrm(): boolean;
38
40
  getDisplayName(): string;
39
41
  isSame(device: DeviceAdapter): boolean;
42
+ waitForData(timeout: number): Promise<unknown>;
40
43
  getID(): string;
41
44
  getName(): string;
42
45
  getProfile(): string;
@@ -28,6 +28,7 @@ class AntAdapter extends device_1.default {
28
28
  this.ignorePower = false;
29
29
  this.deviceData = {};
30
30
  this.data = {};
31
+ this.dataMsgCount = 0;
31
32
  this.updateFrequency = exports.DEFAULT_UPDATE_FREQUENCY;
32
33
  this.channel = undefined;
33
34
  this.paused = false;
@@ -52,6 +53,29 @@ class AntAdapter extends device_1.default {
52
53
  const adapter = device;
53
54
  return (adapter.getID() === this.getID() && adapter.getProfile() === this.getProfile());
54
55
  }
56
+ waitForData(timeout) {
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ const startTs = Date.now();
59
+ const timeoutTs = startTs + timeout;
60
+ return new Promise((resolve, reject) => {
61
+ if (this.ivWaitForData)
62
+ return reject(new Error('busy'));
63
+ this.ivWaitForData = setInterval(() => {
64
+ const nowTs = Date.now();
65
+ if (nowTs > timeoutTs && this.dataMsgCount === 0) {
66
+ clearInterval(this.ivWaitForData);
67
+ this.ivWaitForData = undefined;
68
+ reject(new Error('No Data Received'));
69
+ }
70
+ if (this.dataMsgCount > 0) {
71
+ clearInterval(this.ivWaitForData);
72
+ this.ivWaitForData = undefined;
73
+ resolve(nowTs - startTs);
74
+ }
75
+ }, 500);
76
+ });
77
+ });
78
+ }
55
79
  getID() {
56
80
  return this.sensor.getDeviceID().toString();
57
81
  }
@@ -110,9 +134,11 @@ class AntAdapter extends device_1.default {
110
134
  clearInterval(this.ivDataTimeout);
111
135
  this.ivDataTimeout = undefined;
112
136
  this.lastDataTS = undefined;
137
+ this.dataMsgCount = 0;
113
138
  }
114
139
  start(props) {
115
140
  return __awaiter(this, void 0, void 0, function* () {
141
+ this.dataMsgCount = 0;
116
142
  if (props && props.user)
117
143
  this.userSettings = props.user;
118
144
  if (props && props.bikeSettings)
package/lib/antv2/fe.d.ts CHANGED
@@ -9,7 +9,6 @@ export default class AntFEAdapter extends AntAdapter {
9
9
  protected cyclingMode: CyclingMode;
10
10
  protected distanceInternal?: number;
11
11
  protected startProps: any;
12
- protected msgCount: number;
13
12
  protected isReconnecting: boolean;
14
13
  constructor(sensor: ISensor, protocol: AntProtocol);
15
14
  isBike(): boolean;
package/lib/antv2/fe.js CHANGED
@@ -30,7 +30,7 @@ class AntFEAdapter extends ant_device_1.default {
30
30
  this.deviceData = {
31
31
  DeviceID: sensor.getDeviceID()
32
32
  };
33
- this.msgCount = 0;
33
+ this.dataMsgCount = 0;
34
34
  this.logger = new gd_eventlog_1.EventLogger('Ant+FE');
35
35
  this.isReconnecting = false;
36
36
  }
@@ -118,13 +118,14 @@ class AntFEAdapter extends ant_device_1.default {
118
118
  });
119
119
  }
120
120
  onDeviceData(deviceData) {
121
+ this.dataMsgCount++;
122
+ this.lastDataTS = Date.now();
121
123
  if (!this.started || this.isStopped())
122
124
  return;
123
- this.msgCount++;
124
125
  this.deviceData = deviceData;
125
- this.lastDataTS = Date.now();
126
- if (!this.ivDataTimeout)
126
+ if (this.dataMsgCount === 1) {
127
127
  this.startDataTimeoutCheck();
128
+ }
128
129
  try {
129
130
  const logData = this.getLogData(deviceData, ['PairedDevices', 'RawData']);
130
131
  this.logger.logEvent({ message: 'onDeviceData', data: logData });
@@ -198,11 +199,11 @@ class AntFEAdapter extends ant_device_1.default {
198
199
  _super.start.call(this, props);
199
200
  this.startProps = props;
200
201
  this.logger.logEvent({ message: 'start', props });
201
- this.msgCount = 0;
202
202
  const opts = props || {};
203
203
  const { args = {}, user = {} } = opts;
204
204
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
205
205
  const { timeout = 20000 } = props || {};
206
+ const totalTimeout = timeout + 10000;
206
207
  let to;
207
208
  const stopTimeoutCheck = () => {
208
209
  if (to) {
@@ -214,15 +215,33 @@ class AntFEAdapter extends ant_device_1.default {
214
215
  yield this.stop();
215
216
  reject(new Error(`could not start device, reason:timeout`));
216
217
  to = null;
217
- }), timeout);
218
+ }), totalTimeout);
218
219
  this.setFEDefaultTimeout();
219
220
  let success = false;
220
221
  let status = { userSent: false, slopeSent: false };
221
222
  let retry = 0;
223
+ let startSuccess = 0;
222
224
  while (!success && retry < MAX_RETRIES) {
223
225
  retry++;
224
226
  if (!this.started) {
225
227
  this.started = yield this.ant.startSensor(this.sensor, this.onDeviceData.bind(this));
228
+ if (this.started) {
229
+ startSuccess++;
230
+ }
231
+ if (this.started && startSuccess === 1) {
232
+ try {
233
+ yield this.waitForData(timeout);
234
+ }
235
+ catch (err) {
236
+ stopTimeoutCheck();
237
+ try {
238
+ yield yield this.ant.stopSensor(this.sensor);
239
+ }
240
+ catch (_a) { }
241
+ this.started = false;
242
+ return reject(new Error(`could not start device, reason: ${err.message}`));
243
+ }
244
+ }
226
245
  status = { userSent: false, slopeSent: false };
227
246
  }
228
247
  if (!this.started) {
@@ -244,12 +263,12 @@ class AntFEAdapter extends ant_device_1.default {
244
263
  try {
245
264
  yield yield this.ant.stopSensor(this.sensor);
246
265
  }
247
- catch (_a) { }
266
+ catch (_b) { }
248
267
  this.started = false;
249
268
  }
250
269
  success = status.userSent && status.slopeSent;
251
270
  }
252
- while (success && this.msgCount === 0) {
271
+ while (success && this.dataMsgCount === 0) {
253
272
  yield (0, utils_2.sleep)(500);
254
273
  }
255
274
  if (success) {
@@ -260,7 +279,10 @@ class AntFEAdapter extends ant_device_1.default {
260
279
  else {
261
280
  this.logger.logEvent({ message: 'start failed' });
262
281
  stopTimeoutCheck();
263
- reject(new Error('could not start device, reason: could not send FE commands'));
282
+ if (this.started)
283
+ reject(new Error('could not start device, reason: could not send FE commands'));
284
+ else
285
+ reject(new Error('could not start device, reason: could not connect'));
264
286
  }
265
287
  }));
266
288
  });
package/lib/antv2/hr.js CHANGED
@@ -37,10 +37,11 @@ class AntHrAdapter extends ant_device_1.default {
37
37
  return `${(0, utils_1.getBrand)(manID)} Hrm ${DeviceID}${hrmStr}`;
38
38
  }
39
39
  onDeviceData(deviceData) {
40
+ this.dataMsgCount++;
41
+ this.lastDataTS = Date.now();
40
42
  if (!this.started)
41
43
  return;
42
44
  this.deviceData = deviceData;
43
- this.lastDataTS = Date.now();
44
45
  if (!this.ivDataTimeout)
45
46
  this.startDataTimeoutCheck();
46
47
  try {
@@ -67,7 +68,7 @@ class AntHrAdapter extends ant_device_1.default {
67
68
  return __awaiter(this, void 0, void 0, function* () {
68
69
  _super.start.call(this, props);
69
70
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
70
- const { timeout } = props || {};
71
+ const { timeout = 20000 } = props || {};
71
72
  let to;
72
73
  if (timeout) {
73
74
  to = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
@@ -76,9 +77,14 @@ class AntHrAdapter extends ant_device_1.default {
76
77
  }), timeout);
77
78
  }
78
79
  this.started = yield this.ant.startSensor(this.sensor, this.onDeviceData.bind(this));
79
- if (to)
80
- clearTimeout(to);
81
- resolve(this.started);
80
+ try {
81
+ yield this.waitForData(timeout - 100);
82
+ if (to)
83
+ clearTimeout(to);
84
+ resolve(this.started);
85
+ }
86
+ catch (err) {
87
+ }
82
88
  }));
83
89
  });
84
90
  }
package/lib/antv2/pwr.js CHANGED
@@ -55,10 +55,11 @@ class AntPwrAdapter extends ant_device_1.default {
55
55
  return logData;
56
56
  }
57
57
  onDeviceData(deviceData) {
58
+ this.dataMsgCount++;
59
+ this.lastDataTS = Date.now();
58
60
  if (!this.started)
59
61
  return;
60
62
  this.deviceData = deviceData;
61
- this.lastDataTS = Date.now();
62
63
  if (!this.ivDataTimeout)
63
64
  this.startDataTimeoutCheck();
64
65
  try {
@@ -135,7 +136,7 @@ class AntPwrAdapter extends ant_device_1.default {
135
136
  return true;
136
137
  _super.start.call(this, props);
137
138
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
138
- const { timeout } = props || {};
139
+ const { timeout = 20000 } = props || {};
139
140
  let to;
140
141
  if (timeout) {
141
142
  to = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
@@ -144,9 +145,14 @@ class AntPwrAdapter extends ant_device_1.default {
144
145
  }), timeout);
145
146
  }
146
147
  this.started = yield this.ant.startSensor(this.sensor, this.onDeviceData.bind(this));
147
- if (to)
148
- clearTimeout(to);
149
- resolve(this.started);
148
+ try {
149
+ yield this.waitForData(timeout - 100);
150
+ if (to)
151
+ clearTimeout(to);
152
+ resolve(this.started);
153
+ }
154
+ catch (err) {
155
+ }
150
156
  }));
151
157
  });
152
158
  }
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "incyclist-devices",
3
- "version": "1.5.22",
3
+ "version": "1.5.24",
4
4
  "dependencies": {
5
5
  "@serialport/parser-byte-length": "^9.0.1",
6
6
  "@serialport/parser-delimiter": "^9.0.1",
7
7
  "@types/serialport": "^8.0.1",
8
8
  "gd-ant-plus": "^0.0.33",
9
- "incyclist-ant-plus": "file:../ant-plus",
10
- "incyclist-devices": "^1.5.21",
9
+ "incyclist-ant-plus": "^0.1.14",
11
10
  "win32filetime": "^1.0.2"
12
11
  },
13
12
  "peerDependencies": {