motion-master-client 0.0.43 → 0.0.45

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 (125) hide show
  1. package/package.json +17 -2
  2. package/src/index.js +29 -0
  3. package/src/index.js.map +1 -0
  4. package/src/lib/cia402.d.ts +182 -0
  5. package/src/lib/cia402.js +392 -0
  6. package/src/lib/cia402.js.map +1 -0
  7. package/src/lib/config-file.d.ts +13 -0
  8. package/src/lib/config-file.js +50 -0
  9. package/src/lib/config-file.js.map +1 -0
  10. package/src/lib/device-log-line.d.ts +5 -0
  11. package/src/lib/device-log-line.js +3 -0
  12. package/src/lib/device-log-line.js.map +1 -0
  13. package/src/lib/device-parameter.d.ts +56 -0
  14. package/src/lib/device-parameter.js +39 -0
  15. package/src/lib/device-parameter.js.map +1 -0
  16. package/src/lib/device.d.ts +9 -0
  17. package/src/lib/device.js +3 -0
  18. package/src/lib/device.js.map +1 -0
  19. package/src/lib/hardware-description.d.ts +41 -0
  20. package/src/lib/hardware-description.js +94 -0
  21. package/src/lib/hardware-description.js.map +1 -0
  22. package/src/lib/logger.d.ts +1 -0
  23. package/src/lib/logger.js +8 -0
  24. package/src/lib/logger.js.map +1 -0
  25. package/src/lib/monitoring-config.d.ts +6 -0
  26. package/src/lib/monitoring-config.js +3 -0
  27. package/src/lib/monitoring-config.js.map +1 -0
  28. package/src/lib/{monitoring-entry.ts → monitoring-entry.d.ts} +4 -5
  29. package/src/lib/monitoring-entry.js +3 -0
  30. package/src/lib/monitoring-entry.js.map +1 -0
  31. package/src/lib/motion-master-client.d.ts +56 -0
  32. package/src/lib/motion-master-client.js +167 -0
  33. package/src/lib/motion-master-client.js.map +1 -0
  34. package/src/lib/motion-master-pub-sub-client.d.ts +17 -0
  35. package/src/lib/motion-master-pub-sub-client.js +73 -0
  36. package/src/lib/motion-master-pub-sub-client.js.map +1 -0
  37. package/src/lib/motion-master-pub-sub-socket.d.ts +34 -0
  38. package/src/lib/motion-master-pub-sub-socket.js +3 -0
  39. package/src/lib/motion-master-pub-sub-socket.js.map +1 -0
  40. package/src/lib/motion-master-pub-sub-web-socket.d.ts +14 -0
  41. package/src/lib/motion-master-pub-sub-web-socket.js +67 -0
  42. package/src/lib/motion-master-pub-sub-web-socket.js.map +1 -0
  43. package/src/lib/motion-master-pub-sub-worker-socket.d.ts +14 -0
  44. package/src/lib/motion-master-pub-sub-worker-socket.js +42 -0
  45. package/src/lib/motion-master-pub-sub-worker-socket.js.map +1 -0
  46. package/src/lib/motion-master-req-res-client.d.ts +947 -0
  47. package/src/lib/motion-master-req-res-client.js +1735 -0
  48. package/src/lib/motion-master-req-res-client.js.map +1 -0
  49. package/src/lib/motion-master-req-res-socket.d.ts +52 -0
  50. package/src/lib/motion-master-req-res-socket.js +3 -0
  51. package/src/lib/motion-master-req-res-socket.js.map +1 -0
  52. package/src/lib/motion-master-req-res-web-socket.d.ts +24 -0
  53. package/src/lib/motion-master-req-res-web-socket.js +97 -0
  54. package/src/lib/motion-master-req-res-web-socket.js.map +1 -0
  55. package/src/lib/motion-master-req-res-worker-socket.d.ts +20 -0
  56. package/src/lib/motion-master-req-res-worker-socket.js +69 -0
  57. package/src/lib/motion-master-req-res-worker-socket.js.map +1 -0
  58. package/src/lib/operators.d.ts +20 -0
  59. package/src/lib/operators.js +85 -0
  60. package/src/lib/operators.js.map +1 -0
  61. package/src/lib/options.d.ts +10 -0
  62. package/src/lib/options.js +14 -0
  63. package/src/lib/options.js.map +1 -0
  64. package/src/lib/parameter.d.ts +72 -0
  65. package/src/lib/parameter.js +119 -0
  66. package/src/lib/parameter.js.map +1 -0
  67. package/src/lib/product-id-range.d.ts +7 -0
  68. package/src/lib/product-id-range.js +12 -0
  69. package/src/lib/product-id-range.js.map +1 -0
  70. package/src/lib/request-status-resolver.d.ts +4 -0
  71. package/src/lib/request-status-resolver.js +345 -0
  72. package/src/lib/request-status-resolver.js.map +1 -0
  73. package/src/lib/system-log-line.d.ts +9 -0
  74. package/src/lib/system-log-line.js +3 -0
  75. package/src/lib/system-log-line.js.map +1 -0
  76. package/src/lib/{types.ts → types.d.ts} +149 -81
  77. package/src/lib/types.js +29 -0
  78. package/src/lib/types.js.map +1 -0
  79. package/src/lib/urls.d.ts +3 -0
  80. package/src/lib/urls.js +10 -0
  81. package/src/lib/urls.js.map +1 -0
  82. package/src/lib/util.d.ts +42 -0
  83. package/src/lib/util.js +326 -0
  84. package/src/lib/util.js.map +1 -0
  85. package/.babelrc +0 -3
  86. package/.eslintrc.json +0 -18
  87. package/jest.config.ts +0 -16
  88. package/motion-master.proto +0 -1822
  89. package/project.json +0 -45
  90. package/src/lib/cia402.spec.ts +0 -77
  91. package/src/lib/cia402.ts +0 -414
  92. package/src/lib/config-file.spec.ts +0 -114
  93. package/src/lib/config-file.ts +0 -63
  94. package/src/lib/device-log-line.ts +0 -5
  95. package/src/lib/device-parameter.spec.ts +0 -85
  96. package/src/lib/device-parameter.ts +0 -79
  97. package/src/lib/device.ts +0 -10
  98. package/src/lib/hardware-description.spec.ts +0 -253
  99. package/src/lib/hardware-description.ts +0 -129
  100. package/src/lib/logger.ts +0 -5
  101. package/src/lib/monitoring-config.ts +0 -6
  102. package/src/lib/motion-master-client.ts +0 -250
  103. package/src/lib/motion-master-pub-sub-client.ts +0 -100
  104. package/src/lib/motion-master-pub-sub-socket.ts +0 -40
  105. package/src/lib/motion-master-pub-sub-web-socket.ts +0 -78
  106. package/src/lib/motion-master-pub-sub-worker-socket.ts +0 -51
  107. package/src/lib/motion-master-req-res-client.spec.ts +0 -740
  108. package/src/lib/motion-master-req-res-client.ts +0 -2206
  109. package/src/lib/motion-master-req-res-socket.ts +0 -62
  110. package/src/lib/motion-master-req-res-web-socket.ts +0 -124
  111. package/src/lib/motion-master-req-res-worker-socket.ts +0 -87
  112. package/src/lib/operators.ts +0 -110
  113. package/src/lib/options.ts +0 -12
  114. package/src/lib/parameter.spec.ts +0 -160
  115. package/src/lib/parameter.ts +0 -170
  116. package/src/lib/product-id-range.ts +0 -8
  117. package/src/lib/request-status-resolver.ts +0 -403
  118. package/src/lib/system-log-line.ts +0 -9
  119. package/src/lib/urls.ts +0 -6
  120. package/src/lib/util.ts +0 -317
  121. package/tsconfig.json +0 -23
  122. package/tsconfig.lib.json +0 -10
  123. package/tsconfig.spec.json +0 -20
  124. package/typedoc.json +0 -10
  125. /package/src/{index.ts → index.d.ts} +0 -0
@@ -1,62 +0,0 @@
1
- import { BehaviorSubject, Observable } from "rxjs";
2
- import { IMotionMasterMessage } from "./types";
3
-
4
- export interface MotionMasterReqResSocket {
5
- /**
6
- * Emits a boolean value when socket gets opened or closed.
7
- */
8
- readonly opened$: BehaviorSubject<boolean>;
9
-
10
- /**
11
- * Motion Master is considered alive when it sends messages in regular time interval.
12
- */
13
- readonly alive$: BehaviorSubject<boolean>;
14
-
15
- /**
16
- * Decoded message instances coming from Motion Master.
17
- */
18
- readonly message$: Observable<IMotionMasterMessage>;
19
-
20
- /**
21
- * URL set in call to open.
22
- */
23
- get url(): string | undefined;
24
-
25
- /**
26
- * Send ping system messages to Motion Master with a fixed time delay between each call.
27
- */
28
- get pingSystemInterval(): number | undefined;
29
-
30
- /**
31
- * How long in milliseconds to consider Motion Master alive.
32
- */
33
- get systemAliveTimeout(): number | undefined;
34
-
35
- /**
36
- * Open socket.
37
- *
38
- * The connected$ and eventually alive$ observables will emit true values.
39
- */
40
- open(url: string, pingSystemInterval?: number, systemAliveTimeout?: number): void;
41
-
42
- /**
43
- * Close socket.
44
- *
45
- * The opened$ and alive$ observables will emit false values.
46
- */
47
- close(): void;
48
-
49
- /**
50
- * Reopen socket.
51
- *
52
- * Reopen if closed using the same url, pingSystemInterval, and systemAliveTimeout previously set in open.
53
- */
54
- reopen(): void;
55
-
56
- /**
57
- * Send an instance of a message.
58
- *
59
- * Subscribe to the message$ observable in order to receive the response messages.
60
- */
61
- send(message: IMotionMasterMessage): void;
62
- }
@@ -1,124 +0,0 @@
1
- import { BehaviorSubject, filter, interval, map, Subject, Subscription, tap } from "rxjs";
2
- import { webSocket, WebSocketSubject, WebSocketSubjectConfig } from "rxjs/webSocket";
3
- import { logger } from "./logger";
4
- import { MotionMasterReqResSocket } from "./motion-master-req-res-socket";
5
- import { IMotionMasterMessage, MotionMasterMessage } from "./types";
6
- import { convertMotionMasterMessageToLoggerContext, createPlainObjectFromMotionMasterMessage } from "./util";
7
-
8
- export class MotionMasterReqResWebSocket implements MotionMasterReqResSocket {
9
-
10
- readonly opened$ = new BehaviorSubject<boolean>(false);
11
-
12
- readonly alive$ = new BehaviorSubject<boolean>(false);
13
-
14
- readonly message$ = new Subject<IMotionMasterMessage>();
15
-
16
- private aliveTimeoutId = 0;
17
-
18
- private pingSystemObserver = { next: () => this.send({ request: { pingSystem: {} } }) };
19
-
20
- private pingSystemSubscription = new Subscription();
21
-
22
- private webSocket$?: WebSocketSubject<Uint8Array>;
23
-
24
- private _url?: string;
25
- private _pingSystemInterval?: number;
26
- private _systemAliveTimeout?: number;
27
-
28
- get url(): string | undefined {
29
- return this._url;
30
- }
31
-
32
- get pingSystemInterval(): number | undefined {
33
- return this._pingSystemInterval;
34
- }
35
-
36
- get systemAliveTimeout(): number | undefined {
37
- return this._systemAliveTimeout;
38
- }
39
-
40
- open(url: string, pingSystemInterval = 250, systemAliveTimeout = 1000): void {
41
- if (this.opened$.getValue() === true) {
42
- throw new Error('MotionMasterReqResWebSocket is already opened!');
43
- }
44
-
45
- this._url = url;
46
- this._pingSystemInterval = pingSystemInterval;
47
- this._systemAliveTimeout = systemAliveTimeout;
48
-
49
- this.webSocket$ = this.createWebSocket(url, pingSystemInterval);
50
-
51
- this.webSocket$?.pipe(
52
- map((data: Uint8Array) => MotionMasterMessage.decode(data)),
53
- tap(() => this.keepalive(systemAliveTimeout)),
54
- filter((message) => !(message.status?.systemPong)),
55
- map(message => createPlainObjectFromMotionMasterMessage(message)),
56
- tap((message) => {
57
- const context = convertMotionMasterMessageToLoggerContext(message);
58
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
- logger.info(context as any, `Received ${context.name}`);
60
- }),
61
- ).subscribe({
62
- next: (message) => this.message$.next(message),
63
- error: (err) => {
64
- console.error(err);
65
- },
66
- });
67
- }
68
-
69
- close(): void {
70
- clearTimeout(this.aliveTimeoutId);
71
- this.pingSystemSubscription.unsubscribe();
72
- this.webSocket$?.unsubscribe();
73
- }
74
-
75
- reopen() {
76
- if (this.url && this.opened$.value === false) {
77
- this.open(this.url, this.pingSystemInterval, this.systemAliveTimeout);
78
- }
79
- }
80
-
81
- send(message: IMotionMasterMessage): void {
82
- if (!message.request?.pingSystem) {
83
- const context = convertMotionMasterMessageToLoggerContext(message);
84
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
- logger.info(context as any, `Send ${context.name}`);
86
- }
87
-
88
- this.webSocket$?.next(MotionMasterMessage.encode(message).finish());
89
- }
90
-
91
- private createWebSocket(url: string, pingSystemInterval = 250) {
92
- const webSocketConfig: WebSocketSubjectConfig<Uint8Array> = {
93
- binaryType: 'arraybuffer',
94
- closeObserver: {
95
- next: () => {
96
- this.opened$.next(false);
97
- logger.info(`Connection closed ${url}`);
98
- },
99
- },
100
- deserializer: (e: MessageEvent) => new Uint8Array(e.data as unknown as Iterable<number>),
101
- openObserver: {
102
- next: () => {
103
- this.pingSystemSubscription = interval(pingSystemInterval)
104
- .subscribe(this.pingSystemObserver);
105
- this.opened$.next(true);
106
- logger.info(`Connection opened ${url}`);
107
- },
108
- },
109
- serializer: (value: Uint8Array) => value,
110
- url,
111
- };
112
-
113
- return webSocket(webSocketConfig);
114
- }
115
-
116
- private keepalive(systemAliveTimeout = 1000) {
117
- if (this.alive$.getValue() === false) {
118
- this.alive$.next(true);
119
- }
120
- clearTimeout(this.aliveTimeoutId);
121
- this.aliveTimeoutId = setTimeout(() => this.alive$.next(false), systemAliveTimeout) as unknown as number;
122
- }
123
-
124
- }
@@ -1,87 +0,0 @@
1
- import { BehaviorSubject, Subject } from "rxjs";
2
- import { logger } from "./logger";
3
- import { MotionMasterReqResSocket } from "./motion-master-req-res-socket";
4
- import { IMotionMasterMessage } from "./types";
5
- import { convertMotionMasterMessageToLoggerContext } from "./util";
6
-
7
- export class MotionMasterReqResWorkerSocket implements MotionMasterReqResSocket {
8
-
9
- readonly opened$ = new BehaviorSubject<boolean>(false);
10
-
11
- readonly alive$ = new BehaviorSubject<boolean>(false);
12
-
13
- readonly message$ = new Subject<IMotionMasterMessage>();
14
-
15
- private _url?: string;
16
- private _pingSystemInterval?: number;
17
- private _systemAliveTimeout?: number;
18
-
19
- constructor(
20
- public readonly worker: Worker,
21
- ) { }
22
-
23
- get url(): string | undefined {
24
- return this._url;
25
- }
26
-
27
- get pingSystemInterval(): number | undefined {
28
- return this._pingSystemInterval;
29
- }
30
-
31
- get systemAliveTimeout(): number | undefined {
32
- return this._systemAliveTimeout;
33
- }
34
-
35
- open(url: string, pingSystemInterval = 250, systemAliveTimeout = 1000): void {
36
- if (this.opened$.getValue() === true) {
37
- throw new Error('MotionMasterReqResWorkerSocket is already opened!');
38
- }
39
-
40
- this._url = url;
41
- this._pingSystemInterval = pingSystemInterval;
42
- this._systemAliveTimeout = systemAliveTimeout;
43
-
44
- this.worker.onmessage = ({ data }) => {
45
- if ('opened' in data) {
46
- const { opened } = data;
47
- this.opened$.next(opened);
48
- logger.info(opened ? `Opened req/res 🔌 ${url}` : `Closed req/res 🔌 ${url}`);
49
- } else if ('alive' in data) {
50
- const { alive } = data;
51
- this.alive$.next(alive);
52
- logger.info(alive ? `System is alive 💓` : 'System is as dead as 🦤');
53
- } else if ('message' in data) {
54
- const { message } = data;
55
-
56
- const context = convertMotionMasterMessageToLoggerContext(message);
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- logger.info(context as any, `Received ${context.name}`);
59
-
60
- this.message$.next(message);
61
- }
62
- }
63
-
64
- this.worker.postMessage({
65
- open: { url, pingSystemInterval, systemAliveTimeout },
66
- });
67
- }
68
-
69
- reopen() {
70
- if (this.url && this.opened$.value === false) {
71
- this.open(this.url, this.pingSystemInterval, this.systemAliveTimeout);
72
- }
73
- }
74
-
75
- close(): void {
76
- this.worker.postMessage({ close: true });
77
- }
78
-
79
- send(message: IMotionMasterMessage): void {
80
- const context = convertMotionMasterMessageToLoggerContext(message);
81
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
- logger.info(context as any, `Send ${context.name}`);
83
-
84
- this.worker.postMessage({ message });
85
- }
86
-
87
- }
@@ -1,110 +0,0 @@
1
- import { pipe, filter, map, timeout, takeWhile, Observable, UnaryFunction, mergeMap, of } from 'rxjs';
2
- import { getParameterValue } from './util';
3
- import { requestStatusResolver } from './request-status-resolver';
4
- import { IMotionMasterMessage, MotionMasterMessage, ParameterValueType, StatusKey } from './types';
5
- import { DeviceParameter } from './device-parameter';
6
- import { MotionMasterReqResClient } from './motion-master-req-res-client';
7
- import { makeParameterId } from './parameter';
8
-
9
- export function selectMotionMasterMessageStatusByMessageId<T>(key: StatusKey, id?: string) {
10
- return pipe(
11
- filter((message: IMotionMasterMessage) => message.id === id),
12
- map((message) => {
13
- // Handling the special case when Motion Master sends SystemEvent instead of e.g. DeviceParameterInfo status for
14
- // GetDeviceParameterInfo request message. This typically happens when request contains an invalid device address.
15
- if (message.status?.systemEvent && key !== 'systemEvent') {
16
- if (message.status.systemEvent.error) {
17
- throw new Error(`Error selecting message: ${message.status.systemEvent.error.message ?? ''}`);
18
- } else {
19
- throw new Error(`Error selecting message. Received System Event instead of "${key.toString()}": ${JSON.stringify(message)}`);
20
- }
21
- }
22
- return message.status?.[key] as T;
23
- }),
24
- );
25
- }
26
-
27
- export function extendStatus<T>(data: { statusKey: StatusKey, messageId: string }) {
28
- return pipe(
29
- map((status: T) => {
30
- const { statusKey, messageId } = data;
31
- const request = requestStatusResolver[statusKey]?.<T>(status);
32
- return { ...status, messageId, request };
33
- }),
34
- );
35
- }
36
-
37
- export function transformMotionMasterMessageToStatus<T>(statusKey: StatusKey, requestTimeout: number, messageId: string) {
38
- if (typeof requestTimeout !== 'number') {
39
- throw new Error(`Invalid requestTimeout=${requestTimeout} provided for ${statusKey}`);
40
- }
41
-
42
- return pipe(
43
- selectMotionMasterMessageStatusByMessageId<T>(statusKey, messageId),
44
- timeout(requestTimeout),
45
- extendStatus({ statusKey, messageId }),
46
- takeWhile((status) => status.request !== 'succeeded' && status.request !== 'failed', true),
47
- );
48
- }
49
-
50
- export function selectMotionMasterMessageByTopic<T>(topic: string) {
51
- return pipe(
52
- filter(([t]: [string, T]) => t === topic),
53
- map(([, data]) => data),
54
- );
55
- }
56
-
57
- export function selectMotionMasterMessageStatusByKey<T>(key: keyof MotionMasterMessage.IStatus) {
58
- return pipe(
59
- filter((message: IMotionMasterMessage) => !!(message.status && message.status[key])),
60
- map((message) => message.status?.[key] as T),
61
- );
62
- }
63
-
64
- export function mapMonitoringParameterValuesStatusMessageToParameterValues()
65
- : UnaryFunction<Observable<IMotionMasterMessage>, Observable<ParameterValueType[]>> {
66
- return pipe(
67
- map((message: IMotionMasterMessage) => {
68
- if (message.status?.monitoringParameterValues) {
69
- const { deviceParameterValues } = message.status.monitoringParameterValues;
70
- if (deviceParameterValues?.parameterValues) {
71
- return deviceParameterValues.parameterValues.map((parameterValue) => getParameterValue(parameterValue));
72
- }
73
- }
74
- return [];
75
- }),
76
- );
77
- }
78
-
79
- export function mapMonitoringParameterValuesStatusMessageToDeviceParameters(request: MotionMasterReqResClient)
80
- : UnaryFunction<Observable<IMotionMasterMessage>, Observable<DeviceParameter[]>> {
81
- return pipe(
82
- mergeMap((message: IMotionMasterMessage) => {
83
- const parameterValues = message.status?.monitoringParameterValues?.deviceParameterValues?.parameterValues;
84
-
85
- if (!parameterValues) {
86
- return of([]);
87
- }
88
-
89
- const deviceAddress = message?.status?.monitoringParameterValues?.deviceParameterValues?.deviceAddress!;
90
-
91
- return request.resolveDeviceParameterInfoMap(deviceAddress).pipe(
92
- map((infoMap) => {
93
- return parameterValues.map((parameter) => {
94
- const id = makeParameterId(parameter.index!, parameter.subindex ?? 0);
95
-
96
- const infoParameter = infoMap.get(id);
97
-
98
- if (!infoParameter) {
99
- throw new Error(`No info parameter for ${deviceAddress} ${id}`);
100
- }
101
-
102
- const value = getParameterValue(parameter);
103
-
104
- return { ...infoParameter, value };
105
- })
106
- }),
107
- );
108
- }),
109
- );
110
- }
@@ -1,12 +0,0 @@
1
- import { MotionMasterMessage } from './types';
2
-
3
- export const parameterValueTypeOptions = {
4
- 'intValue': 'intValue',
5
- 'uintValue': 'uintValue',
6
- 'floatValue': 'floatValue',
7
- 'stringValue': 'stringValue',
8
- 'rawValue': 'rawValue',
9
- };
10
-
11
- export const ethercatNetworkStateOptions = MotionMasterMessage.Status.EthercatNetworkState.State;
12
- export const positionControllerTypeOptions = MotionMasterMessage.Request.ComputeAutoTuningGains.PositionParameters.ControllerType;
@@ -1,160 +0,0 @@
1
- import { differenceParameters, intersectionParameters, makeParameterId, splitParameterId } from "./parameter";
2
-
3
- describe('parameter', () => {
4
-
5
- describe('makeParameterId', () => {
6
-
7
- test.each<[[(number | null | undefined), (number | null | undefined)], string]>([
8
- [[0x1234, 123], '0x1234:7B'],
9
- [[23, 23], '0x0017:17'],
10
- [[0, 0], '0x0000:00'],
11
- [[0x2000, undefined], '0x2000:00'],
12
- [[0x2003, null], '0x2003:00'],
13
- [[0x10000, 3], '0x00010000:03'],
14
- [[0x100F0, undefined], '0x000100F0:00'],
15
- ])('should for tuple %j return "%s"', (tuple, expected) => {
16
- const result = makeParameterId(tuple);
17
-
18
- expect(result).toBe(expected);
19
- });
20
-
21
- test.each([
22
- [{}, '0x0000:00'],
23
- [{ index: 0x2004, subindex: 4 }, '0x2004:04'],
24
- [{ index: 0x1024 }, '0x1024:00'],
25
- ])('should for parameter %j return "%s"', (parameter, expected) => {
26
- const result = makeParameterId(parameter);
27
-
28
- expect(result).toBe(expected);
29
- });
30
-
31
- test.each([
32
- [0x1234, 123, '0x1234:7B'],
33
- [23, 23, '0x0017:17'],
34
- [0, 0, '0x0000:00'],
35
- [0x2000, undefined, '0x2000:00'],
36
- [0x2003, null, '0x2003:00'],
37
- [0x10000, 3, '0x00010000:03'],
38
- [0x100F0, undefined, '0x000100F0:00'],
39
- ])('should for index %d and subindex %d return "%s"', (index, subindex, expected) => {
40
- const result = makeParameterId(index, subindex);
41
-
42
- expect(result).toBe(expected);
43
- });
44
-
45
- it('should throw if index is less than 0', () => {
46
- expect(() => {
47
- makeParameterId(-123, 0);
48
- }).toThrow();
49
- });
50
-
51
- it('should throw if subindex is less than 0', () => {
52
- expect(() => {
53
- makeParameterId(0x1024, -3);
54
- }).toThrow();
55
- });
56
-
57
- });
58
-
59
- describe('splitParameterId', () => {
60
-
61
- test.each([
62
- ['0x1234:7B', [4660, 123]],
63
- ['0x000100F0:00', [65776, 0]],
64
- ])('should for id "%s" return tuple %j', (id, expected) => {
65
- const result = splitParameterId(id);
66
-
67
- expect(result).toEqual(expected);
68
- });
69
-
70
- test.each([
71
- ['0x12:7B'],
72
- ['0x1234:F'],
73
- ['0x1234:FG'],
74
- ['0x1H34:FF'],
75
- ])('should throw error for id "%s"', (id) => {
76
- expect(() => splitParameterId(id)).toThrow();
77
- });
78
-
79
- });
80
-
81
- describe('differenceParameters', () => {
82
- it('should return an empty array if there are no differences', () => {
83
- const parameters = differenceParameters(
84
- [
85
- { index: 0x2030, subindex: 1 },
86
- { index: 0x2031, subindex: 1 },
87
- ],
88
- [
89
- { index: 0x2030, subindex: 1 },
90
- { index: 0x2031, subindex: 1 },
91
- ],
92
- );
93
-
94
- expect(parameters).toEqual([]);
95
- });
96
-
97
- it('should return an array of differences', () => {
98
- const parameters = differenceParameters(
99
- [
100
- { index: 0x2030, subindex: 1 },
101
- { index: 0x2031, subindex: 1 },
102
- { index: 0x6040, subindex: 0 },
103
- { index: 0x6091, subindex: 0 },
104
- ],
105
- [
106
- { index: 0x2031, subindex: 1 },
107
- { index: 0x6040, subindex: 0 },
108
- { index: 0x6041, subindex: 0 },
109
- ],
110
- );
111
-
112
- expect(parameters).toEqual([
113
- { index: 0x2030, subindex: 1 },
114
- { index: 0x6091, subindex: 0 },
115
- ]);
116
- });
117
- });
118
-
119
- fdescribe('intersectionParameters', () => {
120
- it('should return full array if there are no differences', () => {
121
- const parameters = intersectionParameters(
122
- [
123
- { index: 0x2030, subindex: 1 },
124
- { index: 0x2031, subindex: 1 },
125
- ],
126
- [
127
- { index: 0x2030, subindex: 1 },
128
- { index: 0x2031, subindex: 1 },
129
- ],
130
- );
131
-
132
- expect(parameters).toEqual([
133
- { index: 0x2030, subindex: 1 },
134
- { index: 0x2031, subindex: 1 },
135
- ]);
136
- });
137
-
138
- it('should return an array excluding differences', () => {
139
- const parameters = intersectionParameters(
140
- [
141
- { index: 0x2031, subindex: 1 },
142
- { index: 0x6040, subindex: 0 },
143
- { index: 0x6041, subindex: 0 },
144
- ],
145
- [
146
- { index: 0x2030, subindex: 1 },
147
- { index: 0x2031, subindex: 1 },
148
- { index: 0x6040, subindex: 0 },
149
- { index: 0x6091, subindex: 0 },
150
- ],
151
- );
152
-
153
- expect(parameters).toEqual([
154
- { index: 0x2031, subindex: 1 },
155
- { index: 0x6040, subindex: 0 },
156
- ]);
157
- });
158
- });
159
-
160
- });