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, p3_client_physical = DEFAULT_P3_CLIENT, p3_client_functional = DEFAULT_P3_CLIENT, 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 p3_client_physical: Value of P3Client_Phys time parameter. :param p3_client_functional: Value of P3Client_Func time parameter. :param p6_client_timeout: Timeout value for P6Client parameter. :param p6_ext_client_timeout: Timeout value for P6*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_P2_EXT_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 5050 Default value of :ref:`P2*Client ` timeout. .. py:attribute:: DEFAULT_P3_CLIENT :type: uds.utilities.TimeMillisecondsAlias :value: 100 Default value of :ref:`P3Client ` time parameters. .. py:attribute:: DEFAULT_P6_CLIENT_TIMEOUT :type: uds.utilities.TimeMillisecondsAlias :value: 10000 Default value of :ref:`P6Client ` 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: 10 Default value of receiving task cycle. .. py:attribute:: tester_present_storage_size :value: 5 Tester Present records number to store. .. 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:: __p2_client_timeout :value: 100 .. py:attribute:: __p2_ext_client_timeout :value: 5050 .. py:attribute:: __p3_client_physical :value: 100 .. py:attribute:: __p3_client_functional :value: 100 .. py:attribute:: __p6_client_timeout :value: 10000 .. py:attribute:: __p6_ext_client_timeout :value: 50000 .. py:attribute:: __s3_client :value: 2000 .. 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:: p3_client_physical :type: uds.utilities.TimeMillisecondsAlias Get value of :ref:`P3Client_Phys ` parameter. .. py:property:: p3_client_functional :type: uds.utilities.TimeMillisecondsAlias Get value of :ref:`P3Client_Func ` 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:: __tester_present_task_event :type: threading.Event .. py:attribute:: __tester_present_thread :type: Optional[threading.Thread] :value: None .. py:attribute:: __background_receiving_task_event :type: threading.Event .. py:attribute:: __break_in_background_receiving_event :type: threading.Event .. py:attribute:: __background_receiving_thread :type: Optional[threading.Thread] :value: None .. py:attribute:: __send_and_receive_not_in_progress_event :type: threading.Event .. py:attribute:: __receiving_not_in_progress_event :type: threading.Event .. py:attribute:: __transmission_not_in_progress_event :type: threading.Event .. py:attribute:: __receiving_lock :type: threading.Lock .. py:attribute:: __transmission_lock :type: threading.Lock .. py:attribute:: __physical_transmission_lock :type: threading.Lock .. py:attribute:: __functional_transmission_lock :type: threading.Lock .. py:attribute:: __response_queue :type: queue.Queue[uds.message.UdsMessageRecord] .. py:attribute:: __last_physical_request :type: Optional[uds.message.UdsMessageRecord] :value: None .. py:attribute:: __last_physical_response :type: Optional[uds.message.UdsMessageRecord] :value: None .. py:attribute:: __last_functional_request :type: Optional[uds.message.UdsMessageRecord] :value: None .. py:attribute:: __last_functional_response :type: Optional[uds.message.UdsMessageRecord] :value: None .. py:attribute:: __last_tester_present_requests :type: List[uds.message.UdsMessageRecord] :value: [] .. 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:: last_sent_tester_present_requests :type: Tuple[uds.message.UdsMessageRecord, Ellipsis] Get records with the last few request with Tester Present messages. .. py:property:: last_sent_request :type: Optional[uds.message.UdsMessageRecord] Get record with the last request message sent. .. py:property:: last_received_response :type: Optional[uds.message.UdsMessageRecord] Get record with the last response message sent. .. warning:: Only the final response for the request messages can be found here. No Negative Responses with Response Pending NRC (0x78), neither cyclic responses (e.g. following ResponseOnEvent or ReadDataByPeriodicIdentifier responses). .. py:property:: is_background_receiving :type: bool Get flag whether background receiving thread is running. .. py:property:: is_tester_present_sent :type: bool Get flag whether Tester Present thread is running periodic sending. .. py:property:: is_ready_for_physical_transmission :type: bool Get flag whether Client is ready for physically addressed request message transmission. :return: True if no message is currently transmitted or received and the last physically addressed request was either received or timed-out (P2, P3 or P6), False otherwise. .. py:property:: is_ready_for_functional_transmission :type: bool Get flag whether Client is ready for functionally addressed request message transmission. :return: True if no message is currently transmitted and P3Client_Func timeout was exceeded for the last functionally addressed request. .. 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:: __receiving_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_request) Schedule a single Tester Present message transmission for a cyclic sending. :param tester_present_request: Tester Present request message to send. .. py:method:: _update_last_response(response_record) Update the last response messages received by the Client. :param response_record: Recently received response record. .. 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:: _send_request(request) Send UDS Request Message in a threadsafe way. :param request: Request message to send. :return: Record of the request message that was sent. .. py:method:: _receive_response(start_timeout, end_timeout) Receive UDS response message to previously sent request. :param start_timeout: Maximal time (in milliseconds) to wait for the start of the message reception. :param end_timeout: Maximal time (in milliseconds) to wait for the end of the message reception. :return: Record with response message received to the last UDS request message sent. .. py:method:: _receive_initial_response(request_record) Receive the first UDS response to a request message. :param request_record: Request message to which response is collected. :raise TimeoutError: Either P2Client or P6Client timeout was exceeded. :return: Received UDS Response Message. None if legitimately (either Functionally addressed request or with SPRMIB set) no response was received. .. py:method:: _receive_following_response(request_record, previous_response_record) Receive the following (not the first one) UDS response to a request message. :param request_record: Request message to which response is collected. :param previous_response_record: Record of the proceeding UDS response. :raise TimeoutError: Either P2*Client or P6*Client timeout was exceeded. :return: Received UDS Response Message. .. py:method:: is_response_pending_message(response_message, request_sid) :staticmethod: Check if provided UDS message is Response Pending Message to a diagnostic service of given SID. :param response_message: UDS Message to check. :param request_sid: SID value of the proceeding UDS request message. :raise TypeError: Provided value is neither instance of UdsMessage nor UdsMessageRecord class. :return: True if provided UDS message is a Negative Response Message (with Response Pending NRC) to a diagnostic service of given SID, False otherwise. .. py:method:: is_response_to_request(response_message, request_message) Check if provided UDS message is a response message to a diagnostic service of given SID. :param response_message: UDS Message to check. :param request_message: UDS Request Message. :raise TypeError: Provided value is neither instance of UdsMessage nor UdsMessageRecord class. :return: True if provided UDS message is a response message to a diagnostic service of given SID, False otherwise. .. py:method:: wait_till_ready_for_physical_transmission() Wait till the client is ready to transmit physically addressed request message. .. py:method:: wait_till_ready_for_functional_transmission() Wait till the client is ready to transmit functionally addressed request message. .. py:method:: wait_till_ready_for_transmission(request) Wait till the client is ready for transmitting given request message. :param request: Request message to send. .. 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_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:: start_background_receiving(cycle = DEFAULT_RECEIVING_TASK_CYCLE) Start background receiving task. ..note:: 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. .. py:method:: stop_background_receiving() Stop background receiving task. .. 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