Skip to content

Commit f0800ec

Browse files
authored
examples: Add type hints, use cancellation event, name MeasurementService consistently (#372)
* examples: Standardize measurement_service variable name * examples: Add missing type hints * examples: Use event to signal cancellation
1 parent aeeb4d9 commit f0800ec

10 files changed

Lines changed: 67 additions & 82 deletions

File tree

examples/nidaqmx_analog_input/measurement.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import logging
44
import pathlib
55
import sys
6-
from typing import Optional
6+
from typing import List, Optional, Tuple
77

88
import click
99
import nidaqmx
@@ -49,7 +49,7 @@
4949
@measurement_service.configuration("sample_rate", nims.DataType.Double, 1000.0)
5050
@measurement_service.configuration("number_of_samples", nims.DataType.UInt64, 100)
5151
@measurement_service.output("acquired_samples", nims.DataType.DoubleArray1D)
52-
def measure(pin_name, sample_rate, number_of_samples):
52+
def measure(pin_name: str, sample_rate: float, number_of_samples: int) -> Tuple[List[float]]:
5353
"""Perform a finite analog input measurement with NI-DAQmx."""
5454
logging.info(
5555
"Executing measurement: pin_name=%s sample_rate=%g number_of_samples=%d",
@@ -66,7 +66,7 @@ def measure(pin_name, sample_rate, number_of_samples):
6666
) as reservation:
6767
task: Optional[nidaqmx.Task] = None
6868

69-
def cancel_callback():
69+
def cancel_callback() -> None:
7070
logging.info("Canceling measurement")
7171
task_to_abort = task
7272
if task_to_abort is not None:

examples/nidcpower_source_dc_voltage/measurement.py

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import logging
44
import pathlib
55
import sys
6+
import threading
67
import time
7-
from typing import Iterable
8+
from typing import Iterable, List, Tuple
89

910
import click
1011
import grpc
@@ -72,7 +73,7 @@ def measure(
7273
current_limit: float,
7374
current_limit_range: float,
7475
source_delay: float,
75-
):
76+
) -> Tuple[List[int], List[str], List[float], List[float], List[bool]]:
7677
"""Source and measure a DC voltage with an NI SMU."""
7778
logging.info("Executing measurement: pin_names=%s voltage_level=%g", pin_names, voltage_level)
7879

@@ -91,17 +92,8 @@ def measure(
9192
channels = session.channels[reservation.session_info.channel_list]
9293
channel_mappings = reservation.session_info.channel_mappings
9394

94-
pending_cancellation = False
95-
96-
def cancel_callback():
97-
logging.info("Canceling measurement")
98-
session_to_abort = session
99-
if session_to_abort is not None:
100-
nonlocal pending_cancellation
101-
pending_cancellation = True
102-
session_to_abort.abort()
103-
104-
measurement_service.context.add_cancel_callback(cancel_callback)
95+
cancellation_event = threading.Event()
96+
measurement_service.context.add_cancel_callback(cancellation_event.set)
10597
time_remaining = measurement_service.context.time_remaining
10698

10799
channels.source_mode = nidcpower.SourceMode.SINGLE_POINT
@@ -121,7 +113,7 @@ def cancel_callback():
121113
measurement_service.context.abort(
122114
grpc.StatusCode.DEADLINE_EXCEEDED, "deadline exceeded"
123115
)
124-
if pending_cancellation:
116+
if cancellation_event.is_set():
125117
measurement_service.context.abort(
126118
grpc.StatusCode.CANCELLED, "client requested cancellation"
127119
)
@@ -165,7 +157,7 @@ def cancel_callback():
165157
def _log_measured_values(
166158
channel_mappings: Iterable[nims.session_management.ChannelMapping],
167159
measured_values: Iterable,
168-
):
160+
) -> None:
169161
"""Log the measured values."""
170162
for mapping, measurement in zip(channel_mappings, measured_values):
171163
logging.info("site%s/%s:", mapping.site, mapping.pin_or_relay_name)

examples/nidmm_measurement/measurement.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def measure(
8282
measurement_type: Function,
8383
range: float,
8484
resolution_digits: float,
85-
) -> Tuple:
85+
) -> Tuple[float, bool, float]:
8686
"""Perform a measurement using an NI DMM."""
8787
logging.info(
8888
"Starting measurement: pin_name=%s measurement_type=%s range=%g resolution_digits=%g",

examples/nifgen_standard_function/measurement.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55
import pathlib
66
import sys
7+
import threading
78
import time
89
from enum import Enum
910
from typing import Tuple
@@ -81,7 +82,7 @@ def measure(
8182
frequency: float,
8283
amplitude: float,
8384
duration: float,
84-
) -> Tuple:
85+
) -> Tuple[()]:
8586
"""Generate a standard function waveform using an NI waveform generator."""
8687
logging.info(
8788
"Starting generation: pin_name=%s waveform_type=%s frequency=%g amplitude=%g",
@@ -91,14 +92,8 @@ def measure(
9192
amplitude,
9293
)
9394

94-
pending_cancellation = False
95-
96-
def cancel_callback():
97-
logging.info("Canceling generation")
98-
nonlocal pending_cancellation
99-
pending_cancellation = True
100-
101-
measurement_service.context.add_cancel_callback(cancel_callback)
95+
cancellation_event = threading.Event()
96+
measurement_service.context.add_cancel_callback(cancellation_event.set)
10297

10398
session_management_client = create_session_management_client(measurement_service)
10499

@@ -139,7 +134,7 @@ def cancel_callback():
139134
measurement_service.context.abort(
140135
grpc.StatusCode.DEADLINE_EXCEEDED, "Deadline exceeded."
141136
)
142-
if pending_cancellation:
137+
if cancellation_event.is_set():
143138
measurement_service.context.abort(
144139
grpc.StatusCode.CANCELLED, "Client requested cancellation."
145140
)

examples/niscope_acquire_waveform/measurement.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import logging
44
import pathlib
55
import sys
6+
import threading
67
import time
7-
from typing import Tuple
8+
from typing import List, Tuple
89

910
import click
1011
import grpc
@@ -96,7 +97,7 @@ def measure(
9697
auto_trigger: bool,
9798
trigger_coupling: str,
9899
timeout: float,
99-
) -> Tuple:
100+
) -> Tuple[List[float], ...]:
100101
"""Acquire a waveform using an NI oscilloscope."""
101102
logging.info(
102103
"Starting acquisition: pin_or_relay_names=%s vertical_range=%g trigger_source=%s trigger_level=%g",
@@ -106,14 +107,8 @@ def measure(
106107
trigger_level,
107108
)
108109

109-
pending_cancellation = False
110-
111-
def cancel_callback():
112-
logging.info("Canceling acquisition")
113-
nonlocal pending_cancellation
114-
pending_cancellation = True
115-
116-
measurement_service.context.add_cancel_callback(cancel_callback)
110+
cancellation_event = threading.Event()
111+
measurement_service.context.add_cancel_callback(cancellation_event.set)
117112

118113
session_management_client = create_session_management_client(measurement_service)
119114

@@ -167,7 +162,7 @@ def cancel_callback():
167162
measurement_service.context.abort(
168163
grpc.StatusCode.DEADLINE_EXCEEDED, "Deadline exceeded."
169164
)
170-
if pending_cancellation:
165+
if cancellation_event.is_set():
171166
measurement_service.context.abort(
172167
grpc.StatusCode.CANCELLED, "Client requested cancellation."
173168
)

examples/niswitch_control_relays/measurement.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
def measure(
4747
relay_names: str,
4848
close_relays: bool,
49-
) -> Tuple:
49+
) -> Tuple[()]:
5050
"""Control relays using an NI relay driver (e.g. PXI-2567)."""
5151
logging.info(
5252
"Controlling relays: relay_names=%s close_relay=%s",

examples/nivisa_dmm_measurement/measurement.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def measure(
7575
measurement_type: Function,
7676
range: float,
7777
resolution_digits: float,
78-
) -> Tuple:
78+
) -> Tuple[float]:
7979
"""Perform a DMM measurement using NI-VISA and an NI Instrument Simulator v2.0."""
8080
logging.info(
8181
"Starting measurement: pin_name=%s measurement_type=%s range=%g resolution_digits=%g",

examples/output_voltage_measurement/measurement.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import threading
66
import time
77
from enum import Enum
8+
from typing import Tuple
89

910
import _nidcpower_helpers
1011
import _visa_helpers
@@ -100,7 +101,7 @@ def measure(
100101
range: float,
101102
resolution_digits: float,
102103
output_pin: str,
103-
):
104+
) -> Tuple[float]:
104105
"""Source DC voltage as input with an NI SMU and measure output using NI-VISA DMM."""
105106
logging.info(
106107
"Executing measurement: pin_names=%s voltage_level=%g measurement_type=%s range=%g resolution_digits=%g",

examples/sample_measurement/measurement.py

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pathlib
44
import sys
55
from enum import Enum
6+
from typing import Iterable, Tuple
67

78
import click
89
from _helpers import configure_logging, verbosity_option
@@ -16,7 +17,7 @@
1617

1718
script_or_exe = sys.executable if getattr(sys, "frozen", False) else __file__
1819
service_directory = pathlib.Path(script_or_exe).resolve().parent
19-
sample_measurement_service = nims.MeasurementService(
20+
measurement_service = nims.MeasurementService(
2021
service_config_path=service_directory / "SampleMeasurement.serviceconfig",
2122
version="0.1.0.0",
2223
ui_file_paths=[
@@ -36,50 +37,48 @@ class Color(Enum):
3637
BLUE = 3
3738

3839

39-
@sample_measurement_service.register_measurement
40-
@sample_measurement_service.configuration("Float In", nims.DataType.Float, 0.06)
41-
@sample_measurement_service.configuration(
42-
"Double Array In", nims.DataType.DoubleArray1D, [0.1, 0.2, 0.3]
43-
)
44-
@sample_measurement_service.configuration("Bool In", nims.DataType.Boolean, False)
45-
@sample_measurement_service.configuration("String In", nims.DataType.String, "sample string")
46-
@sample_measurement_service.configuration(
47-
"Enum In", nims.DataType.Enum, Color.BLUE, enum_type=Color
48-
)
49-
@sample_measurement_service.configuration(
40+
@measurement_service.register_measurement
41+
@measurement_service.configuration("Float In", nims.DataType.Float, 0.06)
42+
@measurement_service.configuration("Double Array In", nims.DataType.DoubleArray1D, [0.1, 0.2, 0.3])
43+
@measurement_service.configuration("Bool In", nims.DataType.Boolean, False)
44+
@measurement_service.configuration("String In", nims.DataType.String, "sample string")
45+
@measurement_service.configuration("Enum In", nims.DataType.Enum, Color.BLUE, enum_type=Color)
46+
@measurement_service.configuration(
5047
"Protobuf Enum In",
5148
nims.DataType.Enum,
5249
color_pb2.ProtobufColor.BLACK,
5350
enum_type=color_pb2.ProtobufColor,
5451
)
55-
@sample_measurement_service.configuration(
52+
@measurement_service.configuration(
5653
"String Array In", nims.DataType.StringArray1D, ["String1", "String2"]
5754
)
58-
@sample_measurement_service.output("Float out", nims.DataType.Float)
59-
@sample_measurement_service.output("Double Array out", nims.DataType.DoubleArray1D)
60-
@sample_measurement_service.output("Bool out", nims.DataType.Boolean)
61-
@sample_measurement_service.output("String out", nims.DataType.String)
62-
@sample_measurement_service.output("Enum out", nims.DataType.Enum, enum_type=Color)
63-
@sample_measurement_service.output(
55+
@measurement_service.output("Float out", nims.DataType.Float)
56+
@measurement_service.output("Double Array out", nims.DataType.DoubleArray1D)
57+
@measurement_service.output("Bool out", nims.DataType.Boolean)
58+
@measurement_service.output("String out", nims.DataType.String)
59+
@measurement_service.output("Enum out", nims.DataType.Enum, enum_type=Color)
60+
@measurement_service.output(
6461
"Protobuf Enum out", nims.DataType.Enum, enum_type=color_pb2.ProtobufColor
6562
)
66-
@sample_measurement_service.output("String Array out", nims.DataType.StringArray1D)
63+
@measurement_service.output("String Array out", nims.DataType.StringArray1D)
6764
def measure(
68-
float_input,
69-
double_array_input,
70-
bool_input,
71-
string_input,
72-
enum_input,
73-
protobuf_enum_input,
74-
string_array_in,
75-
):
65+
float_input: float,
66+
double_array_input: Iterable[float],
67+
bool_input: bool,
68+
string_input: str,
69+
enum_input: Color,
70+
protobuf_enum_input: color_pb2.ProtobufColor.ValueType,
71+
string_array_in: Iterable[str],
72+
) -> Tuple[
73+
float, Iterable[float], bool, str, Color, color_pb2.ProtobufColor.ValueType, Iterable[str]
74+
]:
7675
"""Perform a loopback measurement with various data types."""
7776
logging.info("Executing measurement")
7877

79-
def cancel_callback():
78+
def cancel_callback() -> None:
8079
logging.info("Canceling measurement")
8180

82-
sample_measurement_service.context.add_cancel_callback(cancel_callback)
81+
measurement_service.context.add_cancel_callback(cancel_callback)
8382

8483
float_output = float_input
8584
float_array_output = double_array_input
@@ -107,7 +106,7 @@ def main(verbosity: int) -> None:
107106
"""Perform a loopback measurement with various data types."""
108107
configure_logging(verbosity)
109108

110-
with sample_measurement_service.host_service():
109+
with measurement_service.host_service():
111110
input("Press enter to close the measurement service.\n")
112111

113112

tests/utilities/loopback_measurement/__init__.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Contains utility functions to test loopback measurement service. """
22
import pathlib
33
from enum import Enum
4+
from typing import Iterable, Tuple
45

56
from examples.sample_measurement._stubs import color_pb2
67

@@ -51,14 +52,16 @@ class Color(Enum):
5152
)
5253
@measurement_service.output("String Array out", nims.DataType.StringArray1D)
5354
def measure(
54-
float_input,
55-
double_array_input,
56-
bool_input,
57-
string_input,
58-
enum_input,
59-
protobuf_enum_input,
60-
string_array_in,
61-
):
55+
float_input: float,
56+
double_array_input: Iterable[float],
57+
bool_input: bool,
58+
string_input: str,
59+
enum_input: Color,
60+
protobuf_enum_input: color_pb2.ProtobufColor.ValueType,
61+
string_array_in: Iterable[str],
62+
) -> Tuple[
63+
float, Iterable[float], bool, str, Color, color_pb2.ProtobufColor.ValueType, Iterable[str]
64+
]:
6265
"""Perform a loopback measurement with various data types."""
6366
float_output = float_input
6467
float_array_output = double_array_input

0 commit comments

Comments
 (0)