Source code for nixnet.database._ecu

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import typing  # NOQA: F401

from nixnet import _errors
from nixnet import _props
from nixnet import constants

from nixnet.database import _cluster
from nixnet.database import _database_object
from nixnet.database import _dbc_attributes
from nixnet.database import _frame


[docs]class Ecu(_database_object.DatabaseObject): """Database ECU""" def __init__( self, **kwargs # type: int ): # type: (...) -> None if not kwargs or '_handle' not in kwargs: raise TypeError() self._handle = kwargs['_handle'] self._dbc_attributes = None # type: typing.Optional[_dbc_attributes.DbcAttributeCollection] def __eq__(self, other): if isinstance(other, self.__class__): return self._handle == other._handle else: return NotImplemented def __ne__(self, other): result = self.__eq__(other) if result is NotImplemented: return result else: return not result def __hash__(self): return hash(self._handle) def __repr__(self): return '{}(handle={})'.format(type(self).__name__, self._handle)
[docs] def check_config_status(self): # type: () -> None """Check this ECU's configuration status. By default, incorrectly configured ECUs in the database are not returned from :any:`Cluster.ecus` because they cannot be used in the bus communication. You can change this behavior by setting :any:`Database.show_invalid_from_open` to `True`. When an ECU configuration status becomes invalid after the database is opened, the ECU still is returned from :any:`Cluster.ecus` even if :any:`Database.show_invalid_from_open` is `False`. Raises: :any:`XnetError`: The ECU is incorrectly configured. """ status_code = _props.get_ecu_config_status(self._handle) _errors.check_for_error(status_code)
@property def clst(self): # type: () -> _cluster.Cluster """:any:`Cluster`: Returns the parent cluster to which the ECU is connected. The parent cluster is determined when the ECU object is created. You cannot change it afterwards. """ handle = _props.get_ecu_clst_ref(self._handle) return _cluster.Cluster(_handle=handle) @property def comment(self): # type: () -> typing.Text """str: Get or set a comment describing the ECU object. A comment is a string containing up to 65535 characters. """ return _props.get_ecu_comment(self._handle) @comment.setter def comment(self, value): # type: (typing.Text) -> None _props.set_ecu_comment(self._handle, value) @property def dbc_attributes(self): # type: () -> _dbc_attributes.DbcAttributeCollection """:any:`DbcAttributeCollection`: Access the ECU's DBC attributes.""" if self._dbc_attributes is None: self._dbc_attributes = _dbc_attributes.DbcAttributeCollection(self._handle) return self._dbc_attributes @property def name(self): # type: () -> typing.Text """str: Get or set the name of the ECU object. Lowercase letters, uppercase letters, numbers, and the underscore (_) are valid characters for the short name. The space ( ), period (.), and other special characters are not supported within the name. The short name must begin with a letter (uppercase or lowercase) or underscore, and not a number. The short name is limited to 128 characters. An ECU name must be unique for all ECUs in a cluster. This short name does not include qualifiers to ensure that it is unique, such as the database and cluster name. It is for display purposes. """ return _props.get_ecu_name(self._handle) @name.setter def name(self, value): # type: (typing.Text) -> None _props.set_ecu_name(self._handle, value) @property def rx_frms(self): # type: () -> typing.Iterable[_frame.Frame] """list of :any:`Frame<_frame.Frame>`: Get or set a list of frames the ECU receives. This property defines all frames the ECU receives. All frames an ECU receives in a given cluster must be defined in the same cluster. """ for ref in _props.get_ecu_rx_frm_refs(self._handle): yield _frame.Frame(_handle=ref) @rx_frms.setter def rx_frms(self, value): # type: (typing.Iterable[_frame.Frame]) -> None handle_list = [frame._handle for frame in value] _props.set_ecu_rx_frm_refs(self._handle, handle_list) @property def tx_frms(self): # type: () -> typing.Iterable[_frame.Frame] """list of :any:`Frame<_frame.Frame>`: Get or set a list of frames the ECU transmits. This property defines all frames the ECU transmits. All frames an ECU transmits in a given cluster must be defined in the same cluster. """ for ref in _props.get_ecu_tx_frm_refs(self._handle): yield _frame.Frame(_handle=ref) @tx_frms.setter def tx_frms(self, value): # type: (typing.Iterable[_frame.Frame]) -> None frame_handles = [frame._handle for frame in value] _props.set_ecu_tx_frm_refs(self._handle, frame_handles) @property def flex_ray_is_coldstart(self): return _props.get_ecu_flex_ray_is_coldstart(self._handle) @property def flex_ray_startup_frame_ref(self): return _props.get_ecu_flex_ray_startup_frame_ref(self._handle) @property def flex_ray_wakeup_ptrn(self): return _props.get_ecu_flex_ray_wakeup_ptrn(self._handle) @flex_ray_wakeup_ptrn.setter def flex_ray_wakeup_ptrn(self, value): _props.set_ecu_flex_ray_wakeup_ptrn(self._handle, value) @property def flex_ray_wakeup_chs(self): return _props.get_ecu_flex_ray_wakeup_chs(self._handle) @flex_ray_wakeup_chs.setter def flex_ray_wakeup_chs(self, value): _props.set_ecu_flex_ray_wakeup_chs(self._handle, value) @property def flex_ray_connected_chs(self): return _props.get_ecu_flex_ray_connected_chs(self._handle) @flex_ray_connected_chs.setter def flex_ray_connected_chs(self, value): _props.set_ecu_flex_ray_connected_chs(self._handle, value) @property def lin_master(self): # type: () -> bool """bool: Get or set whether the ECU is a LIN master (``True``) or LIN slave (``False``).""" return _props.get_ecu_lin_master(self._handle) @lin_master.setter def lin_master(self, value): # type: (bool) -> None _props.set_ecu_lin_master(self._handle, value) @property def lin_protocol_ver(self): # type: () -> constants.LinProtocolVer """:any:`LinProtocolVer`: Get or set the version of the LIN standard this ECU uses.""" return constants.LinProtocolVer(_props.get_ecu_lin_protocol_ver(self._handle)) @lin_protocol_ver.setter def lin_protocol_ver(self, value): # type: (constants.LinProtocolVer) -> None _props.set_ecu_lin_protocol_ver(self._handle, value.value) @property def lin_initial_nad(self): # type: () -> int """int: Get or set the initial NAD of a LIN slave node. NAD is the address of a slave node and is used in diagnostic services. Initial NAD is replaced by configured NAD with node configuration services. .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_initial_nad(self._handle) @lin_initial_nad.setter def lin_initial_nad(self, value): # type: (int) -> None _props.set_ecu_lin_initial_nad(self._handle, value) @property def lin_config_nad(self): # type: () -> int """int: Get or set the configured NAD of a LIN slave node. NAD is the address of a slave node and is used in diagnostic services. Initial NAD is replaced by configured NAD with node configuration services. .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_config_nad(self._handle) @lin_config_nad.setter def lin_config_nad(self, value): # type: (int) -> None _props.set_ecu_lin_config_nad(self._handle, value) @property def lin_supplier_id(self): # type: () -> int """int: Get or set the supplier ID. Supplier ID is a 16-bit value identifying the supplier of the LIN node (ECU). .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_supplier_id(self._handle) @lin_supplier_id.setter def lin_supplier_id(self, value): # type: (int) -> None _props.set_ecu_lin_supplier_id(self._handle, value) @property def lin_function_id(self): # type: () -> int """int: Get or set the function ID. Function ID is a 16-bit value identifying the function of the LIN node (ECU). .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_function_id(self._handle) @lin_function_id.setter def lin_function_id(self, value): # type: (int) -> None _props.set_ecu_lin_function_id(self._handle, value) @property def lin_p2_min(self): # type: () -> float """float: Get or set the minimum time in seconds between frame reception and node response. This is the minimum time between reception of the last frame of the diagnostic request and the response sent by the node. .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_p2_min(self._handle) @lin_p2_min.setter def lin_p2_min(self, value): # type (float) -> None _props.set_ecu_lin_p2_min(self._handle, value) @property def lin_st_min(self): # type: () -> float """float: Get or set the minimum time in seconds for node preparation. This is the minimum time the node requires to prepare for the next frame of the diagnostic service. .. warning:: This property is not saved in the FIBEX database. You can import it only from an LDF file. """ return _props.get_ecu_lin_st_min(self._handle) @lin_st_min.setter def lin_st_min(self, value): # type (float) -> None _props.set_ecu_lin_st_min(self._handle, value) @property def j1939_preferred_address(self): # type: () -> int """int: Get or set the preferred J1939 node address to be used when simulating this ECU. If you assign this ECU to an XNET session (`j1939.set_ecu`), XNET will start address claiming for this address using :any:`Ecu.j1939_node_name` and use the address for the session when the address is granted. """ return _props.get_ecu_j1939_preferred_address(self._handle) @j1939_preferred_address.setter def j1939_preferred_address(self, value): # type: (int) -> None _props.set_ecu_j1939_preferred_address(self._handle, value) @property def j1939_node_name(self): # type: () -> int """int: Get or set the preferred J1939 node address to be used when simulating this ECU. If you assign this ECU to an XNET session (`j1939.set_ecu`), XNET will start address claiming for this address using this node name and :any:`Ecu.j1939_preferred_address`. """ return _props.get_ecu_j1939_node_name(self._handle) @j1939_node_name.setter def j1939_node_name(self, value): # type: (int) -> None _props.set_ecu_j1939_node_name(self._handle, value)