From 7f825f7a6481abffbe3bf898101d30883f70c03b Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Mon, 8 May 2023 21:28:55 +0530 Subject: [PATCH 01/11] feat: include samps read/write value in exception for read/write methods --- generated/nidaqmx/nidaqmx_service.cpp | 64 ++++----- generated/nidaqmx/nidaqmx_service.h | 2 + source/codegen/common_helpers.py | 18 +++ source/codegen/metadata/nidaqmx/__init__.py | 12 +- .../metadata/nidaqmx/functions_addon.py | 135 ++++++++++++++++++ source/codegen/metadata_validation.py | 1 + source/codegen/templates/service.h.mako | 4 + source/codegen/templates/service_helpers.mako | 7 +- source/custom/nidaqmx_service.custom.cpp | 16 +++ source/server/converters.h | 22 +++ 10 files changed, 246 insertions(+), 35 deletions(-) diff --git a/generated/nidaqmx/nidaqmx_service.cpp b/generated/nidaqmx/nidaqmx_service.cpp index a52332961..841c36fb7 100644 --- a/generated/nidaqmx/nidaqmx_service.cpp +++ b/generated/nidaqmx/nidaqmx_service.cpp @@ -12932,7 +12932,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadAnalogF64(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13003,7 +13003,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadBinaryI16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13058,7 +13058,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadBinaryI32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13103,7 +13103,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadBinaryU16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13158,7 +13158,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadBinaryU32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13188,7 +13188,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCounterF64(task, num_samps_per_chan, timeout, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13234,7 +13234,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCounterF64Ex(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13316,7 +13316,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCounterU32(task, num_samps_per_chan, timeout, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13362,7 +13362,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCounterU32Ex(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13410,7 +13410,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCtrFreq(task, num_samps_per_chan, timeout, interleaved, read_array_frequency, read_array_duty_cycle, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13486,7 +13486,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCtrTicks(task, num_samps_per_chan, timeout, interleaved, read_array_high_ticks, read_array_low_ticks, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13562,7 +13562,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadCtrTime(task, num_samps_per_chan, timeout, interleaved, read_array_high_time, read_array_low_time, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13636,7 +13636,7 @@ namespace nidaqmx_grpc { int32 num_bytes_per_samp {}; auto status = library_->ReadDigitalLines(task, num_samps_per_chan, timeout, fill_mode, (uInt8*)read_array.data(), array_size_in_bytes, &samps_per_chan_read, &num_bytes_per_samp, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_read_array(read_array); @@ -13709,7 +13709,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13764,7 +13764,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13809,7 +13809,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU8(task, num_samps_per_chan, timeout, fill_mode, (uInt8*)read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_read_array(read_array); @@ -13856,7 +13856,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadPowerBinaryI16(task, num_samps_per_chan, timeout, fill_mode, read_array_voltage.data(), read_array_current.data(), array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->mutable_read_array_voltage()->Clear(); @@ -13922,7 +13922,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; auto status = library_->ReadPowerF64(task, num_samps_per_chan, timeout, fill_mode, read_array_voltage, read_array_current, array_size_in_samps, &samps_per_chan_read, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13980,7 +13980,7 @@ namespace nidaqmx_grpc { int32 num_bytes_per_samp {}; auto status = library_->ReadRaw(task, num_samps_per_chan, timeout, (uInt8*)read_array.data(), array_size_in_bytes, &samps_read, &num_bytes_per_samp, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_read, task); } response->set_status(status); response->set_read_array(read_array); @@ -18248,7 +18248,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteAnalogF64(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18336,7 +18336,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteBinaryI16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18381,7 +18381,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteBinaryI32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18443,7 +18443,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteBinaryU16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18488,7 +18488,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteBinaryU32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18534,7 +18534,7 @@ namespace nidaqmx_grpc { int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrFreq(task, num_samps_per_chan, auto_start, timeout, data_layout, frequency, duty_cycle, &num_samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18607,7 +18607,7 @@ namespace nidaqmx_grpc { int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrTicks(task, num_samps_per_chan, auto_start, timeout, data_layout, high_ticks, low_ticks, &num_samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18680,7 +18680,7 @@ namespace nidaqmx_grpc { int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrTime(task, num_samps_per_chan, auto_start, timeout, data_layout, high_time, low_time, &num_samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18752,7 +18752,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteDigitalLines(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18840,7 +18840,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18885,7 +18885,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18930,7 +18930,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU8(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18959,7 +18959,7 @@ namespace nidaqmx_grpc { int32 samps_per_chan_written {}; auto status = library_->WriteRaw(task, num_samps, auto_start, timeout, write_array, &samps_per_chan_written, reserved); if (!status_ok(status)) { - return ConvertApiErrorStatusForTaskHandle(context, status, task); + return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); diff --git a/generated/nidaqmx/nidaqmx_service.h b/generated/nidaqmx/nidaqmx_service.h index ead109926..ebb108250 100644 --- a/generated/nidaqmx/nidaqmx_service.h +++ b/generated/nidaqmx/nidaqmx_service.h @@ -435,6 +435,8 @@ class NiDAQmxService final : public NiDAQmx::WithCallbackMethod_RegisterSignalEv NiDAQmxLibraryInterface* library_; ResourceRepositorySharedPtr session_repository_; ::grpc::Status ConvertApiErrorStatusForTaskHandle(::grpc::ServerContext* context, int32_t status, TaskHandle task); + ::grpc::Status ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read, TaskHandle task); + ::grpc::Status ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written, TaskHandle task); NiDAQmxFeatureToggles feature_toggles_; }; diff --git a/source/codegen/common_helpers.py b/source/codegen/common_helpers.py index 38185e382..c843c9956 100644 --- a/source/codegen/common_helpers.py +++ b/source/codegen/common_helpers.py @@ -22,6 +22,14 @@ PascalTokenSubstitution("Uint", "UInt") ] +READ_ERROR_PARAMETERS = [ + "samps_read", "samps_per_chan_read" +] + +WRITE_ERROR_PARAMETERS = [ + "samps_per_chan_written", "num_samps_per_chan", "num_samps_per_chan_written" +] + def is_output_parameter(parameter): """Whether the parameter is an output parameter.""" @@ -1186,3 +1194,13 @@ def get_params_needing_initialization(parameters: List[dict]) -> List[dict]: * Outputs that are calculated/populated after the API call. """ return [p for p in parameters if not (is_return_value(p) or is_get_last_error_output_param(p))] + + +def get_parameter_for_error_generation(params, is_read_method): + for param in params: + if param["direction"] == "out": + if is_read_method and _camel_to_snake(param["name"]) in READ_ERROR_PARAMETERS: + return _camel_to_snake(param["name"]) + elif not is_read_method and _camel_to_snake(param["name"]) in WRITE_ERROR_PARAMETERS: + return _camel_to_snake(param["name"]) + return None diff --git a/source/codegen/metadata/nidaqmx/__init__.py b/source/codegen/metadata/nidaqmx/__init__.py index e79f8aacd..ac4bb1e33 100644 --- a/source/codegen/metadata/nidaqmx/__init__.py +++ b/source/codegen/metadata/nidaqmx/__init__.py @@ -1,12 +1,20 @@ from .functions import functions -from .functions_addon import functions_validation_suppressions +from .functions_addon import functions_validation_suppressions, functions_override_metadata from .attributes import attributes from .enums import enums from .enums_addon import enums_validation_suppressions from .config import config +copy_functions = functions.copy() +def update_functions(): + for function_name, function_data in functions_override_metadata.items(): + copy_functions[function_name] = {**copy_functions[function_name], **functions_override_metadata[function_name]} + return copy_functions + +all_functions = update_functions() + metadata = { - "functions" : functions, + "functions" : all_functions, "functions_validation_suppressions": functions_validation_suppressions, "attributes" : attributes, "enums" : enums, diff --git a/source/codegen/metadata/nidaqmx/functions_addon.py b/source/codegen/metadata/nidaqmx/functions_addon.py index fcdfbf1bd..87c6ffba3 100644 --- a/source/codegen/metadata/nidaqmx/functions_addon.py +++ b/source/codegen/metadata/nidaqmx/functions_addon.py @@ -1,4 +1,139 @@ functions_override_metadata = { + 'ReadAnalogF64': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadAnalogScalarF64': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadBinaryI16': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadBinaryI32': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadBinaryU16': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadBinaryU32': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCounterF64': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCounterF64Ex': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCounterScalarF64': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadCounterScalarU32': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadCounterU32': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCounterU32Ex': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCtrFreq': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCtrFreqScalar': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadCtrTicks': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCtrTicksScalar': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadCtrTime': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadCtrTimeScalar': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadDigitalLines': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadDigitalScalarU32': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'ReadDigitalU16': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadDigitalU32': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadDigitalU8': { + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadPowerScalarF64': { + 'python_codegen_method': 'CustomCode_Read_Scalar', + }, + 'WriteAnalogF64': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteAnalogScalarF64': { + 'python_codegen_method': 'CustomCode_Write_Scalar', + }, + 'WriteBinaryI16': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteBinaryI32': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteBinaryU16': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteBinaryU32': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteCtrFreq': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteCtrFreqScalar': { + 'python_codegen_method': 'CustomCode_Write_Scalar', + }, + 'WriteCtrTicks': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteCtrTicksScalar': { + 'python_codegen_method': 'CustomCode_Write_Scalar', + }, + 'WriteCtrTime': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteCtrTimeScalar': { + 'python_codegen_method': 'CustomCode_Write_Scalar', + }, + 'WriteDigitalLines': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteDigitalScalarU32': { + 'python_codegen_method': 'CustomCode_Write_Scalar', + }, + 'WriteDigitalU16': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteDigitalU32': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'WriteDigitalU8': { + 'python_codegen_method': 'CustomCode_Write', + }, + 'ReadPowerBinaryI16':{ + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadPowerF64':{ + 'python_codegen_method': 'CustomCode_Read', + }, + 'ReadRaw':{ + 'python_codegen_method': 'CustomCode_Read', + }, + 'WriteRaw':{ + 'python_codegen_method': 'CustomCode_Write', + } } functions_validation_suppressions = { diff --git a/source/codegen/metadata_validation.py b/source/codegen/metadata_validation.py index 8281cd97b..cf101f3d4 100644 --- a/source/codegen/metadata_validation.py +++ b/source/codegen/metadata_validation.py @@ -169,6 +169,7 @@ class RULES: Optional("adaptor_parameter"): dict, Optional("is_python_factory"): bool, Optional("python_description"): str, + Optional("python_codegen_method"): str, } ) diff --git a/source/codegen/templates/service.h.mako b/source/codegen/templates/service.h.mako index 334302d10..c482d2d1d 100644 --- a/source/codegen/templates/service.h.mako +++ b/source/codegen/templates/service.h.mako @@ -101,6 +101,10 @@ private: cpp_handle_type = resource_handle_type[0].upper() + resource_handle_type[1:] %>\ ::grpc::Status ConvertApiErrorStatusFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, ${resource_handle_type} ${config["session_handle_parameter_name"]}); + % if config["c_function_prefix"] == "DAQmx": + ::grpc::Status ConvertApiErrorStatusWithReadParametersFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read, ${resource_handle_type} ${config["session_handle_parameter_name"]}); + ::grpc::Status ConvertApiErrorStatusWithWriteParametersFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written, ${resource_handle_type} ${config["session_handle_parameter_name"]}); + %endif % endfor % if common_helpers.has_viboolean_array_param(functions): void Copy(const std::vector& input, google::protobuf::RepeatedField* output); diff --git a/source/codegen/templates/service_helpers.mako b/source/codegen/templates/service_helpers.mako index fc53d5498..777894b76 100644 --- a/source/codegen/templates/service_helpers.mako +++ b/source/codegen/templates/service_helpers.mako @@ -756,6 +756,7 @@ ${set_response_values(normal_outputs, init_method)}\ config = data['config'] input_parameters = [p for p in parameters if common_helpers.is_input_parameter(p)] resource_handle_types = service_helpers.get_resource_handle_types(config) + method_type = function_data.get("python_codegen_method", None) %>\ <%block filter="common_helpers.indent(indent_level)">\ <% @@ -768,7 +769,11 @@ ${set_response_values(normal_outputs, init_method)}\ break cpp_handle_type = handle_type[0].upper() + handle_type[1:] method_call = "" - if function_data.get('exclude_from_get_last_error', False): + if method_type == "CustomCode_Read": + method_call = f'return ConvertApiErrorStatusWithReadParametersFor{cpp_handle_type}(context, status, {common_helpers.get_parameter_for_error_generation(parameters, True)}, {session});' + elif method_type == "CustomCode_Write": + method_call = f'return ConvertApiErrorStatusWithWriteParametersFor{cpp_handle_type}(context, status, {common_helpers.get_parameter_for_error_generation(parameters, False)}, {session});' + elif function_data.get('exclude_from_get_last_error', False): method_call = f'return nidevice_grpc::ApiErrorToStatus(context, status);' else: method_call = f'return ConvertApiErrorStatusFor{cpp_handle_type}(context, status, {session});' diff --git a/source/custom/nidaqmx_service.custom.cpp b/source/custom/nidaqmx_service.custom.cpp index 9c495b680..cf794fe5d 100644 --- a/source/custom/nidaqmx_service.custom.cpp +++ b/source/custom/nidaqmx_service.custom.cpp @@ -10,4 +10,20 @@ ::grpc::Status NiDAQmxService::ConvertApiErrorStatusForTaskHandle(::grpc::Server return nidevice_grpc::ApiErrorAndDescriptionToStatus(context, status, description); } +::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read , TaskHandle task) +{ + // This implementation assumes this method is always called on the same thread where the error occurred. + std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); + library_->GetExtendedErrorInfo(&description[0], nidevice_grpc::kMaxGrpcErrorDescriptionSize); + return nidevice_grpc::ApiErrorAndDescriptionToStatusForReadMethod(context, status, samps_per_chan_read, description); +} + +::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written , TaskHandle task) +{ + // This implementation assumes this method is always called on the same thread where the error occurred. + std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); + library_->GetExtendedErrorInfo(&description[0], nidevice_grpc::kMaxGrpcErrorDescriptionSize); + return nidevice_grpc::ApiErrorAndDescriptionToStatusForWriteMethod(context, status, samps_per_chan_written, description); +} + } // namespace nidaqmx_grpc diff --git a/source/server/converters.h b/source/server/converters.h index 77447b770..6417e7094 100644 --- a/source/server/converters.h +++ b/source/server/converters.h @@ -409,6 +409,28 @@ inline ::grpc::Status ApiErrorAndDescriptionToStatus(TServerContext* context, in return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); } +template +inline ::grpc::Status ApiErrorAndDescriptionToStatusForReadMethod(TServerContext* context, int32_t status, int32_t samps_per_chan_read, std::string& description) +{ + context->AddTrailingMetadata("ni-error", std::to_string(status)); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)) + converters::trim_trailing_nulls(description); + std::string description_utf8; + converters::convert_to_grpc(description, &description_utf8); + return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); +} + +template +inline ::grpc::Status ApiErrorAndDescriptionToStatusForWriteMethod(TServerContext* context, int32_t status, int32_t samps_per_chan_written, std::string& description) +{ + context->AddTrailingMetadata("ni-error", std::to_string(status)); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)) + converters::trim_trailing_nulls(description); + std::string description_utf8; + converters::convert_to_grpc(description, &description_utf8); + return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); +} + template inline ::grpc::Status ApiErrorToStatus(TServerContext* context, int32_t status) { From 1c638a03b7f03c4238687b96d5189ef5c5e0a873 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Wed, 10 May 2023 15:59:01 +0530 Subject: [PATCH 02/11] feat: simplify error conversion --- source/custom/nidaqmx_service.custom.cpp | 12 ++++-------- source/server/converters.h | 22 ---------------------- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/source/custom/nidaqmx_service.custom.cpp b/source/custom/nidaqmx_service.custom.cpp index cf794fe5d..bc89ffd14 100644 --- a/source/custom/nidaqmx_service.custom.cpp +++ b/source/custom/nidaqmx_service.custom.cpp @@ -12,18 +12,14 @@ ::grpc::Status NiDAQmxService::ConvertApiErrorStatusForTaskHandle(::grpc::Server ::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read , TaskHandle task) { - // This implementation assumes this method is always called on the same thread where the error occurred. - std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); - library_->GetExtendedErrorInfo(&description[0], nidevice_grpc::kMaxGrpcErrorDescriptionSize); - return nidevice_grpc::ApiErrorAndDescriptionToStatusForReadMethod(context, status, samps_per_chan_read, description); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)) + return ConvertApiErrorStatusForTaskHandle(context, status, task); } ::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written , TaskHandle task) { - // This implementation assumes this method is always called on the same thread where the error occurred. - std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); - library_->GetExtendedErrorInfo(&description[0], nidevice_grpc::kMaxGrpcErrorDescriptionSize); - return nidevice_grpc::ApiErrorAndDescriptionToStatusForWriteMethod(context, status, samps_per_chan_written, description); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)) + return ConvertApiErrorStatusForTaskHandle(context, status, task); } } // namespace nidaqmx_grpc diff --git a/source/server/converters.h b/source/server/converters.h index 6417e7094..77447b770 100644 --- a/source/server/converters.h +++ b/source/server/converters.h @@ -409,28 +409,6 @@ inline ::grpc::Status ApiErrorAndDescriptionToStatus(TServerContext* context, in return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); } -template -inline ::grpc::Status ApiErrorAndDescriptionToStatusForReadMethod(TServerContext* context, int32_t status, int32_t samps_per_chan_read, std::string& description) -{ - context->AddTrailingMetadata("ni-error", std::to_string(status)); - context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)) - converters::trim_trailing_nulls(description); - std::string description_utf8; - converters::convert_to_grpc(description, &description_utf8); - return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); -} - -template -inline ::grpc::Status ApiErrorAndDescriptionToStatusForWriteMethod(TServerContext* context, int32_t status, int32_t samps_per_chan_written, std::string& description) -{ - context->AddTrailingMetadata("ni-error", std::to_string(status)); - context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)) - converters::trim_trailing_nulls(description); - std::string description_utf8; - converters::convert_to_grpc(description, &description_utf8); - return ::grpc::Status(grpc::StatusCode::UNKNOWN, description_utf8); -} - template inline ::grpc::Status ApiErrorToStatus(TServerContext* context, int32_t status) { From db9bc485240a4196618944cb8e6097e5420de632 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Wed, 10 May 2023 23:25:07 +0530 Subject: [PATCH 03/11] fix: add missing semicolon --- source/custom/nidaqmx_service.custom.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/custom/nidaqmx_service.custom.cpp b/source/custom/nidaqmx_service.custom.cpp index bc89ffd14..ffbe18184 100644 --- a/source/custom/nidaqmx_service.custom.cpp +++ b/source/custom/nidaqmx_service.custom.cpp @@ -12,13 +12,13 @@ ::grpc::Status NiDAQmxService::ConvertApiErrorStatusForTaskHandle(::grpc::Server ::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read , TaskHandle task) { - context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)) + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); return ConvertApiErrorStatusForTaskHandle(context, status, task); } ::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written , TaskHandle task) { - context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)) + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); return ConvertApiErrorStatusForTaskHandle(context, status, task); } From dfbb1b77c83f3f4a88e5da03ef6424759d53afe4 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 18:13:06 +0530 Subject: [PATCH 04/11] feat: simplify metadata addition --- source/codegen/common_helpers.py | 9 +- .../metadata/nidaqmx/functions_addon.py | 135 ------------------ source/codegen/metadata_validation.py | 1 - source/codegen/templates/service.h.mako | 4 - source/codegen/templates/service_helpers.mako | 11 +- source/custom/nidaqmx_service.custom.cpp | 12 -- 6 files changed, 8 insertions(+), 164 deletions(-) diff --git a/source/codegen/common_helpers.py b/source/codegen/common_helpers.py index c843c9956..e80f42217 100644 --- a/source/codegen/common_helpers.py +++ b/source/codegen/common_helpers.py @@ -1196,11 +1196,8 @@ def get_params_needing_initialization(parameters: List[dict]) -> List[dict]: return [p for p in parameters if not (is_return_value(p) or is_get_last_error_output_param(p))] -def get_parameter_for_error_generation(params, is_read_method): +def get_parameter_for_error_generation(params): for param in params: - if param["direction"] == "out": - if is_read_method and _camel_to_snake(param["name"]) in READ_ERROR_PARAMETERS: - return _camel_to_snake(param["name"]) - elif not is_read_method and _camel_to_snake(param["name"]) in WRITE_ERROR_PARAMETERS: - return _camel_to_snake(param["name"]) + if param["direction"] == "out" and "return_on_error_key" in param: + return param return None diff --git a/source/codegen/metadata/nidaqmx/functions_addon.py b/source/codegen/metadata/nidaqmx/functions_addon.py index 87c6ffba3..fcdfbf1bd 100644 --- a/source/codegen/metadata/nidaqmx/functions_addon.py +++ b/source/codegen/metadata/nidaqmx/functions_addon.py @@ -1,139 +1,4 @@ functions_override_metadata = { - 'ReadAnalogF64': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadAnalogScalarF64': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadBinaryI16': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadBinaryI32': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadBinaryU16': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadBinaryU32': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCounterF64': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCounterF64Ex': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCounterScalarF64': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadCounterScalarU32': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadCounterU32': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCounterU32Ex': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCtrFreq': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCtrFreqScalar': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadCtrTicks': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCtrTicksScalar': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadCtrTime': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadCtrTimeScalar': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadDigitalLines': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadDigitalScalarU32': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'ReadDigitalU16': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadDigitalU32': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadDigitalU8': { - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadPowerScalarF64': { - 'python_codegen_method': 'CustomCode_Read_Scalar', - }, - 'WriteAnalogF64': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteAnalogScalarF64': { - 'python_codegen_method': 'CustomCode_Write_Scalar', - }, - 'WriteBinaryI16': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteBinaryI32': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteBinaryU16': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteBinaryU32': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteCtrFreq': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteCtrFreqScalar': { - 'python_codegen_method': 'CustomCode_Write_Scalar', - }, - 'WriteCtrTicks': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteCtrTicksScalar': { - 'python_codegen_method': 'CustomCode_Write_Scalar', - }, - 'WriteCtrTime': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteCtrTimeScalar': { - 'python_codegen_method': 'CustomCode_Write_Scalar', - }, - 'WriteDigitalLines': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteDigitalScalarU32': { - 'python_codegen_method': 'CustomCode_Write_Scalar', - }, - 'WriteDigitalU16': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteDigitalU32': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'WriteDigitalU8': { - 'python_codegen_method': 'CustomCode_Write', - }, - 'ReadPowerBinaryI16':{ - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadPowerF64':{ - 'python_codegen_method': 'CustomCode_Read', - }, - 'ReadRaw':{ - 'python_codegen_method': 'CustomCode_Read', - }, - 'WriteRaw':{ - 'python_codegen_method': 'CustomCode_Write', - } } functions_validation_suppressions = { diff --git a/source/codegen/metadata_validation.py b/source/codegen/metadata_validation.py index cf101f3d4..8281cd97b 100644 --- a/source/codegen/metadata_validation.py +++ b/source/codegen/metadata_validation.py @@ -169,7 +169,6 @@ class RULES: Optional("adaptor_parameter"): dict, Optional("is_python_factory"): bool, Optional("python_description"): str, - Optional("python_codegen_method"): str, } ) diff --git a/source/codegen/templates/service.h.mako b/source/codegen/templates/service.h.mako index c482d2d1d..334302d10 100644 --- a/source/codegen/templates/service.h.mako +++ b/source/codegen/templates/service.h.mako @@ -101,10 +101,6 @@ private: cpp_handle_type = resource_handle_type[0].upper() + resource_handle_type[1:] %>\ ::grpc::Status ConvertApiErrorStatusFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, ${resource_handle_type} ${config["session_handle_parameter_name"]}); - % if config["c_function_prefix"] == "DAQmx": - ::grpc::Status ConvertApiErrorStatusWithReadParametersFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read, ${resource_handle_type} ${config["session_handle_parameter_name"]}); - ::grpc::Status ConvertApiErrorStatusWithWriteParametersFor${cpp_handle_type}(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written, ${resource_handle_type} ${config["session_handle_parameter_name"]}); - %endif % endfor % if common_helpers.has_viboolean_array_param(functions): void Copy(const std::vector& input, google::protobuf::RepeatedField* output); diff --git a/source/codegen/templates/service_helpers.mako b/source/codegen/templates/service_helpers.mako index 777894b76..0ed1f3147 100644 --- a/source/codegen/templates/service_helpers.mako +++ b/source/codegen/templates/service_helpers.mako @@ -756,7 +756,7 @@ ${set_response_values(normal_outputs, init_method)}\ config = data['config'] input_parameters = [p for p in parameters if common_helpers.is_input_parameter(p)] resource_handle_types = service_helpers.get_resource_handle_types(config) - method_type = function_data.get("python_codegen_method", None) + error_parameter = common_helpers.get_parameter_for_error_generation(parameters) %>\ <%block filter="common_helpers.indent(indent_level)">\ <% @@ -769,15 +769,14 @@ ${set_response_values(normal_outputs, init_method)}\ break cpp_handle_type = handle_type[0].upper() + handle_type[1:] method_call = "" - if method_type == "CustomCode_Read": - method_call = f'return ConvertApiErrorStatusWithReadParametersFor{cpp_handle_type}(context, status, {common_helpers.get_parameter_for_error_generation(parameters, True)}, {session});' - elif method_type == "CustomCode_Write": - method_call = f'return ConvertApiErrorStatusWithWriteParametersFor{cpp_handle_type}(context, status, {common_helpers.get_parameter_for_error_generation(parameters, False)}, {session});' - elif function_data.get('exclude_from_get_last_error', False): + if function_data.get('exclude_from_get_last_error', False): method_call = f'return nidevice_grpc::ApiErrorToStatus(context, status);' else: method_call = f'return ConvertApiErrorStatusFor{cpp_handle_type}(context, status, {session});' %>\ + %if error_parameter is not None: + context->AddTrailingMetadata("${error_parameter.get("return_on_error_key")}", std::to_string(${error_parameter.get("name")})); + %endif if (!status_ok(status)) { ${method_call} } diff --git a/source/custom/nidaqmx_service.custom.cpp b/source/custom/nidaqmx_service.custom.cpp index ffbe18184..9c495b680 100644 --- a/source/custom/nidaqmx_service.custom.cpp +++ b/source/custom/nidaqmx_service.custom.cpp @@ -10,16 +10,4 @@ ::grpc::Status NiDAQmxService::ConvertApiErrorStatusForTaskHandle(::grpc::Server return nidevice_grpc::ApiErrorAndDescriptionToStatus(context, status, description); } -::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read , TaskHandle task) -{ - context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); - return ConvertApiErrorStatusForTaskHandle(context, status, task); -} - -::grpc::Status NiDAQmxService::ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written , TaskHandle task) -{ - context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); - return ConvertApiErrorStatusForTaskHandle(context, status, task); -} - } // namespace nidaqmx_grpc From 0a9f9a08c87828d6c1506cc743e73a2d631a508a Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 18:47:44 +0530 Subject: [PATCH 05/11] feat: update the metadata for DAQmx --- source/codegen/metadata/nidaqmx/functions.py | 35 ++++++++++++++++++-- source/codegen/metadata_validation.py | 1 + 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/source/codegen/metadata/nidaqmx/functions.py b/source/codegen/metadata/nidaqmx/functions.py index 588fedd62..bdd5cee3e 100644 --- a/source/codegen/metadata/nidaqmx/functions.py +++ b/source/codegen/metadata/nidaqmx/functions.py @@ -12836,6 +12836,7 @@ 'ctypes_data_type': 'ctypes.c_uint32', 'direction': 'in', 'name': 'arraySize', + 'pointer': True, 'python_data_type': 'int', 'type': 'uInt32' } @@ -17127,6 +17128,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17271,6 +17273,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17364,6 +17367,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17458,6 +17462,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17551,6 +17556,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17633,6 +17639,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17726,6 +17733,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -17908,6 +17916,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18001,6 +18010,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18106,6 +18116,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18269,6 +18280,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18434,6 +18446,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18556,7 +18569,7 @@ 'type': 'int32' }, { - 'ctypes_data_type': 'numpy.uint8', + 'ctypes_data_type': 'numpy.bool', 'direction': 'out', 'has_explicit_buffer_size': True, 'is_list': True, @@ -18585,6 +18598,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18739,6 +18753,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18832,6 +18847,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -18925,6 +18941,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -19196,6 +19213,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -23124,6 +23142,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23277,6 +23296,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23369,6 +23389,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23462,6 +23483,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23554,6 +23576,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23655,6 +23678,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23824,6 +23848,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -23995,6 +24020,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -24137,7 +24163,7 @@ 'type': 'int32' }, { - 'ctypes_data_type': 'numpy.uint8', + 'ctypes_data_type': 'numpy.bool', 'direction': 'in', 'is_list': True, 'is_optional_in_python': False, @@ -24155,6 +24181,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -24308,6 +24335,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -24400,6 +24428,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -24492,6 +24521,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { @@ -24571,6 +24601,7 @@ 'python_data_type': 'int', 'python_description': '', 'python_type_annotation': 'int', + 'return_on_error_key': 'ni-samps-per-chan-written', 'type': 'int32' }, { diff --git a/source/codegen/metadata_validation.py b/source/codegen/metadata_validation.py index b35341f8f..64174450f 100644 --- a/source/codegen/metadata_validation.py +++ b/source/codegen/metadata_validation.py @@ -123,6 +123,7 @@ class RULES: Optional("python_description"): str, Optional("python_default_value"): Or(str, bool, int, float, None), Optional("is_grpc_enum"): bool, + Optional("return_on_error_key"): str, } ) From 533d9aead549ff640bbfc6a005b401925bbe8a98 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 19:03:01 +0530 Subject: [PATCH 06/11] fix: case conversion --- source/codegen/templates/service_helpers.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/codegen/templates/service_helpers.mako b/source/codegen/templates/service_helpers.mako index 0ed1f3147..32aed7064 100644 --- a/source/codegen/templates/service_helpers.mako +++ b/source/codegen/templates/service_helpers.mako @@ -775,7 +775,7 @@ ${set_response_values(normal_outputs, init_method)}\ method_call = f'return ConvertApiErrorStatusFor{cpp_handle_type}(context, status, {session});' %>\ %if error_parameter is not None: - context->AddTrailingMetadata("${error_parameter.get("return_on_error_key")}", std::to_string(${error_parameter.get("name")})); + context->AddTrailingMetadata("${error_parameter.get["return_on_error_key"]}", std::to_string(${common_helpers._camel_to_snake(error_parameter["name"])})); %endif if (!status_ok(status)) { ${method_call} From f516d793e92ff2c3e2d800ffa6473e8df375c6c6 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 19:27:59 +0530 Subject: [PATCH 07/11] fix: snake conversion --- source/codegen/templates/service_helpers.mako | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/codegen/templates/service_helpers.mako b/source/codegen/templates/service_helpers.mako index 32aed7064..1699852e1 100644 --- a/source/codegen/templates/service_helpers.mako +++ b/source/codegen/templates/service_helpers.mako @@ -775,7 +775,7 @@ ${set_response_values(normal_outputs, init_method)}\ method_call = f'return ConvertApiErrorStatusFor{cpp_handle_type}(context, status, {session});' %>\ %if error_parameter is not None: - context->AddTrailingMetadata("${error_parameter.get["return_on_error_key"]}", std::to_string(${common_helpers._camel_to_snake(error_parameter["name"])})); + context->AddTrailingMetadata("${error_parameter["return_on_error_key"]}", std::to_string(${common_helpers.pascal_to_snake(error_parameter["name"])})); %endif if (!status_ok(status)) { ${method_call} From 98395e5594fee8a436fbc2b7d4033bc8f4f26007 Mon Sep 17 00:00:00 2001 From: Sam Chrisvin <104556074+samchris007@users.noreply.github.com> Date: Fri, 12 May 2023 20:09:12 +0530 Subject: [PATCH 08/11] Generate service files using functions.py --- generated/nidaqmx/nidaqmx_service.cpp | 96 +++++++++++++------- generated/nidaqmx/nidaqmx_service.h | 2 - source/codegen/metadata/nidaqmx/functions.py | 2 + 3 files changed, 66 insertions(+), 34 deletions(-) diff --git a/generated/nidaqmx/nidaqmx_service.cpp b/generated/nidaqmx/nidaqmx_service.cpp index 841c36fb7..7fc0b4d57 100644 --- a/generated/nidaqmx/nidaqmx_service.cpp +++ b/generated/nidaqmx/nidaqmx_service.cpp @@ -12931,8 +12931,9 @@ namespace nidaqmx_grpc { float64* read_array = response->mutable_read_array()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadAnalogF64(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13002,8 +13003,9 @@ namespace nidaqmx_grpc { std::vector read_array(array_size_in_samps); int32 samps_per_chan_read {}; auto status = library_->ReadBinaryI16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13057,8 +13059,9 @@ namespace nidaqmx_grpc { int32* read_array = reinterpret_cast(response->mutable_read_array()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadBinaryI32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13102,8 +13105,9 @@ namespace nidaqmx_grpc { std::vector read_array(array_size_in_samps); int32 samps_per_chan_read {}; auto status = library_->ReadBinaryU16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13157,8 +13161,9 @@ namespace nidaqmx_grpc { uInt32* read_array = reinterpret_cast(response->mutable_read_array()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadBinaryU32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13187,8 +13192,9 @@ namespace nidaqmx_grpc { float64* read_array = response->mutable_read_array()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadCounterF64(task, num_samps_per_chan, timeout, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13233,8 +13239,9 @@ namespace nidaqmx_grpc { float64* read_array = response->mutable_read_array()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadCounterF64Ex(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13315,8 +13322,9 @@ namespace nidaqmx_grpc { uInt32* read_array = reinterpret_cast(response->mutable_read_array()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadCounterU32(task, num_samps_per_chan, timeout, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13361,8 +13369,9 @@ namespace nidaqmx_grpc { uInt32* read_array = reinterpret_cast(response->mutable_read_array()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadCounterU32Ex(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13409,8 +13418,9 @@ namespace nidaqmx_grpc { float64* read_array_duty_cycle = response->mutable_read_array_duty_cycle()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadCtrFreq(task, num_samps_per_chan, timeout, interleaved, read_array_frequency, read_array_duty_cycle, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13485,8 +13495,9 @@ namespace nidaqmx_grpc { uInt32* read_array_low_ticks = reinterpret_cast(response->mutable_read_array_low_ticks()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadCtrTicks(task, num_samps_per_chan, timeout, interleaved, read_array_high_ticks, read_array_low_ticks, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13561,8 +13572,9 @@ namespace nidaqmx_grpc { float64* read_array_low_time = response->mutable_read_array_low_time()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadCtrTime(task, num_samps_per_chan, timeout, interleaved, read_array_high_time, read_array_low_time, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13635,8 +13647,9 @@ namespace nidaqmx_grpc { int32 samps_per_chan_read {}; int32 num_bytes_per_samp {}; auto status = library_->ReadDigitalLines(task, num_samps_per_chan, timeout, fill_mode, (uInt8*)read_array.data(), array_size_in_bytes, &samps_per_chan_read, &num_bytes_per_samp, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_read_array(read_array); @@ -13708,8 +13721,9 @@ namespace nidaqmx_grpc { std::vector read_array(array_size_in_samps); int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU16(task, num_samps_per_chan, timeout, fill_mode, read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->mutable_read_array()->Clear(); @@ -13763,8 +13777,9 @@ namespace nidaqmx_grpc { uInt32* read_array = reinterpret_cast(response->mutable_read_array()->mutable_data()); int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU32(task, num_samps_per_chan, timeout, fill_mode, read_array, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13808,8 +13823,9 @@ namespace nidaqmx_grpc { std::string read_array(array_size_in_samps, '\0'); int32 samps_per_chan_read {}; auto status = library_->ReadDigitalU8(task, num_samps_per_chan, timeout, fill_mode, (uInt8*)read_array.data(), array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_read_array(read_array); @@ -13855,8 +13871,9 @@ namespace nidaqmx_grpc { std::vector read_array_current(array_size_in_samps); int32 samps_per_chan_read {}; auto status = library_->ReadPowerBinaryI16(task, num_samps_per_chan, timeout, fill_mode, read_array_voltage.data(), read_array_current.data(), array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->mutable_read_array_voltage()->Clear(); @@ -13921,8 +13938,9 @@ namespace nidaqmx_grpc { float64* read_array_current = response->mutable_read_array_current()->mutable_data(); int32 samps_per_chan_read {}; auto status = library_->ReadPowerF64(task, num_samps_per_chan, timeout, fill_mode, read_array_voltage, read_array_current, array_size_in_samps, &samps_per_chan_read, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_per_chan_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_per_chan_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_read(samps_per_chan_read); @@ -13979,8 +13997,9 @@ namespace nidaqmx_grpc { int32 samps_read {}; int32 num_bytes_per_samp {}; auto status = library_->ReadRaw(task, num_samps_per_chan, timeout, (uInt8*)read_array.data(), array_size_in_bytes, &samps_read, &num_bytes_per_samp, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-read", std::to_string(samps_read)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithReadParametersForTaskHandle(context, status, samps_read, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_read_array(read_array); @@ -18247,8 +18266,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteAnalogF64(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18335,8 +18355,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteBinaryI16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18380,8 +18401,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteBinaryI32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18442,8 +18464,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteBinaryU16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18487,8 +18510,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteBinaryU32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18533,8 +18557,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrFreq(task, num_samps_per_chan, auto_start, timeout, data_layout, frequency, duty_cycle, &num_samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(num_samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18606,8 +18631,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrTicks(task, num_samps_per_chan, auto_start, timeout, data_layout, high_ticks, low_ticks, &num_samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(num_samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18679,8 +18705,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 num_samps_per_chan_written {}; auto status = library_->WriteCtrTime(task, num_samps_per_chan, auto_start, timeout, data_layout, high_time, low_time, &num_samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(num_samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, num_samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_num_samps_per_chan_written(num_samps_per_chan_written); @@ -18751,8 +18778,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteDigitalLines(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18839,8 +18867,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU16(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array.data(), &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18884,8 +18913,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU32(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18929,8 +18959,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteDigitalU8(task, num_samps_per_chan, auto_start, timeout, data_layout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); @@ -18958,8 +18989,9 @@ namespace nidaqmx_grpc { auto reserved = nullptr; int32 samps_per_chan_written {}; auto status = library_->WriteRaw(task, num_samps, auto_start, timeout, write_array, &samps_per_chan_written, reserved); + context->AddTrailingMetadata("ni-samps-per-chan-written", std::to_string(samps_per_chan_written)); if (!status_ok(status)) { - return ConvertApiErrorStatusWithWriteParametersForTaskHandle(context, status, samps_per_chan_written, task); + return ConvertApiErrorStatusForTaskHandle(context, status, task); } response->set_status(status); response->set_samps_per_chan_written(samps_per_chan_written); diff --git a/generated/nidaqmx/nidaqmx_service.h b/generated/nidaqmx/nidaqmx_service.h index ebb108250..ead109926 100644 --- a/generated/nidaqmx/nidaqmx_service.h +++ b/generated/nidaqmx/nidaqmx_service.h @@ -435,8 +435,6 @@ class NiDAQmxService final : public NiDAQmx::WithCallbackMethod_RegisterSignalEv NiDAQmxLibraryInterface* library_; ResourceRepositorySharedPtr session_repository_; ::grpc::Status ConvertApiErrorStatusForTaskHandle(::grpc::ServerContext* context, int32_t status, TaskHandle task); - ::grpc::Status ConvertApiErrorStatusWithReadParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_read, TaskHandle task); - ::grpc::Status ConvertApiErrorStatusWithWriteParametersForTaskHandle(::grpc::ServerContext* context, int32_t status, int32_t samps_per_chan_written, TaskHandle task); NiDAQmxFeatureToggles feature_toggles_; }; diff --git a/source/codegen/metadata/nidaqmx/functions.py b/source/codegen/metadata/nidaqmx/functions.py index bdd5cee3e..d34ab8206 100644 --- a/source/codegen/metadata/nidaqmx/functions.py +++ b/source/codegen/metadata/nidaqmx/functions.py @@ -19013,6 +19013,7 @@ { 'direction': 'out', 'name': 'sampsPerChanRead', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { @@ -19077,6 +19078,7 @@ { 'direction': 'out', 'name': 'sampsPerChanRead', + 'return_on_error_key': 'ni-samps-per-chan-read', 'type': 'int32' }, { From 807d873d09f77354b424fceecddc3073473267b9 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 20:13:20 +0530 Subject: [PATCH 09/11] fix: remove unnecessary changes --- source/codegen/common_helpers.py | 9 --------- source/codegen/metadata/nidaqmx/__init__.py | 12 ++---------- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/source/codegen/common_helpers.py b/source/codegen/common_helpers.py index e80f42217..8163063f6 100644 --- a/source/codegen/common_helpers.py +++ b/source/codegen/common_helpers.py @@ -22,15 +22,6 @@ PascalTokenSubstitution("Uint", "UInt") ] -READ_ERROR_PARAMETERS = [ - "samps_read", "samps_per_chan_read" -] - -WRITE_ERROR_PARAMETERS = [ - "samps_per_chan_written", "num_samps_per_chan", "num_samps_per_chan_written" -] - - def is_output_parameter(parameter): """Whether the parameter is an output parameter.""" return "out" in parameter["direction"] diff --git a/source/codegen/metadata/nidaqmx/__init__.py b/source/codegen/metadata/nidaqmx/__init__.py index ac4bb1e33..e79f8aacd 100644 --- a/source/codegen/metadata/nidaqmx/__init__.py +++ b/source/codegen/metadata/nidaqmx/__init__.py @@ -1,20 +1,12 @@ from .functions import functions -from .functions_addon import functions_validation_suppressions, functions_override_metadata +from .functions_addon import functions_validation_suppressions from .attributes import attributes from .enums import enums from .enums_addon import enums_validation_suppressions from .config import config -copy_functions = functions.copy() -def update_functions(): - for function_name, function_data in functions_override_metadata.items(): - copy_functions[function_name] = {**copy_functions[function_name], **functions_override_metadata[function_name]} - return copy_functions - -all_functions = update_functions() - metadata = { - "functions" : all_functions, + "functions" : functions, "functions_validation_suppressions": functions_validation_suppressions, "attributes" : attributes, "enums" : enums, From aa62f49bd0afa6e78d12c7b31cbb8ff33c2dc476 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Fri, 12 May 2023 20:13:57 +0530 Subject: [PATCH 10/11] fix: alignment --- source/codegen/common_helpers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/source/codegen/common_helpers.py b/source/codegen/common_helpers.py index 8163063f6..b41062143 100644 --- a/source/codegen/common_helpers.py +++ b/source/codegen/common_helpers.py @@ -22,6 +22,7 @@ PascalTokenSubstitution("Uint", "UInt") ] + def is_output_parameter(parameter): """Whether the parameter is an output parameter.""" return "out" in parameter["direction"] From a380b7396df645d6e18a47a8076a1487f3535c51 Mon Sep 17 00:00:00 2001 From: Sakthi Subramanian Muthuramalingam Date: Mon, 15 May 2023 14:59:44 +0530 Subject: [PATCH 11/11] fix: simplify helper method --- source/codegen/common_helpers.py | 7 ------- source/codegen/templates/service_helpers.mako | 6 +++--- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/source/codegen/common_helpers.py b/source/codegen/common_helpers.py index b41062143..38185e382 100644 --- a/source/codegen/common_helpers.py +++ b/source/codegen/common_helpers.py @@ -1186,10 +1186,3 @@ def get_params_needing_initialization(parameters: List[dict]) -> List[dict]: * Outputs that are calculated/populated after the API call. """ return [p for p in parameters if not (is_return_value(p) or is_get_last_error_output_param(p))] - - -def get_parameter_for_error_generation(params): - for param in params: - if param["direction"] == "out" and "return_on_error_key" in param: - return param - return None diff --git a/source/codegen/templates/service_helpers.mako b/source/codegen/templates/service_helpers.mako index 1699852e1..fbf680699 100644 --- a/source/codegen/templates/service_helpers.mako +++ b/source/codegen/templates/service_helpers.mako @@ -756,7 +756,7 @@ ${set_response_values(normal_outputs, init_method)}\ config = data['config'] input_parameters = [p for p in parameters if common_helpers.is_input_parameter(p)] resource_handle_types = service_helpers.get_resource_handle_types(config) - error_parameter = common_helpers.get_parameter_for_error_generation(parameters) + error_parameters = [p for p in parameters if common_helpers.is_output_parameter(p) and "return_on_error_key" in p] %>\ <%block filter="common_helpers.indent(indent_level)">\ <% @@ -774,9 +774,9 @@ ${set_response_values(normal_outputs, init_method)}\ else: method_call = f'return ConvertApiErrorStatusFor{cpp_handle_type}(context, status, {session});' %>\ - %if error_parameter is not None: + %for error_parameter in error_parameters: context->AddTrailingMetadata("${error_parameter["return_on_error_key"]}", std::to_string(${common_helpers.pascal_to_snake(error_parameter["name"])})); - %endif + %endfor if (!status_ok(status)) { ${method_call} }