diff --git a/CHANGELOG.md b/CHANGELOG.md index 24b51fb89..ec708faa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,8 @@ All notable changes to this project will be documented in this file. * #### Removed * ### `nidigital` (NI-Digital Pattern Driver) * #### Added + * Methods Added: + * `enable_match_fail_combination` * #### Changed * #### Removed * ### `nidmm` (NI-DMM) diff --git a/build/templates/tox-system_tests.ini.mako b/build/templates/tox-system_tests.ini.mako index cd3f27d5a..07c97bd6f 100644 --- a/build/templates/tox-system_tests.ini.mako +++ b/build/templates/tox-system_tests.ini.mako @@ -73,6 +73,9 @@ deps = % if uses_other_wheel: ${wheel_env_no_py}: build +% endif +% if module_name == 'nidigital': + ${module_name}-system_tests: nisync % endif ${module_name}-system_tests: pytest ${module_name}-system_tests: coverage diff --git a/docs/nidigital/class.rst b/docs/nidigital/class.rst index e7738482e..757baeb72 100644 --- a/docs/nidigital/class.rst +++ b/docs/nidigital/class.rst @@ -1326,6 +1326,19 @@ disable_sites Example: :py:meth:`my_session.disable_sites` +enable_match_fail_combination +----------------------------- + + .. py:currentmodule:: nidigital.Session + + .. py:method:: enable_match_fail_combination() + + Configures digital pattern instruments and the PXIe-6674T timing and synchronization instrument to combine pattern comparison results and control subsequent pattern execution across digital pattern instruments based on those results. You must initialize the PXIe-6674T using NI-Sync and call this method from a multi-instrument session. + + + + + enable_sites ------------ diff --git a/generated/nidigital/nidigital/_library.py b/generated/nidigital/nidigital/_library.py index f37419372..1f1d78ed1 100644 --- a/generated/nidigital/nidigital/_library.py +++ b/generated/nidigital/nidigital/_library.py @@ -49,6 +49,7 @@ def __init__(self, ctypes_library): self.niDigital_CreateTimeSet_cfunc = None self.niDigital_DeleteAllTimeSets_cfunc = None self.niDigital_DisableSites_cfunc = None + self.niDigital_EnableMatchFailCombination_cfunc = None self.niDigital_EnableSites_cfunc = None self.niDigital_FetchCaptureWaveformU32_cfunc = None self.niDigital_FetchHistoryRAMCycleInformation_cfunc = None @@ -346,6 +347,14 @@ def niDigital_DisableSites(self, vi, site_list): # noqa: N802 self.niDigital_DisableSites_cfunc.restype = ViStatus # noqa: F405 return self.niDigital_DisableSites_cfunc(vi, site_list) + def niDigital_EnableMatchFailCombination(self, session_count, sessions, sync_session): # noqa: N802 + with self._func_lock: + if self.niDigital_EnableMatchFailCombination_cfunc is None: + self.niDigital_EnableMatchFailCombination_cfunc = self._get_library_function('niDigital_EnableMatchFailCombination') + self.niDigital_EnableMatchFailCombination_cfunc.argtypes = [ViUInt32, ctypes.POINTER(ViSession), ViSession] # noqa: F405 + self.niDigital_EnableMatchFailCombination_cfunc.restype = ViStatus # noqa: F405 + return self.niDigital_EnableMatchFailCombination_cfunc(session_count, sessions, sync_session) + def niDigital_EnableSites(self, vi, site_list): # noqa: N802 with self._func_lock: if self.niDigital_EnableSites_cfunc is None: diff --git a/generated/nidigital/nidigital/_library_interpreter.py b/generated/nidigital/nidigital/_library_interpreter.py index 9d85229bf..e830756ab 100644 --- a/generated/nidigital/nidigital/_library_interpreter.py +++ b/generated/nidigital/nidigital/_library_interpreter.py @@ -366,6 +366,14 @@ def disable_sites(self, site_list): # noqa: N802 errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) return + def enable_match_fail_combination(self, sessions, sync_session): # noqa: N802 + session_count_ctype = _visatype.ViUInt32(0 if sessions is None else len(sessions)) # case S160 + sessions_ctype = _get_ctypes_pointer_for_buffer(value=sessions, library_type=_visatype.ViSession) # case B550 + sync_session_ctype = _visatype.ViSession(sync_session) # case S110 + error_code = self._library.niDigital_EnableMatchFailCombination(session_count_ctype, sessions_ctype, sync_session_ctype) + errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) + return + def enable_sites(self, site_list): # noqa: N802 vi_ctype = _visatype.ViSession(self._vi) # case S110 site_list_ctype = ctypes.create_string_buffer(site_list.encode(self._encoding)) # case C010 diff --git a/generated/nidigital/nidigital/session.py b/generated/nidigital/nidigital/session.py index 8a5d2edfc..3678e5dc3 100644 --- a/generated/nidigital/nidigital/session.py +++ b/generated/nidigital/nidigital/session.py @@ -3429,6 +3429,14 @@ def delete_all_time_sets(self): ''' self._interpreter.delete_all_time_sets() + @ivi_synchronized + def enable_match_fail_combination(self, sync_session): + '''enable_match_fail_combination + + Configures digital pattern instruments and the PXIe-6674T timing and synchronization instrument to combine pattern comparison results and control subsequent pattern execution across digital pattern instruments based on those results. You must initialize the PXIe-6674T using NI-Sync and call this method from a multi-instrument session. + ''' + self._interpreter.enable_match_fail_combination([self._interpreter.get_session_handle()], sync_session.session_handle) + @ivi_synchronized def load_specifications_levels_and_timing(self, specifications_file_paths=None, levels_file_paths=None, timing_file_paths=None): '''load_specifications_levels_and_timing diff --git a/generated/nidigital/nidigital/unit_tests/_mock_helper.py b/generated/nidigital/nidigital/unit_tests/_mock_helper.py index 8f2e25132..5a5e111dc 100644 --- a/generated/nidigital/nidigital/unit_tests/_mock_helper.py +++ b/generated/nidigital/nidigital/unit_tests/_mock_helper.py @@ -72,6 +72,8 @@ def __init__(self): self._defaults['DeleteAllTimeSets']['return'] = 0 self._defaults['DisableSites'] = {} self._defaults['DisableSites']['return'] = 0 + self._defaults['EnableMatchFailCombination'] = {} + self._defaults['EnableMatchFailCombination']['return'] = 0 self._defaults['EnableSites'] = {} self._defaults['EnableSites']['return'] = 0 self._defaults['FetchCaptureWaveformU32'] = {} @@ -407,6 +409,11 @@ def niDigital_DisableSites(self, vi, site_list): # noqa: N802 return self._defaults['DisableSites']['return'] return self._defaults['DisableSites']['return'] + def niDigital_EnableMatchFailCombination(self, session_count, sessions, sync_session): # noqa: N802 + if self._defaults['EnableMatchFailCombination']['return'] != 0: + return self._defaults['EnableMatchFailCombination']['return'] + return self._defaults['EnableMatchFailCombination']['return'] + def niDigital_EnableSites(self, vi, site_list): # noqa: N802 if self._defaults['EnableSites']['return'] != 0: return self._defaults['EnableSites']['return'] @@ -1179,6 +1186,8 @@ def set_side_effects_and_return_values(self, mock_library): mock_library.niDigital_DeleteAllTimeSets.return_value = 0 mock_library.niDigital_DisableSites.side_effect = MockFunctionCallError("niDigital_DisableSites") mock_library.niDigital_DisableSites.return_value = 0 + mock_library.niDigital_EnableMatchFailCombination.side_effect = MockFunctionCallError("niDigital_EnableMatchFailCombination") + mock_library.niDigital_EnableMatchFailCombination.return_value = 0 mock_library.niDigital_EnableSites.side_effect = MockFunctionCallError("niDigital_EnableSites") mock_library.niDigital_EnableSites.return_value = 0 mock_library.niDigital_FetchCaptureWaveformU32.side_effect = MockFunctionCallError("niDigital_FetchCaptureWaveformU32") diff --git a/generated/nidigital/tox-system_tests.ini b/generated/nidigital/tox-system_tests.ini index 4bcef3a22..8c3ee95c4 100644 --- a/generated/nidigital/tox-system_tests.ini +++ b/generated/nidigital/tox-system_tests.ini @@ -39,6 +39,7 @@ commands = deps = nidigital-wheel_dep: build + nidigital-system_tests: nisync nidigital-system_tests: pytest nidigital-system_tests: coverage nidigital-system_tests: numpy diff --git a/src/nidigital/metadata/functions_addon.py b/src/nidigital/metadata/functions_addon.py index f738d04a5..ef43e2fab 100644 --- a/src/nidigital/metadata/functions_addon.py +++ b/src/nidigital/metadata/functions_addon.py @@ -535,3 +535,84 @@ ], }, } + +functions_additional_enable_match_fail_combination = { + 'EnableMatchFailCombination': { + 'codegen_method': 'yes', + 'method_templates': [ + { + 'documentation_filename': 'default_method', + 'library_interpreter_filename': 'enable_match_fail_combination', + 'method_python_name_suffix': '', + 'session_filename': 'none', + } + ], + 'documentation': { + 'description': 'Configures digital pattern instruments and the PXIe-6674T timing and synchronization instrument to combine pattern comparison results and control subsequent pattern execution across digital pattern instruments based on those results. You must initialize the PXIe-6674T using NI-Sync and use the niTClk Synchronize function to synchronize instruments before calling the niDigital_EnableMatchFailCombination function.\n' + }, + 'included_in_proto': False, + 'parameters': [ + { + 'direction': 'in', + 'documentation': { + 'description': 'Number of sessions.\n' + }, + 'name': 'sessionCount', + 'type': 'ViUInt32' + }, + { + 'direction': 'in', + 'documentation': { + 'description': 'The specified array of sessions synchronized using NI-TClk.\n' + }, + 'name': 'sessions', + 'size': { + 'mechanism': 'passed-in', + 'value': 'sessionCount' + }, + 'type': 'ViSession[]' + }, + { + 'direction': 'in', + 'documentation': { + 'description': 'The specified NI-Sync session.\n' + }, + 'name': 'syncSession', + 'type': 'ViSession' + } + ], + 'returns': 'ViStatus' + }, + 'FancyEnableMatchFailCombination': { + 'python_name': 'enable_match_fail_combination', + 'codegen_method': 'python-only', + 'method_templates': [ + { + 'documentation_filename': 'default_method', + 'library_interpreter_filename': 'none', + 'method_python_name_suffix': '', + 'session_filename': 'fancy_enable_match_fail_combination', + } + ], + 'documentation': { + 'description': 'Configures digital pattern instruments and the PXIe-6674T timing and synchronization instrument to combine pattern comparison results and control subsequent pattern execution across digital pattern instruments based on those results. You must initialize the PXIe-6674T using NI-Sync and call this method from a multi-instrument session.\n' + }, + 'included_in_proto': True, + 'parameters': [ + { + 'direction': 'in', + 'name': 'vi', + 'type': 'ViSession' + }, + { + 'direction': 'in', + 'documentation': { + 'description': 'The specified NI-Sync session.\n' + }, + 'name': 'syncSession', + 'type': 'ViSession' + } + ], + 'returns': 'ViStatus' + }, +} \ No newline at end of file diff --git a/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pattern.digipat b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pattern.digipat new file mode 100644 index 000000000..4a41bca92 Binary files /dev/null and b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pattern.digipat differ diff --git a/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_levels.digilevels b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_levels.digilevels new file mode 100644 index 000000000..35dc1d186 --- /dev/null +++ b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_levels.digilevels @@ -0,0 +1,15 @@ + + + + + + 0 + 3.3 + 0.8 + 2 + 0 + HighZ + + + + \ No newline at end of file diff --git a/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_map.pinmap b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_map.pinmap new file mode 100644 index 000000000..9ae95d34f --- /dev/null +++ b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/pin_map.pinmap @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/specifications.specs b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/specifications.specs new file mode 100644 index 000000000..51ba58bb5 --- /dev/null +++ b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/specifications.specs @@ -0,0 +1,9 @@ + + +
+ + 1 µs + +
+ +
\ No newline at end of file diff --git a/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/timing.digitiming b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/timing.digitiming new file mode 100644 index 000000000..1a44a993e --- /dev/null +++ b/src/nidigital/system_tests/test_files/test_enable_match_fail_combination/timing.digitiming @@ -0,0 +1,23 @@ + + + + + + timing.period + + + + 0 ns + timing.period / 2 + timing.period + + + (3 * timing.period) / 4 + + Pattern + + + + + + \ No newline at end of file diff --git a/src/nidigital/system_tests/test_system_nidigital.py b/src/nidigital/system_tests/test_system_nidigital.py index 34ae3562d..8e48f7714 100644 --- a/src/nidigital/system_tests/test_system_nidigital.py +++ b/src/nidigital/system_tests/test_system_nidigital.py @@ -1330,6 +1330,22 @@ class TestLibrary(SystemTests): def session_creation_kwargs(self): return {} + def test_enable_match_fail_combination(self, multi_instrument_session): + import nisync + + test_name = self.test_enable_match_fail_combination.__name__ + multi_instrument_session.load_pin_map(self.get_test_file_path(test_name, 'pin_map.pinmap')) + multi_instrument_session.load_pattern(self.get_test_file_path(test_name, 'pattern.digipat')) + multi_instrument_session.load_specifications_levels_and_timing( + specifications_file_paths=self.get_test_file_path(test_name, 'specifications.specs'), + levels_file_paths=self.get_test_file_path(test_name, 'pin_levels.digilevels'), + timing_file_paths=self.get_test_file_path(test_name, 'timing.digitiming')) + multi_instrument_session.apply_levels_and_timing(levels_sheet='pin_levels', timing_sheet='timing') + with nisync.Session('6674T') as sync_session: + multi_instrument_session.enable_match_fail_combination(sync_session) + multi_instrument_session.burst_pattern(start_label='new_pattern') + multi_instrument_session.read_sequencer_flag(nidigital.SequencerFlag.FLAG0) + class TestGrpc(SystemTests): @pytest.fixture(scope='class') diff --git a/src/nidigital/templates/_grpc_stub_interpreter.py/enable_match_fail_combination.py.mako b/src/nidigital/templates/_grpc_stub_interpreter.py/enable_match_fail_combination.py.mako new file mode 100644 index 000000000..7e0404ed2 --- /dev/null +++ b/src/nidigital/templates/_grpc_stub_interpreter.py/enable_match_fail_combination.py.mako @@ -0,0 +1,5 @@ +## This file is empty. We won't support gRPC, for now. +## Even though gRPC Device supports the function, the nisync Python API lacks gRPC support, so there's no point. +## If a user tries to call enable_match_fail_combination with a session runing on a gRPC Device Server, they will get an error +## because the method does not exist in _grpc_stub_interpreter.py. +## Most likely it will be an AttributeError, though it hasn't been tested. \ No newline at end of file diff --git a/src/nidigital/templates/_library_interpreter.py/enable_match_fail_combination.py.mako b/src/nidigital/templates/_library_interpreter.py/enable_match_fail_combination.py.mako new file mode 100644 index 000000000..79bff50cb --- /dev/null +++ b/src/nidigital/templates/_library_interpreter.py/enable_match_fail_combination.py.mako @@ -0,0 +1,8 @@ + + def enable_match_fail_combination(self, sessions, sync_session): # noqa: N802 + session_count_ctype = _visatype.ViUInt32(0 if sessions is None else len(sessions)) # case S160 + sessions_ctype = _get_ctypes_pointer_for_buffer(value=sessions, library_type=_visatype.ViSession) # case B550 + sync_session_ctype = _visatype.ViSession(sync_session) # case S110 + error_code = self._library.niDigital_EnableMatchFailCombination(session_count_ctype, sessions_ctype, sync_session_ctype) + errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) + return diff --git a/src/nidigital/templates/session.py/fancy_enable_match_fail_combination.py.mako b/src/nidigital/templates/session.py/fancy_enable_match_fail_combination.py.mako new file mode 100644 index 000000000..de0e68749 --- /dev/null +++ b/src/nidigital/templates/session.py/fancy_enable_match_fail_combination.py.mako @@ -0,0 +1,10 @@ +<%page args="f, config, method_template"/>\ +<% + import build.helper as helper +%>\ + def ${f['python_name']}(self, sync_session): + '''${f['python_name']} + + ${helper.get_function_docstring(f, False, config, indent=8)} + ''' + self._interpreter.enable_match_fail_combination([self._interpreter.get_session_handle()], sync_session.session_handle)