Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fancy write_source_waveform_unique #1119

Merged
merged 37 commits into from
Nov 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
19c5abc
Add template for fancy_fetch_capture_waveform
texasaggie97-zz Nov 12, 2019
f0b1c52
Add FetchCaptureWaveformU32 back and make 'library-only'
texasaggie97-zz Nov 12, 2019
1ec0cf9
Add FancyFetchCaptureWaveform
texasaggie97-zz Nov 12, 2019
c401652
Update CHANGELOG.md
texasaggie97-zz Nov 12, 2019
3d30465
Update generated files
texasaggie97-zz Nov 12, 2019
650ab93
Expand on comments
texasaggie97-zz Nov 12, 2019
9d6f7a2
Remove old comment
texasaggie97-zz Nov 12, 2019
bc53d04
Move conversion to "code generated" method
texasaggie97-zz Nov 12, 2019
6f12d64
Update generated files
texasaggie97-zz Nov 12, 2019
c51afc6
Fix setting size parameter
texasaggie97-zz Nov 12, 2019
619c0cd
Set enum type
texasaggie97-zz Nov 12, 2019
72a01b0
Update generated files
texasaggie97-zz Nov 12, 2019
36f648c
Merge branch 'master' into bug1076/add_fancy_fetch_capture_waveform
texasaggie97-zz Nov 13, 2019
39ce0d2
Don't worry about Python 2
texasaggie97-zz Nov 13, 2019
650c31f
Return a dict instead of a namedtupe
texasaggie97-zz Nov 13, 2019
a068305
Update documentation
texasaggie97-zz Nov 13, 2019
3b37be1
Add test stub that will only run on Python 3+
texasaggie97-zz Nov 13, 2019
f0395da
Update generated files
texasaggie97-zz Nov 13, 2019
ca37af2
Update CHANGELOG.md
texasaggie97-zz Nov 13, 2019
13a5187
Add fancy wrapper for write_source_waveform_site_unique()
texasaggie97-zz Nov 13, 2019
113ea70
Add stub test for Python 3 only
texasaggie97-zz Nov 13, 2019
1252d00
Update CHANGELOG.md
texasaggie97-zz Nov 13, 2019
8b8a6f7
Update generated files
texasaggie97-zz Nov 13, 2019
e88dac5
Merge branch 'master' into bug1069/add_fancy_write_source_waveform_un…
texasaggie97-zz Nov 13, 2019
e28b8cc
Fix exception message
texasaggie97-zz Nov 15, 2019
93b36bf
Use 'siteN' for sites in string passed into the driver
texasaggie97-zz Nov 15, 2019
48e894b
Update generated files
texasaggie97-zz Nov 15, 2019
d77a0db
Merge branch 'master' into bug1069/add_fancy_write_source_waveform_un…
texasaggie97-zz Nov 15, 2019
09d02a8
Merge branch 'master' into bug1069/add_fancy_write_source_waveform_un…
texasaggie97-zz Nov 18, 2019
0115a85
Let driver error on empty list of waveforms
texasaggie97-zz Nov 18, 2019
0ebad64
Update generated files
texasaggie97-zz Nov 18, 2019
ec52ab8
Merge branch 'master' into bug1069/add_fancy_write_source_waveform_un…
texasaggie97-zz Nov 18, 2019
edec3c9
Fix function name we call
texasaggie97-zz Nov 19, 2019
7a5f894
Merge branch 'master' into bug1069/add_fancy_write_source_waveform_un…
texasaggie97-zz Nov 19, 2019
3974bc2
Update generated files
texasaggie97-zz Nov 19, 2019
2ea9eec
Force rebuild
texasaggie97-zz Nov 19, 2019
df4d284
Add comment about the type being ignored
texasaggie97-zz Nov 19, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ All notable changes to this project will be documented in this file.
* ### NI-Digital Pattern Driver
* #### Added
* `fetch_capture_waveform()` - returns dictionary { site: data, site: data, ... }
* `write_source_waveform_site_unique()` - takes waveform_name and dictionary { site: data, site: data, ... }
* `pins` is now a valid repeated capability
* #### Changed
* Fix get/set properties - [#1062](https://github.com/ni/nimi-python/issues/1062)
Expand Down
30 changes: 30 additions & 0 deletions docs/nidigital/class.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3370,6 +3370,36 @@ write_source_waveform_data_from_file_tdms

:type waveform_file_path: str

write_source_waveform_site_unique
---------------------------------

.. py:currentmodule:: nidigital.Session

.. py:method:: write_source_waveform_site_unique(waveform_name, waveform_data)

TBD





:param waveform_name:





:type waveform_name: str
:param waveform_data:


Dictionary where each key is the site number and the value is array.array of unsigned int




:type waveform_data: { site: data, site: data, ... }

write_static
------------

Expand Down
9 changes: 9 additions & 0 deletions generated/nidigital/_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ def __init__(self, ctypes_library):
self.niDigital_WriteSequencerRegister_cfunc = None
self.niDigital_WriteSourceWaveformBroadcastU32_cfunc = None
self.niDigital_WriteSourceWaveformDataFromFileTDMS_cfunc = None
self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc = None
self.niDigital_WriteStatic_cfunc = None
self.niDigital_close_cfunc = None
self.niDigital_error_message_cfunc = None
Expand Down Expand Up @@ -1095,6 +1096,14 @@ def niDigital_WriteSourceWaveformDataFromFileTDMS(self, vi, waveform_name, wavef
self.niDigital_WriteSourceWaveformDataFromFileTDMS_cfunc.restype = ViStatus # noqa: F405
return self.niDigital_WriteSourceWaveformDataFromFileTDMS_cfunc(vi, waveform_name, waveform_file_path)

def niDigital_WriteSourceWaveformSiteUniqueU32(self, vi, site_list, waveform_name, num_waveforms, samples_per_waveform, waveform_data): # noqa: N802
with self._func_lock:
if self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc is None:
self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc = self._library.niDigital_WriteSourceWaveformSiteUniqueU32
self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc.argtypes = [ViSession, ctypes.POINTER(ViChar), ctypes.POINTER(ViChar), ViInt32, ViInt32, ctypes.POINTER(ViUInt32)] # noqa: F405
self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc.restype = ViStatus # noqa: F405
return self.niDigital_WriteSourceWaveformSiteUniqueU32_cfunc(vi, site_list, waveform_name, num_waveforms, samples_per_waveform, waveform_data)

def niDigital_WriteStatic(self, vi, channel_list, state): # noqa: N802
with self._func_lock:
if self.niDigital_WriteStatic_cfunc is None:
Expand Down
70 changes: 70 additions & 0 deletions generated/nidigital/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -2845,6 +2845,47 @@ def self_test(self):
raise errors.SelfTestError(code, msg)
return None

@ivi_synchronized
def write_source_waveform_site_unique(self, waveform_name, waveform_data):
'''write_source_waveform_site_unique

TBD

Args:
waveform_name (str):

waveform_data ({ site: data, site: data, ... }): Dictionary where each key is the site number and the value is array.array of unsigned int

'''
site_list = []
# We assume all the entries are the same length (we'll check later) to make the array the correct size
# Get an entry from the dictionary from https://stackoverflow.com/questions/30362391/how-do-you-find-the-first-key-in-a-dictionary
if len(waveform_data) == 0:
actual_samples_per_waveform = 0
else:
actual_samples_per_waveform = len(waveform_data[next(iter(waveform_data))])
data = array.array('L', [0] * (len(waveform_data) * actual_samples_per_waveform))
mv = memoryview(data)

i = 0
for site in waveform_data:
if len(waveform_data[site]) != actual_samples_per_waveform:
raise ValueError('Mismatched length of waveforms. All must be the same length.')
if waveform_data[site].typecode != 'L':
raise ValueError('Wrong array element type. Must be unsigned 32 bit int ("L"), was {}'.format(waveform_data[site].typecode))

site_list.append('site' + str(site))

start = i * actual_samples_per_waveform
end = start + actual_samples_per_waveform
mv[start:end] = waveform_data[site]

i += 1

site_list_str = ','.join(site_list)

self._write_source_waveform_site_unique_u32(site_list_str, waveform_name, len(waveform_data), actual_samples_per_waveform, data)

@ivi_synchronized
def fetch_history_ram_cycle_information(self, site, sample_index):
r'''fetch_history_ram_cycle_information
Expand Down Expand Up @@ -3626,6 +3667,35 @@ def write_source_waveform_data_from_file_tdms(self, waveform_name, waveform_file
errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False)
return

@ivi_synchronized
def _write_source_waveform_site_unique_u32(self, site_list, waveform_name, num_waveforms, samples_per_waveform, waveform_data):
r'''_write_source_waveform_site_unique_u32

TBD

Args:
site_list (str):

waveform_name (str):

num_waveforms (int):

samples_per_waveform (int):

waveform_data (array.array("L")):

'''
vi_ctype = _visatype.ViSession(self._vi) # case S110
site_list_ctype = ctypes.create_string_buffer(site_list.encode(self._encoding)) # case C020
waveform_name_ctype = ctypes.create_string_buffer(waveform_name.encode(self._encoding)) # case C020
num_waveforms_ctype = _visatype.ViInt32(num_waveforms) # case S150
samples_per_waveform_ctype = _visatype.ViInt32(samples_per_waveform) # case S150
waveform_data_array = get_ctypes_and_array(value=waveform_data, array_type="L") # case B550
waveform_data_ctype = get_ctypes_pointer_for_buffer(value=waveform_data_array, library_type=_visatype.ViUInt32) # case B550
error_code = self._library.niDigital_WriteSourceWaveformSiteUniqueU32(vi_ctype, site_list_ctype, waveform_name_ctype, num_waveforms_ctype, samples_per_waveform_ctype, waveform_data_ctype)
errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False)
return

def _close(self):
r'''_close

Expand Down
9 changes: 9 additions & 0 deletions generated/nidigital/unit_tests/_mock_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,8 @@ def __init__(self):
self._defaults['WriteSourceWaveformBroadcastU32']['return'] = 0
self._defaults['WriteSourceWaveformDataFromFileTDMS'] = {}
self._defaults['WriteSourceWaveformDataFromFileTDMS']['return'] = 0
self._defaults['WriteSourceWaveformSiteUniqueU32'] = {}
self._defaults['WriteSourceWaveformSiteUniqueU32']['return'] = 0
self._defaults['WriteStatic'] = {}
self._defaults['WriteStatic']['return'] = 0
self._defaults['close'] = {}
Expand Down Expand Up @@ -1262,6 +1264,11 @@ def niDigital_WriteSourceWaveformDataFromFileTDMS(self, vi, waveform_name, wavef
return self._defaults['WriteSourceWaveformDataFromFileTDMS']['return']
return self._defaults['WriteSourceWaveformDataFromFileTDMS']['return']

def niDigital_WriteSourceWaveformSiteUniqueU32(self, vi, site_list, waveform_name, num_waveforms, samples_per_waveform, waveform_data): # noqa: N802
if self._defaults['WriteSourceWaveformSiteUniqueU32']['return'] != 0:
return self._defaults['WriteSourceWaveformSiteUniqueU32']['return']
return self._defaults['WriteSourceWaveformSiteUniqueU32']['return']

def niDigital_WriteStatic(self, vi, channel_list, state): # noqa: N802
if self._defaults['WriteStatic']['return'] != 0:
return self._defaults['WriteStatic']['return']
Expand Down Expand Up @@ -1548,6 +1555,8 @@ def set_side_effects_and_return_values(self, mock_library):
mock_library.niDigital_WriteSourceWaveformBroadcastU32.return_value = 0
mock_library.niDigital_WriteSourceWaveformDataFromFileTDMS.side_effect = MockFunctionCallError("niDigital_WriteSourceWaveformDataFromFileTDMS")
mock_library.niDigital_WriteSourceWaveformDataFromFileTDMS.return_value = 0
mock_library.niDigital_WriteSourceWaveformSiteUniqueU32.side_effect = MockFunctionCallError("niDigital_WriteSourceWaveformSiteUniqueU32")
mock_library.niDigital_WriteSourceWaveformSiteUniqueU32.return_value = 0
mock_library.niDigital_WriteStatic.side_effect = MockFunctionCallError("niDigital_WriteStatic")
mock_library.niDigital_WriteStatic.return_value = 0
mock_library.niDigital_close.side_effect = MockFunctionCallError("niDigital_close")
Expand Down
8 changes: 3 additions & 5 deletions src/nidigital/metadata/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -3772,7 +3772,7 @@
'returns': 'ViStatus'
},
'WriteSourceWaveformSiteUniqueU32': {
'codegen_method': 'no',
'codegen_method': 'private',
'documentation': {
'description': 'TBD'
},
Expand Down Expand Up @@ -3805,10 +3805,7 @@
{
'direction': 'in',
'name': 'waveformData',
'size': {
'mechanism': 'custom',
'value': None
},
'use_array': True,
'type': 'ViUInt32[]'
}
],
Expand Down Expand Up @@ -3954,3 +3951,4 @@
'returns': 'ViStatus'
}
}

38 changes: 38 additions & 0 deletions src/nidigital/metadata/functions_addon.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,44 @@
functions_override_metadata = {
}

functions_additional_write_source_waveform_site_unique = {
'FancyWriteSourceWaveformSiteUnique': {
'python_name': 'write_source_waveform_site_unique',
'codegen_method': 'python-only',
'method_templates': [
{
'documentation_filename': 'default_method',
'method_python_name_suffix': '',
'session_filename': 'fancy_write_source_waveform_site_unique',
}
],
'documentation': {
'description': 'TBD'
},
'parameters': [
{
'direction': 'in',
'name': 'vi',
'type': 'ViSession'
},
{
'direction': 'in',
'name': 'waveformName',
'type': 'ViConstString'
},
{
'direction': 'in',
'documentation': {
'description': '\nDictionary where each key is the site number and the value is array.array of unsigned int\n'
},
'name': 'waveform_data',
'type': 'ViUInt32', # This type is ignored since this function isn't code generated
'type_in_documentation': '{ site: data, site: data, ... }',
},
],
},
}

functions_additional_get_pin_results_pin_information = {
'FancyGetPinResultsPinInformation': {
'python_name': 'get_pin_results_pin_information',
Expand Down
6 changes: 6 additions & 0 deletions src/nidigital/system_tests/test_system_nidigital.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ def test_tdr_some_channels(multi_instrument_session):
assert fetched_offsets == applied_offsets


def test_write_source_waveform_site_unique(multi_instrument_session):
# Implementation of write_source_waveform_site_unique() uses memoryview of array.array, which is not supported in Python 2.x
if sys.version_info.major >= 3:
pass


def test_get_pin_results_pin_information(multi_instrument_session):
pass

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<%page args="f, config, method_template"/>\
<%
import build.helper as helper
suffix = method_template['method_python_name_suffix']
%>\
def ${f['python_name']}${suffix}(${helper.get_params_snippet(f, helper.ParameterUsageOptions.SESSION_METHOD_DECLARATION)}):
'''${f['python_name']}

${helper.get_function_docstring(f, False, config, indent=8)}
'''
site_list = []
# We assume all the entries are the same length (we'll check later) to make the array the correct size
# Get an entry from the dictionary from https://stackoverflow.com/questions/30362391/how-do-you-find-the-first-key-in-a-dictionary
if len(waveform_data) == 0:
actual_samples_per_waveform = 0
else:
actual_samples_per_waveform = len(waveform_data[next(iter(waveform_data))])
data = array.array('L', [0] * (len(waveform_data) * actual_samples_per_waveform))
mv = memoryview(data)

i = 0
for site in waveform_data:
if len(waveform_data[site]) != actual_samples_per_waveform:
raise ValueError('Mismatched length of waveforms. All must be the same length.')
if waveform_data[site].typecode != 'L':
raise ValueError('Wrong array element type. Must be unsigned 32 bit int ("L"), was {}'.format(waveform_data[site].typecode))

site_list.append('site' + str(site))

start = i * actual_samples_per_waveform
end = start + actual_samples_per_waveform
mv[start:end] = waveform_data[site]

i += 1

site_list_str = ','.join(site_list)

self._write_source_waveform_site_unique_u32(site_list_str, waveform_name, len(waveform_data), actual_samples_per_waveform, data)