uds.client ========== .. py:module:: uds.client .. autoapi-nested-parse:: Implementation for :ref:`UDS Client ` Simulation. Classes ------- .. autoapisummary:: uds.client.Client Module Contents --------------- .. py:class:: Client(transport_interface, p2_client_timeout = DEFAULT_P2_CLIENT_TIMEOUT, p2_ext_client_timeout = DEFAULT_P2_EXT_CLIENT_TIMEOUT, p6_client_timeout = DEFAULT_P6_CLIENT_TIMEOUT, p6_ext_client_timeout = DEFAULT_P6_EXT_CLIENT_TIMEOUT, s3_client = DEFAULT_S3_CLIENT) Simulation for UDS Client entity. Configure Client for UDS communication. :param transport_interface: Transport Interface object for managing UDS communication. :param p2_client_timeout: Timeout value for P2Client parameter. :param p2_ext_client_timeout: Timeout value for P2*Client parameter. :param p6_client_timeout: Timeout value for P6Client parameter. :param p6_ext_client_timeout: Timeout value for P*Client parameter. :param s3_client: Value of S3Client time parameter. .. py:attribute:: DEFAULT_P2_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 100 Default value of :ref:`P2Client ` timeout. .. py:attribute:: DEFAULT_P6_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 10000 Default value of :ref:`P6Client ` timeout. .. py:attribute:: DEFAULT_P2_EXT_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 5050 Default value of :ref:`P2*Client ` timeout. .. py:attribute:: DEFAULT_P6_EXT_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 50000 Default value of :ref:`P6*Client ` timeout. .. py:attribute:: DEFAULT_S3_CLIENT :type: uds.utilities.TimeMillisecondsAlias :value: 2000 Default value of :ref:`S3Client ` time parameter. .. py:attribute:: DEFAULT_RECEIVING_TASK_CYCLE :type: uds.utilities.TimeMillisecondsAlias :value: 20 Default value of receiving task cycle. .. py:property:: transport_interface :type: uds.transport_interface.AbstractTransportInterface Get Transport Interface used. .. py:property:: p2_client_timeout :type: uds.utilities.TimeMillisecondsAlias Get timeout value for :ref:`P2Client ` parameter. .. py:property:: p2_ext_client_timeout :type: uds.utilities.TimeMillisecondsAlias Get timeout value for :ref:`P2*Client ` parameter. .. py:property:: p6_client_timeout :type: uds.utilities.TimeMillisecondsAlias Get timeout value for :ref:`P6Client ` parameter. .. py:property:: p6_ext_client_timeout :type: uds.utilities.TimeMillisecondsAlias Get timeout value for :ref:`P6*Client ` parameter. .. py:property:: s3_client :type: uds.utilities.TimeMillisecondsAlias Get value of :ref:`S3Client ` parameter. .. py:attribute:: __p2_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] :value: None .. py:attribute:: __p2_ext_client_measured :type: Optional[Tuple[uds.utilities.TimeMillisecondsAlias, Ellipsis]] :value: None .. py:attribute:: __p6_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] :value: None .. py:attribute:: __p6_ext_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] :value: None .. py:attribute:: __response_queue :type: queue.SimpleQueue[uds.message.UdsMessageRecord] .. py:attribute:: __receiving_thread :type: Optional[threading.Thread] :value: None .. py:attribute:: __receiving_stop_event :type: threading.Event .. py:attribute:: __receiving_break_event :type: threading.Event .. py:attribute:: __receiving_not_in_progress :type: threading.Event .. py:attribute:: __tester_present_thread :type: Optional[threading.Thread] :value: None .. py:attribute:: __tester_present_stop_event :type: threading.Event .. py:method:: __del__() Safely finish all tasks. .. py:property:: p2_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] Get last measured value of P2Client parameter. :return: The last measured value or None if measurement was not performed. .. py:property:: p2_ext_client_measured :type: Optional[Tuple[uds.utilities.TimeMillisecondsAlias, Ellipsis]] Get last measured values of P2*Client parameter. :return: The last measured values or None if measurement was not performed. .. py:property:: p6_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] Get last measured value of P6Client parameter. :return: The last measured value or None if measurement was not performed. .. py:property:: p6_ext_client_measured :type: Optional[uds.utilities.TimeMillisecondsAlias] Get last measured value of P6*Client parameter. :return: The last measured value or None if measurement was not performed. .. py:property:: is_receiving :type: bool Get flag whether receiving thread is running. .. py:property:: is_tester_present_sent :type: bool Get flag whether Tester Present thread is running periodic sending. .. py:method:: _update_p2_client_measured(value) Update measured values of P2Client parameter. :param value: Value to set. :raise TypeError: Provided value is not int or float type. :raise ValueError: Provided time value must be a positive number. .. py:method:: _update_p2_ext_client_measured(*values) Update measured values of P2*Client parameter. :param values: Values to set. :raise RuntimeError: At least one P2*Client value must be provided. :raise TypeError: One of provided values is not int or float type. :raise ValueError: One of provided values is out of range. .. py:method:: _update_p6_client_measured(value) Update measured values of P6Client parameter. :param value: Value to set. :raise TypeError: Provided value is not int or float type. :raise ValueError: Provided time value must be a positive number. .. py:method:: _update_p6_ext_client_measured(value) Update measured values of P6*Client parameter. :param value: Value to set. :raise TypeError: Provided value is not int or float type. :raise ValueError: Provided time value must be a positive number. .. py:method:: _update_measured_client_values(request_record, response_records) Update measured timing parameters on Client side (P2Client, P2*Client, P6Client and P6*Client). :param request_record: Record of the last transmitted request message. :param response_records: Records of received responses to provided message. .. py:method:: _receive_response(sid, start_timeout, end_timeout) Receive UDS response message to previously sent request. :param sid: SID of the last sent request message. :param start_timeout: Maximal time (in milliseconds) to wait. :return: Record with response message received to the last UDS request message sent. None if a timeout was reached. .. py:method:: _receive_task(cycle) Schedule reception of a UDS message for a cyclic response collecting. :param cycle: Time (in milliseconds) used for this task cycle. .. py:method:: _send_tester_present_task(tester_present_message) Schedule a single Tester Present message transmission for a cyclic sending. :param tester_present_message: Tester Present message to send. .. py:method:: is_response_pending_message(message, request_sid) :staticmethod: Check if provided UDS message record contains Negative Response with Response Pending NRC. :param message: UDS Message Record to check. :param request_sid: Request SID value sent in the proceeding UDS request message. :raise TypeError: Provided message value is not an instance of UdsMessageRecord class. :return: True if provided UDS message record contains Negative Response with Response Pending NRC, False otherwise. .. py:method:: get_response(timeout = None) Wait for the first received response message. .. note:: This method can be used for fetching responses messages that were not direct responses to request messages sent via :meth:`~uds.client.Client.send_request_receive_responses`. This includes responses to cyclically sent Tester Present. Typically used for fetching following :ref:`Response on Event (RSID 0xC6) ` responses. :param timeout: Maximal time to wait for a response message. Leave None to wait forever. :raise TypeError: Provided value is not int or float type. :raise ValueError: Provided value is out of range. :return: Record with the first response message received or None if no message was received. .. py:method:: get_response_no_wait() Get the first received response message, but do not wait for its arrival. .. note:: This method can be used for fetching responses messages that were not direct responses to request messages sent via :meth:`~uds.client.Client.send_request_receive_responses`. This includes responses to cyclically sent Tester Present. Typically used for fetching following :ref:`Response on Event (RSID 0xC6) ` responses. :return: Record with the first response message received or None if no message was received. .. py:method:: clear_response_queue() Clear all response messages that are currently stored in the queue. .. py:method:: start_receiving(cycle = DEFAULT_RECEIVING_TASK_CYCLE) Start receiving task in the background. All response messages sent to this Client while receiving is active, will be collected and accessible via :meth:`~uds.client.Client.get_response` and :meth:`~uds.client.Client.get_response_no_wait` methods. .. warning:: Cycle value would be overwritten with default value if request message is sent while receiving. .. py:method:: stop_receiving() Stop receiving task. .. py:method:: start_tester_present(addressing_type = AddressingType.FUNCTIONAL, sprmib = True) Start sending Tester Present cyclically. :param addressing_type: Addressing Type to use for cyclical messages. :param sprmib: Whether to use Suppress Positive Response Message Indication Bit. .. py:method:: stop_tester_present() Stop sending Tester Present cyclically. .. py:method:: send_request_receive_responses(request) Send diagnostic request and receive all responses (till the final one). :param request: Request message to send. :raise TypeError: Provided value is not an instance of UdsMessage class. :raise TimeoutError: Response was initiated with Response Pending message, but never finalized. :return: Tuple with two elements: - record of diagnostic request message that was sent - tuple with diagnostic response messages that were received in the response