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.
Files changed (114) hide show
  1. package/README.MD +238 -0
  2. package/lib/adapters.d.ts +1 -0
  3. package/lib/adapters.js +19 -0
  4. package/lib/antv2/adapter-factory.d.ts +8 -7
  5. package/lib/antv2/adapter-factory.js +4 -2
  6. package/lib/antv2/adapter.d.ts +3 -2
  7. package/lib/antv2/adapter.js +15 -4
  8. package/lib/antv2/ant-interface.d.ts +6 -2
  9. package/lib/antv2/ant-interface.js +27 -21
  10. package/lib/antv2/binding.d.ts +1 -1
  11. package/lib/antv2/binding.js +1 -1
  12. package/lib/antv2/fe/adapter.d.ts +12 -9
  13. package/lib/antv2/fe/adapter.js +67 -27
  14. package/lib/antv2/hr/adapter.d.ts +6 -5
  15. package/lib/antv2/hr/adapter.js +19 -16
  16. package/lib/antv2/index.d.ts +2 -2
  17. package/lib/antv2/pwr/adapter.d.ts +6 -4
  18. package/lib/antv2/pwr/adapter.js +24 -16
  19. package/lib/antv2/sensor-factory.d.ts +2 -2
  20. package/lib/antv2/types.d.ts +5 -2
  21. package/lib/antv2/types.js +3 -0
  22. package/lib/antv2/utils.d.ts +3 -0
  23. package/lib/antv2/utils.js +12 -1
  24. package/lib/base/adpater.d.ts +14 -2
  25. package/lib/base/adpater.js +43 -4
  26. package/lib/ble/adapter-factory.d.ts +18 -16
  27. package/lib/ble/adapter-factory.js +54 -45
  28. package/lib/ble/base/adapter.d.ts +53 -0
  29. package/lib/ble/{adapter.js → base/adapter.js} +111 -9
  30. package/lib/ble/base/comms-utils.d.ts +7 -0
  31. package/lib/ble/base/comms-utils.js +91 -0
  32. package/lib/ble/{ble-comms.d.ts → base/comms.d.ts} +27 -17
  33. package/lib/ble/{ble-comms.js → base/comms.js} +179 -53
  34. package/lib/ble/bindings/index.d.ts +2 -0
  35. package/lib/ble/bindings/index.js +8 -0
  36. package/lib/ble/bindings/linux.d.ts +15 -0
  37. package/lib/ble/bindings/linux.js +39 -0
  38. package/lib/ble/bindings/mock.d.ts +9 -0
  39. package/lib/ble/bindings/mock.js +108 -0
  40. package/lib/ble/bindings/types.d.ts +57 -0
  41. package/lib/ble/bindings/types.js +96 -0
  42. package/lib/ble/ble-interface.d.ts +34 -46
  43. package/lib/ble/ble-interface.js +242 -345
  44. package/lib/ble/ble-peripheral.d.ts +4 -2
  45. package/lib/ble/ble-peripheral.js +39 -8
  46. package/lib/ble/consts.d.ts +1 -0
  47. package/lib/ble/consts.js +2 -1
  48. package/lib/ble/cp/adapter.d.ts +1 -2
  49. package/lib/ble/cp/adapter.js +2 -15
  50. package/lib/ble/cp/comm.d.ts +8 -5
  51. package/lib/ble/cp/comm.js +12 -27
  52. package/lib/ble/elite/adapter.d.ts +1 -2
  53. package/lib/ble/elite/adapter.js +12 -19
  54. package/lib/ble/elite/comms.d.ts +8 -4
  55. package/lib/ble/elite/comms.js +12 -25
  56. package/lib/ble/fm/adapter.d.ts +3 -2
  57. package/lib/ble/fm/adapter.js +129 -70
  58. package/lib/ble/fm/comms.d.ts +8 -8
  59. package/lib/ble/fm/comms.js +33 -55
  60. package/lib/ble/fm/types.d.ts +5 -0
  61. package/lib/ble/hr/adapter.d.ts +1 -4
  62. package/lib/ble/hr/adapter.js +1 -18
  63. package/lib/ble/hr/comm.d.ts +6 -2
  64. package/lib/ble/hr/comm.js +6 -2
  65. package/lib/ble/hr/mock.d.ts +7 -0
  66. package/lib/ble/hr/mock.js +47 -0
  67. package/lib/ble/index.d.ts +2 -1
  68. package/lib/ble/index.js +5 -5
  69. package/lib/ble/peripheral-cache.d.ts +43 -0
  70. package/lib/ble/peripheral-cache.js +107 -0
  71. package/lib/ble/tacx/adapter.d.ts +1 -1
  72. package/lib/ble/tacx/adapter.js +20 -14
  73. package/lib/ble/tacx/comms.d.ts +6 -6
  74. package/lib/ble/tacx/comms.js +10 -43
  75. package/lib/ble/types.d.ts +54 -27
  76. package/lib/ble/types.js +0 -17
  77. package/lib/ble/utils.d.ts +15 -5
  78. package/lib/ble/utils.js +25 -66
  79. package/lib/ble/wahoo/adapter.d.ts +1 -1
  80. package/lib/ble/wahoo/adapter.js +12 -10
  81. package/lib/ble/wahoo/comms.d.ts +7 -6
  82. package/lib/ble/wahoo/comms.js +15 -17
  83. package/lib/index.d.ts +10 -7
  84. package/lib/index.js +21 -25
  85. package/lib/interfaces.d.ts +2 -1
  86. package/lib/interfaces.js +4 -0
  87. package/lib/modes/power-base.js +4 -0
  88. package/lib/serial/adapter.d.ts +5 -0
  89. package/lib/serial/adapter.js +19 -0
  90. package/lib/serial/bindings/tcp.d.ts +2 -1
  91. package/lib/serial/bindings/tcp.js +19 -5
  92. package/lib/serial/daum/DaumAdapter.d.ts +1 -1
  93. package/lib/serial/daum/DaumAdapter.js +16 -10
  94. package/lib/serial/daum/premium/adapter.d.ts +1 -0
  95. package/lib/serial/daum/premium/adapter.js +9 -2
  96. package/lib/serial/daum/premium/comms.js +10 -3
  97. package/lib/serial/daum/premium/mock.js +0 -1
  98. package/lib/serial/index.d.ts +3 -3
  99. package/lib/serial/index.js +2 -2
  100. package/lib/serial/kettler/ergo-racer/adapter.d.ts +1 -4
  101. package/lib/serial/kettler/ergo-racer/adapter.js +15 -39
  102. package/lib/serial/serial-interface.d.ts +3 -1
  103. package/lib/serial/serial-interface.js +43 -17
  104. package/lib/simulator/Simulator.d.ts +2 -0
  105. package/lib/simulator/Simulator.js +8 -5
  106. package/lib/types/adapter.d.ts +10 -3
  107. package/lib/types/device.d.ts +3 -0
  108. package/lib/types/interface.d.ts +7 -3
  109. package/package.json +3 -5
  110. package/lib/ble/adapter.d.ts +0 -41
  111. package/lib/ble/ble.d.ts +0 -57
  112. package/lib/ble/ble.js +0 -48
  113. package/lib/device.d.ts +0 -0
  114. package/lib/device.js +0 -0
@@ -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
- }, 1000);
322
+ }, this.pullFrequency);
337
323
  const ivUpdate = setInterval(() => {
338
- this.sendData();
324
+ this.emitData(this.data);
339
325
  this.refreshRequests();
340
- }, 1000);
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
- if (!this.ignoreBike) {
390
- data.speed = internalData.speed;
391
- data.power = internalData.power;
392
- data.cadence = internalData.pedalRpm;
393
- data.distance = distance;
394
- data.deviceDistanceCounter = bikeData.distance;
395
- data.internalDistanceCounter = internalData.distanceInternal;
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
- if (!this.ignoreBike) {
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<Boolean>;
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.on('error', (err) => {
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
- if (this.getName() === 'tcpip') {
223
- const _binding = binding;
224
- paths = (yield _binding.list(port)) || [];
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
- else {
227
- paths = (yield binding.list()) || [];
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
- detected.push(device);
249
- this.emit('device', device);
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
- if (this.onDataFn) {
211
- this.onDataFn(data);
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;
@@ -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): any;
13
+ isEqual(settings: DeviceSettings): boolean;
12
14
  getCapabilities(): IncyclistCapability[];
13
- hasCapability(capability: IncyclistCapability): any;
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 {
@@ -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;
@@ -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 type IncyclistInterface = {
10
+ export interface IncyclistInterface extends EventEmitter {
9
11
  getName(): string;
10
12
  setBinding(binding: any): void;
11
13
  connect(): Promise<boolean>;
12
- disconnect(): Promise<Boolean>;
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.0-beta.1",
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
- "@types/serialport": "^8.0.2",
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": "nodemon --watch src -e ts,js --exec npm run build"
31
+ "dev": "tsc --watch"
34
32
  },
35
33
  "files": [
36
34
  "lib/"
@@ -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