import ctypes
from nidaqmx._lib import lib_importer, ctypes_byte_str, c_bool32
from nidaqmx.errors import (
check_for_error, is_string_buffer_too_small)
__all__ = ['PersistedTask']
[docs]class PersistedTask:
"""
Represents a saved DAQmx task.
Use the DAQmx Persisted Task properties to query information about
programmatically saved tasks.
"""
__slots__ = ['_name', '__weakref__']
[docs] def __init__(self, name):
"""
Args:
name: Specifies the name of the saved task.
"""
self._name = name
[docs] def __eq__(self, other):
if isinstance(other, self.__class__):
return self._name == other._name
return False
[docs] def __hash__(self):
return hash(self._name)
[docs] def __ne__(self, other):
return not self.__eq__(other)
[docs] def __repr__(self):
return f'PersistedTask(name={self._name})'
@property
def author(self):
"""
str: Indicates the author of the task.
"""
cfunc = lib_importer.windll.DAQmxGetPersistedTaskAuthor
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [
ctypes_byte_str, ctypes.c_char_p, ctypes.c_uint]
temp_size = 0
while True:
val = ctypes.create_string_buffer(temp_size)
size_or_code = cfunc(
self._name, val, temp_size)
if is_string_buffer_too_small(size_or_code):
# Buffer size must have changed between calls; check again.
temp_size = 0
elif size_or_code > 0 and temp_size == 0:
# Buffer size obtained, use to retrieve data.
temp_size = size_or_code
else:
break
check_for_error(size_or_code)
return val.value.decode('ascii')
@property
def allow_interactive_editing(self):
"""
bool: Indicates whether the task can be edited in the DAQ
Assistant.
"""
val = c_bool32()
cfunc = (lib_importer.windll.
DAQmxGetPersistedTaskAllowInteractiveEditing)
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [
ctypes_byte_str, ctypes.POINTER(c_bool32)]
error_code = cfunc(
self._name, ctypes.byref(val))
check_for_error(error_code)
return val.value
@property
def allow_interactive_deletion(self):
"""
bool: Indicates whether the task can be deleted through MAX.
"""
val = c_bool32()
cfunc = (lib_importer.windll.
DAQmxGetPersistedTaskAllowInteractiveDeletion)
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [
ctypes_byte_str, ctypes.POINTER(c_bool32)]
error_code = cfunc(
self._name, ctypes.byref(val))
check_for_error(error_code)
return val.value
[docs] def delete(self):
"""
Deletes this task from MAX.
This function does not clear the copy of the task stored in memory.
Use the DAQmx Clear Task function to clear that copy of the task.
"""
cfunc = lib_importer.windll.DAQmxDeleteSavedTask
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [ctypes_byte_str]
error_code = cfunc(self._name)
check_for_error(error_code)
[docs] def load(self):
"""
Loads this saved task.
If you use this function to load a task, you must use DAQmx Clear
Task to destroy it.
Returns:
nidaqmx.task.Task: Indicates the loaded Task object.
"""
task_handle = lib_importer.task_handle(0)
cfunc = lib_importer.windll.DAQmxLoadTask
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [
ctypes_byte_str,
ctypes.POINTER(lib_importer.task_handle)]
error_code = cfunc(self._name, ctypes.byref(task_handle))
check_for_error(error_code)
from nidaqmx.system.storage._alternate_task_constructor import (
_TaskAlternateConstructor)
return _TaskAlternateConstructor(task_handle)