SCPI-Instrument-Control 1.0.0__tar.gz → 1.1.0__tar.gz
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.
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/CHANGELOG.md +9 -0
- {scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info → scpi_instrument_control-1.1.0}/PKG-INFO +1 -1
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info}/PKG-INFO +1 -1
- scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/SOURCES.txt +156 -0
- scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/entry_points.txt +3 -0
- scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/top_level.txt +2 -0
- scpi_instrument_control-1.1.0/examples/data_logger_basic.py +147 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/pyproject.toml +6 -5
- scpi_instrument_control-1.1.0/scpi_control/__init__.py +58 -0
- scpi_instrument_control-1.1.0/scpi_control/analysis.py +401 -0
- scpi_instrument_control-1.1.0/scpi_control/automation.py +557 -0
- scpi_instrument_control-1.1.0/scpi_control/awg_models.py +277 -0
- scpi_instrument_control-1.1.0/scpi_control/awg_output.py +503 -0
- scpi_instrument_control-1.1.0/scpi_control/awg_scpi_commands.py +183 -0
- scpi_instrument_control-1.1.0/scpi_control/channel.py +269 -0
- scpi_instrument_control-1.1.0/scpi_control/connection/__init__.py +40 -0
- scpi_instrument_control-1.1.0/scpi_control/connection/base.py +115 -0
- scpi_instrument_control-1.1.0/scpi_control/connection/mock.py +645 -0
- scpi_instrument_control-1.1.0/scpi_control/connection/socket.py +211 -0
- scpi_instrument_control-1.1.0/scpi_control/connection/visa_connection.py +395 -0
- scpi_instrument_control-1.1.0/scpi_control/daq_models.py +316 -0
- scpi_instrument_control-1.1.0/scpi_control/daq_scpi_commands.py +227 -0
- scpi_instrument_control-1.1.0/scpi_control/data_logger.py +762 -0
- scpi_instrument_control-1.1.0/scpi_control/exceptions.py +37 -0
- scpi_instrument_control-1.1.0/scpi_control/function_generator.py +381 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/__init__.py +3 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/app.py +118 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/connection_manager.py +204 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/daq_worker.py +205 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/live_view_worker.py +179 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/main_window.py +1723 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/utils/validators.py +177 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/vnc_window.py +251 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/waveform_capture_worker.py +132 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/__init__.py +34 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/channel_control.py +387 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/cursor_panel.py +319 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_ai_panel.py +392 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_channel_config.py +317 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_data_view.py +373 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_scan_config.py +279 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/data_logger_control.py +364 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/error_dialog.py +222 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/fft_display.py +353 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/math_panel.py +327 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_marker.py +460 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/__init__.py +32 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/frequency_marker.py +251 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/timing_marker.py +411 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/voltage_marker.py +271 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_panel.py +320 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/protocol_decode_panel.py +417 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/psu_control.py +323 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/reference_panel.py +345 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/scope_web_view.py +160 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/terminal_widget.py +311 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/timebase_control.py +294 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/trigger_control.py +297 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/vector_graphics_panel.py +530 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/visual_measurement_panel.py +617 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/waveform_display.py +1120 -0
- scpi_instrument_control-1.1.0/scpi_control/gui/widgets/waveform_display_pg.py +713 -0
- scpi_instrument_control-1.1.0/scpi_control/math_channel.py +449 -0
- scpi_instrument_control-1.1.0/scpi_control/measurement.py +350 -0
- scpi_instrument_control-1.1.0/scpi_control/measurement_config.py +245 -0
- scpi_instrument_control-1.1.0/scpi_control/models.py +300 -0
- scpi_instrument_control-1.1.0/scpi_control/oscilloscope.py +461 -0
- scpi_instrument_control-1.1.0/scpi_control/power_supply.py +424 -0
- scpi_instrument_control-1.1.0/scpi_control/power_supply_output.py +410 -0
- scpi_instrument_control-1.1.0/scpi_control/protocol_decode.py +210 -0
- scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/__init__.py +7 -0
- scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/i2c_decoder.py +325 -0
- scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/spi_decoder.py +264 -0
- scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/uart_decoder.py +225 -0
- scpi_instrument_control-1.1.0/scpi_control/psu_data_logger.py +293 -0
- scpi_instrument_control-1.1.0/scpi_control/psu_models.py +236 -0
- scpi_instrument_control-1.1.0/scpi_control/psu_scpi_commands.py +162 -0
- scpi_instrument_control-1.1.0/scpi_control/py.typed +0 -0
- scpi_instrument_control-1.1.0/scpi_control/reference_waveform.py +412 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/__init__.py +23 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/app.py +38 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/__init__.py +12 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/base.py +53 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/markdown_generator.py +546 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/pdf_generator.py +1205 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/__init__.py +20 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/analyzer.py +287 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/client.py +446 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/context_builder.py +292 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_analyzer.py +316 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_context_builder.py +340 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_prompts.py +114 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/prompts.py +108 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/main_window.py +862 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/__init__.py +16 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/app_settings.py +85 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/criteria.py +219 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/plot_style.py +82 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/report_data.py +549 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/report_options.py +63 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/template.py +493 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/models/test_types.py +284 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/__init__.py +7 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/image_handler.py +194 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/waveform_analyzer.py +1138 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/waveform_loader.py +316 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/__init__.py +7 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/ai_analysis_panel.py +567 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/chat_sidebar.py +325 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/llm_settings_dialog.py +585 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/metadata_panel.py +299 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/pdf_preview_dialog.py +356 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/report_options_dialog.py +557 -0
- scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/template_manager_dialog.py +390 -0
- scpi_instrument_control-1.1.0/scpi_control/scpi_commands.py +206 -0
- scpi_instrument_control-1.1.0/scpi_control/screen_capture.py +261 -0
- scpi_instrument_control-1.1.0/scpi_control/trigger.py +325 -0
- scpi_instrument_control-1.1.0/scpi_control/vector_graphics.py +537 -0
- scpi_instrument_control-1.1.0/scpi_control/waveform.py +634 -0
- scpi_instrument_control-1.1.0/siglent/exceptions.py +40 -0
- scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/SOURCES.txt +0 -43
- scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/entry_points.txt +0 -3
- scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/top_level.txt +0 -1
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/LICENSE +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/MANIFEST.in +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/README.md +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/SCPI_Instrument_Control.egg-info/dependency_links.txt +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/SCPI_Instrument_Control.egg-info/requires.txt +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/SDS800XHD_Series_ProgrammingGuide_EN11G.pdf +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/VISUAL_MEASUREMENTS.md +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/01_main_window.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/channel_controls.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/cursors.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/fft_analysis.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/main_window.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/measurements_panel.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/visual_measurements.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/README.md +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/advanced_analysis.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/basic_usage.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/batch_capture.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/continuous_capture.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/function_generator_basic.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/live_plot.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/measurements.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/probe_calibration_analysis.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_advanced_features.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_basic_control.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_gui_test.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_usb_connection.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/report_generation_example.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/simple_capture.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/trigger_based_capture.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/vector_graphics_xy_mode.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/waveform_capture.py +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment Wide.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.icns +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.ico +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.png +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/setup.cfg +0 -0
- {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/siglent/__init__.py +0 -0
|
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
## [1.0.1] - 2026-01-07
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
10
19
|
## [1.0.0] - 2026-01-06
|
|
11
20
|
|
|
12
21
|
### ⚠️ MAJOR RELEASE - Package Renamed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: SCPI-Instrument-Control
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Universal Python library for controlling SCPI-compatible test equipment via Ethernet/LAN. Supports oscilloscopes (Siglent SDS series, generic SCPI scopes), function generators/AWGs (Siglent SDG series, generic SCPI AWGs), and power supplies (Siglent SPD series, generic SCPI PSUs). Features include waveform capture, measurements, FFT analysis, PyQt6 GUI, automated report generation with AI analysis, and comprehensive SCPI command abstraction.
|
|
5
5
|
Author: Robin Mumm
|
|
6
6
|
Maintainer: little-did-I-know
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: SCPI-Instrument-Control
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Universal Python library for controlling SCPI-compatible test equipment via Ethernet/LAN. Supports oscilloscopes (Siglent SDS series, generic SCPI scopes), function generators/AWGs (Siglent SDG series, generic SCPI AWGs), and power supplies (Siglent SPD series, generic SCPI PSUs). Features include waveform capture, measurements, FFT analysis, PyQt6 GUI, automated report generation with AI analysis, and comprehensive SCPI command abstraction.
|
|
5
5
|
Author: Robin Mumm
|
|
6
6
|
Maintainer: little-did-I-know
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
CHANGELOG.md
|
|
2
|
+
LICENSE
|
|
3
|
+
MANIFEST.in
|
|
4
|
+
README.md
|
|
5
|
+
pyproject.toml
|
|
6
|
+
SCPI_Instrument_Control.egg-info/PKG-INFO
|
|
7
|
+
SCPI_Instrument_Control.egg-info/SOURCES.txt
|
|
8
|
+
SCPI_Instrument_Control.egg-info/dependency_links.txt
|
|
9
|
+
SCPI_Instrument_Control.egg-info/entry_points.txt
|
|
10
|
+
SCPI_Instrument_Control.egg-info/requires.txt
|
|
11
|
+
SCPI_Instrument_Control.egg-info/top_level.txt
|
|
12
|
+
docs/SDS800XHD_Series_ProgrammingGuide_EN11G.pdf
|
|
13
|
+
docs/VISUAL_MEASUREMENTS.md
|
|
14
|
+
docs/images/01_main_window.png
|
|
15
|
+
docs/images/channel_controls.png
|
|
16
|
+
docs/images/cursors.png
|
|
17
|
+
docs/images/fft_analysis.png
|
|
18
|
+
docs/images/main_window.png
|
|
19
|
+
docs/images/measurements_panel.png
|
|
20
|
+
docs/images/visual_measurements.png
|
|
21
|
+
examples/README.md
|
|
22
|
+
examples/advanced_analysis.py
|
|
23
|
+
examples/basic_usage.py
|
|
24
|
+
examples/batch_capture.py
|
|
25
|
+
examples/continuous_capture.py
|
|
26
|
+
examples/data_logger_basic.py
|
|
27
|
+
examples/function_generator_basic.py
|
|
28
|
+
examples/live_plot.py
|
|
29
|
+
examples/measurements.py
|
|
30
|
+
examples/probe_calibration_analysis.py
|
|
31
|
+
examples/psu_advanced_features.py
|
|
32
|
+
examples/psu_basic_control.py
|
|
33
|
+
examples/psu_gui_test.py
|
|
34
|
+
examples/psu_usb_connection.py
|
|
35
|
+
examples/report_generation_example.py
|
|
36
|
+
examples/simple_capture.py
|
|
37
|
+
examples/trigger_based_capture.py
|
|
38
|
+
examples/vector_graphics_xy_mode.py
|
|
39
|
+
examples/waveform_capture.py
|
|
40
|
+
resources/Test Equipment Wide.png
|
|
41
|
+
resources/Test Equipment.icns
|
|
42
|
+
resources/Test Equipment.ico
|
|
43
|
+
resources/Test Equipment.png
|
|
44
|
+
scpi_control/__init__.py
|
|
45
|
+
scpi_control/analysis.py
|
|
46
|
+
scpi_control/automation.py
|
|
47
|
+
scpi_control/awg_models.py
|
|
48
|
+
scpi_control/awg_output.py
|
|
49
|
+
scpi_control/awg_scpi_commands.py
|
|
50
|
+
scpi_control/channel.py
|
|
51
|
+
scpi_control/daq_models.py
|
|
52
|
+
scpi_control/daq_scpi_commands.py
|
|
53
|
+
scpi_control/data_logger.py
|
|
54
|
+
scpi_control/exceptions.py
|
|
55
|
+
scpi_control/function_generator.py
|
|
56
|
+
scpi_control/math_channel.py
|
|
57
|
+
scpi_control/measurement.py
|
|
58
|
+
scpi_control/measurement_config.py
|
|
59
|
+
scpi_control/models.py
|
|
60
|
+
scpi_control/oscilloscope.py
|
|
61
|
+
scpi_control/power_supply.py
|
|
62
|
+
scpi_control/power_supply_output.py
|
|
63
|
+
scpi_control/protocol_decode.py
|
|
64
|
+
scpi_control/psu_data_logger.py
|
|
65
|
+
scpi_control/psu_models.py
|
|
66
|
+
scpi_control/psu_scpi_commands.py
|
|
67
|
+
scpi_control/py.typed
|
|
68
|
+
scpi_control/reference_waveform.py
|
|
69
|
+
scpi_control/scpi_commands.py
|
|
70
|
+
scpi_control/screen_capture.py
|
|
71
|
+
scpi_control/trigger.py
|
|
72
|
+
scpi_control/vector_graphics.py
|
|
73
|
+
scpi_control/waveform.py
|
|
74
|
+
scpi_control/connection/__init__.py
|
|
75
|
+
scpi_control/connection/base.py
|
|
76
|
+
scpi_control/connection/mock.py
|
|
77
|
+
scpi_control/connection/socket.py
|
|
78
|
+
scpi_control/connection/visa_connection.py
|
|
79
|
+
scpi_control/gui/__init__.py
|
|
80
|
+
scpi_control/gui/app.py
|
|
81
|
+
scpi_control/gui/connection_manager.py
|
|
82
|
+
scpi_control/gui/daq_worker.py
|
|
83
|
+
scpi_control/gui/live_view_worker.py
|
|
84
|
+
scpi_control/gui/main_window.py
|
|
85
|
+
scpi_control/gui/vnc_window.py
|
|
86
|
+
scpi_control/gui/waveform_capture_worker.py
|
|
87
|
+
scpi_control/gui/utils/validators.py
|
|
88
|
+
scpi_control/gui/widgets/__init__.py
|
|
89
|
+
scpi_control/gui/widgets/channel_control.py
|
|
90
|
+
scpi_control/gui/widgets/cursor_panel.py
|
|
91
|
+
scpi_control/gui/widgets/daq_ai_panel.py
|
|
92
|
+
scpi_control/gui/widgets/daq_channel_config.py
|
|
93
|
+
scpi_control/gui/widgets/daq_data_view.py
|
|
94
|
+
scpi_control/gui/widgets/daq_scan_config.py
|
|
95
|
+
scpi_control/gui/widgets/data_logger_control.py
|
|
96
|
+
scpi_control/gui/widgets/error_dialog.py
|
|
97
|
+
scpi_control/gui/widgets/fft_display.py
|
|
98
|
+
scpi_control/gui/widgets/math_panel.py
|
|
99
|
+
scpi_control/gui/widgets/measurement_marker.py
|
|
100
|
+
scpi_control/gui/widgets/measurement_panel.py
|
|
101
|
+
scpi_control/gui/widgets/protocol_decode_panel.py
|
|
102
|
+
scpi_control/gui/widgets/psu_control.py
|
|
103
|
+
scpi_control/gui/widgets/reference_panel.py
|
|
104
|
+
scpi_control/gui/widgets/scope_web_view.py
|
|
105
|
+
scpi_control/gui/widgets/terminal_widget.py
|
|
106
|
+
scpi_control/gui/widgets/timebase_control.py
|
|
107
|
+
scpi_control/gui/widgets/trigger_control.py
|
|
108
|
+
scpi_control/gui/widgets/vector_graphics_panel.py
|
|
109
|
+
scpi_control/gui/widgets/visual_measurement_panel.py
|
|
110
|
+
scpi_control/gui/widgets/waveform_display.py
|
|
111
|
+
scpi_control/gui/widgets/waveform_display_pg.py
|
|
112
|
+
scpi_control/gui/widgets/measurement_markers/__init__.py
|
|
113
|
+
scpi_control/gui/widgets/measurement_markers/frequency_marker.py
|
|
114
|
+
scpi_control/gui/widgets/measurement_markers/timing_marker.py
|
|
115
|
+
scpi_control/gui/widgets/measurement_markers/voltage_marker.py
|
|
116
|
+
scpi_control/protocol_decoders/__init__.py
|
|
117
|
+
scpi_control/protocol_decoders/i2c_decoder.py
|
|
118
|
+
scpi_control/protocol_decoders/spi_decoder.py
|
|
119
|
+
scpi_control/protocol_decoders/uart_decoder.py
|
|
120
|
+
scpi_control/report_generator/__init__.py
|
|
121
|
+
scpi_control/report_generator/app.py
|
|
122
|
+
scpi_control/report_generator/main_window.py
|
|
123
|
+
scpi_control/report_generator/generators/__init__.py
|
|
124
|
+
scpi_control/report_generator/generators/base.py
|
|
125
|
+
scpi_control/report_generator/generators/markdown_generator.py
|
|
126
|
+
scpi_control/report_generator/generators/pdf_generator.py
|
|
127
|
+
scpi_control/report_generator/llm/__init__.py
|
|
128
|
+
scpi_control/report_generator/llm/analyzer.py
|
|
129
|
+
scpi_control/report_generator/llm/client.py
|
|
130
|
+
scpi_control/report_generator/llm/context_builder.py
|
|
131
|
+
scpi_control/report_generator/llm/daq_analyzer.py
|
|
132
|
+
scpi_control/report_generator/llm/daq_context_builder.py
|
|
133
|
+
scpi_control/report_generator/llm/daq_prompts.py
|
|
134
|
+
scpi_control/report_generator/llm/prompts.py
|
|
135
|
+
scpi_control/report_generator/models/__init__.py
|
|
136
|
+
scpi_control/report_generator/models/app_settings.py
|
|
137
|
+
scpi_control/report_generator/models/criteria.py
|
|
138
|
+
scpi_control/report_generator/models/plot_style.py
|
|
139
|
+
scpi_control/report_generator/models/report_data.py
|
|
140
|
+
scpi_control/report_generator/models/report_options.py
|
|
141
|
+
scpi_control/report_generator/models/template.py
|
|
142
|
+
scpi_control/report_generator/models/test_types.py
|
|
143
|
+
scpi_control/report_generator/utils/__init__.py
|
|
144
|
+
scpi_control/report_generator/utils/image_handler.py
|
|
145
|
+
scpi_control/report_generator/utils/waveform_analyzer.py
|
|
146
|
+
scpi_control/report_generator/utils/waveform_loader.py
|
|
147
|
+
scpi_control/report_generator/widgets/__init__.py
|
|
148
|
+
scpi_control/report_generator/widgets/ai_analysis_panel.py
|
|
149
|
+
scpi_control/report_generator/widgets/chat_sidebar.py
|
|
150
|
+
scpi_control/report_generator/widgets/llm_settings_dialog.py
|
|
151
|
+
scpi_control/report_generator/widgets/metadata_panel.py
|
|
152
|
+
scpi_control/report_generator/widgets/pdf_preview_dialog.py
|
|
153
|
+
scpi_control/report_generator/widgets/report_options_dialog.py
|
|
154
|
+
scpi_control/report_generator/widgets/template_manager_dialog.py
|
|
155
|
+
siglent/__init__.py
|
|
156
|
+
siglent/exceptions.py
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Basic Data Logger / DAQ example.
|
|
2
|
+
|
|
3
|
+
This example demonstrates basic usage of the DataLogger class for
|
|
4
|
+
data acquisition systems like the Keysight 34970A/DAQ970A.
|
|
5
|
+
|
|
6
|
+
Requirements:
|
|
7
|
+
- A SCPI-compatible DAQ system (Keysight 34970A, DAQ970A, or similar)
|
|
8
|
+
- Network connection to the instrument
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from scpi_control import DataLogger
|
|
12
|
+
|
|
13
|
+
# Replace with your DAQ's IP address
|
|
14
|
+
DAQ_IP = "192.168.1.100"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def basic_measurements():
|
|
18
|
+
"""Demonstrate basic voltage measurements."""
|
|
19
|
+
print("=== Basic Voltage Measurements ===\n")
|
|
20
|
+
|
|
21
|
+
with DataLogger(DAQ_IP) as daq:
|
|
22
|
+
print(f"Connected to: {daq.identify()}")
|
|
23
|
+
print(f"Model: {daq.model_capability.model_name}")
|
|
24
|
+
print(f"Channels available: {daq.model_capability.get_all_channels()}\n")
|
|
25
|
+
|
|
26
|
+
# Configure channels 101-103 for DC voltage measurement
|
|
27
|
+
channels = [101, 102, 103]
|
|
28
|
+
daq.configure_voltage_dc(channels, range="AUTO", resolution="AUTO")
|
|
29
|
+
print(f"Configured channels {channels} for DC voltage\n")
|
|
30
|
+
|
|
31
|
+
# Take immediate measurements
|
|
32
|
+
readings = daq.measure_voltage_dc(channels)
|
|
33
|
+
print("Measurement results:")
|
|
34
|
+
for reading in readings:
|
|
35
|
+
print(f" Channel {reading.channel}: {reading.value:.6f} {reading.unit}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def scan_multiple_channels():
|
|
39
|
+
"""Demonstrate scanning multiple channels."""
|
|
40
|
+
print("\n=== Multi-Channel Scan ===\n")
|
|
41
|
+
|
|
42
|
+
with DataLogger(DAQ_IP) as daq:
|
|
43
|
+
# Configure different measurement types on different channels
|
|
44
|
+
daq.configure_voltage_dc([101, 102], range="10") # 10V range
|
|
45
|
+
daq.configure_temperature([103, 104], sensor_type="TC", sensor_subtype="K")
|
|
46
|
+
daq.configure_resistance([105], four_wire=False)
|
|
47
|
+
|
|
48
|
+
# Set up scan list
|
|
49
|
+
scan_channels = [101, 102, 103, 104, 105]
|
|
50
|
+
daq.set_scan_list(scan_channels)
|
|
51
|
+
print(f"Scan list: {daq.get_scan_list()}")
|
|
52
|
+
|
|
53
|
+
# Configure trigger for immediate single scan
|
|
54
|
+
daq.set_trigger_source("IMM")
|
|
55
|
+
daq.set_trigger_count(1)
|
|
56
|
+
|
|
57
|
+
# Initiate and read
|
|
58
|
+
readings = daq.read()
|
|
59
|
+
print(f"\nScanned {len(readings)} channels:")
|
|
60
|
+
for i, reading in enumerate(readings):
|
|
61
|
+
ch = scan_channels[i] if i < len(scan_channels) else "?"
|
|
62
|
+
print(f" Channel {ch}: {reading.value:.6f}")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def continuous_logging():
|
|
66
|
+
"""Demonstrate continuous data logging."""
|
|
67
|
+
print("\n=== Continuous Logging (5 seconds) ===\n")
|
|
68
|
+
|
|
69
|
+
with DataLogger(DAQ_IP) as daq:
|
|
70
|
+
# Configure for voltage monitoring
|
|
71
|
+
channels = [101, 102]
|
|
72
|
+
daq.configure_voltage_dc(channels)
|
|
73
|
+
|
|
74
|
+
# Log at 1 second intervals for 5 seconds
|
|
75
|
+
print("Logging for 5 seconds...")
|
|
76
|
+
all_readings = daq.start_logging(
|
|
77
|
+
channels=channels,
|
|
78
|
+
interval=1.0,
|
|
79
|
+
duration=5.0,
|
|
80
|
+
callback=lambda r: print(f" Got {len(r)} readings"),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
print(f"\nTotal scans collected: {len(all_readings)}")
|
|
84
|
+
print(f"Total readings: {sum(len(r) for r in all_readings)}")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def alarm_monitoring():
|
|
88
|
+
"""Demonstrate alarm/limit checking."""
|
|
89
|
+
print("\n=== Alarm Monitoring ===\n")
|
|
90
|
+
|
|
91
|
+
with DataLogger(DAQ_IP) as daq:
|
|
92
|
+
if not daq.model_capability.has_alarm:
|
|
93
|
+
print("This model does not support alarm limits")
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
# Configure voltage measurement with limits
|
|
97
|
+
channel = 101
|
|
98
|
+
daq.configure_voltage_dc(channel)
|
|
99
|
+
|
|
100
|
+
# Set alarm limits: warn if voltage goes outside 0-5V
|
|
101
|
+
daq.set_alarm_limits(channel, high=5.0, low=0.0)
|
|
102
|
+
daq.enable_alarm(channel, enable=True)
|
|
103
|
+
print(f"Alarm limits set on channel {channel}: 0V to 5V")
|
|
104
|
+
|
|
105
|
+
# Take a measurement
|
|
106
|
+
readings = daq.measure_voltage_dc(channel)
|
|
107
|
+
print(f"Current reading: {readings[0].value:.3f} V")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def scaling_example():
|
|
111
|
+
"""Demonstrate mx+b scaling."""
|
|
112
|
+
print("\n=== Scaling (mx+b) Example ===\n")
|
|
113
|
+
|
|
114
|
+
with DataLogger(DAQ_IP) as daq:
|
|
115
|
+
if not daq.model_capability.has_math:
|
|
116
|
+
print("This model does not support scaling")
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
channel = 101
|
|
120
|
+
daq.configure_voltage_dc(channel)
|
|
121
|
+
|
|
122
|
+
# Apply scaling: convert 0-10V input to 0-100% display
|
|
123
|
+
# Scaled value = (reading * 10) + 0 = percentage
|
|
124
|
+
daq.set_scaling(channel, gain=10.0, offset=0.0, enable=True)
|
|
125
|
+
print("Scaling configured: 0-10V input -> 0-100% output")
|
|
126
|
+
|
|
127
|
+
readings = daq.measure_voltage_dc(channel)
|
|
128
|
+
print(f"Raw voltage: {readings[0].value:.3f} V")
|
|
129
|
+
# Note: scaled value would be returned if DAQ returns scaled data
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
if __name__ == "__main__":
|
|
133
|
+
print("Data Logger / DAQ Basic Examples")
|
|
134
|
+
print("================================\n")
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
basic_measurements()
|
|
138
|
+
# scan_multiple_channels()
|
|
139
|
+
# continuous_logging()
|
|
140
|
+
# alarm_monitoring()
|
|
141
|
+
# scaling_example()
|
|
142
|
+
except Exception as e:
|
|
143
|
+
print(f"Error: {e}")
|
|
144
|
+
print("\nMake sure:")
|
|
145
|
+
print(f" 1. Your DAQ is connected at {DAQ_IP}")
|
|
146
|
+
print(" 2. The IP address is correct")
|
|
147
|
+
print(" 3. No other software is using the connection")
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "SCPI-Instrument-Control"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.1.0"
|
|
8
8
|
description = "Universal Python library for controlling SCPI-compatible test equipment via Ethernet/LAN. Supports oscilloscopes (Siglent SDS series, generic SCPI scopes), function generators/AWGs (Siglent SDG series, generic SCPI AWGs), and power supplies (Siglent SPD series, generic SCPI PSUs). Features include waveform capture, measurements, FFT analysis, PyQt6 GUI, automated report generation with AI analysis, and comprehensive SCPI command abstraction."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.8"
|
|
@@ -122,18 +122,19 @@ all = [
|
|
|
122
122
|
]
|
|
123
123
|
|
|
124
124
|
[project.scripts]
|
|
125
|
-
siglent-gui = "
|
|
126
|
-
siglent-report-generator = "
|
|
125
|
+
siglent-gui = "scpi_control.gui.app:main"
|
|
126
|
+
siglent-report-generator = "scpi_control.report_generator.app:main"
|
|
127
127
|
|
|
128
128
|
[tool.setuptools]
|
|
129
129
|
include-package-data = true
|
|
130
130
|
|
|
131
131
|
[tool.setuptools.package-data]
|
|
132
132
|
siglent = ["py.typed"]
|
|
133
|
+
scpi_control = ["py.typed"]
|
|
133
134
|
|
|
134
135
|
[tool.setuptools.packages.find]
|
|
135
136
|
where = ["."]
|
|
136
|
-
include = ["siglent*"]
|
|
137
|
+
include = ["siglent*", "scpi_control*"]
|
|
137
138
|
|
|
138
139
|
[tool.black]
|
|
139
140
|
line-length = 100
|
|
@@ -158,7 +159,7 @@ filterwarnings = [
|
|
|
158
159
|
]
|
|
159
160
|
|
|
160
161
|
[tool.coverage.run]
|
|
161
|
-
source = ["siglent"]
|
|
162
|
+
source = ["siglent", "scpi_control"]
|
|
162
163
|
omit = [
|
|
163
164
|
"*/tests/*",
|
|
164
165
|
"*/test_*.py",
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""SCPI Instrument Control Package
|
|
2
|
+
|
|
3
|
+
This package provides programmatic control for SCPI-compatible test equipment
|
|
4
|
+
via Ethernet/LAN connection.
|
|
5
|
+
|
|
6
|
+
Supported equipment:
|
|
7
|
+
- Oscilloscopes (Siglent SDS series and SCPI-compatible models)
|
|
8
|
+
- Function Generators / AWGs (Siglent SDG series and SCPI-compatible models)
|
|
9
|
+
- Power Supplies (Siglent SPD series and SCPI-compatible models)
|
|
10
|
+
- Data Acquisition / Data Loggers (Keysight 34970A/DAQ970A and SCPI-compatible models)
|
|
11
|
+
|
|
12
|
+
For high-level automation and data collection, see the automation module:
|
|
13
|
+
from scpi_control.automation import DataCollector, TriggerWaitCollector
|
|
14
|
+
|
|
15
|
+
For power supply control:
|
|
16
|
+
from scpi_control import PowerSupply
|
|
17
|
+
|
|
18
|
+
For function generator control:
|
|
19
|
+
from scpi_control import FunctionGenerator
|
|
20
|
+
|
|
21
|
+
For data acquisition / data logging:
|
|
22
|
+
from scpi_control import DataLogger
|
|
23
|
+
|
|
24
|
+
For automated test report generation:
|
|
25
|
+
from scpi_control.report_generator import ReportGenerator
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
__version__ = "1.1.0"
|
|
29
|
+
|
|
30
|
+
from scpi_control.exceptions import CommandError, SiglentConnectionError, SiglentError, SiglentTimeoutError
|
|
31
|
+
from scpi_control.oscilloscope import Oscilloscope
|
|
32
|
+
|
|
33
|
+
# Power supply support (stable as of v0.5.0)
|
|
34
|
+
from scpi_control.power_supply import PowerSupply
|
|
35
|
+
from scpi_control.psu_data_logger import PSUDataLogger, TimedPSULogger
|
|
36
|
+
|
|
37
|
+
# Function generator support (new in v0.6.0, stable in v1.0.0)
|
|
38
|
+
from scpi_control.function_generator import FunctionGenerator
|
|
39
|
+
|
|
40
|
+
# Data acquisition / Data logger support (new in v1.1.0)
|
|
41
|
+
from scpi_control.data_logger import DataLogger
|
|
42
|
+
|
|
43
|
+
__all__ = [
|
|
44
|
+
# Core features
|
|
45
|
+
"Oscilloscope",
|
|
46
|
+
"SiglentError",
|
|
47
|
+
"SiglentConnectionError",
|
|
48
|
+
"SiglentTimeoutError",
|
|
49
|
+
"CommandError",
|
|
50
|
+
# Power supply features
|
|
51
|
+
"PowerSupply",
|
|
52
|
+
"PSUDataLogger",
|
|
53
|
+
"TimedPSULogger",
|
|
54
|
+
# Function generator features
|
|
55
|
+
"FunctionGenerator",
|
|
56
|
+
# Data acquisition features
|
|
57
|
+
"DataLogger",
|
|
58
|
+
]
|