@ya-modbus/cli 0.4.1-refactor-scope-driver-packages.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.
Files changed (85) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +674 -0
  3. package/README.md +612 -0
  4. package/dist/bin/ya-modbus.d.ts +9 -0
  5. package/dist/bin/ya-modbus.d.ts.map +1 -0
  6. package/dist/bin/ya-modbus.js +10 -0
  7. package/dist/bin/ya-modbus.js.map +1 -0
  8. package/dist/src/commands/discover.d.ts +25 -0
  9. package/dist/src/commands/discover.d.ts.map +1 -0
  10. package/dist/src/commands/discover.js +160 -0
  11. package/dist/src/commands/discover.js.map +1 -0
  12. package/dist/src/commands/list-devices.d.ts +21 -0
  13. package/dist/src/commands/list-devices.d.ts.map +1 -0
  14. package/dist/src/commands/list-devices.js +75 -0
  15. package/dist/src/commands/list-devices.js.map +1 -0
  16. package/dist/src/commands/read.d.ts +25 -0
  17. package/dist/src/commands/read.d.ts.map +1 -0
  18. package/dist/src/commands/read.js +76 -0
  19. package/dist/src/commands/read.js.map +1 -0
  20. package/dist/src/commands/show-defaults.d.ts +21 -0
  21. package/dist/src/commands/show-defaults.d.ts.map +1 -0
  22. package/dist/src/commands/show-defaults.js +48 -0
  23. package/dist/src/commands/show-defaults.js.map +1 -0
  24. package/dist/src/commands/write.d.ts +26 -0
  25. package/dist/src/commands/write.d.ts.map +1 -0
  26. package/dist/src/commands/write.js +61 -0
  27. package/dist/src/commands/write.js.map +1 -0
  28. package/dist/src/discovery/constants.d.ts +37 -0
  29. package/dist/src/discovery/constants.d.ts.map +1 -0
  30. package/dist/src/discovery/constants.js +45 -0
  31. package/dist/src/discovery/constants.js.map +1 -0
  32. package/dist/src/discovery/device-identifier.d.ts +52 -0
  33. package/dist/src/discovery/device-identifier.d.ts.map +1 -0
  34. package/dist/src/discovery/device-identifier.js +193 -0
  35. package/dist/src/discovery/device-identifier.js.map +1 -0
  36. package/dist/src/discovery/parameter-generator-utils.d.ts +29 -0
  37. package/dist/src/discovery/parameter-generator-utils.d.ts.map +1 -0
  38. package/dist/src/discovery/parameter-generator-utils.js +59 -0
  39. package/dist/src/discovery/parameter-generator-utils.js.map +1 -0
  40. package/dist/src/discovery/parameter-generator.d.ts +97 -0
  41. package/dist/src/discovery/parameter-generator.d.ts.map +1 -0
  42. package/dist/src/discovery/parameter-generator.js +184 -0
  43. package/dist/src/discovery/parameter-generator.js.map +1 -0
  44. package/dist/src/discovery/progress.d.ts +24 -0
  45. package/dist/src/discovery/progress.d.ts.map +1 -0
  46. package/dist/src/discovery/progress.js +57 -0
  47. package/dist/src/discovery/progress.js.map +1 -0
  48. package/dist/src/discovery/scanner.d.ts +46 -0
  49. package/dist/src/discovery/scanner.d.ts.map +1 -0
  50. package/dist/src/discovery/scanner.js +143 -0
  51. package/dist/src/discovery/scanner.js.map +1 -0
  52. package/dist/src/formatters/discovery-results.d.ts +10 -0
  53. package/dist/src/formatters/discovery-results.d.ts.map +1 -0
  54. package/dist/src/formatters/discovery-results.js +57 -0
  55. package/dist/src/formatters/discovery-results.js.map +1 -0
  56. package/dist/src/formatters/json.d.ts +30 -0
  57. package/dist/src/formatters/json.d.ts.map +1 -0
  58. package/dist/src/formatters/json.js +33 -0
  59. package/dist/src/formatters/json.js.map +1 -0
  60. package/dist/src/formatters/performance.d.ts +19 -0
  61. package/dist/src/formatters/performance.d.ts.map +1 -0
  62. package/dist/src/formatters/performance.js +24 -0
  63. package/dist/src/formatters/performance.js.map +1 -0
  64. package/dist/src/formatters/table.d.ts +10 -0
  65. package/dist/src/formatters/table.d.ts.map +1 -0
  66. package/dist/src/formatters/table.js +91 -0
  67. package/dist/src/formatters/table.js.map +1 -0
  68. package/dist/src/index.d.ts +5 -0
  69. package/dist/src/index.d.ts.map +1 -0
  70. package/dist/src/index.js +154 -0
  71. package/dist/src/index.js.map +1 -0
  72. package/dist/src/utils/commands.d.ts +191 -0
  73. package/dist/src/utils/commands.d.ts.map +1 -0
  74. package/dist/src/utils/commands.js +400 -0
  75. package/dist/src/utils/commands.js.map +1 -0
  76. package/dist/src/utils/object-utils.d.ts +20 -0
  77. package/dist/src/utils/object-utils.d.ts.map +1 -0
  78. package/dist/src/utils/object-utils.js +28 -0
  79. package/dist/src/utils/object-utils.js.map +1 -0
  80. package/dist/src/utils/validation.d.ts +70 -0
  81. package/dist/src/utils/validation.d.ts.map +1 -0
  82. package/dist/src/utils/validation.js +158 -0
  83. package/dist/src/utils/validation.js.map +1 -0
  84. package/dist/tsconfig.tsbuildinfo +1 -0
  85. package/package.json +63 -0
@@ -0,0 +1,160 @@
1
+ import { loadDriver } from '@ya-modbus/driver-loader';
2
+ import { ProgressTracker } from '../discovery/progress.js';
3
+ import { scanForDevices } from '../discovery/scanner.js';
4
+ import { formatDiscoveryJSON, formatDiscoveryTable } from '../formatters/discovery-results.js';
5
+ /**
6
+ * Discover command implementation
7
+ *
8
+ * Scans for Modbus RTU devices on the specified port by testing
9
+ * different slave IDs and serial parameters.
10
+ *
11
+ * @param options - Command options
12
+ */
13
+ export async function discoverCommand(options) {
14
+ const strategy = options.strategy ?? 'quick';
15
+ const timeout = options.timeout ?? 1000; // Device response timeout
16
+ const delay = options.delay ?? 100; // Inter-command delay for bus recovery
17
+ const format = options.format ?? 'table';
18
+ const maxDevices = options.maxDevices ?? 1; // Default: stop after finding 1 device
19
+ const verbose = options.verbose ?? false;
20
+ const silent = options.silent ?? false;
21
+ if (!silent) {
22
+ console.log(`Starting Modbus device discovery on ${options.port}...`);
23
+ console.log(`Strategy: ${strategy}`);
24
+ console.log(`Timeout: ${timeout}ms, Delay: ${delay}ms`);
25
+ if (maxDevices === 0) {
26
+ console.log('Mode: Find all devices');
27
+ }
28
+ else {
29
+ console.log(`Mode: Find up to ${maxDevices} device(s)`);
30
+ }
31
+ if (verbose) {
32
+ console.log('Verbose: Enabled');
33
+ }
34
+ console.log('');
35
+ }
36
+ // Try to load driver metadata (explicit --driver or auto-detect from cwd)
37
+ let driverMetadata;
38
+ try {
39
+ driverMetadata = await loadDriver(options.driver ? { driverPackage: options.driver } : {});
40
+ if (!silent) {
41
+ if (options.driver) {
42
+ console.log(`Using driver: ${options.driver}`);
43
+ }
44
+ else {
45
+ console.log('Using local driver package');
46
+ }
47
+ if (driverMetadata?.defaultConfig) {
48
+ console.log('Using driver DEFAULT_CONFIG for parameter prioritization');
49
+ }
50
+ if (driverMetadata?.supportedConfig) {
51
+ console.log('Using driver SUPPORTED_CONFIG to limit parameter combinations');
52
+ }
53
+ console.log('');
54
+ }
55
+ }
56
+ catch (error) {
57
+ // Driver loading failed - continue with generic Modbus parameters
58
+ if (!silent) {
59
+ console.log('No driver available, using generic Modbus parameters...');
60
+ if (verbose) {
61
+ console.log(` (${error.message})`);
62
+ }
63
+ console.log('');
64
+ }
65
+ }
66
+ // Create progress tracker (calculate total combinations without materializing)
67
+ const { countParameterCombinations } = await import('../discovery/parameter-generator-utils.js');
68
+ // Build generator options conditionally to avoid passing undefined
69
+ const generatorOptions = {
70
+ strategy,
71
+ };
72
+ if (driverMetadata?.defaultConfig && 'baudRate' in driverMetadata.defaultConfig) {
73
+ generatorOptions.defaultConfig = driverMetadata.defaultConfig;
74
+ }
75
+ if (driverMetadata?.supportedConfig && 'validBaudRates' in driverMetadata.supportedConfig) {
76
+ generatorOptions.supportedConfig = driverMetadata.supportedConfig;
77
+ }
78
+ const totalCombinations = countParameterCombinations(generatorOptions);
79
+ const progress = new ProgressTracker(totalCombinations);
80
+ if (!silent) {
81
+ console.log(`Testing ${totalCombinations} parameter combinations...`);
82
+ console.log('');
83
+ }
84
+ // Build scan options conditionally
85
+ const scanOptions = {
86
+ port: options.port,
87
+ timeout,
88
+ delayMs: delay,
89
+ maxDevices,
90
+ verbose,
91
+ onProgress: (current, _total, devicesFound) => {
92
+ // Only show progress bar if not in verbose mode, silent mode, or json format
93
+ if (!verbose && !silent) {
94
+ const progressText = progress.update(current, devicesFound);
95
+ if (progressText && format !== 'json') {
96
+ // Clear line and write progress
97
+ process.stdout.clearLine?.(0);
98
+ process.stdout.cursorTo?.(0);
99
+ process.stdout.write(progressText);
100
+ }
101
+ }
102
+ },
103
+ onDeviceFound: (device) => {
104
+ if (!silent && format !== 'json') {
105
+ // Clear progress line (if not verbose)
106
+ if (!verbose) {
107
+ process.stdout.clearLine?.(0);
108
+ process.stdout.cursorTo?.(0);
109
+ }
110
+ // Show found device
111
+ console.log(`✓ Found device: Slave ID ${device.slaveId} @ ${device.baudRate},${device.parity === 'none' ? 'N' : device.parity === 'even' ? 'E' : 'O'},${device.dataBits},${device.stopBits}`);
112
+ }
113
+ },
114
+ };
115
+ // Add verbose callback if verbose mode is enabled (and not silent)
116
+ if (verbose && !silent) {
117
+ scanOptions.onTestAttempt = (params, result) => {
118
+ if (format !== 'json') {
119
+ const parityChar = params.parity === 'none' ? 'N' : params.parity === 'even' ? 'E' : 'O';
120
+ const status = result === 'found' ? '✓' : result === 'testing' ? '·' : '✗';
121
+ const paramStr = `${params.slaveId}@${params.baudRate},${parityChar},${params.dataBits},${params.stopBits}`;
122
+ if (result === 'testing') {
123
+ // Show what we're testing
124
+ process.stdout.clearLine?.(0);
125
+ process.stdout.cursorTo?.(0);
126
+ process.stdout.write(`${status} Testing: ${paramStr}`);
127
+ }
128
+ else if (result === 'found') {
129
+ // Device found - print on new line
130
+ process.stdout.clearLine?.(0);
131
+ process.stdout.cursorTo?.(0);
132
+ console.log(`${status} Found: ${paramStr}`);
133
+ }
134
+ // Don't print anything for 'not-found' - just move to next test
135
+ }
136
+ };
137
+ }
138
+ // Scan for devices
139
+ const devices = await scanForDevices(generatorOptions, scanOptions);
140
+ // Clear progress line (if not silent)
141
+ if (!silent && format !== 'json') {
142
+ process.stdout.clearLine?.(0);
143
+ process.stdout.cursorTo?.(0);
144
+ }
145
+ if (!silent) {
146
+ console.log('');
147
+ console.log(`Discovery complete! Found ${devices.length} device(s).`);
148
+ console.log('');
149
+ }
150
+ // Format and display results (always show, even in silent mode)
151
+ if (devices.length > 0) {
152
+ if (format === 'json') {
153
+ console.log(formatDiscoveryJSON(devices));
154
+ }
155
+ else {
156
+ console.log(formatDiscoveryTable(devices));
157
+ }
158
+ }
159
+ }
160
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/commands/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * List devices command
3
+ *
4
+ * Displays supported devices from a driver package's DEVICES export.
5
+ */
6
+ /**
7
+ * Options for list-devices command
8
+ */
9
+ export interface ListDevicesOptions {
10
+ /** Driver package name (auto-detects from cwd if not specified) */
11
+ driver?: string;
12
+ /** Output format: 'table' or 'json' */
13
+ format?: 'table' | 'json';
14
+ }
15
+ /**
16
+ * List devices command handler
17
+ *
18
+ * @param options - Command options
19
+ */
20
+ export declare function listDevicesCommand(options: ListDevicesOptions): Promise<void>;
21
+ //# sourceMappingURL=list-devices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-devices.d.ts","sourceRoot":"","sources":["../../../src/commands/list-devices.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC1B;AAoBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DnF"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * List devices command
3
+ *
4
+ * Displays supported devices from a driver package's DEVICES export.
5
+ */
6
+ import { loadDriver } from '@ya-modbus/driver-loader';
7
+ import Table from 'cli-table3';
8
+ /**
9
+ * Format default config as a short string
10
+ */
11
+ function formatDefaultConfig(config) {
12
+ if (!config)
13
+ return '-';
14
+ if ('baudRate' in config) {
15
+ // Serial config
16
+ const parityChar = config.parity === 'none' ? 'N' : config.parity === 'even' ? 'E' : 'O';
17
+ return `${config.baudRate} ${config.dataBits}${parityChar}${config.stopBits}`;
18
+ }
19
+ else if ('defaultPort' in config) {
20
+ // TCP config
21
+ return `TCP:${config.defaultPort}`;
22
+ }
23
+ return '-';
24
+ }
25
+ /**
26
+ * List devices command handler
27
+ *
28
+ * @param options - Command options
29
+ */
30
+ export async function listDevicesCommand(options) {
31
+ // Load driver metadata (auto-detects from cwd if no --driver specified)
32
+ const driverMetadata = await loadDriver(options.driver ? { driverPackage: options.driver } : {});
33
+ if (options.format === 'json') {
34
+ // JSON output
35
+ console.log(JSON.stringify({
36
+ devices: driverMetadata.devices ?? null,
37
+ defaultConfig: driverMetadata.defaultConfig,
38
+ supportedConfig: driverMetadata.supportedConfig,
39
+ }, null, 2));
40
+ return;
41
+ }
42
+ // Human-readable table output
43
+ const devices = driverMetadata.devices;
44
+ if (!devices || Object.keys(devices).length === 0) {
45
+ console.log('This driver does not export a DEVICES registry.');
46
+ console.log('It is a single-device driver.\n');
47
+ if (driverMetadata.defaultConfig) {
48
+ console.log('Default config:', formatDefaultConfig(driverMetadata.defaultConfig));
49
+ }
50
+ return;
51
+ }
52
+ console.log('Supported Devices\n');
53
+ // Create table
54
+ const table = new Table({
55
+ head: ['Device', 'Manufacturer', 'Model', 'Config', 'Description'],
56
+ style: {
57
+ head: ['cyan', 'bold'],
58
+ },
59
+ });
60
+ // Add rows
61
+ const entries = Object.entries(devices);
62
+ for (const [key, info] of entries) {
63
+ const config = info.defaultConfig ?? driverMetadata.defaultConfig;
64
+ table.push([
65
+ key,
66
+ info.manufacturer,
67
+ info.model,
68
+ formatDefaultConfig(config),
69
+ info.description ?? '',
70
+ ]);
71
+ }
72
+ console.log(table.toString());
73
+ console.log(`\nTotal: ${entries.length} device(s)`);
74
+ }
75
+ //# sourceMappingURL=list-devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-devices.js","sourceRoot":"","sources":["../../../src/commands/list-devices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Read command options
3
+ */
4
+ export interface ReadOptions {
5
+ port?: string;
6
+ baudRate?: number;
7
+ dataBits?: number;
8
+ parity?: string;
9
+ stopBits?: number;
10
+ host?: string;
11
+ slaveId: number;
12
+ timeout?: number;
13
+ driver?: string;
14
+ device?: string;
15
+ dataPoint?: string[];
16
+ all?: boolean;
17
+ format: 'table' | 'json';
18
+ }
19
+ /**
20
+ * Read command implementation
21
+ *
22
+ * @param options - Command options
23
+ */
24
+ export declare function readCommand(options: ReadOptions): Promise<void>;
25
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/commands/read.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,WAAW;IAE1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IAGf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,GAAG,CAAC,EAAE,OAAO,CAAA;IAGb,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CACzB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ErE"}
@@ -0,0 +1,76 @@
1
+ import { formatJSON } from '../formatters/json.js';
2
+ import { formatPerformance } from '../formatters/performance.js';
3
+ import { formatTable } from '../formatters/table.js';
4
+ import { isReadable, withDriver } from '../utils/commands.js';
5
+ /**
6
+ * Read command implementation
7
+ *
8
+ * @param options - Command options
9
+ */
10
+ export async function readCommand(options) {
11
+ const startTime = performance.now();
12
+ await withDriver(options, async (driver, mergedOptions) => {
13
+ // Determine which data points to read
14
+ let dataPointIds;
15
+ if (options.all) {
16
+ // Read all readable data points
17
+ dataPointIds = driver.dataPoints.filter(isReadable).map((dp) => dp.id);
18
+ }
19
+ else if (options.dataPoint && options.dataPoint.length > 0) {
20
+ dataPointIds = options.dataPoint;
21
+ }
22
+ else {
23
+ throw new Error('Either --data-point or --all must be specified');
24
+ }
25
+ // Validate data points exist and are readable (O(N) using Map lookup)
26
+ const dataPointMap = new Map(driver.dataPoints.map((dp) => [dp.id, dp]));
27
+ for (const id of dataPointIds) {
28
+ const dataPoint = dataPointMap.get(id);
29
+ if (!dataPoint) {
30
+ throw new Error(`Data point not found: ${id}`);
31
+ }
32
+ if (!isReadable(dataPoint)) {
33
+ throw new Error(`Data point is write-only: ${id}`);
34
+ }
35
+ }
36
+ // Read data points
37
+ let values;
38
+ if (dataPointIds.length === 1) {
39
+ // Single data point - use readDataPoint
40
+ const dataPointId = dataPointIds[0]; // length === 1, so [0] is guaranteed to exist
41
+ const value = await driver.readDataPoint(dataPointId);
42
+ values = { [dataPointId]: value };
43
+ }
44
+ else {
45
+ // Multiple data points - use batch read
46
+ values = await driver.readDataPoints(dataPointIds);
47
+ }
48
+ // Calculate performance metrics
49
+ const endTime = performance.now();
50
+ const metrics = {
51
+ responseTimeMs: endTime - startTime,
52
+ operations: dataPointIds.length,
53
+ errors: 0, // Errors cause exceptions, so this is always 0 for successful reads
54
+ };
55
+ // Format output
56
+ if (options.format === 'json') {
57
+ const output = formatJSON(driver.dataPoints.filter((dp) => dp.id in values), values, {
58
+ driver: options.driver,
59
+ connection: options.host
60
+ ? { host: options.host, slaveId: mergedOptions.slaveId }
61
+ : mergedOptions.port && typeof mergedOptions.port === 'string'
62
+ ? { port: mergedOptions.port, slaveId: mergedOptions.slaveId }
63
+ : undefined,
64
+ performance: metrics,
65
+ });
66
+ console.log(output);
67
+ }
68
+ else {
69
+ // Table format (default)
70
+ const table = formatTable(driver.dataPoints.filter((dp) => dp.id in values), values);
71
+ console.log(table);
72
+ console.log(formatPerformance(metrics));
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/commands/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Show driver defaults command
3
+ *
4
+ * Displays DEFAULT_CONFIG and SUPPORTED_CONFIG from a driver package.
5
+ */
6
+ /**
7
+ * Options for show-defaults command
8
+ */
9
+ export interface ShowDefaultsOptions {
10
+ /** Driver package name (auto-detects from cwd if not specified) */
11
+ driver?: string;
12
+ /** Output format: 'table' or 'json' */
13
+ format?: 'table' | 'json';
14
+ }
15
+ /**
16
+ * Show driver defaults command handler
17
+ *
18
+ * @param options - Command options
19
+ */
20
+ export declare function showDefaultsCommand(options: ShowDefaultsOptions): Promise<void>;
21
+ //# sourceMappingURL=show-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-defaults.d.ts","sourceRoot":"","sources":["../../../src/commands/show-defaults.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCrF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Show driver defaults command
3
+ *
4
+ * Displays DEFAULT_CONFIG and SUPPORTED_CONFIG from a driver package.
5
+ */
6
+ import { loadDriver } from '@ya-modbus/driver-loader';
7
+ /**
8
+ * Show driver defaults command handler
9
+ *
10
+ * @param options - Command options
11
+ */
12
+ export async function showDefaultsCommand(options) {
13
+ // Load driver metadata (auto-detects from cwd if no --driver specified)
14
+ const driverMetadata = await loadDriver(options.driver ? { driverPackage: options.driver } : {});
15
+ if (options.format === 'json') {
16
+ // JSON output
17
+ console.log(JSON.stringify({
18
+ defaultConfig: driverMetadata.defaultConfig,
19
+ supportedConfig: driverMetadata.supportedConfig,
20
+ }, null, 2));
21
+ }
22
+ else {
23
+ // Human-readable table output
24
+ console.log('Driver Defaults');
25
+ console.log('===============\n');
26
+ if (driverMetadata.defaultConfig) {
27
+ console.log('DEFAULT_CONFIG:');
28
+ for (const [key, value] of Object.entries(driverMetadata.defaultConfig)) {
29
+ console.log(` ${key}: ${JSON.stringify(value)}`);
30
+ }
31
+ console.log();
32
+ }
33
+ else {
34
+ console.log('No DEFAULT_CONFIG exported by this driver.\n');
35
+ }
36
+ if (driverMetadata.supportedConfig) {
37
+ console.log('SUPPORTED_CONFIG:');
38
+ for (const [key, value] of Object.entries(driverMetadata.supportedConfig)) {
39
+ console.log(` ${key}: ${JSON.stringify(value)}`);
40
+ }
41
+ console.log();
42
+ }
43
+ else {
44
+ console.log('No SUPPORTED_CONFIG exported by this driver.\n');
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=show-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-defaults.js","sourceRoot":"","sources":["../../../src/commands/show-defaults.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAarD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA4B;IACpE,wEAAwE;IACxE,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEhG,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,cAAc;QACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,aAAa,EAAE,cAAc,CAAC,aAAa;YAC3C,eAAe,EAAE,cAAc,CAAC,eAAe;SAChD,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QAEhC,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;gBACxE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACnD,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC7D,CAAC;QAED,IAAI,cAAc,CAAC,eAAe,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACnD,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Write command options
3
+ */
4
+ export interface WriteOptions {
5
+ port?: string;
6
+ baudRate?: number;
7
+ dataBits?: number;
8
+ parity?: string;
9
+ stopBits?: number;
10
+ host?: string;
11
+ slaveId: number;
12
+ timeout?: number;
13
+ driver?: string;
14
+ device?: string;
15
+ dataPoint: string;
16
+ value: string;
17
+ yes?: boolean;
18
+ verify?: boolean;
19
+ }
20
+ /**
21
+ * Write command implementation
22
+ *
23
+ * @param options - Command options
24
+ */
25
+ export declare function writeCommand(options: WriteOptions): Promise<void>;
26
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/commands/write.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,YAAY;IAE3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IAGjB,IAAI,CAAC,EAAE,MAAM,CAAA;IAGb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAGhB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IAGf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEvE"}
@@ -0,0 +1,61 @@
1
+ import chalk from 'chalk';
2
+ import { confirm, findWritableDataPoint, floatsEqual, isReadable, parseValue, validateValue, withDriver, } from '../utils/commands.js';
3
+ /**
4
+ * Write command implementation
5
+ *
6
+ * @param options - Command options
7
+ */
8
+ export async function writeCommand(options) {
9
+ await withDriver(options, async (driver) => {
10
+ // Find and validate writable data point
11
+ const dataPoint = findWritableDataPoint(driver, options.dataPoint);
12
+ // Parse and validate value
13
+ const parsedValue = parseValue(options.value, dataPoint);
14
+ validateValue(parsedValue, dataPoint);
15
+ // Show current value if readable and request confirmation
16
+ if (!options.yes) {
17
+ if (isReadable(dataPoint)) {
18
+ try {
19
+ const currentValue = await driver.readDataPoint(options.dataPoint);
20
+ console.log(chalk.cyan(`Current value: ${String(currentValue)}`));
21
+ }
22
+ catch {
23
+ console.log(chalk.yellow('Could not read current value'));
24
+ }
25
+ }
26
+ console.log(chalk.cyan(`New value: ${String(parsedValue)}`));
27
+ const confirmed = await confirm(chalk.bold(`Write ${String(parsedValue)} to ${options.dataPoint}?`));
28
+ if (!confirmed) {
29
+ console.log('Write aborted');
30
+ return;
31
+ }
32
+ }
33
+ // Write value
34
+ await driver.writeDataPoint(options.dataPoint, parsedValue);
35
+ console.log(chalk.green(`Successfully wrote ${String(parsedValue)} to ${options.dataPoint}`));
36
+ // Verify if requested
37
+ if (options.verify) {
38
+ if (!isReadable(dataPoint)) {
39
+ console.log(chalk.yellow('Cannot verify write-only data point'));
40
+ return;
41
+ }
42
+ try {
43
+ const readValue = await driver.readDataPoint(options.dataPoint);
44
+ // Compare values (handle floating point precision)
45
+ const match = dataPoint.type === 'float'
46
+ ? floatsEqual(readValue, parsedValue)
47
+ : readValue === parsedValue;
48
+ if (match) {
49
+ console.log(chalk.green(`Verification: OK (read back ${String(readValue)})`));
50
+ }
51
+ else {
52
+ console.log(chalk.red(`Verification: MISMATCH (expected ${String(parsedValue)}, got ${String(readValue)})`));
53
+ }
54
+ }
55
+ catch (error) {
56
+ console.log(chalk.red(`Verification failed: ${error.message}`));
57
+ }
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/commands/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { BaudRate, DataBits, Parity, StopBits } from '@ya-modbus/driver-types';
2
+ /**
3
+ * Standard Modbus baud rates for thorough scanning
4
+ * Ordered by commonality (most common first)
5
+ */
6
+ export declare const STANDARD_BAUD_RATES: readonly BaudRate[];
7
+ /**
8
+ * Common baud rates for quick scanning
9
+ */
10
+ export declare const COMMON_BAUD_RATES: readonly BaudRate[];
11
+ /**
12
+ * Standard Modbus parity settings
13
+ * Ordered by commonality
14
+ */
15
+ export declare const STANDARD_PARITY: readonly Parity[];
16
+ /**
17
+ * Standard data bits options
18
+ */
19
+ export declare const STANDARD_DATA_BITS: readonly DataBits[];
20
+ /**
21
+ * Common data bits for quick scanning
22
+ */
23
+ export declare const COMMON_DATA_BITS: readonly DataBits[];
24
+ /**
25
+ * Standard stop bits options
26
+ */
27
+ export declare const STANDARD_STOP_BITS: readonly StopBits[];
28
+ /**
29
+ * Common stop bits for quick scanning
30
+ */
31
+ export declare const COMMON_STOP_BITS: readonly StopBits[];
32
+ /**
33
+ * Valid Modbus slave address range (0 is broadcast, 248-255 reserved)
34
+ */
35
+ export declare const MIN_SLAVE_ID = 1;
36
+ export declare const MAX_SLAVE_ID = 247;
37
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/discovery/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEnF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,QAAQ,EASzC,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,QAAQ,EAA2B,CAAA;AAE5E;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAqC,CAAA;AAElF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,QAAQ,EAAoB,CAAA;AAEtE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,QAAQ,EAAiB,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,QAAQ,EAAoB,CAAA;AAEtE;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,QAAQ,EAAiB,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,YAAY,IAAI,CAAA;AAC7B,eAAO,MAAM,YAAY,MAAM,CAAA"}