Skip to content

Commit 859c18d

Browse files
mikeprosserniMike Prosser
andauthored
Add support for reading digital waveforms (#809)
* add read_digital_waveform() to Interpreters and DigitalSingleChannelReader * read_digital_waveforms * cleanup * add digital support to Task.read_waveform() * handle LineGrouping.CHAN_FOR_ALL_LINES * cleanup * test for ports and better asserts * test cleanup * cleanup and add test___digital_multi_channel_multi_line_reader___reuse_waveform_in_place___overwrites_data_timing_and_attributes * from __future__ import annotations * api cleanup * minor test cleanups * fix test assertion * bytes_per_chan_array and interpreter.read_new_digital_waveforms() * assert signal names, and test lines and port together * tests with lines and port together in a single channel * use constructor instead of DigitalWaveform.from_lines() * cleanup --------- Co-authored-by: Mike Prosser <[email protected]>
1 parent bf7babb commit 859c18d

File tree

14 files changed

+2366
-174
lines changed

14 files changed

+2366
-174
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""Example for reading digital signals.
2+
3+
This example demonstrates how to input a finite digital pattern
4+
using the DAQ device's internal clock.
5+
"""
6+
7+
import os
8+
9+
os.environ["NIDAQMX_ENABLE_WAVEFORM_SUPPORT"] = "1"
10+
11+
import nidaqmx # noqa: E402 # Must import after setting environment variable
12+
from nidaqmx.constants import ( # noqa: E402
13+
READ_ALL_AVAILABLE,
14+
AcquisitionType,
15+
LineGrouping,
16+
)
17+
18+
with nidaqmx.Task() as task:
19+
task.di_channels.add_di_chan(
20+
"cdaqTesterMod4/port0", line_grouping=LineGrouping.CHAN_FOR_ALL_LINES
21+
)
22+
task.timing.cfg_samp_clk_timing(1000.0, sample_mode=AcquisitionType.FINITE, samps_per_chan=50)
23+
24+
waveform = task.read_waveform(READ_ALL_AVAILABLE)
25+
print("Acquired data:")
26+
print(waveform.data)
27+
print(f"Channel name: {waveform.channel_name}")
28+
print(f"t0: {waveform.timing.start_time}")
29+
print(f"dt: {waveform.timing.sample_interval}")

generated/nidaqmx/_base_interpreter.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# Do not edit this file; it was automatically generated.
2+
from __future__ import annotations
3+
24
import abc
35
import numpy
4-
from nitypes.waveform import AnalogWaveform
6+
from nitypes.waveform import AnalogWaveform, DigitalWaveform
57
from typing import Sequence
68
from nidaqmx.constants import WaveformAttributeMode
79

@@ -1858,7 +1860,7 @@ def read_analog_waveform(
18581860
timeout: float,
18591861
waveform: AnalogWaveform[numpy.float64],
18601862
waveform_attribute_mode: WaveformAttributeMode
1861-
) -> None:
1863+
) -> int:
18621864
raise NotImplementedError
18631865

18641866
@abc.abstractmethod
@@ -1869,5 +1871,41 @@ def read_analog_waveforms(
18691871
timeout: float,
18701872
waveforms: Sequence[AnalogWaveform[numpy.float64]],
18711873
waveform_attribute_mode: WaveformAttributeMode
1872-
) -> None:
1873-
raise NotImplementedError
1874+
) -> int:
1875+
raise NotImplementedError
1876+
1877+
@abc.abstractmethod
1878+
def read_digital_waveform(
1879+
self,
1880+
task_handle: object,
1881+
number_of_samples_per_channel: int,
1882+
timeout: float,
1883+
waveform: DigitalWaveform[numpy.uint8],
1884+
waveform_attribute_mode: WaveformAttributeMode
1885+
) -> int:
1886+
raise NotImplementedError
1887+
1888+
@abc.abstractmethod
1889+
def read_digital_waveforms(
1890+
self,
1891+
task_handle: object,
1892+
channel_count: int,
1893+
number_of_samples_per_channel: int,
1894+
number_of_signals_per_sample: int,
1895+
timeout: float,
1896+
waveforms: Sequence[DigitalWaveform[numpy.uint8]],
1897+
waveform_attribute_mode: WaveformAttributeMode,
1898+
) -> int:
1899+
raise NotImplementedError
1900+
1901+
@abc.abstractmethod
1902+
def read_new_digital_waveforms(
1903+
self,
1904+
task_handle: object,
1905+
channel_count: int,
1906+
number_of_samples_per_channel: int,
1907+
number_of_signals_per_sample: int,
1908+
timeout: float,
1909+
waveform_attribute_mode: WaveformAttributeMode,
1910+
) -> Sequence[DigitalWaveform[numpy.uint8]]:
1911+
raise NotImplementedError

generated/nidaqmx/_grpc_interpreter.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import threading
66
import typing
77
import warnings
8-
from nitypes.waveform import AnalogWaveform
8+
from nitypes.waveform import AnalogWaveform, DigitalWaveform
99
from typing import Callable, Generic, Sequence, TypeVar
1010

1111
import google.protobuf.message
@@ -3609,7 +3609,7 @@ def read_analog_waveform(
36093609
timeout: float,
36103610
waveform: AnalogWaveform[numpy.float64],
36113611
waveform_attribute_mode: WaveformAttributeMode
3612-
) -> None:
3612+
) -> int:
36133613
raise NotImplementedError
36143614

36153615
def read_analog_waveforms(
@@ -3619,7 +3619,40 @@ def read_analog_waveforms(
36193619
timeout: float,
36203620
waveforms: Sequence[AnalogWaveform[numpy.float64]],
36213621
waveform_attribute_mode: WaveformAttributeMode
3622-
) -> None:
3622+
) -> int:
3623+
raise NotImplementedError
3624+
3625+
def read_digital_waveform(
3626+
self,
3627+
task_handle: object,
3628+
number_of_samples_per_channel: int,
3629+
timeout: float,
3630+
waveform: DigitalWaveform[numpy.uint8],
3631+
waveform_attribute_mode: WaveformAttributeMode
3632+
) -> int:
3633+
raise NotImplementedError
3634+
3635+
def read_digital_waveforms(
3636+
self,
3637+
task_handle: object,
3638+
channel_count: int,
3639+
number_of_samples_per_channel: int,
3640+
number_of_signals_per_sample: int,
3641+
timeout: float,
3642+
waveforms: Sequence[DigitalWaveform[numpy.uint8]],
3643+
waveform_attribute_mode: WaveformAttributeMode,
3644+
) -> int:
3645+
raise NotImplementedError
3646+
3647+
def read_new_digital_waveforms(
3648+
self,
3649+
task_handle: object,
3650+
channel_count: int,
3651+
number_of_samples_per_channel: int,
3652+
number_of_signals_per_sample: int,
3653+
timeout: float,
3654+
waveform_attribute_mode: WaveformAttributeMode,
3655+
) -> Sequence[DigitalWaveform[numpy.uint8]]:
36233656
raise NotImplementedError
36243657

36253658
def _assign_numpy_array(numpy_array, grpc_array):

0 commit comments

Comments
 (0)