diff --git a/generated/nirfmxspecan/nirfmxspecan_compilation_test.cpp b/generated/nirfmxspecan/nirfmxspecan_compilation_test.cpp index 536688deb..cef22e595 100644 --- a/generated/nirfmxspecan/nirfmxspecan_compilation_test.cpp +++ b/generated/nirfmxspecan/nirfmxspecan_compilation_test.cpp @@ -704,7 +704,7 @@ int32 DPDCfgApplyDPDUserLookupTable(niRFmxInstrHandle instrumentHandle, char sel int32 DPDCfgApplyDPDUserLookupTableInterleavedIQ(niRFmxInstrHandle instrumentHandle, char selectorString[], float32 lutInputPowers[], float32 lutComplexGains[], int32 arraySize) { - return RFmxSpecAn_DPDCfgApplyDPDUserLookupTable(instrumentHandle, selectorString, lutInputPowers, reinterpret_cast(lutComplexGains), arraySize/2); + return RFmxSpecAn_DPDCfgApplyDPDUserLookupTable(instrumentHandle, selectorString, lutInputPowers, reinterpret_cast(lutComplexGains), arraySize); } int32 DPDCfgApplyDPDUserLookupTableSplit(niRFmxInstrHandle instrumentHandle, char selectorString[], float32 lutInputPowers[], float32 lutComplexGainsI[], float32 lutComplexGainsQ[], int32 arraySize) diff --git a/generated/nirfmxspecan/nirfmxspecan_library.cpp b/generated/nirfmxspecan/nirfmxspecan_library.cpp index 29d8a8cca..da7db0a7a 100644 --- a/generated/nirfmxspecan/nirfmxspecan_library.cpp +++ b/generated/nirfmxspecan/nirfmxspecan_library.cpp @@ -1648,7 +1648,7 @@ int32 NiRFmxSpecAnLibrary::DPDCfgApplyDPDUserLookupTableInterleavedIQ(niRFmxInst if (!function_pointers_.DPDCfgApplyDPDUserLookupTableInterleavedIQ) { throw nidevice_grpc::LibraryLoadException("Could not find RFmxSpecAn_DPDCfgApplyDPDUserLookupTable."); } - return function_pointers_.DPDCfgApplyDPDUserLookupTableInterleavedIQ(instrumentHandle, selectorString, lutInputPowers, reinterpret_cast(lutComplexGains), arraySize/2); + return function_pointers_.DPDCfgApplyDPDUserLookupTableInterleavedIQ(instrumentHandle, selectorString, lutInputPowers, reinterpret_cast(lutComplexGains), arraySize); } int32 NiRFmxSpecAnLibrary::DPDCfgApplyDPDUserLookupTableSplit(niRFmxInstrHandle instrumentHandle, char selectorString[], float32 lutInputPowers[], float32 lutComplexGainsI[], float32 lutComplexGainsQ[], int32 arraySize) diff --git a/generated/nirfmxspecan/nirfmxspecan_service.cpp b/generated/nirfmxspecan/nirfmxspecan_service.cpp index 186b39845..2417c2ec5 100644 --- a/generated/nirfmxspecan/nirfmxspecan_service.cpp +++ b/generated/nirfmxspecan/nirfmxspecan_service.cpp @@ -5622,49 +5622,6 @@ namespace nirfmxspecan_grpc { } } - //--------------------------------------------------------------------- - //--------------------------------------------------------------------- - ::grpc::Status NiRFmxSpecAnService::DPDCfgApplyDPDUserLookupTableInterleavedIQ(::grpc::ServerContext* context, const DPDCfgApplyDPDUserLookupTableInterleavedIQRequest* request, DPDCfgApplyDPDUserLookupTableInterleavedIQResponse* response) - { - if (context->IsCancelled()) { - return ::grpc::Status::CANCELLED; - } - try { - auto instrument_grpc_session = request->instrument(); - niRFmxInstrHandle instrument = session_repository_->access_session(instrument_grpc_session.name()); - auto selector_string_mbcs = convert_from_grpc(request->selector_string()); - char* selector_string = (char*)selector_string_mbcs.c_str(); - auto lut_input_powers = const_cast(request->lut_input_powers().data()); - auto lut_complex_gains = const_cast(request->lut_complex_gains().data()); - auto array_size_determine_from_sizes = std::array - { - request->lut_input_powers_size(), - request->lut_complex_gains_size() - }; - const auto array_size_size_calculation = calculate_linked_array_size(array_size_determine_from_sizes, true); - - if (array_size_size_calculation.match_state == MatchState::MISMATCH) { - return ::grpc::Status(::grpc::INVALID_ARGUMENT, "The sizes of linked repeated fields [lut_input_powers, lut_complex_gains] do not match"); - } - // NULL out optional params with zero sizes. - if (array_size_size_calculation.match_state == MatchState::MATCH_OR_ZERO) { - lut_input_powers = request->lut_input_powers_size() ? std::move(lut_input_powers) : nullptr; - lut_complex_gains = request->lut_complex_gains_size() ? std::move(lut_complex_gains) : nullptr; - } - auto array_size = array_size_size_calculation.size; - - auto status = library_->DPDCfgApplyDPDUserLookupTableInterleavedIQ(instrument, selector_string, lut_input_powers, lut_complex_gains, array_size); - if (!status_ok(status)) { - return ConvertApiErrorStatusForNiRFmxInstrHandle(context, status, instrument); - } - response->set_status(status); - return ::grpc::Status::OK; - } - catch (nidevice_grpc::NonDriverException& ex) { - return ex.GetStatus(); - } - } - //--------------------------------------------------------------------- //--------------------------------------------------------------------- ::grpc::Status NiRFmxSpecAnService::DPDCfgApplyDPDUserLookupTableSplit(::grpc::ServerContext* context, const DPDCfgApplyDPDUserLookupTableSplitRequest* request, DPDCfgApplyDPDUserLookupTableSplitResponse* response) diff --git a/source/codegen/metadata/nirfmxspecan/functions_addon.py b/source/codegen/metadata/nirfmxspecan/functions_addon.py index 2120c22de..68071566a 100644 --- a/source/codegen/metadata/nirfmxspecan/functions_addon.py +++ b/source/codegen/metadata/nirfmxspecan/functions_addon.py @@ -55,4 +55,53 @@ ], 'returns': 'int32' }, + 'DPDCfgApplyDPDUserLookupTableInterleavedIQ': { + 'cname': 'RFmxSpecAn_DPDCfgApplyDPDUserLookupTable', + 'codegen_method': 'CustomCode', + 'parameters': [ + { + 'direction': 'in', + 'grpc_name': 'instrument', + 'name': 'instrumentHandle', + 'type': 'niRFmxInstrHandle' + }, + { + 'direction': 'in', + 'name': 'selectorString', + 'type': 'char[]' + }, + { + 'direction': 'in', + 'name': 'lutInputPowers', + 'size': { + 'mechanism': 'custom-code', + 'tags': [ + 'optional' + ], + 'value': 'arraySize' + }, + 'type': 'float32[]' + }, + { + 'direction': 'in', + 'name': 'lutComplexGains', + 'size': { + 'mechanism': 'custom-code', + 'tags': [ + 'optional' + ], + 'value': 'arraySize' + }, + 'type': 'float32[]', + 'value_converted_to_c_representation': 'reinterpret_cast(lutComplexGains)' + }, + { + 'direction': 'in', + 'include_in_proto': False, + 'name': 'arraySize', + 'type': 'int32', + } + ], + 'returns': 'int32' + }, } diff --git a/source/custom/nirfmxspecan_service.custom.cpp b/source/custom/nirfmxspecan_service.custom.cpp index 5a77700f7..f7b69c690 100644 --- a/source/custom/nirfmxspecan_service.custom.cpp +++ b/source/custom/nirfmxspecan_service.custom.cpp @@ -1,18 +1,66 @@ #include +using nidevice_grpc::converters::convert_to_grpc; +using nidevice_grpc::converters::convert_from_grpc; +using nidevice_grpc::converters::calculate_linked_array_size; +using nidevice_grpc::converters::MatchState; namespace nirfmxspecan_grpc { -::grpc::Status NiRFmxSpecAnService::ConvertApiErrorStatusForNiRFmxInstrHandle(::grpc::ServerContextBase* context, int32_t status, niRFmxInstrHandle instrumentHandle) -{ - ViStatus error_code{}; - std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); - // Try first to get the most recent error with a dynamic message. - library_->GetError(instrumentHandle, &error_code, nidevice_grpc::kMaxGrpcErrorDescriptionSize, &description[0]); - if (error_code != status) { - // Since another thread has changed the status, fall back to the static message lookup. - library_->GetErrorString(instrumentHandle, status, nidevice_grpc::kMaxGrpcErrorDescriptionSize, &description[0]); + // Returns true if it's safe to use outputs of a method with the given status. + inline bool status_ok(int32 status) + { + return status >= 0; + } + + ::grpc::Status NiRFmxSpecAnService::ConvertApiErrorStatusForNiRFmxInstrHandle(::grpc::ServerContextBase* context, int32_t status, niRFmxInstrHandle instrumentHandle) + { + ViStatus error_code{}; + std::string description(nidevice_grpc::kMaxGrpcErrorDescriptionSize, '\0'); + // Try first to get the most recent error with a dynamic message. + library_->GetError(instrumentHandle, &error_code, nidevice_grpc::kMaxGrpcErrorDescriptionSize, &description[0]); + if (error_code != status) { + // Since another thread has changed the status, fall back to the static message lookup. + library_->GetErrorString(instrumentHandle, status, nidevice_grpc::kMaxGrpcErrorDescriptionSize, &description[0]); + } + return nidevice_grpc::ApiErrorAndDescriptionToStatus(context, status, description); + } + + //--------------------------------------------------------------------- + //--------------------------------------------------------------------- + ::grpc::Status NiRFmxSpecAnService::DPDCfgApplyDPDUserLookupTableInterleavedIQ(::grpc::ServerContext*context, const DPDCfgApplyDPDUserLookupTableInterleavedIQRequest* request, DPDCfgApplyDPDUserLookupTableInterleavedIQResponse* response) + { + if (context->IsCancelled()) { + return ::grpc::Status::CANCELLED; + } + try { + auto instrument_grpc_session = request->instrument(); + niRFmxInstrHandle instrument = session_repository_->access_session(instrument_grpc_session.name()); + auto selector_string_mbcs = convert_from_grpc(request->selector_string()); + char* selector_string = (char*)selector_string_mbcs.c_str(); + auto lut_input_powers = const_cast(request->lut_input_powers().data()); + auto lut_complex_gains = const_cast(request->lut_complex_gains().data()); + auto array_size = 0; + if (request->lut_input_powers_size()) { + array_size = request->lut_input_powers_size() * 2; + if (request->lut_complex_gains_size()) { + if (request->lut_complex_gains_size() != array_size) { + return ::grpc::Status(::grpc::INVALID_ARGUMENT, "lut_complex_gains size must be twice the size of lut_input_powers."); + } + } + } + else if (request->lut_complex_gains_size()) { + array_size = request->lut_complex_gains_size(); + } + auto status = library_->DPDCfgApplyDPDUserLookupTableInterleavedIQ(instrument, selector_string, lut_input_powers, lut_complex_gains, array_size); + if (!status_ok(status)) { + return ConvertApiErrorStatusForNiRFmxInstrHandle(context, status, instrument); + } + response->set_status(status); + return ::grpc::Status::OK; + } + catch (nidevice_grpc::NonDriverException& ex) { + return ex.GetStatus(); + } } - return nidevice_grpc::ApiErrorAndDescriptionToStatus(context, status, description); -} } // namespace nirfmxspecan_grpc