File: exceptions.py

package info (click to toggle)
python-can 4.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,372 kB
  • sloc: python: 25,840; makefile: 38; sh: 20
file content (106 lines) | stat: -rw-r--r-- 4,839 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
from abc import ABC, abstractmethod
from typing import Dict

from can import CanError

from .constants import ReturnCode


class UcanException(CanError, ABC):
    """Base class for USB can errors."""

    def __init__(self, result, func, arguments):
        self.result = result
        self.func = func
        self.arguments = arguments

        message = self._error_message_mapping.get(result, "unknown")
        super().__init__(
            message=f"Function {func.__name__} (called with {arguments}): {message}",
            error_code=result.value,
        )

    @property
    @abstractmethod
    def _error_message_mapping(self) -> Dict[ReturnCode, str]: ...


class UcanError(UcanException):
    """Exception class for errors from USB-CAN-library."""

    _ERROR_MESSAGES = {
        ReturnCode.ERR_RESOURCE: "could not created a resource (memory, handle, ...)",
        ReturnCode.ERR_MAXMODULES: "the maximum number of opened modules is reached",
        ReturnCode.ERR_HWINUSE: "the specified module is already in use",
        ReturnCode.ERR_ILLVERSION: "the software versions of the module and library are incompatible",
        ReturnCode.ERR_ILLHW: "the module with the specified device number is not connected "
        "(or used by an other application)",
        ReturnCode.ERR_ILLHANDLE: "wrong USB-CAN-Handle handed over to the function",
        ReturnCode.ERR_ILLPARAM: "wrong parameter handed over to the function",
        ReturnCode.ERR_BUSY: "instruction can not be processed at this time",
        ReturnCode.ERR_TIMEOUT: "no answer from module",
        ReturnCode.ERR_IOFAILED: "a request to the driver failed",
        ReturnCode.ERR_DLL_TXFULL: "a CAN message did not fit into the transmit buffer",
        ReturnCode.ERR_MAXINSTANCES: "maximum number of applications is reached",
        ReturnCode.ERR_CANNOTINIT: "CAN interface is not yet initialized",
        ReturnCode.ERR_DISCONECT: "USB-CANmodul was disconnected",
        ReturnCode.ERR_NOHWCLASS: "the needed device class does not exist",
        ReturnCode.ERR_ILLCHANNEL: "illegal CAN channel",
        ReturnCode.ERR_RESERVED1: "reserved",
        ReturnCode.ERR_ILLHWTYPE: "the API function can not be used with this hardware",
    }

    @property
    def _error_message_mapping(self) -> Dict[ReturnCode, str]:
        return UcanError._ERROR_MESSAGES


class UcanCmdError(UcanException):
    """Exception class for errors from firmware in USB-CANmodul."""

    _ERROR_MESSAGES = {
        ReturnCode.ERRCMD_NOTEQU: "the received response does not match to the transmitted command",
        ReturnCode.ERRCMD_REGTST: "no access to the CAN controller",
        ReturnCode.ERRCMD_ILLCMD: "the module could not interpret the command",
        ReturnCode.ERRCMD_EEPROM: "error while reading the EEPROM",
        ReturnCode.ERRCMD_RESERVED1: "reserved",
        ReturnCode.ERRCMD_RESERVED2: "reserved",
        ReturnCode.ERRCMD_RESERVED3: "reserved",
        ReturnCode.ERRCMD_ILLBDR: "illegal baud rate value specified in BTR0/BTR1 for systec "
        "USB-CANmoduls",
        ReturnCode.ERRCMD_NOTINIT: "CAN channel is not initialized",
        ReturnCode.ERRCMD_ALREADYINIT: "CAN channel is already initialized",
        ReturnCode.ERRCMD_ILLSUBCMD: "illegal sub-command specified",
        ReturnCode.ERRCMD_ILLIDX: "illegal index specified (e.g. index for cyclic CAN messages)",
        ReturnCode.ERRCMD_RUNNING: "cyclic CAN message(s) can not be defined because transmission of "
        "cyclic CAN messages is already running",
    }

    @property
    def _error_message_mapping(self) -> Dict[ReturnCode, str]:
        return UcanCmdError._ERROR_MESSAGES


class UcanWarning(UcanException):
    """Exception class for warnings, the function has been executed anyway."""

    _ERROR_MESSAGES = {
        ReturnCode.WARN_NODATA: "no CAN messages received",
        ReturnCode.WARN_SYS_RXOVERRUN: "overrun in receive buffer of the kernel driver",
        ReturnCode.WARN_DLL_RXOVERRUN: "overrun in receive buffer of the USB-CAN-library",
        ReturnCode.WARN_RESERVED1: "reserved",
        ReturnCode.WARN_RESERVED2: "reserved",
        ReturnCode.WARN_FW_TXOVERRUN: "overrun in transmit buffer of the firmware (but this CAN message "
        "was successfully stored in buffer of the ibrary)",
        ReturnCode.WARN_FW_RXOVERRUN: "overrun in receive buffer of the firmware (but this CAN message "
        "was successfully read)",
        ReturnCode.WARN_FW_TXMSGLOST: "reserved",
        ReturnCode.WARN_NULL_PTR: "pointer is NULL",
        ReturnCode.WARN_TXLIMIT: "not all CAN messages could be stored to the transmit buffer in "
        "USB-CAN-library",
        ReturnCode.WARN_BUSY: "reserved",
    }

    @property
    def _error_message_mapping(self) -> Dict[ReturnCode, str]:
        return UcanWarning._ERROR_MESSAGES