Skip to content

Commit

Permalink
Add Double2DArray Input Configurations support
Browse files Browse the repository at this point in the history
  • Loading branch information
Blahpapto1 committed Dec 4, 2024
1 parent 8392f40 commit 6fa5e2b
Show file tree
Hide file tree
Showing 11 changed files with 92 additions and 19 deletions.
8 changes: 7 additions & 1 deletion examples/sample_measurement/measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ class Color(Enum):
@measurement_service.configuration(
"String Array In", nims.DataType.StringArray1D, ["String1", "String2"]
)
@measurement_service.configuration(
"Double2DArray In",
nims.DataType.Double2DArray,
array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
)
@measurement_service.output("Float out", nims.DataType.Float)
@measurement_service.output("Double Array out", nims.DataType.DoubleArray1D)
@measurement_service.output("Bool out", nims.DataType.Boolean)
Expand All @@ -70,6 +75,7 @@ def measure(
enum_input: Color,
protobuf_enum_input: color_pb2.ProtobufColor.ValueType,
string_array_in: Iterable[str],
double2d_array_input: array_pb2.Double2DArray,
) -> Tuple[
float,
Iterable[float],
Expand All @@ -95,7 +101,7 @@ def cancel_callback() -> None:
enum_output = enum_input
protobuf_enum_output = protobuf_enum_input
string_array_output = string_array_in
double2d_array_output = array_pb2.Double2DArray()
double2d_array_output = double2d_array_input
logging.info("Completed measurement")

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def get_configuration_and_output_metadata_by_index(
"""Returns the configuration and output metadata of the measurement."""
configuration_parameter_list = []
for configuration in metadata.measurement_signature.configuration_parameters:
if configuration.message_type:
if configuration.message_type and configuration.message_type != "ni.protobuf.types.Double2DArray":
raise click.ClickException(
f"Measurement configurations do not support message data types ({configuration.message_type} is unsupported)."
)
Expand Down Expand Up @@ -209,6 +209,18 @@ def get_configuration_and_output_metadata_by_index(
default_value = default_value.value
elif isinstance(default_value, list) and any(isinstance(e, Enum) for e in default_value):
default_value = [e.value for e in default_value]
elif isinstance(default_value, str):
default_value = repr(default_value)
elif configuration_metadata[id].message_type == "ni.protobuf.types.Double2DArray":
default_value = str(default_value).split("\n")[:-1]
value_2d_array_rows = int(default_value[0].split(" ")[1])
value_2d_array_columns = int(default_value[1].split(" ")[1])
value_2d_array_data = []
for data in default_value[2:]:
new_data = data.split(" ")[1]
value_2d_array_data.append(int(new_data))

default_value = f"Double2DArray(rows={value_2d_array_rows}, columns={value_2d_array_columns}, data={value_2d_array_data})"
configuration_metadata[id] = configuration_metadata[id]._replace(
default_value=default_value
)
Expand All @@ -231,8 +243,6 @@ def get_configuration_parameters_with_type_and_default_values(

default_value = metadata.default_value
parameter_type = _get_configuration_python_type_as_str(metadata.type, metadata.repeated)
if isinstance(default_value, str):
default_value = repr(default_value)

if metadata.annotations and metadata.annotations.get("ni/type_specialization") == "path":
parameter_type = "pathlib.PurePath"
Expand Down Expand Up @@ -264,6 +274,9 @@ def get_configuration_parameters_with_type_and_default_values(
else:
enum_value = next((e.name for e in enum_type if e.value == default_value), None)
default_value = f"{parameter_type}.{enum_value}"

if metadata.message_type and metadata.message_type == "ni.protobuf.types.Double2DArray":
parameter_type = "Double2DArray"

configuration_parameters.append(f"{parameter_name}: {parameter_type} = {default_value}")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class ${class_name}:
display_name=${value.display_name | repr},
type=Field.Kind.ValueType(${value.type}),
repeated=${value.repeated},
default_value=${_format_default_value(value.default_value)},
default_value=${value.default_value},
annotations=${value.annotations | n, repr},
message_type=${value.message_type | repr},
field_name=${value.field_name | repr},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
from tests.conftest import CliRunnerFunction
from tests.utilities.discovery_service_process import DiscoveryServiceProcess
from tests.utilities.measurements import non_streaming_data_measurement

from ni_measurement_plugin_sdk_service._internal.stubs.ni.protobuf.types import (
array_pb2,
)

class EnumInEnum(Enum):
"""EnumInEnum used for enum-typed measurement configs and outputs."""
Expand Down Expand Up @@ -65,7 +67,7 @@ def test___measurement_plugin_client___measure___returns_output(
enum_out=EnumInEnum.BLUE,
enum_array_out=[EnumInEnum.RED, EnumInEnum.GREEN],
protobuf_enum_out=ProtobufEnumInEnum.BLACK,
double2darray_out=None,
double2darray_out=array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
)
measurement_plugin_client = test_measurement_client_type()

Expand Down Expand Up @@ -121,7 +123,7 @@ def test___measurement_plugin_client___stream_measure___returns_output(
enum_out=EnumInEnum.BLUE,
enum_array_out=[EnumInEnum.RED, EnumInEnum.GREEN],
protobuf_enum_out=ProtobufEnumInEnum.BLACK,
double2darray_out=None,
double2darray_out=array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
)
measurement_plugin_client = test_measurement_client_type()

Expand Down Expand Up @@ -219,7 +221,7 @@ def _verify_output_types(outputs: Any, measurement_plugin_client_module: ModuleT
_assert_type(outputs.enum_out, enum_type)
_assert_collection_type(outputs.enum_array_out, Sequence, enum_type)
_assert_type(outputs.protobuf_enum_out, protobuf_enum_type)
_assert_type(outputs.double2darray_out, type(None))
_assert_type(outputs.double2darray_out, array_pb2.Double2DArray)


def _assert_type(value: Any, expected_type: Union[Type[Any], Tuple[Type[Any], ...]]) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,16 @@ def __init__(
field_name="Protobuf_Enum_In",
enum_type=ProtobufEnumInEnum,
),
14: ParameterMetadata(
display_name="Double2DArray In",
type=Field.Kind.ValueType(11),
repeated=False,
default_value=Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
annotations={},
message_type="ni.protobuf.types.Double2DArray",
field_name="Double2DArray_In",
enum_type=None,
),
}
self._output_metadata = {
1: ParameterMetadata(
Expand Down Expand Up @@ -585,6 +595,7 @@ def measure(
enum_in: EnumInEnum = EnumInEnum.BLUE,
enum_array_in: typing.Iterable[EnumInEnum] = [EnumInEnum.RED, EnumInEnum.GREEN],
protobuf_enum_in: ProtobufEnumInEnum = ProtobufEnumInEnum.BLACK,
double2darray_in: Double2DArray = Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
) -> Outputs:
"""Perform a single measurement.
Expand All @@ -605,6 +616,7 @@ def measure(
enum_in,
enum_array_in,
protobuf_enum_in,
double2darray_in,
)
for response in stream_measure_response:
result = response
Expand Down Expand Up @@ -639,6 +651,7 @@ def stream_measure(
enum_in: EnumInEnum = EnumInEnum.BLUE,
enum_array_in: typing.Iterable[EnumInEnum] = [EnumInEnum.RED, EnumInEnum.GREEN],
protobuf_enum_in: ProtobufEnumInEnum = ProtobufEnumInEnum.BLACK,
double2darray_in: Double2DArray = Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
) -> typing.Generator[Outputs, None, None]:
"""Perform a streaming measurement.
Expand All @@ -659,6 +672,7 @@ def stream_measure(
enum_in,
enum_array_in,
protobuf_enum_in,
double2darray_in,
]
with self._initialization_lock:
if self._measure_response is not None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ class Color(Enum):
color_pb2.ProtobufColor.BLACK,
enum_type=color_pb2.ProtobufColor,
)
@measurement_service.configuration(
"Double2DArray In",
nims.DataType.Double2DArray,
array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6]),
)
@measurement_service.output("Float out", nims.DataType.Float)
@measurement_service.output("Double Array out", nims.DataType.DoubleArray1D)
@measurement_service.output("Bool out", nims.DataType.Boolean)
Expand Down Expand Up @@ -106,6 +111,7 @@ def measure(
enum_input: Color,
enum_array_input: Iterable[Color],
protobuf_enum_input: color_pb2.ProtobufColor.ValueType,
double2d_array_input: array_pb2.Double2DArray,
) -> Tuple[
float,
Iterable[float],
Expand Down Expand Up @@ -138,7 +144,7 @@ def measure(
enum_output = enum_input
enum_array_output = enum_array_input
protobuf_enum_output = protobuf_enum_input
double2d_array_output = array_pb2.Double2DArray()
double2d_array_output = double2d_array_input

return (
float_output,
Expand Down
16 changes: 16 additions & 0 deletions packages/service/tests/unit/test_decoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
TypeSpecialization,
)
from ni_measurement_plugin_sdk_service._internal.stubs.ni.protobuf.types import (
array_pb2,
xydata_pb2,
)
from tests.utilities.stubs.serialization import test_pb2
Expand Down Expand Up @@ -53,6 +54,8 @@ class Countries(IntEnum):

double_xy_data_array = [double_xy_data, double_xy_data2]

double_2d_array = array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6])

# This should match the number of fields in bigmessage.proto.
BIG_MESSAGE_SIZE = 100

Expand Down Expand Up @@ -83,6 +86,7 @@ class Countries(IntEnum):
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
]
],
)
Expand Down Expand Up @@ -125,6 +129,7 @@ def test___empty_buffer___deserialize_parameters___returns_zero_or_empty():
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
]
parameter = _get_test_parameter_by_id(nonzero_defaults)
service_name = _test_create_file_descriptor(list(parameter.values()), "empty_buffer")
Expand Down Expand Up @@ -347,6 +352,14 @@ def _get_test_parameter_by_id(default_values):
annotations={},
message_type=xydata_pb2.DoubleXYData.DESCRIPTOR.full_name,
),
23: ParameterMetadata.initialize(
display_name="double_2d_array",
type=type_pb2.Field.TYPE_MESSAGE,
repeated=False,
default_value=default_values[22],
annotations={},
message_type=array_pb2.Double2DArray.DESCRIPTOR.full_name,
),
}
return parameter_by_id

Expand Down Expand Up @@ -376,6 +389,9 @@ def _get_test_grpc_message(test_values):
parameter.xy_data.x_data.append(test_values[20].x_data[0])
parameter.xy_data.y_data.append(test_values[20].y_data[0])
parameter.xy_data_array.extend(test_values[21])
parameter.double_2d_array.rows = test_values[22].rows
parameter.double_2d_array.columns = test_values[22].columns
parameter.double_2d_array.data.extend(test_values[22].data)
return parameter


Expand Down
8 changes: 8 additions & 0 deletions packages/service/tests/unit/test_encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
serialization_descriptors,
)
from ni_measurement_plugin_sdk_service._internal.stubs.ni.protobuf.types import (
array_pb2,
xydata_pb2,
)
from tests.unit.test_decoder import (
Expand Down Expand Up @@ -51,6 +52,8 @@ class Countries(IntEnum):

double_xy_data_array = [double_xy_data, double_xy_data2]

double_2d_array = array_pb2.Double2DArray(rows=2, columns=3, data=[1, 2, 3, 4, 5, 6])

# This should match the number of fields in bigmessage.proto.
BIG_MESSAGE_SIZE = 100

Expand Down Expand Up @@ -81,6 +84,7 @@ class Countries(IntEnum):
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
],
[
-0.9999,
Expand All @@ -105,6 +109,7 @@ class Countries(IntEnum):
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
],
],
)
Expand Down Expand Up @@ -149,6 +154,7 @@ def test___serializer___serialize_parameter___successful_serialization(test_valu
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
],
[
-0.9999,
Expand All @@ -173,6 +179,7 @@ def test___serializer___serialize_parameter___successful_serialization(test_valu
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
],
],
)
Expand Down Expand Up @@ -230,6 +237,7 @@ def test___big_message___serialize_parameters___returns_serialized_data() -> Non
[Countries.AUSTRALIA, Countries.CANADA],
double_xy_data,
double_xy_data_array,
double_2d_array,
],
],
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
syntax = "proto3";
package ni.measurementlink.measurement.tests.serialization;

import "ni/protobuf/types/array.proto";
import "ni/protobuf/types/xydata.proto";

enum DifferentColor
Expand Down Expand Up @@ -42,4 +43,5 @@ message MeasurementParameter {
repeated Countries int_enum_array_data = 20;
ni.protobuf.types.DoubleXYData xy_data = 21;
repeated ni.protobuf.types.DoubleXYData xy_data_array = 22;
ni.protobuf.types.Double2DArray double_2d_array = 23;
}
15 changes: 8 additions & 7 deletions packages/service/tests/utilities/stubs/serialization/test_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 6fa5e2b

Please sign in to comment.