incyclist-devices 2.0.38 → 2.1.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 (192) hide show
  1. package/lib/adapters.d.ts +1 -1
  2. package/lib/antv2/adapter-factory.d.ts +4 -13
  3. package/lib/antv2/adapter.d.ts +16 -33
  4. package/lib/antv2/adapter.js +68 -112
  5. package/lib/antv2/ant-interface.d.ts +3 -11
  6. package/lib/antv2/ant-interface.js +1 -1
  7. package/lib/antv2/base/adapter.d.ts +62 -0
  8. package/lib/antv2/base/adapter.js +360 -0
  9. package/lib/antv2/base/ant-interface.d.ts +35 -0
  10. package/lib/antv2/base/ant-interface.js +285 -0
  11. package/lib/antv2/base/binding.d.ts +13 -0
  12. package/lib/antv2/base/binding.js +27 -0
  13. package/lib/antv2/cad/adapter.d.ts +10 -0
  14. package/lib/antv2/cad/adapter.js +25 -0
  15. package/lib/antv2/cad/index.d.ts +2 -0
  16. package/lib/antv2/cad/index.js +7 -0
  17. package/lib/antv2/consts.d.ts +2 -0
  18. package/lib/antv2/consts.js +5 -0
  19. package/lib/antv2/factories/adapter-factory.d.ts +14 -0
  20. package/lib/antv2/factories/adapter-factory.js +65 -0
  21. package/lib/antv2/factories/sensor-factory.d.ts +5 -0
  22. package/lib/antv2/factories/sensor-factory.js +22 -0
  23. package/lib/antv2/fe/adapter.d.ts +25 -26
  24. package/lib/antv2/fe/adapter.js +212 -218
  25. package/lib/antv2/hr/adapter.d.ts +6 -14
  26. package/lib/antv2/hr/adapter.js +7 -55
  27. package/lib/antv2/hr copy/adapter.d.ts +11 -0
  28. package/lib/antv2/hr copy/adapter.js +30 -0
  29. package/lib/antv2/hr copy/index.d.ts +2 -0
  30. package/lib/antv2/hr copy/index.js +7 -0
  31. package/lib/antv2/index.d.ts +5 -4
  32. package/lib/antv2/index.js +4 -2
  33. package/lib/antv2/pwr/adapter.d.ts +9 -29
  34. package/lib/antv2/pwr/adapter.js +20 -130
  35. package/lib/antv2/types.d.ts +23 -3
  36. package/lib/base/adpater.d.ts +42 -45
  37. package/lib/base/adpater.js +144 -110
  38. package/lib/base/consts.d.ts +4 -0
  39. package/lib/base/consts.js +9 -0
  40. package/lib/ble/adapter-factory.d.ts +4 -4
  41. package/lib/ble/base/adapter.d.ts +6 -24
  42. package/lib/ble/base/adapter.js +4 -94
  43. package/lib/ble/ble-interface.d.ts +2 -3
  44. package/lib/ble/cp/adapter.d.ts +6 -11
  45. package/lib/ble/cp/adapter.js +9 -12
  46. package/lib/ble/elite/adapter.d.ts +8 -8
  47. package/lib/ble/elite/adapter.js +6 -2
  48. package/lib/ble/fm/adapter.d.ts +11 -11
  49. package/lib/ble/fm/adapter.js +26 -20
  50. package/lib/ble/hr/adapter.d.ts +3 -4
  51. package/lib/ble/hr/adapter.js +2 -2
  52. package/lib/ble/tacx/adapter.d.ts +2 -3
  53. package/lib/ble/tacx/adapter.js +8 -8
  54. package/lib/ble/types.d.ts +1 -2
  55. package/lib/ble/wahoo/adapter.d.ts +2 -2
  56. package/lib/ble/wahoo/adapter.js +6 -6
  57. package/lib/ble/wahoo/comms.js +16 -16
  58. package/lib/factories/adapters.d.ts +7 -0
  59. package/lib/factories/adapters.js +49 -0
  60. package/lib/factories/index.d.ts +3 -0
  61. package/lib/factories/index.js +10 -0
  62. package/lib/factories/interfaces.d.ts +7 -0
  63. package/lib/factories/interfaces.js +27 -0
  64. package/lib/index.d.ts +8 -9
  65. package/lib/index.js +5 -8
  66. package/lib/interfaces.d.ts +1 -1
  67. package/lib/modes/ant-fe-adv-st-mode.d.ts +12 -0
  68. package/lib/modes/ant-fe-adv-st-mode.js +83 -0
  69. package/lib/modes/antble-erg.d.ts +31 -0
  70. package/lib/modes/antble-erg.js +28 -0
  71. package/lib/modes/antble-smarttrainer.d.ts +23 -0
  72. package/lib/modes/antble-smarttrainer.js +65 -0
  73. package/lib/modes/base.d.ts +29 -0
  74. package/lib/modes/{cycling-mode.js → base.js} +23 -26
  75. package/lib/modes/daum-classic-standard.d.ts +17 -0
  76. package/lib/modes/daum-classic-standard.js +54 -0
  77. package/lib/modes/daum-erg.d.ts +49 -0
  78. package/lib/{serial/daum/ERGCyclingMode.js → modes/daum-erg.js} +45 -73
  79. package/lib/modes/daum-power.d.ts +5 -0
  80. package/lib/{serial/daum/DaumPowerMeterCyclingMode.js → modes/daum-power.js} +1 -10
  81. package/lib/modes/daum-premium-standard.d.ts +24 -0
  82. package/lib/{serial/daum/premium/modes/daum-classic.js → modes/daum-premium-standard.js} +26 -38
  83. package/lib/modes/daum-smarttrainer.d.ts +83 -0
  84. package/lib/{serial/daum/SmartTrainerCyclingMode.js → modes/daum-smarttrainer.js} +23 -26
  85. package/lib/modes/kettler-erg.d.ts +44 -0
  86. package/lib/{serial/kettler/ergo-racer/modes/erg.js → modes/kettler-erg.js} +12 -23
  87. package/lib/modes/power-base.d.ts +28 -3
  88. package/lib/modes/power-base.js +184 -7
  89. package/lib/modes/power-meter.d.ts +11 -16
  90. package/lib/modes/power-meter.js +15 -54
  91. package/lib/modes/simulator.d.ts +38 -10
  92. package/lib/modes/simulator.js +14 -46
  93. package/lib/modes/{cycling-mode.d.ts → types.d.ts} +22 -30
  94. package/lib/modes/types.js +56 -0
  95. package/lib/serial/SinglePathScanner.d.ts +17 -0
  96. package/lib/serial/SinglePathScanner.js +87 -0
  97. package/lib/serial/adapter-factory.d.ts +8 -6
  98. package/lib/serial/adapter.d.ts +6 -11
  99. package/lib/serial/adapter.js +5 -2
  100. package/lib/serial/base/adapter.d.ts +17 -0
  101. package/lib/serial/base/adapter.js +67 -0
  102. package/lib/serial/base/comms.d.ts +62 -0
  103. package/lib/serial/base/comms.js +280 -0
  104. package/lib/serial/base/serial-interface.d.ts +36 -0
  105. package/lib/serial/base/serial-interface.js +288 -0
  106. package/lib/serial/base/serial-scanner.d.ts +16 -0
  107. package/lib/serial/base/serial-scanner.js +87 -0
  108. package/lib/serial/base/serialport.d.ts +17 -0
  109. package/lib/serial/base/serialport.js +87 -0
  110. package/lib/serial/comms.d.ts +2 -2
  111. package/lib/serial/daum/DaumAdapter.d.ts +26 -35
  112. package/lib/serial/daum/DaumAdapter.js +214 -161
  113. package/lib/serial/daum/classic/PROTOCOL_NAME.d.ts +2 -0
  114. package/lib/serial/daum/classic/PROTOCOL_NAME.js +5 -0
  115. package/lib/serial/daum/classic/adapter.d.ts +13 -26
  116. package/lib/serial/daum/classic/adapter.js +72 -176
  117. package/lib/serial/daum/classic/comms.d.ts +21 -17
  118. package/lib/serial/daum/classic/comms.js +41 -14
  119. package/lib/serial/daum/classic/consts.d.ts +2 -0
  120. package/lib/serial/daum/classic/consts.js +5 -0
  121. package/lib/serial/daum/classic/mock.d.ts +4 -0
  122. package/lib/serial/daum/classic/mock.js +18 -7
  123. package/lib/serial/daum/classic/types.d.ts +8 -10
  124. package/lib/serial/daum/classic/utils.d.ts +1 -2
  125. package/lib/serial/daum/consts.d.ts +0 -0
  126. package/lib/serial/daum/consts.js +0 -0
  127. package/lib/serial/daum/premium/adapter.d.ts +17 -15
  128. package/lib/serial/daum/premium/adapter.js +86 -109
  129. package/lib/serial/daum/premium/comms.d.ts +7 -7
  130. package/lib/serial/daum/premium/comms.js +25 -16
  131. package/lib/serial/daum/premium/mock.d.ts +5 -1
  132. package/lib/serial/daum/premium/mock.js +17 -7
  133. package/lib/serial/daum/premium/types.d.ts +32 -17
  134. package/lib/serial/daum/premium/types.js +8 -8
  135. package/lib/serial/daum/premium/utils.d.ts +2 -3
  136. package/lib/serial/daum/premium/utils.js +3 -3
  137. package/lib/serial/daum/types.d.ts +14 -0
  138. package/lib/serial/daum/types.js +13 -0
  139. package/lib/serial/factories/adapter-factory.d.ts +14 -0
  140. package/lib/serial/factories/adapter-factory.js +30 -0
  141. package/lib/serial/index.d.ts +8 -5
  142. package/lib/serial/index.js +15 -15
  143. package/lib/serial/kettler/comms.d.ts +1 -1
  144. package/lib/serial/kettler/ergo-racer/adapter.d.ts +11 -16
  145. package/lib/serial/kettler/ergo-racer/adapter.js +10 -12
  146. package/lib/serial/kettler/types.d.ts +8 -0
  147. package/lib/serial/kettler/types.js +2 -0
  148. package/lib/serial/serial-interface.d.ts +2 -32
  149. package/lib/serial/serial-interface.js +4 -78
  150. package/lib/serial/serial-scanner.d.ts +16 -0
  151. package/lib/serial/serial-scanner.js +87 -0
  152. package/lib/serial/serialport.d.ts +1 -13
  153. package/lib/serial/types.d.ts +45 -0
  154. package/lib/serial/types.js +9 -0
  155. package/lib/simulator/Simulator.d.ts +13 -19
  156. package/lib/simulator/Simulator.js +10 -51
  157. package/lib/types/Command.d.ts +8 -0
  158. package/lib/types/Command.js +2 -0
  159. package/lib/types/adapter.d.ts +34 -24
  160. package/lib/types/command.d.ts +0 -8
  161. package/lib/types/command.js +0 -2
  162. package/lib/types/data.d.ts +12 -1
  163. package/lib/types/device.d.ts +8 -23
  164. package/lib/types/device.js +9 -8
  165. package/lib/types/index.d.ts +6 -0
  166. package/lib/types/index.js +22 -0
  167. package/lib/types/route.d.ts +0 -19
  168. package/lib/types/route.js +0 -2
  169. package/lib/types/types.d.ts +8 -0
  170. package/lib/types/types.js +2 -0
  171. package/lib/utils/utils.d.ts +2 -1
  172. package/lib/utils/utils.js +22 -4
  173. package/package.json +3 -3
  174. package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +0 -9
  175. package/lib/antv2/modes/ant-fe-adv-st-mode.js +0 -51
  176. package/lib/antv2/modes/ant-fe-erg-mode.d.ts +0 -6
  177. package/lib/antv2/modes/ant-fe-erg-mode.js +0 -14
  178. package/lib/antv2/modes/ant-fe-st-mode.d.ts +0 -5
  179. package/lib/antv2/modes/ant-fe-st-mode.js +0 -13
  180. package/lib/modes/ble-erg-mode.d.ts +0 -18
  181. package/lib/modes/ble-erg-mode.js +0 -148
  182. package/lib/modes/ble-st-mode.d.ts +0 -15
  183. package/lib/modes/ble-st-mode.js +0 -96
  184. package/lib/serial/daum/DaumPowerMeterCyclingMode.d.ts +0 -8
  185. package/lib/serial/daum/ERGCyclingMode.d.ts +0 -26
  186. package/lib/serial/daum/SmartTrainerCyclingMode.d.ts +0 -42
  187. package/lib/serial/daum/classic/modes/daum-classic.d.ts +0 -13
  188. package/lib/serial/daum/classic/modes/daum-classic.js +0 -97
  189. package/lib/serial/daum/constants.d.ts +0 -19
  190. package/lib/serial/daum/constants.js +0 -22
  191. package/lib/serial/daum/premium/modes/daum-classic.d.ts +0 -14
  192. package/lib/serial/kettler/ergo-racer/modes/erg.d.ts +0 -25
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SinglePathScanner = void 0;
16
+ const gd_eventlog_1 = require("gd-eventlog");
17
+ const utils_1 = require("../utils/utils");
18
+ const adapter_factory_1 = __importDefault(require("./adapter-factory"));
19
+ const types_1 = require("./types");
20
+ class SinglePathScanner {
21
+ constructor(path, serial, props) {
22
+ this.path = path;
23
+ this.serial = serial;
24
+ this.result = undefined;
25
+ this.isScanning = false;
26
+ this.isFound = false;
27
+ this.props = props;
28
+ this.logger = props.logger || new gd_eventlog_1.EventLogger('SerialScanner');
29
+ }
30
+ logEvent(event) {
31
+ if (this.logger) {
32
+ this.logger.logEvent(event);
33
+ }
34
+ const w = global.window;
35
+ if ((w === null || w === void 0 ? void 0 : w.DEVICE_DEBUG) || process.env.BLE_DEBUG) {
36
+ console.log('~~~ SerialScanner', event);
37
+ }
38
+ }
39
+ onStopRequest(resolve) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ this.logEvent({ message: 'stopping scan', path: this.path });
42
+ if (!this.isFound)
43
+ yield this.serial.closePort(this.path);
44
+ this.isScanning = false;
45
+ resolve(this.result);
46
+ });
47
+ }
48
+ scan() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ if (this.isScanning)
51
+ return;
52
+ this.isScanning = true;
53
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
54
+ this.logEvent({ message: 'starting scan', path: this.path, interface: this.serial.getName() });
55
+ this.serial.scanEvents.on('timeout', () => this.onStopRequest(resolve));
56
+ this.serial.scanEvents.on('stop', () => this.onStopRequest(resolve));
57
+ let found = false;
58
+ while (!found && this.isScanning) {
59
+ try {
60
+ const { protocol } = this.props;
61
+ let host, port;
62
+ if (this.serial.getName() === types_1.SerialInterfaceType.TCPIP) {
63
+ [host, port] = this.path.split(':');
64
+ }
65
+ else {
66
+ port = this.path;
67
+ }
68
+ const adapterSettings = { interface: this.serial.getName(), host, port, protocol };
69
+ const adapter = adapter_factory_1.default.getInstance().createInstance(adapterSettings);
70
+ found = yield adapter.check();
71
+ if (found) {
72
+ this.isFound = true;
73
+ const name = adapter.getName();
74
+ resolve(Object.assign(Object.assign({}, adapterSettings), { name }));
75
+ }
76
+ yield (0, utils_1.sleep)(100);
77
+ }
78
+ catch (err) {
79
+ this.logEvent({ message: 'error', fn: 'scan()', error: err.message || err, stack: err.stack });
80
+ yield (0, utils_1.sleep)(100);
81
+ }
82
+ }
83
+ }));
84
+ });
85
+ }
86
+ }
87
+ exports.SinglePathScanner = SinglePathScanner;
@@ -1,12 +1,14 @@
1
- import { SerialIncyclistDevice, SerialDeviceSettings } from './adapter';
1
+ import { DeviceProperties } from '../types';
2
+ import { SerialIncyclistDevice } from './adapter';
3
+ import { SerialDeviceSettings } from "./types";
2
4
  export default class SerialAdapterFactory {
3
5
  static _instance: SerialAdapterFactory;
4
- adapters: {
6
+ adapters: Array<{
5
7
  protocol: string;
6
- AdapterClass: typeof SerialIncyclistDevice;
7
- }[];
8
+ AdapterClass: typeof SerialIncyclistDevice<DeviceProperties>;
9
+ }>;
8
10
  static getInstance(): SerialAdapterFactory;
9
11
  constructor();
10
- registerAdapter(protocol: string, AdapterClass: typeof SerialIncyclistDevice): void;
11
- createInstance(props: SerialDeviceSettings, settings?: any): SerialIncyclistDevice;
12
+ registerAdapter(protocol: string, AdapterClass: typeof SerialIncyclistDevice<DeviceProperties>): void;
13
+ createInstance(props: SerialDeviceSettings, settings?: any): SerialIncyclistDevice<DeviceProperties>;
12
14
  }
@@ -1,16 +1,11 @@
1
- import { DeviceProperties, DeviceSettings } from "../types/device";
2
- import { ControllableDevice } from "../base/adpater";
3
- import SerialInterface from "./serial-interface";
4
- export interface SerialDeviceSettings extends DeviceSettings {
5
- protocol: string;
6
- host?: string;
7
- port?: string;
8
- interface: string | SerialInterface;
9
- }
10
- export declare class SerialIncyclistDevice extends ControllableDevice {
1
+ import IncyclistDevice from "../base/adpater";
2
+ import { DeviceProperties } from "../types";
3
+ import SerialInterface from "./base/serial-interface";
4
+ import { SerialDeviceSettings } from "./types";
5
+ export declare class SerialIncyclistDevice<P extends DeviceProperties> extends IncyclistDevice<P> {
11
6
  pullFrequency: number;
12
7
  check(): Promise<boolean>;
13
- constructor(settings: SerialDeviceSettings, props?: DeviceProperties);
8
+ constructor(settings: SerialDeviceSettings, props?: P);
14
9
  isEqual(settings: SerialDeviceSettings): boolean;
15
10
  getPort(): string;
16
11
  getUniqueName(): string;
@@ -8,11 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.SerialIncyclistDevice = void 0;
13
- const adpater_1 = require("../base/adpater");
16
+ const adpater_1 = __importDefault(require("../base/adpater"));
14
17
  const DEFAULT_PULL_FREQUENCY = 1000;
15
- class SerialIncyclistDevice extends adpater_1.ControllableDevice {
18
+ class SerialIncyclistDevice extends adpater_1.default {
16
19
  check() {
17
20
  return __awaiter(this, void 0, void 0, function* () { throw new Error('not implemnted'); });
18
21
  }
@@ -0,0 +1,17 @@
1
+ import IncyclistDevice from "../../base/adpater";
2
+ import { DeviceProperties } from "../../types";
3
+ import SerialInterface from "./serial-interface";
4
+ import { SerialDeviceSettings } from "../types";
5
+ export declare class SerialIncyclistDevice<P extends DeviceProperties> extends IncyclistDevice<P> {
6
+ pullFrequency: number;
7
+ check(): Promise<boolean>;
8
+ constructor(settings: SerialDeviceSettings, props?: P);
9
+ isEqual(settings: SerialDeviceSettings): boolean;
10
+ getPort(): string;
11
+ getUniqueName(): string;
12
+ getSerialInterface(): SerialInterface;
13
+ getInterface(): string;
14
+ setMaxUpdateFrequency(ms: number): void;
15
+ setPullFrequency(ms: number): void;
16
+ getPullFrequency(): number;
17
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SerialIncyclistDevice = void 0;
16
+ const adpater_1 = __importDefault(require("../../base/adpater"));
17
+ const DEFAULT_PULL_FREQUENCY = 1000;
18
+ class SerialIncyclistDevice extends adpater_1.default {
19
+ check() {
20
+ return __awaiter(this, void 0, void 0, function* () { throw new Error('not implemnted'); });
21
+ }
22
+ ;
23
+ constructor(settings, props) {
24
+ super(settings, props);
25
+ this.pullFrequency = DEFAULT_PULL_FREQUENCY;
26
+ }
27
+ isEqual(settings) {
28
+ if (settings.interface !== this.getInterface())
29
+ return false;
30
+ const s = this.settings;
31
+ if (settings.protocol !== s.protocol)
32
+ return false;
33
+ if (settings.port !== s.port)
34
+ return false;
35
+ if (settings.host && (!s.host || s.host !== settings.host))
36
+ return false;
37
+ return true;
38
+ }
39
+ getPort() {
40
+ const settings = this.settings;
41
+ return settings.port;
42
+ }
43
+ getUniqueName() {
44
+ return `${this.getName()} (${this.getPort()})`;
45
+ }
46
+ getSerialInterface() {
47
+ throw new Error('not implemented');
48
+ }
49
+ getInterface() {
50
+ return 'serial';
51
+ }
52
+ setMaxUpdateFrequency(ms) {
53
+ if (ms <= this.pullFrequency)
54
+ this.updateFrequency = -1;
55
+ else
56
+ this.updateFrequency = ms;
57
+ }
58
+ setPullFrequency(ms) {
59
+ this.pullFrequency = ms;
60
+ if (this.updateFrequency <= this.pullFrequency)
61
+ this.updateFrequency = -1;
62
+ }
63
+ getPullFrequency() {
64
+ return this.pullFrequency;
65
+ }
66
+ }
67
+ exports.SerialIncyclistDevice = SerialIncyclistDevice;
@@ -0,0 +1,62 @@
1
+ /// <reference types="node" />
2
+ import { EventLogger } from "gd-eventlog";
3
+ import SerialInterface from "./serial-interface";
4
+ import { SerialCommProps } from "../types";
5
+ import { SerialPortStream } from "@serialport/stream";
6
+ import { Queue } from "../../utils/utils";
7
+ export type ConnectionState = 'Connecting' | 'Connected' | 'Disconnected' | 'Disconnecting';
8
+ export type Request = {
9
+ logString?: string;
10
+ isBinary?: boolean;
11
+ };
12
+ export type Response = {};
13
+ export interface CommsState {
14
+ data?: Queue<Response>;
15
+ }
16
+ export default class SerialPortComms<T extends CommsState, C extends Request, R extends Response> {
17
+ logger: EventLogger;
18
+ serial: SerialInterface;
19
+ protected path: string;
20
+ protected props: SerialCommProps;
21
+ protected sp: SerialPortStream;
22
+ protected connectState: ConnectionState;
23
+ protected connectPromise: Promise<SerialPortStream>;
24
+ protected disconnectPromise: Promise<boolean>;
25
+ protected writePromise: Promise<void>;
26
+ protected sendCmdPromise: Promise<R>;
27
+ protected actualBikeType?: string;
28
+ protected recvState: T;
29
+ protected isLoggingPaused: boolean;
30
+ constructor(props: SerialCommProps);
31
+ getBusyTimeout(): number;
32
+ getDefaultLoggerName(): string;
33
+ getInitialCommsState(): T;
34
+ validatePath(path: string): string;
35
+ getInterface(): string;
36
+ getPort(): string;
37
+ isConnected(): boolean;
38
+ pauseLogging(): void;
39
+ resumeLogging(): void;
40
+ logEvent(e: any): void;
41
+ connect(): Promise<boolean>;
42
+ onConnected(): void;
43
+ portFlush(): void;
44
+ portPipe(destination: any, options?: any): any;
45
+ portUnpipe(destination?: any): void;
46
+ closePort(): Promise<boolean>;
47
+ resetState(isDisconnected?: boolean): void;
48
+ cleanupPort(isDisconnected?: boolean): void;
49
+ close(): Promise<boolean>;
50
+ flush(): Promise<void>;
51
+ onPortClose(): Promise<void>;
52
+ onPortError(error: Error): Promise<void>;
53
+ isSending(): boolean;
54
+ rejectCurrent(error: Error): void;
55
+ getTimeoutValue(): number;
56
+ onData(data: any, depth?: number): Promise<void>;
57
+ send(command: C): Promise<R>;
58
+ portWrite(buffer: Buffer): Promise<void>;
59
+ write(buffer: Buffer): Promise<void>;
60
+ ensurePrevCmdFinish(logPayload: any): Promise<void>;
61
+ ensureConnection(): Promise<void>;
62
+ }
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const gd_eventlog_1 = require("gd-eventlog");
13
+ const utils_1 = require("../daum/premium/utils");
14
+ const utils_2 = require("../../utils/utils");
15
+ const DEFAULT_BUSY_TIMEOUT = 5000;
16
+ class SerialPortComms {
17
+ constructor(props) {
18
+ this.props = props;
19
+ const { logger, serial, path } = props;
20
+ this.serial = serial;
21
+ this.path = this.validatePath(path);
22
+ const w = global.window;
23
+ this.logger = logger || ((w === null || w === void 0 ? void 0 : w.DEVICE_DEBUG) || process.env.DEBUG ? utils_1.DEBUG_LOGGER : new gd_eventlog_1.EventLogger(this.getDefaultLoggerName()));
24
+ this.resetState();
25
+ }
26
+ getBusyTimeout() {
27
+ return DEFAULT_BUSY_TIMEOUT;
28
+ }
29
+ getDefaultLoggerName() {
30
+ return 'Serial';
31
+ }
32
+ getInitialCommsState() {
33
+ return { data: new utils_2.Queue() };
34
+ }
35
+ validatePath(path) {
36
+ return path;
37
+ }
38
+ getInterface() {
39
+ var _a;
40
+ return (_a = this.serial) === null || _a === void 0 ? void 0 : _a.ifaceName;
41
+ }
42
+ getPort() {
43
+ return this.path;
44
+ }
45
+ isConnected() {
46
+ return this.connectState === 'Connected' || this.connectState === 'Disconnecting';
47
+ }
48
+ pauseLogging() {
49
+ this.isLoggingPaused = true;
50
+ }
51
+ resumeLogging() {
52
+ this.isLoggingPaused = false;
53
+ }
54
+ logEvent(e) {
55
+ if (this.isLoggingPaused)
56
+ return;
57
+ this.logger.logEvent(e);
58
+ const w = global.window;
59
+ if (w === null || w === void 0 ? void 0 : w.DEVICE_DEBUG) {
60
+ console.log(`~~~ ${this.getDefaultLoggerName()}`, e);
61
+ }
62
+ }
63
+ connect() {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ if (this.isConnected() && this.sp) {
66
+ return true;
67
+ }
68
+ if (this.connectState === 'Connecting') {
69
+ if (this.connectPromise) {
70
+ try {
71
+ yield this.connectPromise;
72
+ }
73
+ catch (_a) {
74
+ }
75
+ }
76
+ return this.isConnected();
77
+ }
78
+ try {
79
+ this.connectState = 'Connecting';
80
+ this.connectPromise = this.serial.openPort(this.path);
81
+ const port = yield this.connectPromise;
82
+ this.connectPromise = null;
83
+ if (port !== null) {
84
+ this.connectState = 'Connected';
85
+ this.sp = port;
86
+ this.sp.on('close', this.onPortClose.bind(this));
87
+ this.sp.on('error', this.onPortError.bind(this));
88
+ this.onConnected();
89
+ return true;
90
+ }
91
+ else {
92
+ this.connectState = 'Disconnected';
93
+ return false;
94
+ }
95
+ }
96
+ catch (_b) {
97
+ this.connectState = 'Disconnected';
98
+ return false;
99
+ }
100
+ });
101
+ }
102
+ onConnected() {
103
+ }
104
+ portFlush() {
105
+ if (this.sp)
106
+ this.sp.flush();
107
+ }
108
+ portPipe(destination, options) {
109
+ if (this.sp)
110
+ return this.sp.pipe(destination, options);
111
+ }
112
+ portUnpipe(destination) {
113
+ if (this.sp)
114
+ this.sp.unpipe(destination);
115
+ }
116
+ closePort() {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ if (!this.sp)
119
+ return true;
120
+ try {
121
+ yield this.flush();
122
+ yield this.serial.closePort(this.path);
123
+ return true;
124
+ }
125
+ catch (err) {
126
+ this.logEvent({ message: 'could not close ', reason: err.message });
127
+ return false;
128
+ }
129
+ });
130
+ }
131
+ resetState(isDisconnected = true) {
132
+ this.isLoggingPaused = false;
133
+ this.recvState = this.getInitialCommsState();
134
+ this.connectPromise = null;
135
+ this.disconnectPromise = null;
136
+ this.writePromise = null;
137
+ this.sendCmdPromise = null;
138
+ if (isDisconnected)
139
+ this.connectState = 'Disconnected';
140
+ }
141
+ cleanupPort(isDisconnected = true) {
142
+ if (this.sp) {
143
+ this.sp.removeAllListeners();
144
+ }
145
+ this.sp = null;
146
+ this.resetState(isDisconnected);
147
+ }
148
+ close() {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ let isDisconnected = false;
151
+ if (this.disconnectPromise) {
152
+ try {
153
+ isDisconnected = yield this.disconnectPromise;
154
+ }
155
+ catch (_a) {
156
+ }
157
+ return isDisconnected;
158
+ }
159
+ if (this.connectState === 'Disconnected') {
160
+ this.cleanupPort();
161
+ return true;
162
+ }
163
+ else if (this.connectState === 'Disconnecting' || this.connectState === 'Connected' || this.connectState === 'Connecting') {
164
+ this.connectState = 'Disconnecting';
165
+ this.disconnectPromise = this.closePort();
166
+ isDisconnected = yield this.disconnectPromise;
167
+ if (isDisconnected) {
168
+ this.connectState = 'Disconnected';
169
+ this.logEvent({ message: "port closed:", port: this.path });
170
+ }
171
+ this.cleanupPort(isDisconnected);
172
+ }
173
+ return isDisconnected;
174
+ });
175
+ }
176
+ flush() {
177
+ return __awaiter(this, void 0, void 0, function* () {
178
+ if (this.writePromise) {
179
+ yield (0, utils_2.waitWithTimeout)(this.writePromise, 1000);
180
+ this.writePromise = null;
181
+ }
182
+ });
183
+ }
184
+ onPortClose() {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ if (this.connectState !== 'Disconnected' && this.connectState !== 'Disconnecting')
187
+ this.logEvent({ message: "port closed:", port: this.path });
188
+ this.connectState = 'Disconnected';
189
+ this.cleanupPort();
190
+ });
191
+ }
192
+ onPortError(error) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ if (this.connectState === 'Disconnecting' || this.connectState === 'Disconnected') {
195
+ return;
196
+ }
197
+ this.logEvent({ message: "port error:", port: this.path, error: error.message, connected: this.isConnected(), state: this.connectState });
198
+ if (this.isSending()) {
199
+ this.rejectCurrent(error);
200
+ }
201
+ if (this.connectState === 'Connected')
202
+ this.close();
203
+ });
204
+ }
205
+ isSending() {
206
+ return (this.writePromise !== undefined && this.writePromise !== null) || (this.sendCmdPromise !== null && this.sendCmdPromise !== undefined);
207
+ }
208
+ rejectCurrent(error) {
209
+ this.recvState.data.enqueue({ type: 'Error', error });
210
+ }
211
+ getTimeoutValue() {
212
+ throw new Error('method not implemented');
213
+ }
214
+ onData(data, depth = 0) {
215
+ return __awaiter(this, void 0, void 0, function* () {
216
+ });
217
+ }
218
+ send(command) {
219
+ return __awaiter(this, void 0, void 0, function* () {
220
+ throw new Error('method not implemented');
221
+ });
222
+ }
223
+ portWrite(buffer) {
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ if (!this.sp) {
226
+ this.logEvent({ message: 'write failed', error: 'port is not opened' });
227
+ return;
228
+ }
229
+ try {
230
+ yield this.sp.write(buffer);
231
+ }
232
+ catch (err) {
233
+ this.logEvent({ message: 'write failed', error: err.message });
234
+ }
235
+ });
236
+ }
237
+ write(buffer) {
238
+ return __awaiter(this, void 0, void 0, function* () {
239
+ if (this.writePromise) {
240
+ try {
241
+ yield this.writePromise;
242
+ }
243
+ catch (_a) {
244
+ }
245
+ this.writePromise = null;
246
+ }
247
+ this.writePromise = this.portWrite(buffer);
248
+ yield this.writePromise;
249
+ this.writePromise = null;
250
+ });
251
+ }
252
+ ensurePrevCmdFinish(logPayload) {
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ if (this.sendCmdPromise) {
255
+ const tsRequest = Date.now();
256
+ this.logEvent(Object.assign({ message: 'sendCommand:waiting:' }, logPayload));
257
+ let busyTimedOut = false;
258
+ const onTimeout = () => {
259
+ this.logEvent(Object.assign(Object.assign({ message: 'sendCommand:error:' }, logPayload), { error: 'BUSY timeout', duration: Date.now() - tsRequest }));
260
+ busyTimedOut = true;
261
+ };
262
+ yield (0, utils_2.waitWithTimeout)(this.sendCmdPromise, this.getBusyTimeout(), onTimeout);
263
+ this.sendCmdPromise = null;
264
+ if (busyTimedOut)
265
+ throw new Error('BUSY timeout');
266
+ }
267
+ });
268
+ }
269
+ ensureConnection() {
270
+ return __awaiter(this, void 0, void 0, function* () {
271
+ if (!this.isConnected()) {
272
+ const connected = yield this.connect();
273
+ if (!connected) {
274
+ throw new Error('not connected');
275
+ }
276
+ }
277
+ });
278
+ }
279
+ }
280
+ exports.default = SerialPortComms;
@@ -0,0 +1,36 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import EventEmitter from "events";
4
+ import { BindingInterface } from "@serialport/bindings-interface";
5
+ import { SerialPortStream } from '@serialport/stream';
6
+ import { SerialDeviceSettings, SerialScannerProps, PortMapping, SerialInterfaceProps } from "../types";
7
+ import { IncyclistInterface } from "../../types";
8
+ import { EventLogger } from "gd-eventlog";
9
+ export default class SerialInterface extends EventEmitter implements IncyclistInterface {
10
+ ifaceName: string;
11
+ binding: BindingInterface;
12
+ ports: PortMapping[];
13
+ isScanning: boolean;
14
+ isStopScanRequested: boolean;
15
+ scanEvents: EventEmitter;
16
+ logger: EventLogger;
17
+ toScan: NodeJS.Timeout;
18
+ connected: boolean;
19
+ inUse: string[];
20
+ static _instances: SerialInterface[];
21
+ static getInstance(props: SerialInterfaceProps): SerialInterface;
22
+ static _add(instance: SerialInterface): void;
23
+ constructor(props: SerialInterfaceProps);
24
+ logEvent(event: any): void;
25
+ setBinding(binding: BindingInterface): void;
26
+ getName(): string;
27
+ isConnected(): boolean;
28
+ setInUse(path: string): void;
29
+ releaseInUse(path: string): void;
30
+ connect(): Promise<boolean>;
31
+ disconnect(): Promise<boolean>;
32
+ openPort(path: string): Promise<SerialPortStream | null>;
33
+ closePort(path: string): Promise<Boolean>;
34
+ scan(props: SerialScannerProps): Promise<SerialDeviceSettings[]>;
35
+ stopScan(): Promise<boolean>;
36
+ }