Skip to content

Commit 8920ee6

Browse files
author
Michael Johansen
committed
Merge from main.
Signed-off-by: Michael Johansen <[email protected]>
2 parents 9c8fa0b + 1e2c2e3 commit 8920ee6

File tree

10 files changed

+586
-149
lines changed

10 files changed

+586
-149
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
Prerequisites
2+
===============
3+
Requires a Physical or Simulated Device. Refer to the [Getting Started Section](https://github.com/ni/nidaqmx-python/blob/master/README.rst) to learn how to create a simulated device. This example uses NI oscilloscopes and digitizers like the NI PXIe-5114
4+
5+
## Sample
6+
7+
This is an nipanel example that displays an interactive Streamlit app and updates and fetches data from an NI device.
8+
9+
### Feature
10+
11+
Script demonstrates how to configure vertical, horizontal, and triggering properties and allows you to experiment with numerous configurations, including acquisition types and triggering mode.
12+
- Supports various data types
13+
14+
### Required Software
15+
16+
- Python 3.9 or later
17+
18+
### Usage
19+
20+
```pwsh
21+
poetry install --with examples
22+
poetry run examples\niscope\niscope_configured_acquisition\niscope_configured_acquisition.py
23+
```
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
"""Continuously acquires waveforms from NI-SCOPE, and configures desired acquisition settings."""
2+
3+
import time
4+
from pathlib import Path
5+
6+
import hightime
7+
import niscope
8+
import numpy as np
9+
from niscope.errors import Error
10+
11+
import nipanel
12+
13+
panel_script_path = Path(__file__).with_name("niscope_configured_acquisition_panel.py")
14+
panel = nipanel.create_streamlit_panel(panel_script_path)
15+
16+
panel.set_value("is_running", False)
17+
panel.set_value("run_button", False)
18+
19+
try:
20+
panel.set_value("scope_error", "")
21+
print(f"Panel URL: {panel.panel_url}")
22+
print(f"Waiting for the 'Run' button to be pressed...")
23+
print(f"(Press Ctrl + C to quit)")
24+
while True:
25+
panel.set_value("run_button", False)
26+
while not panel.get_value("run_button", False):
27+
time.sleep(0.1)
28+
with niscope.Session(resource_name=panel.get_value("resource_name", "Dev1")) as session:
29+
session.configure_vertical(
30+
range=panel.get_value("vertical_range", 5.0),
31+
coupling=niscope.VerticalCoupling.DC,
32+
offset=panel.get_value("vertical_offset", 0.0),
33+
)
34+
session.configure_chan_characteristics(
35+
input_impedance=panel.get_value("input_impedance", 1.0e6),
36+
max_input_frequency=panel.get_value("max_input_frequency", 100.0e6),
37+
)
38+
session.configure_horizontal_timing(
39+
min_sample_rate=panel.get_value("min_sample_rate", 10.0e6),
40+
min_num_pts=panel.get_value("min_record_length", 1000),
41+
ref_position=panel.get_value("ref_position", 0.0),
42+
num_records=1000,
43+
enforce_realtime=panel.get_value("enforce_realtime", True),
44+
)
45+
trigger_type = int(panel.get_value("trigger_type", "1"))
46+
if trigger_type == 1:
47+
immediate = session.configure_trigger_immediate()
48+
elif trigger_type == 2:
49+
edge = session.configure_trigger_edge(
50+
trigger_source=str(panel.get_value("edge_source", 0)),
51+
level=panel.get_value("edge_level", 0.0),
52+
slope=panel.get_value("edge_slope", niscope.TriggerSlope.POSITIVE),
53+
trigger_coupling=panel.get_value("edge_coupling", niscope.TriggerCoupling.DC),
54+
delay=hightime.timedelta(seconds=panel.get_value("trigger_delay", 0.0)),
55+
)
56+
elif trigger_type == 3:
57+
digital = session.configure_trigger_digital(
58+
trigger_source=panel.get_value("digital_source", "PFI 1"),
59+
slope=panel.get_value("digital_slope", niscope.TriggerSlope.POSITIVE),
60+
delay=hightime.timedelta(seconds=panel.get_value("trigger_delay", 0.0)),
61+
)
62+
elif trigger_type == 4:
63+
window = session.configure_trigger_window(
64+
trigger_source=str(panel.get_value("window_source", 0)),
65+
window_mode=panel.get_value("window_mode", niscope.TriggerWindowMode.ENTERING),
66+
low_level=panel.get_value("window_low_level", -0.1),
67+
high_level=panel.get_value("window_high_level", 0.1),
68+
trigger_coupling=panel.get_value("window_coupling", niscope.TriggerCoupling.DC),
69+
delay=hightime.timedelta(seconds=panel.get_value("trigger_delay", 0.0)),
70+
)
71+
else:
72+
hysteresis = session.configure_trigger_hysteresis(
73+
trigger_source=str(panel.get_value("hysteresis_source", 0)),
74+
level=panel.get_value("hysteresis_level", 0.0),
75+
hysteresis=panel.get_value("hysteresis", 0.05),
76+
slope=panel.get_value("hysteresis_slope", niscope.TriggerSlope.POSITIVE),
77+
trigger_coupling=panel.get_value(
78+
"hysteresis_coupling", niscope.TriggerCoupling.DC
79+
),
80+
delay=hightime.timedelta(seconds=panel.get_value("trigger_delay", 0.0)),
81+
)
82+
83+
with session.initiate():
84+
wfm = np.array(
85+
session.channels[panel.get_value("channel_number", 0)].fetch(
86+
num_samples=1000,
87+
num_records=1000,
88+
relative_to=niscope.FetchRelativeTo.READ_POINTER,
89+
offset=0,
90+
timeout=hightime.timedelta(seconds=panel.get_value("timeout", 5.0)),
91+
)
92+
)
93+
try:
94+
panel.set_value("is_running", True)
95+
96+
panel.set_value("stop_button", False)
97+
while not panel.get_value("stop_button", False):
98+
99+
for i in range(len(wfm)):
100+
if panel.get_value("stop_button", True):
101+
break
102+
else:
103+
data = wfm[i].samples.tolist()
104+
panel.set_value("waveform_data", data)
105+
panel.set_value("actual_record_length", session.horz_record_length)
106+
panel.set_value("actual_sample_rate", session.samp_clk_timebase_rate)
107+
panel.set_value("auto_triggered", session.trigger_auto_triggered)
108+
except KeyboardInterrupt:
109+
pass
110+
finally:
111+
panel.set_value("is_running", False)
112+
113+
except Error as e:
114+
scope_error = str(e)
115+
print(scope_error)
116+
panel.set_value("scope_error", scope_error)
117+
118+
except KeyboardInterrupt:
119+
pass

0 commit comments

Comments
 (0)