@ya-modbus/cli 0.6.0 → 0.7.0
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.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/bin/ya-modbus.d.ts.map +1 -0
- package/dist/cjs/bin/ya-modbus.js +12 -0
- package/dist/cjs/bin/ya-modbus.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/commands/discover.d.ts.map +1 -0
- package/dist/cjs/src/commands/discover.js +196 -0
- package/dist/cjs/src/commands/discover.js.map +1 -0
- package/dist/cjs/src/commands/list-devices.d.ts.map +1 -0
- package/dist/cjs/src/commands/list-devices.js +79 -0
- package/dist/cjs/src/commands/list-devices.js.map +1 -0
- package/dist/cjs/src/commands/read.d.ts.map +1 -0
- package/dist/cjs/src/commands/read.js +79 -0
- package/dist/cjs/src/commands/read.js.map +1 -0
- package/dist/cjs/src/commands/show-defaults.d.ts.map +1 -0
- package/dist/cjs/src/commands/show-defaults.js +51 -0
- package/dist/cjs/src/commands/show-defaults.js.map +1 -0
- package/dist/cjs/src/commands/write.d.ts.map +1 -0
- package/dist/cjs/src/commands/write.js +65 -0
- package/dist/cjs/src/commands/write.js.map +1 -0
- package/dist/cjs/src/discovery/constants.d.ts.map +1 -0
- package/dist/cjs/src/discovery/constants.js +48 -0
- package/dist/cjs/src/discovery/constants.js.map +1 -0
- package/dist/cjs/src/discovery/device-identifier.d.ts.map +1 -0
- package/dist/cjs/src/discovery/device-identifier.js +196 -0
- package/dist/cjs/src/discovery/device-identifier.js.map +1 -0
- package/dist/cjs/src/discovery/parameter-generator-utils.d.ts.map +1 -0
- package/dist/cjs/src/discovery/parameter-generator-utils.js +63 -0
- package/dist/cjs/src/discovery/parameter-generator-utils.js.map +1 -0
- package/dist/cjs/src/discovery/parameter-generator.d.ts.map +1 -0
- package/dist/cjs/src/discovery/parameter-generator.js +188 -0
- package/dist/cjs/src/discovery/parameter-generator.js.map +1 -0
- package/dist/cjs/src/discovery/progress.d.ts.map +1 -0
- package/dist/cjs/src/discovery/progress.js +59 -0
- package/dist/cjs/src/discovery/progress.js.map +1 -0
- package/dist/cjs/src/discovery/scanner.d.ts.map +1 -0
- package/dist/cjs/src/discovery/scanner.js +147 -0
- package/dist/cjs/src/discovery/scanner.js.map +1 -0
- package/dist/cjs/src/formatters/discovery-results.d.ts.map +1 -0
- package/dist/cjs/src/formatters/discovery-results.js +62 -0
- package/dist/cjs/src/formatters/discovery-results.js.map +1 -0
- package/dist/cjs/src/formatters/json.d.ts.map +1 -0
- package/dist/cjs/src/formatters/json.js +36 -0
- package/dist/cjs/src/formatters/json.js.map +1 -0
- package/dist/cjs/src/formatters/performance.d.ts.map +1 -0
- package/dist/cjs/src/formatters/performance.js +28 -0
- package/dist/cjs/src/formatters/performance.js.map +1 -0
- package/dist/cjs/src/formatters/table.d.ts.map +1 -0
- package/dist/cjs/src/formatters/table.js +95 -0
- package/dist/cjs/src/formatters/table.js.map +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +157 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/utils/commands.d.ts.map +1 -0
- package/dist/cjs/src/utils/commands.js +421 -0
- package/dist/cjs/src/utils/commands.js.map +1 -0
- package/dist/cjs/src/utils/object-utils.d.ts.map +1 -0
- package/dist/cjs/src/utils/object-utils.js +31 -0
- package/dist/cjs/src/utils/object-utils.js.map +1 -0
- package/dist/cjs/src/utils/validation.d.ts.map +1 -0
- package/dist/cjs/src/utils/validation.js +165 -0
- package/dist/cjs/src/utils/validation.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/esm/bin/ya-modbus.d.ts +9 -0
- package/dist/esm/bin/ya-modbus.d.ts.map +1 -0
- package/dist/esm/bin/ya-modbus.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/src/commands/discover.d.ts +25 -0
- package/dist/esm/src/commands/discover.d.ts.map +1 -0
- package/dist/esm/src/commands/discover.js.map +1 -0
- package/dist/esm/src/commands/list-devices.d.ts +21 -0
- package/dist/esm/src/commands/list-devices.d.ts.map +1 -0
- package/dist/esm/src/commands/list-devices.js.map +1 -0
- package/dist/esm/src/commands/read.d.ts +25 -0
- package/dist/esm/src/commands/read.d.ts.map +1 -0
- package/dist/esm/src/commands/read.js.map +1 -0
- package/dist/esm/src/commands/show-defaults.d.ts +21 -0
- package/dist/esm/src/commands/show-defaults.d.ts.map +1 -0
- package/dist/esm/src/commands/show-defaults.js.map +1 -0
- package/dist/esm/src/commands/write.d.ts +26 -0
- package/dist/esm/src/commands/write.d.ts.map +1 -0
- package/dist/esm/src/commands/write.js.map +1 -0
- package/dist/esm/src/discovery/constants.d.ts +37 -0
- package/dist/esm/src/discovery/constants.d.ts.map +1 -0
- package/dist/esm/src/discovery/constants.js.map +1 -0
- package/dist/esm/src/discovery/device-identifier.d.ts +52 -0
- package/dist/esm/src/discovery/device-identifier.d.ts.map +1 -0
- package/dist/esm/src/discovery/device-identifier.js.map +1 -0
- package/dist/esm/src/discovery/parameter-generator-utils.d.ts +29 -0
- package/dist/esm/src/discovery/parameter-generator-utils.d.ts.map +1 -0
- package/dist/esm/src/discovery/parameter-generator-utils.js.map +1 -0
- package/dist/esm/src/discovery/parameter-generator.d.ts +97 -0
- package/dist/esm/src/discovery/parameter-generator.d.ts.map +1 -0
- package/dist/esm/src/discovery/parameter-generator.js.map +1 -0
- package/dist/esm/src/discovery/progress.d.ts +24 -0
- package/dist/esm/src/discovery/progress.d.ts.map +1 -0
- package/dist/{src → esm/src}/discovery/progress.js +2 -4
- package/dist/esm/src/discovery/progress.js.map +1 -0
- package/dist/esm/src/discovery/scanner.d.ts +46 -0
- package/dist/esm/src/discovery/scanner.d.ts.map +1 -0
- package/dist/esm/src/discovery/scanner.js.map +1 -0
- package/dist/esm/src/formatters/discovery-results.d.ts +10 -0
- package/dist/esm/src/formatters/discovery-results.d.ts.map +1 -0
- package/dist/esm/src/formatters/discovery-results.js.map +1 -0
- package/dist/esm/src/formatters/json.d.ts +30 -0
- package/dist/esm/src/formatters/json.d.ts.map +1 -0
- package/dist/esm/src/formatters/json.js.map +1 -0
- package/dist/esm/src/formatters/performance.d.ts +19 -0
- package/dist/esm/src/formatters/performance.d.ts.map +1 -0
- package/dist/esm/src/formatters/performance.js.map +1 -0
- package/dist/esm/src/formatters/table.d.ts +10 -0
- package/dist/esm/src/formatters/table.d.ts.map +1 -0
- package/dist/esm/src/formatters/table.js.map +1 -0
- package/dist/esm/src/index.d.ts +5 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/utils/commands.d.ts +191 -0
- package/dist/esm/src/utils/commands.d.ts.map +1 -0
- package/dist/esm/src/utils/commands.js.map +1 -0
- package/dist/esm/src/utils/object-utils.d.ts +20 -0
- package/dist/esm/src/utils/object-utils.d.ts.map +1 -0
- package/dist/esm/src/utils/object-utils.js.map +1 -0
- package/dist/esm/src/utils/validation.d.ts +70 -0
- package/dist/esm/src/utils/validation.d.ts.map +1 -0
- package/dist/{src → esm/src}/utils/validation.js +0 -3
- package/dist/esm/src/utils/validation.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +26 -9
- package/dist/bin/ya-modbus.d.ts.map +0 -1
- package/dist/bin/ya-modbus.js.map +0 -1
- package/dist/src/commands/discover.d.ts.map +0 -1
- package/dist/src/commands/discover.js.map +0 -1
- package/dist/src/commands/list-devices.d.ts.map +0 -1
- package/dist/src/commands/list-devices.js.map +0 -1
- package/dist/src/commands/read.d.ts.map +0 -1
- package/dist/src/commands/read.js.map +0 -1
- package/dist/src/commands/show-defaults.d.ts.map +0 -1
- package/dist/src/commands/show-defaults.js.map +0 -1
- package/dist/src/commands/write.d.ts.map +0 -1
- package/dist/src/commands/write.js.map +0 -1
- package/dist/src/discovery/constants.d.ts.map +0 -1
- package/dist/src/discovery/constants.js.map +0 -1
- package/dist/src/discovery/device-identifier.d.ts.map +0 -1
- package/dist/src/discovery/device-identifier.js.map +0 -1
- package/dist/src/discovery/parameter-generator-utils.d.ts.map +0 -1
- package/dist/src/discovery/parameter-generator-utils.js.map +0 -1
- package/dist/src/discovery/parameter-generator.d.ts.map +0 -1
- package/dist/src/discovery/parameter-generator.js.map +0 -1
- package/dist/src/discovery/progress.d.ts.map +0 -1
- package/dist/src/discovery/progress.js.map +0 -1
- package/dist/src/discovery/scanner.d.ts.map +0 -1
- package/dist/src/discovery/scanner.js.map +0 -1
- package/dist/src/formatters/discovery-results.d.ts.map +0 -1
- package/dist/src/formatters/discovery-results.js.map +0 -1
- package/dist/src/formatters/json.d.ts.map +0 -1
- package/dist/src/formatters/json.js.map +0 -1
- package/dist/src/formatters/performance.d.ts.map +0 -1
- package/dist/src/formatters/performance.js.map +0 -1
- package/dist/src/formatters/table.d.ts.map +0 -1
- package/dist/src/formatters/table.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/utils/commands.d.ts.map +0 -1
- package/dist/src/utils/commands.js.map +0 -1
- package/dist/src/utils/object-utils.d.ts.map +0 -1
- package/dist/src/utils/object-utils.js.map +0 -1
- package/dist/src/utils/validation.d.ts.map +0 -1
- package/dist/src/utils/validation.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{bin → cjs/bin}/ya-modbus.d.ts +0 -0
- /package/dist/{src → cjs/src}/commands/discover.d.ts +0 -0
- /package/dist/{src → cjs/src}/commands/list-devices.d.ts +0 -0
- /package/dist/{src → cjs/src}/commands/read.d.ts +0 -0
- /package/dist/{src → cjs/src}/commands/show-defaults.d.ts +0 -0
- /package/dist/{src → cjs/src}/commands/write.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/constants.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/device-identifier.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/parameter-generator-utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/parameter-generator.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/progress.d.ts +0 -0
- /package/dist/{src → cjs/src}/discovery/scanner.d.ts +0 -0
- /package/dist/{src → cjs/src}/formatters/discovery-results.d.ts +0 -0
- /package/dist/{src → cjs/src}/formatters/json.d.ts +0 -0
- /package/dist/{src → cjs/src}/formatters/performance.d.ts +0 -0
- /package/dist/{src → cjs/src}/formatters/table.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/commands.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/object-utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/utils/validation.d.ts +0 -0
- /package/dist/{bin → esm/bin}/ya-modbus.js +0 -0
- /package/dist/{src → esm/src}/commands/discover.js +0 -0
- /package/dist/{src → esm/src}/commands/list-devices.js +0 -0
- /package/dist/{src → esm/src}/commands/read.js +0 -0
- /package/dist/{src → esm/src}/commands/show-defaults.js +0 -0
- /package/dist/{src → esm/src}/commands/write.js +0 -0
- /package/dist/{src → esm/src}/discovery/constants.js +0 -0
- /package/dist/{src → esm/src}/discovery/device-identifier.js +0 -0
- /package/dist/{src → esm/src}/discovery/parameter-generator-utils.js +0 -0
- /package/dist/{src → esm/src}/discovery/parameter-generator.js +0 -0
- /package/dist/{src → esm/src}/discovery/scanner.js +0 -0
- /package/dist/{src → esm/src}/formatters/discovery-results.js +0 -0
- /package/dist/{src → esm/src}/formatters/json.js +0 -0
- /package/dist/{src → esm/src}/formatters/performance.js +0 -0
- /package/dist/{src → esm/src}/formatters/table.js +0 -0
- /package/dist/{src → esm/src}/index.js +0 -0
- /package/dist/{src → esm/src}/utils/commands.js +0 -0
- /package/dist/{src → esm/src}/utils/object-utils.js +0 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TCP_PORT = exports.DEFAULT_RTU_CONFIG = void 0;
|
|
4
|
+
exports.isReadable = isReadable;
|
|
5
|
+
exports.isWritable = isWritable;
|
|
6
|
+
exports.findDataPoint = findDataPoint;
|
|
7
|
+
exports.findReadableDataPoint = findReadableDataPoint;
|
|
8
|
+
exports.findWritableDataPoint = findWritableDataPoint;
|
|
9
|
+
exports.floatsEqual = floatsEqual;
|
|
10
|
+
exports.parseValue = parseValue;
|
|
11
|
+
exports.validateValue = validateValue;
|
|
12
|
+
exports.confirm = confirm;
|
|
13
|
+
exports.withTransport = withTransport;
|
|
14
|
+
exports.loadDriverMetadata = loadDriverMetadata;
|
|
15
|
+
exports.getEffectiveDefaultConfig = getEffectiveDefaultConfig;
|
|
16
|
+
exports.getEffectiveSupportedConfig = getEffectiveSupportedConfig;
|
|
17
|
+
exports.getEffectiveDriverMetadata = getEffectiveDriverMetadata;
|
|
18
|
+
exports.applyDriverDefaults = applyDriverDefaults;
|
|
19
|
+
exports.withDriverInstance = withDriverInstance;
|
|
20
|
+
exports.withDriver = withDriver;
|
|
21
|
+
const tslib_1 = require("tslib");
|
|
22
|
+
const promises_1 = tslib_1.__importDefault(require("readline/promises"));
|
|
23
|
+
const driver_loader_1 = require("@ya-modbus/driver-loader");
|
|
24
|
+
const transport_1 = require("@ya-modbus/transport");
|
|
25
|
+
const object_utils_js_1 = require("./object-utils.js");
|
|
26
|
+
const validation_js_1 = require("./validation.js");
|
|
27
|
+
/**
|
|
28
|
+
* Default RTU transport configuration values
|
|
29
|
+
*/
|
|
30
|
+
exports.DEFAULT_RTU_CONFIG = {
|
|
31
|
+
port: '/dev/ttyUSB0',
|
|
32
|
+
baudRate: 9600,
|
|
33
|
+
dataBits: 8,
|
|
34
|
+
parity: 'even',
|
|
35
|
+
stopBits: 1,
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Default TCP port for Modbus TCP
|
|
39
|
+
*/
|
|
40
|
+
exports.DEFAULT_TCP_PORT = 502;
|
|
41
|
+
/**
|
|
42
|
+
* Check if a data point is readable
|
|
43
|
+
*/
|
|
44
|
+
function isReadable(dataPoint) {
|
|
45
|
+
const access = dataPoint.access ?? 'r';
|
|
46
|
+
return access === 'r' || access === 'rw';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a data point is writable
|
|
50
|
+
*/
|
|
51
|
+
function isWritable(dataPoint) {
|
|
52
|
+
const access = dataPoint.access ?? 'r';
|
|
53
|
+
return access === 'w' || access === 'rw';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find a data point by ID
|
|
57
|
+
*
|
|
58
|
+
* @param driver - Device driver instance
|
|
59
|
+
* @param id - Data point ID
|
|
60
|
+
* @returns Data point definition
|
|
61
|
+
* @throws Error if data point not found
|
|
62
|
+
*/
|
|
63
|
+
function findDataPoint(driver, id) {
|
|
64
|
+
const dataPoint = driver.dataPoints.find((dp) => dp.id === id);
|
|
65
|
+
if (!dataPoint) {
|
|
66
|
+
throw new Error(`Data point not found: ${id}`);
|
|
67
|
+
}
|
|
68
|
+
return dataPoint;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Find and validate a readable data point
|
|
72
|
+
*
|
|
73
|
+
* @param driver - Device driver instance
|
|
74
|
+
* @param id - Data point ID
|
|
75
|
+
* @returns Data point definition
|
|
76
|
+
* @throws Error if data point not found or not readable
|
|
77
|
+
*/
|
|
78
|
+
function findReadableDataPoint(driver, id) {
|
|
79
|
+
const dataPoint = findDataPoint(driver, id);
|
|
80
|
+
if (!isReadable(dataPoint)) {
|
|
81
|
+
throw new Error(`Data point is write-only: ${id}`);
|
|
82
|
+
}
|
|
83
|
+
return dataPoint;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find and validate a writable data point
|
|
87
|
+
*
|
|
88
|
+
* @param driver - Device driver instance
|
|
89
|
+
* @param id - Data point ID
|
|
90
|
+
* @returns Data point definition
|
|
91
|
+
* @throws Error if data point not found or not writable
|
|
92
|
+
*/
|
|
93
|
+
function findWritableDataPoint(driver, id) {
|
|
94
|
+
const dataPoint = findDataPoint(driver, id);
|
|
95
|
+
if (!isWritable(dataPoint)) {
|
|
96
|
+
throw new Error(`Data point is read-only: ${id}`);
|
|
97
|
+
}
|
|
98
|
+
return dataPoint;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Compare two floating point numbers for approximate equality
|
|
102
|
+
*
|
|
103
|
+
* Uses relative error to handle both very small and very large values correctly.
|
|
104
|
+
* Also checks absolute error to handle values near zero.
|
|
105
|
+
*
|
|
106
|
+
* @param a - First value
|
|
107
|
+
* @param b - Second value
|
|
108
|
+
* @param relativeEpsilon - Relative error tolerance (default: 1e-6, or 0.0001%)
|
|
109
|
+
* @param absoluteEpsilon - Absolute error tolerance for values near zero (default: 1e-9)
|
|
110
|
+
* @returns True if values are approximately equal
|
|
111
|
+
*/
|
|
112
|
+
function floatsEqual(a, b, relativeEpsilon = 1e-6, absoluteEpsilon = 1e-9) {
|
|
113
|
+
const absoluteError = Math.abs(a - b);
|
|
114
|
+
// Check absolute error first (handles values near zero)
|
|
115
|
+
if (absoluteError < absoluteEpsilon) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
// Check relative error (handles large and small values)
|
|
119
|
+
const largestMagnitude = Math.max(Math.abs(a), Math.abs(b));
|
|
120
|
+
const relativeError = absoluteError / largestMagnitude;
|
|
121
|
+
return relativeError < relativeEpsilon;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse value string based on data point type
|
|
125
|
+
*/
|
|
126
|
+
function parseValue(valueStr, dataPoint) {
|
|
127
|
+
switch (dataPoint.type) {
|
|
128
|
+
case 'float':
|
|
129
|
+
return parseFloat(valueStr);
|
|
130
|
+
case 'integer':
|
|
131
|
+
return parseInt(valueStr, 10);
|
|
132
|
+
case 'boolean':
|
|
133
|
+
return valueStr.toLowerCase() === 'true' || valueStr === '1';
|
|
134
|
+
case 'string':
|
|
135
|
+
return valueStr;
|
|
136
|
+
case 'enum': {
|
|
137
|
+
// Try to parse as number first, otherwise use string
|
|
138
|
+
const num = parseInt(valueStr, 10);
|
|
139
|
+
return isNaN(num) ? valueStr : num;
|
|
140
|
+
}
|
|
141
|
+
default:
|
|
142
|
+
return valueStr;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Validate value against data point constraints
|
|
147
|
+
*/
|
|
148
|
+
function validateValue(value, dataPoint) {
|
|
149
|
+
// Check min/max for numeric types
|
|
150
|
+
if ((dataPoint.type === 'float' || dataPoint.type === 'integer') && typeof value === 'number') {
|
|
151
|
+
if (dataPoint.min !== undefined && value < dataPoint.min) {
|
|
152
|
+
throw new Error(`Value ${value} is outside valid range [${dataPoint.min}, ${dataPoint.max ?? '∞'}]`);
|
|
153
|
+
}
|
|
154
|
+
if (dataPoint.max !== undefined && value > dataPoint.max) {
|
|
155
|
+
throw new Error(`Value ${value} is outside valid range [${dataPoint.min ?? '-∞'}, ${dataPoint.max}]`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Validate enum values
|
|
159
|
+
if (dataPoint.type === 'enum' && dataPoint.enumValues) {
|
|
160
|
+
const validKeys = Object.keys(dataPoint.enumValues);
|
|
161
|
+
const valueStr = String(value);
|
|
162
|
+
if (!validKeys.includes(valueStr)) {
|
|
163
|
+
throw new Error(`Invalid enum value: ${String(value)}. Valid values: ${validKeys.join(', ')}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Prompt user for confirmation
|
|
169
|
+
*/
|
|
170
|
+
async function confirm(message) {
|
|
171
|
+
const rl = promises_1.default.createInterface({
|
|
172
|
+
input: process.stdin,
|
|
173
|
+
output: process.stdout,
|
|
174
|
+
});
|
|
175
|
+
try {
|
|
176
|
+
const answer = await rl.question(`${message} (y/N): `);
|
|
177
|
+
return answer.toLowerCase() === 'y';
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
rl.close();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Execute a function with a transport, ensuring cleanup
|
|
185
|
+
*
|
|
186
|
+
* @param options - Transport configuration options
|
|
187
|
+
* @param fn - Function to execute with the transport
|
|
188
|
+
* @returns Result of the function
|
|
189
|
+
*/
|
|
190
|
+
async function withTransport(options, fn) {
|
|
191
|
+
// Build transport configuration
|
|
192
|
+
const transportConfig = options.host
|
|
193
|
+
? {
|
|
194
|
+
// TCP configuration
|
|
195
|
+
host: options.host,
|
|
196
|
+
port: typeof options.port === 'number' ? options.port : exports.DEFAULT_TCP_PORT,
|
|
197
|
+
slaveId: options.slaveId,
|
|
198
|
+
timeout: options.timeout,
|
|
199
|
+
}
|
|
200
|
+
: {
|
|
201
|
+
// RTU configuration
|
|
202
|
+
port: options.port ?? exports.DEFAULT_RTU_CONFIG.port,
|
|
203
|
+
baudRate: options.baudRate ?? exports.DEFAULT_RTU_CONFIG.baudRate,
|
|
204
|
+
dataBits: (options.dataBits ?? exports.DEFAULT_RTU_CONFIG.dataBits),
|
|
205
|
+
parity: (options.parity ?? exports.DEFAULT_RTU_CONFIG.parity),
|
|
206
|
+
stopBits: (options.stopBits ?? exports.DEFAULT_RTU_CONFIG.stopBits),
|
|
207
|
+
slaveId: options.slaveId,
|
|
208
|
+
timeout: options.timeout,
|
|
209
|
+
};
|
|
210
|
+
// Create transport
|
|
211
|
+
const transport = await (0, transport_1.createTransport)(transportConfig);
|
|
212
|
+
try {
|
|
213
|
+
return await fn(transport);
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
// Always close the transport to release resources and allow process to exit
|
|
217
|
+
await transport.close();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Load driver metadata without creating an instance
|
|
222
|
+
*
|
|
223
|
+
* When no driver name is provided, auto-detects from current working directory.
|
|
224
|
+
*
|
|
225
|
+
* @param driverName - Optional driver package name (auto-detects from cwd if not specified)
|
|
226
|
+
* @returns Loaded driver metadata
|
|
227
|
+
*/
|
|
228
|
+
async function loadDriverMetadata(driverName) {
|
|
229
|
+
return await (0, driver_loader_1.loadDriver)(driverName ? { driverPackage: driverName } : {});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get the effective default config for a device
|
|
233
|
+
*
|
|
234
|
+
* Returns device-specific config if available, otherwise driver-level config.
|
|
235
|
+
*
|
|
236
|
+
* @param driverMetadata - Loaded driver metadata
|
|
237
|
+
* @param device - Optional device key
|
|
238
|
+
* @returns Effective default config or undefined
|
|
239
|
+
*/
|
|
240
|
+
function getEffectiveDefaultConfig(driverMetadata, device) {
|
|
241
|
+
if (!driverMetadata) {
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
// Check for device-specific config first
|
|
245
|
+
if (device && driverMetadata.devices?.[device]?.defaultConfig) {
|
|
246
|
+
const deviceConfig = driverMetadata.devices[device].defaultConfig;
|
|
247
|
+
if (deviceConfig && 'baudRate' in deviceConfig) {
|
|
248
|
+
return deviceConfig;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Fall back to driver-level config
|
|
252
|
+
const driverConfig = driverMetadata.defaultConfig;
|
|
253
|
+
if (driverConfig && 'baudRate' in driverConfig) {
|
|
254
|
+
return driverConfig;
|
|
255
|
+
}
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get the effective supported config for a device
|
|
260
|
+
*
|
|
261
|
+
* Returns device-specific constraints if available, otherwise driver-level constraints.
|
|
262
|
+
*
|
|
263
|
+
* @param driverMetadata - Loaded driver metadata
|
|
264
|
+
* @param device - Optional device key
|
|
265
|
+
* @returns Effective supported config or undefined
|
|
266
|
+
*/
|
|
267
|
+
function getEffectiveSupportedConfig(driverMetadata, device) {
|
|
268
|
+
if (!driverMetadata) {
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
// Check for device-specific config first
|
|
272
|
+
if (device && driverMetadata.devices?.[device]?.supportedConfig) {
|
|
273
|
+
return driverMetadata.devices[device].supportedConfig;
|
|
274
|
+
}
|
|
275
|
+
// Fall back to driver-level config
|
|
276
|
+
return driverMetadata.supportedConfig;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create an effective driver metadata with device-specific configs resolved
|
|
280
|
+
*
|
|
281
|
+
* This creates a view of the driver metadata where defaultConfig and supportedConfig
|
|
282
|
+
* are resolved based on the selected device. This allows validation and other
|
|
283
|
+
* functions to work with device-specific settings transparently.
|
|
284
|
+
*
|
|
285
|
+
* @param driverMetadata - Loaded driver metadata
|
|
286
|
+
* @param device - Optional device key
|
|
287
|
+
* @returns Driver metadata with effective configs for the selected device
|
|
288
|
+
*/
|
|
289
|
+
function getEffectiveDriverMetadata(driverMetadata, device) {
|
|
290
|
+
const effectiveDefaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
|
|
291
|
+
const effectiveSupportedConfig = getEffectiveSupportedConfig(driverMetadata, device);
|
|
292
|
+
// Build result conditionally to satisfy exactOptionalPropertyTypes
|
|
293
|
+
const result = {
|
|
294
|
+
createDriver: driverMetadata.createDriver,
|
|
295
|
+
};
|
|
296
|
+
if (driverMetadata.devices) {
|
|
297
|
+
result.devices = driverMetadata.devices;
|
|
298
|
+
}
|
|
299
|
+
if (effectiveDefaultConfig) {
|
|
300
|
+
result.defaultConfig = effectiveDefaultConfig;
|
|
301
|
+
}
|
|
302
|
+
if (effectiveSupportedConfig) {
|
|
303
|
+
result.supportedConfig = effectiveSupportedConfig;
|
|
304
|
+
}
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Apply driver defaults to transport options
|
|
309
|
+
*
|
|
310
|
+
* Uses device-specific defaults if a device is selected, otherwise driver-level defaults.
|
|
311
|
+
*
|
|
312
|
+
* @param options - Transport options (may be incomplete)
|
|
313
|
+
* @param driverMetadata - Loaded driver metadata with defaults
|
|
314
|
+
* @param device - Optional device key for multi-device drivers
|
|
315
|
+
* @returns Transport options with defaults applied
|
|
316
|
+
*/
|
|
317
|
+
function applyDriverDefaults(options, driverMetadata, device) {
|
|
318
|
+
// For TCP connections, no serial defaults apply
|
|
319
|
+
if (options.host) {
|
|
320
|
+
return options;
|
|
321
|
+
}
|
|
322
|
+
// Get effective config (device-specific or driver-level)
|
|
323
|
+
const defaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
|
|
324
|
+
if (!defaultConfig) {
|
|
325
|
+
return options;
|
|
326
|
+
}
|
|
327
|
+
// Apply defaults for unspecified options
|
|
328
|
+
return {
|
|
329
|
+
...options,
|
|
330
|
+
baudRate: options.baudRate ?? defaultConfig.baudRate,
|
|
331
|
+
dataBits: options.dataBits ?? defaultConfig.dataBits,
|
|
332
|
+
stopBits: options.stopBits ?? defaultConfig.stopBits,
|
|
333
|
+
parity: options.parity ?? defaultConfig.parity,
|
|
334
|
+
slaveId: options.slaveId ?? defaultConfig.defaultAddress,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Execute a function with a driver instance, ensuring cleanup
|
|
339
|
+
*
|
|
340
|
+
* @param transport - Transport to use for driver communication
|
|
341
|
+
* @param driverMetadata - Loaded driver metadata
|
|
342
|
+
* @param slaveId - Modbus slave ID
|
|
343
|
+
* @param device - Optional device key for multi-device drivers
|
|
344
|
+
* @param fn - Function to execute with the driver
|
|
345
|
+
* @returns Result of the function
|
|
346
|
+
*/
|
|
347
|
+
async function withDriverInstance(transport, driverMetadata, slaveId, device, fn) {
|
|
348
|
+
// Validate device key if DEVICES registry exists
|
|
349
|
+
if (driverMetadata.devices) {
|
|
350
|
+
const validDevices = Object.keys(driverMetadata.devices);
|
|
351
|
+
if (device && !validDevices.includes(device)) {
|
|
352
|
+
throw new Error(`Unknown device: ${device}. Valid devices: ${validDevices.join(', ')}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else if (device) {
|
|
356
|
+
// Warn user that --device is ignored for single-device drivers
|
|
357
|
+
console.warn(`Warning: --device '${device}' ignored (driver does not export a DEVICES registry)`);
|
|
358
|
+
}
|
|
359
|
+
// Create driver instance - only include device if defined
|
|
360
|
+
const driverConfig = device ? { transport, slaveId, device } : { transport, slaveId };
|
|
361
|
+
const driver = await driverMetadata.createDriver(driverConfig);
|
|
362
|
+
return await fn(driver);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Execute a function with a driver instance, handling the complete workflow
|
|
366
|
+
*
|
|
367
|
+
* This is a convenience function that:
|
|
368
|
+
* 1. Loads driver metadata (DEFAULT_CONFIG, SUPPORTED_CONFIG)
|
|
369
|
+
* 2. Validates user options against driver constraints (SUPPORTED_CONFIG)
|
|
370
|
+
* 3. Applies driver defaults to user options
|
|
371
|
+
* 4. Validates merged options (catches invalid third-party driver defaults)
|
|
372
|
+
* 5. Creates transport with merged configuration
|
|
373
|
+
* 6. Creates driver instance
|
|
374
|
+
* 7. Executes callback with driver and merged options
|
|
375
|
+
* 8. Ensures cleanup (closes transport)
|
|
376
|
+
*
|
|
377
|
+
* @param options - Combined transport and driver options
|
|
378
|
+
* @param fn - Function to execute with the driver (and optionally merged config)
|
|
379
|
+
* @returns Result of the function
|
|
380
|
+
* @throws ValidationError if user options or driver defaults violate constraints
|
|
381
|
+
*/
|
|
382
|
+
async function withDriver(options, fn) {
|
|
383
|
+
// Load driver metadata first
|
|
384
|
+
const driverMetadata = await loadDriverMetadata(options.driver);
|
|
385
|
+
// Get effective metadata with device-specific configs resolved
|
|
386
|
+
const effectiveMetadata = getEffectiveDriverMetadata(driverMetadata, options.device);
|
|
387
|
+
// Validate user-specified options against device/driver constraints (only for RTU connections)
|
|
388
|
+
if (!options.host) {
|
|
389
|
+
const validationOptions = (0, object_utils_js_1.omitUndefined)({
|
|
390
|
+
baudRate: options.baudRate,
|
|
391
|
+
parity: options.parity,
|
|
392
|
+
dataBits: options.dataBits,
|
|
393
|
+
stopBits: options.stopBits,
|
|
394
|
+
slaveId: options.slaveId,
|
|
395
|
+
});
|
|
396
|
+
(0, validation_js_1.validateSerialOptions)(validationOptions, effectiveMetadata);
|
|
397
|
+
}
|
|
398
|
+
// Apply driver defaults to options (device-specific if selected)
|
|
399
|
+
const mergedOptions = applyDriverDefaults(options, driverMetadata, options.device);
|
|
400
|
+
// Validate merged options to catch invalid defaults from third-party drivers
|
|
401
|
+
// This ensures driver DEFAULT_CONFIG values are valid according to SUPPORTED_CONFIG
|
|
402
|
+
if (!mergedOptions.host) {
|
|
403
|
+
const mergedValidationOptions = (0, object_utils_js_1.omitUndefined)({
|
|
404
|
+
baudRate: mergedOptions.baudRate,
|
|
405
|
+
parity: mergedOptions.parity,
|
|
406
|
+
dataBits: mergedOptions.dataBits,
|
|
407
|
+
stopBits: mergedOptions.stopBits,
|
|
408
|
+
slaveId: mergedOptions.slaveId,
|
|
409
|
+
});
|
|
410
|
+
(0, validation_js_1.validateSerialOptions)(mergedValidationOptions, effectiveMetadata);
|
|
411
|
+
}
|
|
412
|
+
// Create transport with merged options
|
|
413
|
+
return await withTransport(mergedOptions, async (transport) => {
|
|
414
|
+
// Create driver instance
|
|
415
|
+
return await withDriverInstance(transport, driverMetadata, mergedOptions.slaveId, options.device, async (driver) => {
|
|
416
|
+
// Execute callback with driver and merged options
|
|
417
|
+
return await fn(driver, mergedOptions);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../src/utils/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/object-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUnF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Object utility functions
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.omitUndefined = omitUndefined;
|
|
7
|
+
/**
|
|
8
|
+
* Remove undefined properties from an object
|
|
9
|
+
*
|
|
10
|
+
* Creates a new object with all properties that are not undefined.
|
|
11
|
+
* Preserves null, false, 0, empty string, and other falsy values.
|
|
12
|
+
*
|
|
13
|
+
* @param obj - Source object
|
|
14
|
+
* @returns New object without undefined properties
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* omitUndefined({ a: 1, b: undefined, c: 'hello' })
|
|
19
|
+
* // Returns: { a: 1, c: 'hello' }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function omitUndefined(obj) {
|
|
23
|
+
const result = {};
|
|
24
|
+
for (const key in obj) {
|
|
25
|
+
if (obj[key] !== undefined) {
|
|
26
|
+
result[key] = obj[key];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=object-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-utils.js","sourceRoot":"","sources":["../../../../src/utils/object-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiBH,sCAUC;AAzBD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,aAAa,CAAoC,GAAM;IACrE,MAAM,MAAM,GAAe,EAAE,CAAA;IAE7B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,OAAO;aACd,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE;gBAHhD,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,YAAA;CAKnD;AAcD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,IAAI,CAwB9F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,IAAI,CAuBhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAMN"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation utilities for CLI options using driver SUPPORTED_CONFIG
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ValidationError = void 0;
|
|
7
|
+
exports.validateBaudRate = validateBaudRate;
|
|
8
|
+
exports.validateParity = validateParity;
|
|
9
|
+
exports.validateDataBits = validateDataBits;
|
|
10
|
+
exports.validateStopBits = validateStopBits;
|
|
11
|
+
exports.validateSlaveId = validateSlaveId;
|
|
12
|
+
exports.validateSerialOptions = validateSerialOptions;
|
|
13
|
+
/**
|
|
14
|
+
* Validation error with helpful context
|
|
15
|
+
*/
|
|
16
|
+
class ValidationError extends Error {
|
|
17
|
+
constructor(message, field, value, validValues) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.field = field;
|
|
20
|
+
this.value = value;
|
|
21
|
+
this.validValues = validValues;
|
|
22
|
+
this.name = 'ValidationError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ValidationError = ValidationError;
|
|
26
|
+
/**
|
|
27
|
+
* Check if config is a serial config (has validBaudRates)
|
|
28
|
+
*/
|
|
29
|
+
function isSerialConfig(config) {
|
|
30
|
+
return (config !== null &&
|
|
31
|
+
config !== undefined &&
|
|
32
|
+
typeof config === 'object' &&
|
|
33
|
+
'validBaudRates' in config);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate baud rate against driver constraints
|
|
37
|
+
*
|
|
38
|
+
* @param baudRate - User-specified baud rate
|
|
39
|
+
* @param driverMetadata - Loaded driver metadata
|
|
40
|
+
* @throws ValidationError if invalid
|
|
41
|
+
*/
|
|
42
|
+
function validateBaudRate(baudRate, driverMetadata) {
|
|
43
|
+
if (baudRate === undefined) {
|
|
44
|
+
return; // No validation needed if not specified
|
|
45
|
+
}
|
|
46
|
+
const supportedConfig = driverMetadata?.supportedConfig;
|
|
47
|
+
if (!isSerialConfig(supportedConfig) || !supportedConfig.validBaudRates) {
|
|
48
|
+
return; // No driver-specific constraints
|
|
49
|
+
}
|
|
50
|
+
const validRates = supportedConfig.validBaudRates;
|
|
51
|
+
if (!validRates.includes(baudRate)) {
|
|
52
|
+
const rateList = validRates.join(', ');
|
|
53
|
+
const defaultConfig = driverMetadata?.defaultConfig;
|
|
54
|
+
const defaultRate = defaultConfig && 'baudRate' in defaultConfig ? defaultConfig.baudRate : undefined;
|
|
55
|
+
throw new ValidationError(`Invalid baud rate ${baudRate}. This driver supports: ${rateList}${defaultRate ? ` (default: ${defaultRate})` : ''}`, 'baudRate', baudRate, validRates);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate parity against driver constraints
|
|
60
|
+
*
|
|
61
|
+
* @param parity - User-specified parity
|
|
62
|
+
* @param driverMetadata - Loaded driver metadata
|
|
63
|
+
* @throws ValidationError if invalid
|
|
64
|
+
*/
|
|
65
|
+
function validateParity(parity, driverMetadata) {
|
|
66
|
+
if (parity === undefined) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const supportedConfig = driverMetadata?.supportedConfig;
|
|
70
|
+
if (!isSerialConfig(supportedConfig) || !supportedConfig.validParity) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const validParity = supportedConfig.validParity;
|
|
74
|
+
if (!validParity.includes(parity)) {
|
|
75
|
+
const parityList = validParity.join(', ');
|
|
76
|
+
const defaultConfig = driverMetadata?.defaultConfig;
|
|
77
|
+
const defaultParity = defaultConfig && 'parity' in defaultConfig ? defaultConfig.parity : undefined;
|
|
78
|
+
throw new ValidationError(`Invalid parity '${parity}'. This driver supports: ${parityList}${defaultParity ? ` (default: ${defaultParity})` : ''}`, 'parity', parity, validParity);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate data bits against driver constraints
|
|
83
|
+
*
|
|
84
|
+
* @param dataBits - User-specified data bits
|
|
85
|
+
* @param driverMetadata - Loaded driver metadata
|
|
86
|
+
* @throws ValidationError if invalid
|
|
87
|
+
*/
|
|
88
|
+
function validateDataBits(dataBits, driverMetadata) {
|
|
89
|
+
if (dataBits === undefined) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const supportedConfig = driverMetadata?.supportedConfig;
|
|
93
|
+
if (!isSerialConfig(supportedConfig) || !supportedConfig.validDataBits) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const validDataBits = supportedConfig.validDataBits;
|
|
97
|
+
if (!validDataBits.includes(dataBits)) {
|
|
98
|
+
const bitsList = validDataBits.join(', ');
|
|
99
|
+
const defaultConfig = driverMetadata?.defaultConfig;
|
|
100
|
+
const defaultBits = defaultConfig && 'dataBits' in defaultConfig ? defaultConfig.dataBits : undefined;
|
|
101
|
+
throw new ValidationError(`Invalid data bits ${dataBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'dataBits', dataBits, validDataBits);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Validate stop bits against driver constraints
|
|
106
|
+
*
|
|
107
|
+
* @param stopBits - User-specified stop bits
|
|
108
|
+
* @param driverMetadata - Loaded driver metadata
|
|
109
|
+
* @throws ValidationError if invalid
|
|
110
|
+
*/
|
|
111
|
+
function validateStopBits(stopBits, driverMetadata) {
|
|
112
|
+
if (stopBits === undefined) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const supportedConfig = driverMetadata?.supportedConfig;
|
|
116
|
+
if (!isSerialConfig(supportedConfig) || !supportedConfig.validStopBits) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const validStopBits = supportedConfig.validStopBits;
|
|
120
|
+
if (!validStopBits.includes(stopBits)) {
|
|
121
|
+
const bitsList = validStopBits.join(', ');
|
|
122
|
+
const defaultConfig = driverMetadata?.defaultConfig;
|
|
123
|
+
const defaultBits = defaultConfig && 'stopBits' in defaultConfig ? defaultConfig.stopBits : undefined;
|
|
124
|
+
throw new ValidationError(`Invalid stop bits ${stopBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'stopBits', stopBits, validStopBits);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Validate slave ID/address against driver constraints
|
|
129
|
+
*
|
|
130
|
+
* @param slaveId - User-specified slave ID
|
|
131
|
+
* @param driverMetadata - Loaded driver metadata
|
|
132
|
+
* @throws ValidationError if invalid
|
|
133
|
+
*/
|
|
134
|
+
function validateSlaveId(slaveId, driverMetadata) {
|
|
135
|
+
if (slaveId === undefined) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const supportedConfig = driverMetadata?.supportedConfig;
|
|
139
|
+
if (!isSerialConfig(supportedConfig) || !supportedConfig.validAddressRange) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const [min, max] = supportedConfig.validAddressRange;
|
|
143
|
+
if (slaveId < min || slaveId > max) {
|
|
144
|
+
const defaultConfig = driverMetadata?.defaultConfig;
|
|
145
|
+
const defaultAddress = defaultConfig && 'defaultAddress' in defaultConfig ? defaultConfig.defaultAddress : undefined;
|
|
146
|
+
throw new ValidationError(`Invalid slave ID ${slaveId}. This driver supports: ${min}-${max}${defaultAddress ? ` (default: ${defaultAddress})` : ''}`, 'slaveId', slaveId, [min, max]);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Validate all serial connection parameters
|
|
151
|
+
*
|
|
152
|
+
* Validates baudRate, parity, dataBits, stopBits, and slaveId against driver constraints.
|
|
153
|
+
*
|
|
154
|
+
* @param options - Connection options to validate
|
|
155
|
+
* @param driverMetadata - Loaded driver metadata
|
|
156
|
+
* @throws ValidationError if any parameter is invalid
|
|
157
|
+
*/
|
|
158
|
+
function validateSerialOptions(options, driverMetadata) {
|
|
159
|
+
validateBaudRate(options.baudRate, driverMetadata);
|
|
160
|
+
validateParity(options.parity, driverMetadata);
|
|
161
|
+
validateDataBits(options.dataBits, driverMetadata);
|
|
162
|
+
validateStopBits(options.stopBits, driverMetadata);
|
|
163
|
+
validateSlaveId(options.slaveId, driverMetadata);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|