import ctypes
import warnings
from nidaqmx.error_codes import DAQmxErrors, DAQmxWarnings
__all__ = ['DaqError', 'DaqReadError', 'DaqWriteError', 'DaqWarning', 'DaqResourceWarning']
class Error(Exception):
"""
Base error class for module.
"""
pass
[docs]class DaqError(Error):
"""
Error raised by any DAQmx method.
"""
def __init__(self, message, error_code, task_name=''):
"""
Args:
message (string): Specifies the error message.
error_code (int): Specifies the NI-DAQmx error code.
"""
if task_name:
message = '{0}\n\nTask Name: {1}'.format(message, task_name)
super(DaqError, self).__init__(message)
self._error_code = int(error_code)
try:
self._error_type = DAQmxErrors(self._error_code)
except ValueError:
self._error_type = DAQmxErrors.UNKNOWN
@property
def error_code(self):
"""
int: Specifies the NI-DAQmx error code.
"""
return self._error_code
@property
def error_type(self):
"""
:class:`nidaqmx.error_codes.DAQmxErrors`: Specifies the NI-DAQmx
error type.
"""
return self._error_type
[docs]class DaqReadError(DaqError):
"""
Error raised by DAQmx write method that includes the amount of data that was
read.
"""
def __init__(self, message, error_code, samps_per_chan_read, task_name=''):
"""
Args:
message (string): Specifies the error message.
error_code (int): Specifies the NI-DAQmx error code.
"""
if task_name:
message = '{0}\n\nTask Name: {1}'.format(message, task_name)
super(DaqReadError, self).__init__(message, error_code, task_name)
self._error_code = int(error_code)
self._samps_per_chan_read = samps_per_chan_read
try:
self._error_type = DAQmxErrors(self._error_code)
except ValueError:
self._error_type = DAQmxErrors.UNKNOWN
@property
def samps_per_chan_read(self):
"""
int: Indicates the number of samples successfully read.
"""
return self._samps_per_chan_read
[docs]class DaqWriteError(DaqError):
"""
Error raised by DAQmx write method that includes the amount of data that was
written.
"""
def __init__(self, message, error_code, samps_per_chan_written, task_name=''):
"""
Args:
message (string): Specifies the error message.
error_code (int): Specifies the NI-DAQmx error code.
samps_per_chan_written (int): Specifies the number of samples written.
"""
if task_name:
message = '{0}\n\nTask Name: {1}'.format(message, task_name)
super(DaqWriteError, self).__init__(message, error_code, task_name)
self._error_code = int(error_code)
self._samps_per_chan_written = samps_per_chan_written
try:
self._error_type = DAQmxErrors(self._error_code)
except ValueError:
self._error_type = DAQmxErrors.UNKNOWN
@property
def samps_per_chan_written(self):
"""
int: Indicates the number of samples successfully written.
"""
return self._samps_per_chan_written
[docs]class DaqWarning(Warning):
"""
Warning raised by any NI-DAQmx method.
"""
def __init__(self, message, error_code):
"""
Args:
message (string): Specifies the warning message.
error_code (int): Specifies the NI-DAQmx error code.
"""
super(DaqWarning, self).__init__(
'\nWarning {0} occurred.\n\n{1}'.format(error_code, message))
self._error_code = int(error_code)
try:
self._error_type = DAQmxWarnings(self._error_code)
except ValueError:
self._error_type = DAQmxWarnings.UNKNOWN
@property
def error_code(self):
"""
int: Specifies the NI-DAQmx error code.
"""
return self._error_code
@property
def error_type(self):
"""
:class:`nidaqmx.error_codes.DAQmxWarnings`: Specifies the NI-DAQmx
error type.
"""
return self._error_type
class _ResourceWarning(Warning):
"""
Resource warning raised by any NI-DAQmx method.
Used in place of built-in ResourceWarning to allow Python 2.7 support.
"""
pass
# If ResourceWarning is in exceptions, it is also in the built-in namespace.
try:
DaqResourceWarning = ResourceWarning
except NameError:
DaqResourceWarning = _ResourceWarning
warnings.filterwarnings("always", category=DaqWarning)
warnings.filterwarnings("always", category=DaqResourceWarning)
def check_for_error(error_code, samps_per_chan_written=None, samps_per_chan_read=None):
if not error_code:
return
from nidaqmx._lib import lib_importer
if error_code < 0:
error_buffer = ctypes.create_string_buffer(2048)
cfunc = lib_importer.windll.DAQmxGetExtendedErrorInfo
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [ctypes.c_char_p, ctypes.c_uint]
cfunc(error_buffer, 2048)
if samps_per_chan_read is not None:
raise DaqReadError(error_buffer.value.decode("utf-8"), error_code, samps_per_chan_read)
elif samps_per_chan_written is not None:
raise DaqWriteError(error_buffer.value.decode("utf-8"), error_code, samps_per_chan_written)
else:
raise DaqError(error_buffer.value.decode("utf-8"), error_code)
elif error_code > 0:
error_buffer = ctypes.create_string_buffer(2048)
cfunc = lib_importer.windll.DAQmxGetErrorString
if cfunc.argtypes is None:
with cfunc.arglock:
if cfunc.argtypes is None:
cfunc.argtypes = [ctypes.c_int, ctypes.c_char_p,
ctypes.c_uint]
cfunc(error_code, error_buffer, 2048)
warnings.warn(DaqWarning(
error_buffer.value.decode("utf-8"), error_code))
def is_string_buffer_too_small(error_code):
return (
error_code == DAQmxErrors.BUFFER_TOO_SMALL_FOR_STRING or
error_code == DAQmxWarnings.CAPI_STRING_TRUNCATED_TO_FIT_BUFFER)
def is_array_buffer_too_small(error_code):
return error_code == DAQmxErrors.WRITE_BUFFER_TOO_SMALL