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.
Files changed (161) hide show
  1. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/CHANGELOG.md +9 -0
  2. {scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info → scpi_instrument_control-1.1.0}/PKG-INFO +1 -1
  3. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info}/PKG-INFO +1 -1
  4. scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/SOURCES.txt +156 -0
  5. scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/entry_points.txt +3 -0
  6. scpi_instrument_control-1.1.0/SCPI_Instrument_Control.egg-info/top_level.txt +2 -0
  7. scpi_instrument_control-1.1.0/examples/data_logger_basic.py +147 -0
  8. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/pyproject.toml +6 -5
  9. scpi_instrument_control-1.1.0/scpi_control/__init__.py +58 -0
  10. scpi_instrument_control-1.1.0/scpi_control/analysis.py +401 -0
  11. scpi_instrument_control-1.1.0/scpi_control/automation.py +557 -0
  12. scpi_instrument_control-1.1.0/scpi_control/awg_models.py +277 -0
  13. scpi_instrument_control-1.1.0/scpi_control/awg_output.py +503 -0
  14. scpi_instrument_control-1.1.0/scpi_control/awg_scpi_commands.py +183 -0
  15. scpi_instrument_control-1.1.0/scpi_control/channel.py +269 -0
  16. scpi_instrument_control-1.1.0/scpi_control/connection/__init__.py +40 -0
  17. scpi_instrument_control-1.1.0/scpi_control/connection/base.py +115 -0
  18. scpi_instrument_control-1.1.0/scpi_control/connection/mock.py +645 -0
  19. scpi_instrument_control-1.1.0/scpi_control/connection/socket.py +211 -0
  20. scpi_instrument_control-1.1.0/scpi_control/connection/visa_connection.py +395 -0
  21. scpi_instrument_control-1.1.0/scpi_control/daq_models.py +316 -0
  22. scpi_instrument_control-1.1.0/scpi_control/daq_scpi_commands.py +227 -0
  23. scpi_instrument_control-1.1.0/scpi_control/data_logger.py +762 -0
  24. scpi_instrument_control-1.1.0/scpi_control/exceptions.py +37 -0
  25. scpi_instrument_control-1.1.0/scpi_control/function_generator.py +381 -0
  26. scpi_instrument_control-1.1.0/scpi_control/gui/__init__.py +3 -0
  27. scpi_instrument_control-1.1.0/scpi_control/gui/app.py +118 -0
  28. scpi_instrument_control-1.1.0/scpi_control/gui/connection_manager.py +204 -0
  29. scpi_instrument_control-1.1.0/scpi_control/gui/daq_worker.py +205 -0
  30. scpi_instrument_control-1.1.0/scpi_control/gui/live_view_worker.py +179 -0
  31. scpi_instrument_control-1.1.0/scpi_control/gui/main_window.py +1723 -0
  32. scpi_instrument_control-1.1.0/scpi_control/gui/utils/validators.py +177 -0
  33. scpi_instrument_control-1.1.0/scpi_control/gui/vnc_window.py +251 -0
  34. scpi_instrument_control-1.1.0/scpi_control/gui/waveform_capture_worker.py +132 -0
  35. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/__init__.py +34 -0
  36. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/channel_control.py +387 -0
  37. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/cursor_panel.py +319 -0
  38. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_ai_panel.py +392 -0
  39. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_channel_config.py +317 -0
  40. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_data_view.py +373 -0
  41. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/daq_scan_config.py +279 -0
  42. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/data_logger_control.py +364 -0
  43. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/error_dialog.py +222 -0
  44. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/fft_display.py +353 -0
  45. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/math_panel.py +327 -0
  46. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_marker.py +460 -0
  47. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/__init__.py +32 -0
  48. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/frequency_marker.py +251 -0
  49. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/timing_marker.py +411 -0
  50. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_markers/voltage_marker.py +271 -0
  51. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/measurement_panel.py +320 -0
  52. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/protocol_decode_panel.py +417 -0
  53. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/psu_control.py +323 -0
  54. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/reference_panel.py +345 -0
  55. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/scope_web_view.py +160 -0
  56. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/terminal_widget.py +311 -0
  57. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/timebase_control.py +294 -0
  58. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/trigger_control.py +297 -0
  59. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/vector_graphics_panel.py +530 -0
  60. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/visual_measurement_panel.py +617 -0
  61. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/waveform_display.py +1120 -0
  62. scpi_instrument_control-1.1.0/scpi_control/gui/widgets/waveform_display_pg.py +713 -0
  63. scpi_instrument_control-1.1.0/scpi_control/math_channel.py +449 -0
  64. scpi_instrument_control-1.1.0/scpi_control/measurement.py +350 -0
  65. scpi_instrument_control-1.1.0/scpi_control/measurement_config.py +245 -0
  66. scpi_instrument_control-1.1.0/scpi_control/models.py +300 -0
  67. scpi_instrument_control-1.1.0/scpi_control/oscilloscope.py +461 -0
  68. scpi_instrument_control-1.1.0/scpi_control/power_supply.py +424 -0
  69. scpi_instrument_control-1.1.0/scpi_control/power_supply_output.py +410 -0
  70. scpi_instrument_control-1.1.0/scpi_control/protocol_decode.py +210 -0
  71. scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/__init__.py +7 -0
  72. scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/i2c_decoder.py +325 -0
  73. scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/spi_decoder.py +264 -0
  74. scpi_instrument_control-1.1.0/scpi_control/protocol_decoders/uart_decoder.py +225 -0
  75. scpi_instrument_control-1.1.0/scpi_control/psu_data_logger.py +293 -0
  76. scpi_instrument_control-1.1.0/scpi_control/psu_models.py +236 -0
  77. scpi_instrument_control-1.1.0/scpi_control/psu_scpi_commands.py +162 -0
  78. scpi_instrument_control-1.1.0/scpi_control/py.typed +0 -0
  79. scpi_instrument_control-1.1.0/scpi_control/reference_waveform.py +412 -0
  80. scpi_instrument_control-1.1.0/scpi_control/report_generator/__init__.py +23 -0
  81. scpi_instrument_control-1.1.0/scpi_control/report_generator/app.py +38 -0
  82. scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/__init__.py +12 -0
  83. scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/base.py +53 -0
  84. scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/markdown_generator.py +546 -0
  85. scpi_instrument_control-1.1.0/scpi_control/report_generator/generators/pdf_generator.py +1205 -0
  86. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/__init__.py +20 -0
  87. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/analyzer.py +287 -0
  88. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/client.py +446 -0
  89. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/context_builder.py +292 -0
  90. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_analyzer.py +316 -0
  91. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_context_builder.py +340 -0
  92. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/daq_prompts.py +114 -0
  93. scpi_instrument_control-1.1.0/scpi_control/report_generator/llm/prompts.py +108 -0
  94. scpi_instrument_control-1.1.0/scpi_control/report_generator/main_window.py +862 -0
  95. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/__init__.py +16 -0
  96. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/app_settings.py +85 -0
  97. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/criteria.py +219 -0
  98. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/plot_style.py +82 -0
  99. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/report_data.py +549 -0
  100. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/report_options.py +63 -0
  101. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/template.py +493 -0
  102. scpi_instrument_control-1.1.0/scpi_control/report_generator/models/test_types.py +284 -0
  103. scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/__init__.py +7 -0
  104. scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/image_handler.py +194 -0
  105. scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/waveform_analyzer.py +1138 -0
  106. scpi_instrument_control-1.1.0/scpi_control/report_generator/utils/waveform_loader.py +316 -0
  107. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/__init__.py +7 -0
  108. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/ai_analysis_panel.py +567 -0
  109. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/chat_sidebar.py +325 -0
  110. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/llm_settings_dialog.py +585 -0
  111. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/metadata_panel.py +299 -0
  112. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/pdf_preview_dialog.py +356 -0
  113. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/report_options_dialog.py +557 -0
  114. scpi_instrument_control-1.1.0/scpi_control/report_generator/widgets/template_manager_dialog.py +390 -0
  115. scpi_instrument_control-1.1.0/scpi_control/scpi_commands.py +206 -0
  116. scpi_instrument_control-1.1.0/scpi_control/screen_capture.py +261 -0
  117. scpi_instrument_control-1.1.0/scpi_control/trigger.py +325 -0
  118. scpi_instrument_control-1.1.0/scpi_control/vector_graphics.py +537 -0
  119. scpi_instrument_control-1.1.0/scpi_control/waveform.py +634 -0
  120. scpi_instrument_control-1.1.0/siglent/exceptions.py +40 -0
  121. scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/SOURCES.txt +0 -43
  122. scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/entry_points.txt +0 -3
  123. scpi_instrument_control-1.0.0/SCPI_Instrument_Control.egg-info/top_level.txt +0 -1
  124. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/LICENSE +0 -0
  125. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/MANIFEST.in +0 -0
  126. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/README.md +0 -0
  127. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/SCPI_Instrument_Control.egg-info/dependency_links.txt +0 -0
  128. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/SCPI_Instrument_Control.egg-info/requires.txt +0 -0
  129. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/SDS800XHD_Series_ProgrammingGuide_EN11G.pdf +0 -0
  130. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/VISUAL_MEASUREMENTS.md +0 -0
  131. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/01_main_window.png +0 -0
  132. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/channel_controls.png +0 -0
  133. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/cursors.png +0 -0
  134. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/fft_analysis.png +0 -0
  135. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/main_window.png +0 -0
  136. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/measurements_panel.png +0 -0
  137. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/docs/images/visual_measurements.png +0 -0
  138. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/README.md +0 -0
  139. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/advanced_analysis.py +0 -0
  140. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/basic_usage.py +0 -0
  141. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/batch_capture.py +0 -0
  142. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/continuous_capture.py +0 -0
  143. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/function_generator_basic.py +0 -0
  144. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/live_plot.py +0 -0
  145. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/measurements.py +0 -0
  146. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/probe_calibration_analysis.py +0 -0
  147. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_advanced_features.py +0 -0
  148. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_basic_control.py +0 -0
  149. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_gui_test.py +0 -0
  150. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/psu_usb_connection.py +0 -0
  151. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/report_generation_example.py +0 -0
  152. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/simple_capture.py +0 -0
  153. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/trigger_based_capture.py +0 -0
  154. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/vector_graphics_xy_mode.py +0 -0
  155. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/examples/waveform_capture.py +0 -0
  156. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment Wide.png +0 -0
  157. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.icns +0 -0
  158. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.ico +0 -0
  159. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/resources/Test Equipment.png +0 -0
  160. {scpi_instrument_control-1.0.0 → scpi_instrument_control-1.1.0}/setup.cfg +0 -0
  161. {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.0.0
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.0.0
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,3 @@
1
+ [console_scripts]
2
+ siglent-gui = scpi_control.gui.app:main
3
+ siglent-report-generator = scpi_control.report_generator.app:main
@@ -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.0.0"
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 = "siglent.gui.app:main"
126
- siglent-report-generator = "siglent.report_generator.app:main"
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
+ ]