# A CAN bus node (or Board unit)
from typing import Optional
from cantools.database.can.formats.arxml.node_specifics import (
AutosarNodeSpecifics,
)
from cantools.database.can.formats.dbc_specifics import DbcSpecifics
from ...typechecking import Comments
[docs]
class Node:
"""An NODE on the CAN bus.
"""
def __init__(self,
name: str,
comment: str | Comments | None = None,
dbc_specifics: Optional["DbcSpecifics"] = None,
autosar_specifics: Optional["AutosarNodeSpecifics"] = None,
) -> None:
self._name = name
# If the 'comment' argument is a string, we assume that is an
# English comment. This is slightly hacky, because the
# function's behavior depends on the type of the passed
# argument, but it is quite convenient...
self._comments: Comments | None
if isinstance(comment, str):
# use the first comment in the dictionary as "The" comment
self._comments = Comments({None: comment})
else:
# assume that we have either no comment at all or a
# multi-lingual dictionary
self._comments = comment
self._dbc = dbc_specifics or DbcSpecifics()
self._autosar = autosar_specifics or AutosarNodeSpecifics()
@property
def name(self) -> str:
"""The node name as a string.
"""
return self._name
@name.setter
def name(self, value: str) -> None:
self._name = value
@property
def comment(self) -> str | None:
"""The node's comment, or ``None`` if unavailable.
Note that we implicitly try to return the English comment if
multiple languages were specified.
"""
if self._comments is None:
return None
elif self._comments.get(None) is not None:
return self._comments.get(None)
elif self._comments.get("FOR-ALL") is not None:
return self._comments.get("FOR-ALL")
return self._comments.get('EN')
@comment.setter
def comment(self, value: str | None) -> None:
self._comment = value
@property
def comments(self) -> Comments | None:
"""The dictionary with the descriptions of the bus in multiple
languages. ``None`` if unavailable.
"""
return self._comments
@property
def dbc(self) -> DbcSpecifics:
"""An object containing dbc specific properties like e.g. attributes.
"""
return self._dbc
@dbc.setter
def dbc(self, value: DbcSpecifics) -> None:
self._dbc = value
@property
def autosar(self) -> AutosarNodeSpecifics:
"""An object containing AUTOSAR specific properties of the node.
"""
return self._autosar
@autosar.setter
def autosar(self, value: AutosarNodeSpecifics) -> None:
self._autosar = value
def __repr__(self) -> str:
return "node('{}', {})".format(
self._name,
"'" + self.comment + "'" if self.comment is not None else None)