mirror of
https://github.com/JoelBender/bacpypes
synced 2025-09-28 22:15:23 +08:00
first add the classes to the errors module
This commit is contained in:
parent
4c45c8d70a
commit
a344b188c2
|
@ -6,8 +6,9 @@
|
||||||
|
|
||||||
class ConfigurationError(ValueError):
|
class ConfigurationError(ValueError):
|
||||||
|
|
||||||
""" This error is raised when there is a configuration problem such as
|
"""This error is raised when there is a configuration problem such as
|
||||||
bindings between layers or required parameters that are missing. """
|
bindings between layers or required parameters that are missing.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -18,7 +19,8 @@ class ConfigurationError(ValueError):
|
||||||
|
|
||||||
class EncodingError(ValueError):
|
class EncodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during encoding. """
|
"""This error is raised if there is a problem during encoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -29,7 +31,8 @@ class EncodingError(ValueError):
|
||||||
|
|
||||||
class DecodingError(ValueError):
|
class DecodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during decoding. """
|
"""This error is raised if there is a problem during decoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -40,11 +43,284 @@ class DecodingError(ValueError):
|
||||||
|
|
||||||
class ExecutionError(RuntimeError):
|
class ExecutionError(RuntimeError):
|
||||||
|
|
||||||
""" This error is raised for if there is an error during the execution of
|
"""This error is raised for if there is an error during the execution of
|
||||||
a service or function at the application layer of stack and the error
|
a service or function at the application layer of stack and the error
|
||||||
translated into an ErrorPDU. """
|
translated into an ErrorPDU.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, errorClass, errorCode):
|
def __init__(self, errorClass, errorCode):
|
||||||
self.errorClass = errorClass
|
self.errorClass = errorClass
|
||||||
self.errorCode = errorCode
|
self.errorCode = errorCode
|
||||||
self.args = (errorClass, errorCode)
|
self.args = (errorClass, errorCode)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Reject Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class RejectException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to reject reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate RejectPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.rejectReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class RejectOther(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that contains a
|
||||||
|
syntax error for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class RejectBufferOverflow(RejectException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InconsistentParameters(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that omits a
|
||||||
|
conditional service argument that should be present or contains a
|
||||||
|
conditional service argument that should not be present. This condition
|
||||||
|
could also elicit a Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'inconsistentParameters'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidParameterDatatype(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the encoding
|
||||||
|
of one or more of the service parameters does not follow the correct type
|
||||||
|
specification. This condition could also elicit a Reject PDU with a Reject
|
||||||
|
Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidParameterDatatype'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidTag(RejectException):
|
||||||
|
|
||||||
|
"""While parsing a message, an invalid tag was encountered. Since an
|
||||||
|
invalid tag could confuse the parsing logic, any of the following Reject
|
||||||
|
Reasons may also be generated in response to a confirmed request
|
||||||
|
containing an invalid tag: INCONSISTENT_PARAMETERS,
|
||||||
|
INVALID_PARAMETER_DATA_TYPE, MISSING_REQUIRED_PARAMETER, and
|
||||||
|
TOO_MANY_ARGUMENTS.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidTag'
|
||||||
|
|
||||||
|
|
||||||
|
class MissingRequiredParameter(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that is missing at
|
||||||
|
least one mandatory service argument. This condition could also elicit a
|
||||||
|
Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'missingRequiredParameter'
|
||||||
|
|
||||||
|
|
||||||
|
class ParameterOutOfRange(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that conveys a
|
||||||
|
parameter whose value is outside the range defined for this service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'parameterOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class TooManyArguments(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the total
|
||||||
|
number of service arguments is greater than specified for the service.
|
||||||
|
This condition could also elicit a Reject PDU with a Reject Reason of
|
||||||
|
INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'tooManyArguments'
|
||||||
|
|
||||||
|
|
||||||
|
class UndefinedEnumeration(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which one or
|
||||||
|
more of the service parameters is decoded as an enumeration that is not
|
||||||
|
defined by the type specification of this parameter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'undefinedEnumeration'
|
||||||
|
|
||||||
|
|
||||||
|
class UnrecognizedService(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the Service
|
||||||
|
Choice field specifies an unknown or unsupported service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'unrecognizedService'
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Abort Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class AbortException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to abort reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate AbortPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.abortReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class AbortOther(AbortException):
|
||||||
|
|
||||||
|
"""This abort reason is returned for a reason other than any of those
|
||||||
|
for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class AbortBufferOverflow(AbortException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidAPDUInThisState(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that is not expected in the present
|
||||||
|
state of the Transaction State Machine.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'invalidApduInThisState'
|
||||||
|
|
||||||
|
|
||||||
|
class PreemptedByHigherPriorityTask(AbortException):
|
||||||
|
|
||||||
|
"""The transaction shall be aborted to permit higher priority processing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'preemptedByHigherPriorityTask'
|
||||||
|
|
||||||
|
|
||||||
|
class SegmentationNotSupported(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that has its segmentation bit set to
|
||||||
|
TRUE when the receiving device does not support segmentation. It is also
|
||||||
|
generated when a BACnet-ComplexACK- PDU is large enough to require
|
||||||
|
segmentation but it cannot be transmitted because either the transmitting
|
||||||
|
device or the receiving device does not support segmentation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'segmentationNotSupported'
|
||||||
|
|
||||||
|
|
||||||
|
class SecurityError(AbortException):
|
||||||
|
|
||||||
|
"""The Transaction is aborted due to receipt of a security error.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'securityError'
|
||||||
|
|
||||||
|
|
||||||
|
class InsufficientSecurity(AbortException):
|
||||||
|
|
||||||
|
"""The transaction is aborted due to receipt of a PDU secured differently
|
||||||
|
than the original PDU of the transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'insufficientSecurity'
|
||||||
|
|
||||||
|
|
||||||
|
class WindowSizeOutOfRange(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request that is segmented, or receives any segment
|
||||||
|
of a segmented request, where the Proposed Window Size field of the PDU
|
||||||
|
header is either zero or greater than 127.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'windowSizeOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationExceededReplyTime(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a confirmed request but its application layer has not
|
||||||
|
responded within the published APDU Timeout period.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'applicationExceededReplyTime'
|
||||||
|
|
||||||
|
|
||||||
|
class OutOfResources(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request but cannot start processing because it has
|
||||||
|
run out of some internal resource.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'outOfResources'
|
||||||
|
|
||||||
|
|
||||||
|
class TSMTimeout(AbortException):
|
||||||
|
|
||||||
|
"""A transaction state machine timer exceeded the timeout applicable for
|
||||||
|
the current state, causing the transaction machine to abort the
|
||||||
|
transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'tsmTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class APDUTooLong(AbortException):
|
||||||
|
|
||||||
|
"""An APDU was received from the local application program whose overall
|
||||||
|
size exceeds the maximum transmittable length or exceeds the maximum number
|
||||||
|
of segments accepted by the server.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'apduTooLong'
|
||||||
|
|
||||||
|
|
||||||
|
class ServerTimeout(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'serverTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class NoResponse(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'noResponse'
|
||||||
|
|
|
@ -6,8 +6,9 @@
|
||||||
|
|
||||||
class ConfigurationError(ValueError):
|
class ConfigurationError(ValueError):
|
||||||
|
|
||||||
""" This error is raised when there is a configuration problem such as
|
"""This error is raised when there is a configuration problem such as
|
||||||
bindings between layers or required parameters that are missing. """
|
bindings between layers or required parameters that are missing.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -18,7 +19,8 @@ class ConfigurationError(ValueError):
|
||||||
|
|
||||||
class EncodingError(ValueError):
|
class EncodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during encoding. """
|
"""This error is raised if there is a problem during encoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -29,7 +31,8 @@ class EncodingError(ValueError):
|
||||||
|
|
||||||
class DecodingError(ValueError):
|
class DecodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during decoding. """
|
"""This error is raised if there is a problem during decoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -40,11 +43,284 @@ class DecodingError(ValueError):
|
||||||
|
|
||||||
class ExecutionError(RuntimeError):
|
class ExecutionError(RuntimeError):
|
||||||
|
|
||||||
""" This error is raised for if there is an error during the execution of
|
"""This error is raised for if there is an error during the execution of
|
||||||
a service or function at the application layer of stack and the error
|
a service or function at the application layer of stack and the error
|
||||||
translated into an ErrorPDU. """
|
translated into an ErrorPDU.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, errorClass, errorCode):
|
def __init__(self, errorClass, errorCode):
|
||||||
self.errorClass = errorClass
|
self.errorClass = errorClass
|
||||||
self.errorCode = errorCode
|
self.errorCode = errorCode
|
||||||
self.args = (errorClass, errorCode)
|
self.args = (errorClass, errorCode)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Reject Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class RejectException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to reject reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate RejectPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.rejectReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class RejectOther(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that contains a
|
||||||
|
syntax error for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class RejectBufferOverflow(RejectException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InconsistentParameters(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that omits a
|
||||||
|
conditional service argument that should be present or contains a
|
||||||
|
conditional service argument that should not be present. This condition
|
||||||
|
could also elicit a Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'inconsistentParameters'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidParameterDatatype(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the encoding
|
||||||
|
of one or more of the service parameters does not follow the correct type
|
||||||
|
specification. This condition could also elicit a Reject PDU with a Reject
|
||||||
|
Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidParameterDatatype'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidTag(RejectException):
|
||||||
|
|
||||||
|
"""While parsing a message, an invalid tag was encountered. Since an
|
||||||
|
invalid tag could confuse the parsing logic, any of the following Reject
|
||||||
|
Reasons may also be generated in response to a confirmed request
|
||||||
|
containing an invalid tag: INCONSISTENT_PARAMETERS,
|
||||||
|
INVALID_PARAMETER_DATA_TYPE, MISSING_REQUIRED_PARAMETER, and
|
||||||
|
TOO_MANY_ARGUMENTS.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidTag'
|
||||||
|
|
||||||
|
|
||||||
|
class MissingRequiredParameter(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that is missing at
|
||||||
|
least one mandatory service argument. This condition could also elicit a
|
||||||
|
Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'missingRequiredParameter'
|
||||||
|
|
||||||
|
|
||||||
|
class ParameterOutOfRange(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that conveys a
|
||||||
|
parameter whose value is outside the range defined for this service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'parameterOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class TooManyArguments(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the total
|
||||||
|
number of service arguments is greater than specified for the service.
|
||||||
|
This condition could also elicit a Reject PDU with a Reject Reason of
|
||||||
|
INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'tooManyArguments'
|
||||||
|
|
||||||
|
|
||||||
|
class UndefinedEnumeration(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which one or
|
||||||
|
more of the service parameters is decoded as an enumeration that is not
|
||||||
|
defined by the type specification of this parameter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'undefinedEnumeration'
|
||||||
|
|
||||||
|
|
||||||
|
class UnrecognizedService(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the Service
|
||||||
|
Choice field specifies an unknown or unsupported service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'unrecognizedService'
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Abort Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class AbortException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to abort reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate AbortPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.abortReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class AbortOther(AbortException):
|
||||||
|
|
||||||
|
"""This abort reason is returned for a reason other than any of those
|
||||||
|
for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class AbortBufferOverflow(AbortException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidAPDUInThisState(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that is not expected in the present
|
||||||
|
state of the Transaction State Machine.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'invalidApduInThisState'
|
||||||
|
|
||||||
|
|
||||||
|
class PreemptedByHigherPriorityTask(AbortException):
|
||||||
|
|
||||||
|
"""The transaction shall be aborted to permit higher priority processing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'preemptedByHigherPriorityTask'
|
||||||
|
|
||||||
|
|
||||||
|
class SegmentationNotSupported(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that has its segmentation bit set to
|
||||||
|
TRUE when the receiving device does not support segmentation. It is also
|
||||||
|
generated when a BACnet-ComplexACK- PDU is large enough to require
|
||||||
|
segmentation but it cannot be transmitted because either the transmitting
|
||||||
|
device or the receiving device does not support segmentation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'segmentationNotSupported'
|
||||||
|
|
||||||
|
|
||||||
|
class SecurityError(AbortException):
|
||||||
|
|
||||||
|
"""The Transaction is aborted due to receipt of a security error.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'securityError'
|
||||||
|
|
||||||
|
|
||||||
|
class InsufficientSecurity(AbortException):
|
||||||
|
|
||||||
|
"""The transaction is aborted due to receipt of a PDU secured differently
|
||||||
|
than the original PDU of the transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'insufficientSecurity'
|
||||||
|
|
||||||
|
|
||||||
|
class WindowSizeOutOfRange(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request that is segmented, or receives any segment
|
||||||
|
of a segmented request, where the Proposed Window Size field of the PDU
|
||||||
|
header is either zero or greater than 127.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'windowSizeOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationExceededReplyTime(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a confirmed request but its application layer has not
|
||||||
|
responded within the published APDU Timeout period.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'applicationExceededReplyTime'
|
||||||
|
|
||||||
|
|
||||||
|
class OutOfResources(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request but cannot start processing because it has
|
||||||
|
run out of some internal resource.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'outOfResources'
|
||||||
|
|
||||||
|
|
||||||
|
class TSMTimeout(AbortException):
|
||||||
|
|
||||||
|
"""A transaction state machine timer exceeded the timeout applicable for
|
||||||
|
the current state, causing the transaction machine to abort the
|
||||||
|
transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'tsmTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class APDUTooLong(AbortException):
|
||||||
|
|
||||||
|
"""An APDU was received from the local application program whose overall
|
||||||
|
size exceeds the maximum transmittable length or exceeds the maximum number
|
||||||
|
of segments accepted by the server.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'apduTooLong'
|
||||||
|
|
||||||
|
|
||||||
|
class ServerTimeout(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'serverTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class NoResponse(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'noResponse'
|
||||||
|
|
|
@ -6,8 +6,9 @@
|
||||||
|
|
||||||
class ConfigurationError(ValueError):
|
class ConfigurationError(ValueError):
|
||||||
|
|
||||||
""" This error is raised when there is a configuration problem such as
|
"""This error is raised when there is a configuration problem such as
|
||||||
bindings between layers or required parameters that are missing. """
|
bindings between layers or required parameters that are missing.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -18,7 +19,8 @@ class ConfigurationError(ValueError):
|
||||||
|
|
||||||
class EncodingError(ValueError):
|
class EncodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during encoding. """
|
"""This error is raised if there is a problem during encoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -29,7 +31,8 @@ class EncodingError(ValueError):
|
||||||
|
|
||||||
class DecodingError(ValueError):
|
class DecodingError(ValueError):
|
||||||
|
|
||||||
""" This error is raised if there is a problem during decoding. """
|
"""This error is raised if there is a problem during decoding.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
self.args = args
|
self.args = args
|
||||||
|
@ -40,11 +43,284 @@ class DecodingError(ValueError):
|
||||||
|
|
||||||
class ExecutionError(RuntimeError):
|
class ExecutionError(RuntimeError):
|
||||||
|
|
||||||
""" This error is raised for if there is an error during the execution of
|
"""This error is raised for if there is an error during the execution of
|
||||||
a service or function at the application layer of stack and the error
|
a service or function at the application layer of stack and the error
|
||||||
translated into an ErrorPDU. """
|
translated into an ErrorPDU.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, errorClass, errorCode):
|
def __init__(self, errorClass, errorCode):
|
||||||
self.errorClass = errorClass
|
self.errorClass = errorClass
|
||||||
self.errorCode = errorCode
|
self.errorCode = errorCode
|
||||||
self.args = (errorClass, errorCode)
|
self.args = (errorClass, errorCode)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Reject Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class RejectException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to reject reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate RejectPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.rejectReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class RejectOther(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that contains a
|
||||||
|
syntax error for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class RejectBufferOverflow(RejectException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InconsistentParameters(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that omits a
|
||||||
|
conditional service argument that should be present or contains a
|
||||||
|
conditional service argument that should not be present. This condition
|
||||||
|
could also elicit a Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'inconsistentParameters'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidParameterDatatype(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the encoding
|
||||||
|
of one or more of the service parameters does not follow the correct type
|
||||||
|
specification. This condition could also elicit a Reject PDU with a Reject
|
||||||
|
Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidParameterDatatype'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidTag(RejectException):
|
||||||
|
|
||||||
|
"""While parsing a message, an invalid tag was encountered. Since an
|
||||||
|
invalid tag could confuse the parsing logic, any of the following Reject
|
||||||
|
Reasons may also be generated in response to a confirmed request
|
||||||
|
containing an invalid tag: INCONSISTENT_PARAMETERS,
|
||||||
|
INVALID_PARAMETER_DATA_TYPE, MISSING_REQUIRED_PARAMETER, and
|
||||||
|
TOO_MANY_ARGUMENTS.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'invalidTag'
|
||||||
|
|
||||||
|
|
||||||
|
class MissingRequiredParameter(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that is missing at
|
||||||
|
least one mandatory service argument. This condition could also elicit a
|
||||||
|
Reject PDU with a Reject Reason of INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'missingRequiredParameter'
|
||||||
|
|
||||||
|
|
||||||
|
class ParameterOutOfRange(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU that conveys a
|
||||||
|
parameter whose value is outside the range defined for this service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'parameterOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class TooManyArguments(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the total
|
||||||
|
number of service arguments is greater than specified for the service.
|
||||||
|
This condition could also elicit a Reject PDU with a Reject Reason of
|
||||||
|
INVALID_TAG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'tooManyArguments'
|
||||||
|
|
||||||
|
|
||||||
|
class UndefinedEnumeration(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which one or
|
||||||
|
more of the service parameters is decoded as an enumeration that is not
|
||||||
|
defined by the type specification of this parameter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'undefinedEnumeration'
|
||||||
|
|
||||||
|
|
||||||
|
class UnrecognizedService(RejectException):
|
||||||
|
|
||||||
|
"""Generated in response to a confirmed request APDU in which the Service
|
||||||
|
Choice field specifies an unknown or unsupported service.
|
||||||
|
"""
|
||||||
|
|
||||||
|
rejectReason = 'unrecognizedService'
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Abort Exception Family
|
||||||
|
#
|
||||||
|
|
||||||
|
class AbortException(Exception):
|
||||||
|
|
||||||
|
"""Exceptions in this family correspond to abort reasons. If the
|
||||||
|
application raises one of these errors while processing a confirmed
|
||||||
|
service request, the stack will form an appropriate AbortPDU and
|
||||||
|
send it to the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = None
|
||||||
|
|
||||||
|
def __init__(self, *args):
|
||||||
|
if not self.abortReason:
|
||||||
|
raise NotImplementedError("use a derived class")
|
||||||
|
|
||||||
|
# save the args
|
||||||
|
self.args = args
|
||||||
|
|
||||||
|
|
||||||
|
class AbortOther(AbortException):
|
||||||
|
|
||||||
|
"""This abort reason is returned for a reason other than any of those
|
||||||
|
for which an error code has not been explicitly defined.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'other'
|
||||||
|
|
||||||
|
|
||||||
|
class AbortBufferOverflow(AbortException):
|
||||||
|
|
||||||
|
"""A buffer capacity has been exceeded.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'bufferOverflow'
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidAPDUInThisState(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that is not expected in the present
|
||||||
|
state of the Transaction State Machine.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'invalidApduInThisState'
|
||||||
|
|
||||||
|
|
||||||
|
class PreemptedByHigherPriorityTask(AbortException):
|
||||||
|
|
||||||
|
"""The transaction shall be aborted to permit higher priority processing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'preemptedByHigherPriorityTask'
|
||||||
|
|
||||||
|
|
||||||
|
class SegmentationNotSupported(AbortException):
|
||||||
|
|
||||||
|
"""Generated in response to an APDU that has its segmentation bit set to
|
||||||
|
TRUE when the receiving device does not support segmentation. It is also
|
||||||
|
generated when a BACnet-ComplexACK- PDU is large enough to require
|
||||||
|
segmentation but it cannot be transmitted because either the transmitting
|
||||||
|
device or the receiving device does not support segmentation.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'segmentationNotSupported'
|
||||||
|
|
||||||
|
|
||||||
|
class SecurityError(AbortException):
|
||||||
|
|
||||||
|
"""The Transaction is aborted due to receipt of a security error.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'securityError'
|
||||||
|
|
||||||
|
|
||||||
|
class InsufficientSecurity(AbortException):
|
||||||
|
|
||||||
|
"""The transaction is aborted due to receipt of a PDU secured differently
|
||||||
|
than the original PDU of the transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'insufficientSecurity'
|
||||||
|
|
||||||
|
|
||||||
|
class WindowSizeOutOfRange(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request that is segmented, or receives any segment
|
||||||
|
of a segmented request, where the Proposed Window Size field of the PDU
|
||||||
|
header is either zero or greater than 127.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'windowSizeOutOfRange'
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationExceededReplyTime(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a confirmed request but its application layer has not
|
||||||
|
responded within the published APDU Timeout period.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'applicationExceededReplyTime'
|
||||||
|
|
||||||
|
|
||||||
|
class OutOfResources(AbortException):
|
||||||
|
|
||||||
|
"""A device receives a request but cannot start processing because it has
|
||||||
|
run out of some internal resource.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'outOfResources'
|
||||||
|
|
||||||
|
|
||||||
|
class TSMTimeout(AbortException):
|
||||||
|
|
||||||
|
"""A transaction state machine timer exceeded the timeout applicable for
|
||||||
|
the current state, causing the transaction machine to abort the
|
||||||
|
transaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'tsmTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class APDUTooLong(AbortException):
|
||||||
|
|
||||||
|
"""An APDU was received from the local application program whose overall
|
||||||
|
size exceeds the maximum transmittable length or exceeds the maximum number
|
||||||
|
of segments accepted by the server.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'apduTooLong'
|
||||||
|
|
||||||
|
|
||||||
|
class ServerTimeout(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'serverTimeout'
|
||||||
|
|
||||||
|
|
||||||
|
class NoResponse(AbortException):
|
||||||
|
|
||||||
|
"""BACpypes specific.
|
||||||
|
"""
|
||||||
|
|
||||||
|
abortReason = 'noResponse'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user