Skip to content

Commit 7aa81fa

Browse files
mjohanse-emrMichael Johansen
andauthored
Raise an error if irregular timing is encountered during conversion. (#31)
* Raise an error if irregular timing is encountered during conversion. Signed-off-by: Michael Johansen <[email protected]> * Fix typo. Signed-off-by: Michael Johansen <[email protected]> * Rename method based on PR feedback. Signed-off-by: Michael Johansen <[email protected]> --------- Signed-off-by: Michael Johansen <[email protected]> Co-authored-by: Michael Johansen <[email protected]>
1 parent 957904e commit 7aa81fa

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

packages/ni.protobuf.types/src/ni/protobuf/types/waveform_conversion.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
ExtendedPropertyValue,
1919
LinearScaleMode,
2020
NoneScaleMode,
21+
SampleIntervalMode,
2122
Spectrum,
2223
Timing,
2324
)
@@ -42,6 +43,7 @@ def float64_analog_waveform_to_protobuf(
4243
value: AnalogWaveform[np.float64], /
4344
) -> DoubleAnalogWaveform:
4445
"""Convert the Python AnalogWaveform to a protobuf DoubleAnalogWaveform."""
46+
_validate_timing(value)
4547
t0 = _t0_from_waveform(value)
4648
time_interval = _time_interval_from_waveform(value)
4749
attributes = _extended_properties_to_attributes(value.extended_properties)
@@ -74,6 +76,7 @@ def float64_complex_waveform_to_protobuf(
7476
value: ComplexWaveform[np.complex128], /
7577
) -> DoubleComplexWaveform:
7678
"""Convert the Python ComplexWaveform to a protobuf DoubleComplexWaveform."""
79+
_validate_timing(value)
7780
t0 = _t0_from_waveform(value)
7881
time_interval = _time_interval_from_waveform(value)
7982
attributes = _extended_properties_to_attributes(value.extended_properties)
@@ -111,6 +114,7 @@ def int16_complex_waveform_to_protobuf(
111114
value: ComplexWaveform[ComplexInt32Base], /
112115
) -> I16ComplexWaveform:
113116
"""Convert the Python ComplexWaveform to a protobuf DoubleComplexWaveform."""
117+
_validate_timing(value)
114118
t0 = _t0_from_waveform(value)
115119
time_interval = _time_interval_from_waveform(value)
116120
attributes = _extended_properties_to_attributes(value.extended_properties)
@@ -205,6 +209,13 @@ def _value_to_attribute(value: ExtendedPropertyValue) -> WaveformAttributeValue:
205209
return attr_value
206210

207211

212+
def _validate_timing(
213+
waveform: AnalogWaveform[Any] | ComplexWaveform[Any],
214+
) -> None:
215+
if waveform.timing.sample_interval_mode == SampleIntervalMode.IRREGULAR:
216+
raise ValueError("Cannot convert irregular sample interval to protobuf.")
217+
218+
208219
def _t0_from_waveform(
209220
waveform: AnalogWaveform[Any] | ComplexWaveform[Any],
210221
) -> PrecisionTimestamp | None:

packages/ni.protobuf.types/tests/unit/test_waveform_conversion.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime as dt
22

33
import numpy as np
4+
import pytest
45
from nitypes.bintime import DateTime
56
from nitypes.complex import ComplexInt32DType
67
from nitypes.waveform import (
@@ -94,6 +95,19 @@ def test___analog_waveform_with_standard_timing___convert___valid_protobuf() ->
9495
assert dbl_analog_waveform.t0 == converted_t0
9596

9697

98+
def test___analog_waveform_with_irregular_timing___convert___raises_value_error() -> None:
99+
analog_waveform = AnalogWaveform.from_array_1d(np.array([1.0, 2.0, 3.0]))
100+
t0_dt = dt.datetime(2000, 12, 1, tzinfo=dt.timezone.utc)
101+
analog_waveform.timing = Timing.create_with_irregular_interval(
102+
[t0_dt, t0_dt + dt.timedelta(milliseconds=1000), t0_dt + dt.timedelta(milliseconds=3000)]
103+
)
104+
105+
with pytest.raises(ValueError) as exc:
106+
_ = float64_analog_waveform_to_protobuf(analog_waveform)
107+
108+
assert exc.value.args[0].startswith("Cannot convert irregular sample interval to protobuf.")
109+
110+
97111
# ========================================================
98112
# DoubleAnalogWaveform to AnalogWaveform
99113
# ========================================================
@@ -221,6 +235,19 @@ def test___float64_complex_waveform_with_standard_timing___convert___valid_proto
221235
assert dbl_complex_waveform.t0 == converted_t0
222236

223237

238+
def test___float64_complex_waveform_with_irregular_timing___convert___raises_value_error() -> None:
239+
complex_waveform = ComplexWaveform.from_array_1d([1.5 + 2.5j, 3.5 + 4.5j], np.complex128)
240+
t0_dt = dt.datetime(2000, 12, 1, tzinfo=dt.timezone.utc)
241+
complex_waveform.timing = Timing.create_with_irregular_interval(
242+
[t0_dt, t0_dt + dt.timedelta(milliseconds=1000)]
243+
)
244+
245+
with pytest.raises(ValueError) as exc:
246+
_ = float64_complex_waveform_to_protobuf(complex_waveform)
247+
248+
assert exc.value.args[0].startswith("Cannot convert irregular sample interval to protobuf.")
249+
250+
224251
# ========================================================
225252
# DoubleComplexWaveform to ComplexWaveform
226253
# ========================================================
@@ -349,6 +376,19 @@ def test___int16_complex_waveform_with_standard_timing___convert___valid_protobu
349376
assert i16_complex_waveform.t0 == converted_t0
350377

351378

379+
def test___int16_complex_waveform_with_irregular_timing___convert___raises_value_error() -> None:
380+
complex_waveform = ComplexWaveform.from_array_1d([(1, 2), (3, 4)], ComplexInt32DType)
381+
t0_dt = dt.datetime(2000, 12, 1, tzinfo=dt.timezone.utc)
382+
complex_waveform.timing = Timing.create_with_irregular_interval(
383+
[t0_dt, t0_dt + dt.timedelta(milliseconds=1000)]
384+
)
385+
386+
with pytest.raises(ValueError) as exc:
387+
_ = int16_complex_waveform_to_protobuf(complex_waveform)
388+
389+
assert exc.value.args[0].startswith("Cannot convert irregular sample interval to protobuf.")
390+
391+
352392
def test___int16_complex_waveform_with_scaling___convert___valid_protobuf() -> None:
353393
scale_mode = LinearScaleMode(2.0, 3.0)
354394
complex_waveform = ComplexWaveform.from_array_1d(

0 commit comments

Comments
 (0)