uds.client

Implementation for UDS Client Simulation.

Classes

Client

Simulation for UDS Client entity.

Module Contents

class uds.client.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)[source]

Simulation for UDS Client entity.

Configure Client for UDS communication.

Parameters:
  • transport_interface (uds.transport_interface.AbstractTransportInterface) – Transport Interface object for managing UDS communication.

  • p2_client_timeout (uds.utilities.TimeMillisecondsAlias) – Timeout value for P2Client parameter.

  • p2_ext_client_timeout (uds.utilities.TimeMillisecondsAlias) – Timeout value for P2*Client parameter.

  • p3_client_physical (uds.utilities.TimeMillisecondsAlias) – Value of P3Client_Phys time parameter.

  • p3_client_functional (uds.utilities.TimeMillisecondsAlias) – Value of P3Client_Func time parameter.

  • p6_client_timeout (uds.utilities.TimeMillisecondsAlias) – Timeout value for P6Client parameter.

  • p6_ext_client_timeout (uds.utilities.TimeMillisecondsAlias) – Timeout value for P6*Client parameter.

  • s3_client (uds.utilities.TimeMillisecondsAlias) – Value of S3Client time parameter.

DEFAULT_P2_CLIENT_TIMEOUT: uds.utilities.TimeMillisecondsAlias = 100

Default value of P2Client timeout.

DEFAULT_P2_EXT_CLIENT_TIMEOUT: uds.utilities.TimeMillisecondsAlias = 5050

Default value of P2*Client timeout.

DEFAULT_P3_CLIENT: uds.utilities.TimeMillisecondsAlias = 100

Default value of P3Client time parameters.

DEFAULT_P6_CLIENT_TIMEOUT: uds.utilities.TimeMillisecondsAlias = 10000

Default value of P6Client timeout.

DEFAULT_P6_EXT_CLIENT_TIMEOUT: uds.utilities.TimeMillisecondsAlias = 50000

Default value of P6*Client timeout.

DEFAULT_S3_CLIENT: uds.utilities.TimeMillisecondsAlias = 2000

Default value of S3Client time parameter.

DEFAULT_RECEIVING_TASK_CYCLE: uds.utilities.TimeMillisecondsAlias = 10

Default value of receiving task cycle.

tester_present_storage_size = 5

Tester Present records number to store.

__p2_client_measured: uds.utilities.TimeMillisecondsAlias | None = None
__p2_ext_client_measured: Tuple[uds.utilities.TimeMillisecondsAlias, Ellipsis] | None = None
__p6_client_measured: uds.utilities.TimeMillisecondsAlias | None = None
__p6_ext_client_measured: uds.utilities.TimeMillisecondsAlias | None = None
__p2_client_timeout = 100
__p2_ext_client_timeout = 5050
__p3_client_physical = 100
__p3_client_functional = 100
__p6_client_timeout = 10000
__p6_ext_client_timeout = 50000
__s3_client = 2000
property transport_interface: uds.transport_interface.AbstractTransportInterface

Get Transport Interface used.

Return type:

uds.transport_interface.AbstractTransportInterface

property p2_client_timeout: uds.utilities.TimeMillisecondsAlias

Get timeout value for P2Client parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property p2_ext_client_timeout: uds.utilities.TimeMillisecondsAlias

Get timeout value for P2*Client parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property p3_client_physical: uds.utilities.TimeMillisecondsAlias

Get value of P3Client_Phys parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property p3_client_functional: uds.utilities.TimeMillisecondsAlias

Get value of P3Client_Func parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property p6_client_timeout: uds.utilities.TimeMillisecondsAlias

Get timeout value for P6Client parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property p6_ext_client_timeout: uds.utilities.TimeMillisecondsAlias

Get timeout value for P6*Client parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

property s3_client: uds.utilities.TimeMillisecondsAlias

Get value of S3Client parameter.

Return type:

uds.utilities.TimeMillisecondsAlias

__tester_present_task_event: threading.Event
__tester_present_thread: threading.Thread | None = None
__background_receiving_task_event: threading.Event
__break_in_background_receiving_event: threading.Event
__background_receiving_thread: threading.Thread | None = None
__send_and_receive_not_in_progress_event: threading.Event
__receiving_not_in_progress_event: threading.Event
__transmission_not_in_progress_event: threading.Event
__receiving_lock: threading.Lock
__transmission_lock: threading.Lock
__physical_transmission_lock: threading.Lock
__functional_transmission_lock: threading.Lock
__response_queue: queue.Queue[uds.message.UdsMessageRecord]
__last_physical_request: uds.message.UdsMessageRecord | None = None
__last_physical_response: uds.message.UdsMessageRecord | None = None
__last_functional_request: uds.message.UdsMessageRecord | None = None
__last_functional_response: uds.message.UdsMessageRecord | None = None
__last_tester_present_requests: List[uds.message.UdsMessageRecord] = []
__del__()[source]

Safely finish all tasks.

Return type:

None

property p2_client_measured: uds.utilities.TimeMillisecondsAlias | None

Get last measured value of P2Client parameter.

Returns:

The last measured value or None if measurement was not performed.

Return type:

Optional[uds.utilities.TimeMillisecondsAlias]

property p2_ext_client_measured: Tuple[uds.utilities.TimeMillisecondsAlias, Ellipsis] | None

Get last measured values of P2*Client parameter.

Returns:

The last measured values or None if measurement was not performed.

Return type:

Optional[Tuple[uds.utilities.TimeMillisecondsAlias, Ellipsis]]

property p6_client_measured: uds.utilities.TimeMillisecondsAlias | None

Get last measured value of P6Client parameter.

Returns:

The last measured value or None if measurement was not performed.

Return type:

Optional[uds.utilities.TimeMillisecondsAlias]

property p6_ext_client_measured: uds.utilities.TimeMillisecondsAlias | None

Get last measured value of P6*Client parameter.

Returns:

The last measured value or None if measurement was not performed.

Return type:

Optional[uds.utilities.TimeMillisecondsAlias]

property last_sent_tester_present_requests: Tuple[uds.message.UdsMessageRecord, Ellipsis]

Get records with the last few request with Tester Present messages.

Return type:

Tuple[uds.message.UdsMessageRecord, Ellipsis]

property last_sent_request: uds.message.UdsMessageRecord | None

Get record with the last request message sent.

Return type:

Optional[uds.message.UdsMessageRecord]

property last_received_response: uds.message.UdsMessageRecord | None

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).

Return type:

Optional[uds.message.UdsMessageRecord]

property is_background_receiving: bool

Get flag whether background receiving thread is running.

Return type:

bool

property is_tester_present_sent: bool

Get flag whether Tester Present thread is running periodic sending.

Return type:

bool

property is_ready_for_physical_transmission: bool

Get flag whether Client is ready for physically addressed request message transmission.

Returns:

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.

Return type:

bool

property is_ready_for_functional_transmission: bool

Get flag whether Client is ready for functionally addressed request message transmission.

Returns:

True if no message is currently transmitted and P3Client_Func timeout was exceeded for the last functionally addressed request.

Return type:

bool

__update_p2_client_measured(value)

Update measured values of P2Client parameter.

Parameters:

value (uds.utilities.TimeMillisecondsAlias) – Value to set.

Raises:
  • TypeError – Provided value is not int or float type.

  • ValueError – Provided time value must be a positive number.

Return type:

None

__update_p2_ext_client_measured(*values)

Update measured values of P2*Client parameter.

Parameters:

values (uds.utilities.TimeMillisecondsAlias) – Values to set.

Raises:
  • RuntimeError – At least one P2*Client value must be provided.

  • TypeError – One of provided values is not int or float type.

  • ValueError – One of provided values is out of range.

Return type:

None

__update_p6_client_measured(value)

Update measured values of P6Client parameter.

Parameters:

value (uds.utilities.TimeMillisecondsAlias) – Value to set.

Raises:
  • TypeError – Provided value is not int or float type.

  • ValueError – Provided time value must be a positive number.

Return type:

None

__update_p6_ext_client_measured(value)

Update measured values of P6*Client parameter.

Parameters:

value (uds.utilities.TimeMillisecondsAlias) – Value to set.

Raises:
  • TypeError – Provided value is not int or float type.

  • ValueError – Provided time value must be a positive number.

Return type:

None

__receiving_task(cycle)

Schedule reception of a UDS message for a cyclic response collecting.

Parameters:

cycle (uds.utilities.TimeMillisecondsAlias) – Time (in milliseconds) used for this task cycle.

Return type:

None

__send_tester_present_task(tester_present_request)

Schedule a single Tester Present message transmission for a cyclic sending.

Parameters:

tester_present_request (uds.message.UdsMessage) – Tester Present request message to send.

Return type:

None

_update_last_response(response_record)[source]

Update the last response messages received by the Client.

Parameters:

response_record (uds.message.UdsMessageRecord) – Recently received response record.

Return type:

None

_update_measured_client_values(request_record, response_records)[source]

Update measured timing parameters on Client side (P2Client, P2*Client, P6Client and P6*Client).

Parameters:
  • request_record (uds.message.UdsMessageRecord) – Record of the last transmitted request message.

  • response_records (Sequence[uds.message.UdsMessageRecord]) – Records of received responses to provided message.

Return type:

None

_send_request(request)[source]

Send UDS Request Message in a threadsafe way.

Parameters:

request (uds.message.UdsMessage) – Request message to send.

Returns:

Record of the request message that was sent.

Return type:

uds.message.UdsMessageRecord

_receive_response(start_timeout, end_timeout)[source]

Receive UDS response message to previously sent request.

Parameters:
  • start_timeout (uds.utilities.TimeMillisecondsAlias) – Maximal time (in milliseconds) to wait for the start of the message reception.

  • end_timeout (uds.utilities.TimeMillisecondsAlias) – Maximal time (in milliseconds) to wait for the end of the message reception.

Returns:

Record with response message received to the last UDS request message sent.

Return type:

uds.message.UdsMessageRecord

_receive_initial_response(request_record)[source]

Receive the first UDS response to a request message.

Parameters:

request_record (uds.message.UdsMessageRecord) – Request message to which response is collected.

Raises:

TimeoutError – Either P2Client or P6Client timeout was exceeded.

Returns:

Received UDS Response Message. None if legitimately (either Functionally addressed request or with SPRMIB set) no response was received.

Return type:

Optional[uds.message.UdsMessageRecord]

_receive_following_response(request_record, previous_response_record)[source]

Receive the following (not the first one) UDS response to a request message.

Parameters:
  • request_record (uds.message.UdsMessageRecord) – Request message to which response is collected.

  • previous_response_record (uds.message.UdsMessageRecord) – Record of the proceeding UDS response.

Raises:

TimeoutError – Either P2*Client or P6*Client timeout was exceeded.

Returns:

Received UDS Response Message.

Return type:

uds.message.UdsMessageRecord

static is_response_pending_message(response_message, request_sid)[source]

Check if provided UDS message is Response Pending Message to a diagnostic service of given SID.

Parameters:
  • response_message (Union[uds.message.UdsMessage, uds.message.UdsMessageRecord]) – UDS Message to check.

  • request_sid (uds.message.RequestSID) – SID value of the proceeding UDS request message.

Raises:

TypeError – Provided value is neither instance of UdsMessage nor UdsMessageRecord class.

Returns:

True if provided UDS message is a Negative Response Message (with Response Pending NRC) to a diagnostic service of given SID, False otherwise.

Return type:

bool

is_response_to_request(response_message, request_message)[source]

Check if provided UDS message is a response message to a diagnostic service of given SID.

Parameters:
  • response_message (Union[uds.message.UdsMessage, uds.message.UdsMessageRecord]) – UDS Message to check.

  • request_message (Union[uds.message.UdsMessage, uds.message.UdsMessageRecord]) – UDS Request Message.

Raises:

TypeError – Provided value is neither instance of UdsMessage nor UdsMessageRecord class.

Returns:

True if provided UDS message is a response message to a diagnostic service of given SID, False otherwise.

Return type:

bool

wait_till_ready_for_physical_transmission()[source]

Wait till the client is ready to transmit physically addressed request message.

Return type:

None

wait_till_ready_for_functional_transmission()[source]

Wait till the client is ready to transmit functionally addressed request message.

Return type:

None

wait_till_ready_for_transmission(request)[source]

Wait till the client is ready for transmitting given request message.

Parameters:

request (uds.message.UdsMessage) – Request message to send.

Return type:

None

get_response(timeout=None)[source]

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 send_request_receive_responses().

This includes responses to cyclically sent Tester Present. Typically used for fetching following Response on Event (RSID 0xC6) responses.

Parameters:

timeout (Optional[uds.utilities.TimeMillisecondsAlias]) – Maximal time to wait for a response message. Leave None to wait forever.

Raises:
  • TypeError – Provided value is not int or float type.

  • ValueError – Provided value is out of range.

Returns:

Record with the first response message received or None if no message was received.

Return type:

Optional[uds.message.UdsMessageRecord]

get_response_no_wait()[source]

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 send_request_receive_responses().

This includes responses to cyclically sent Tester Present. Typically used for fetching following Response on Event (RSID 0xC6) responses.

Returns:

Record with the first response message received or None if no message was received.

Return type:

Optional[uds.message.UdsMessageRecord]

clear_response_queue()[source]

Clear all response messages that are currently stored in the queue.

Return type:

None

start_tester_present(addressing_type=AddressingType.FUNCTIONAL, sprmib=True)[source]

Start sending Tester Present cyclically.

Parameters:
  • addressing_type (uds.addressing.AddressingType) – Addressing Type to use for cyclical messages.

  • sprmib (bool) – Whether to use Suppress Positive Response Message Indication Bit.

Return type:

None

stop_tester_present()[source]

Stop sending Tester Present cyclically.

Return type:

None

start_background_receiving(cycle=DEFAULT_RECEIVING_TASK_CYCLE)[source]

Start background receiving task.

..note:: All response messages sent to this Client while receiving is active,

will be collected and accessible via get_response() and get_response_no_wait() methods.

Parameters:

cycle (uds.utilities.TimeMillisecondsAlias)

Return type:

None

stop_background_receiving()[source]

Stop background receiving task.

Return type:

None

send_request_receive_responses(request)[source]

Send diagnostic request and receive all responses (till the final one).

Parameters:

request (uds.message.UdsMessage) – Request message to send.

Raises:
  • TypeError – Provided value is not an instance of UdsMessage class.

  • TimeoutError – Response was initiated with Response Pending message, but never finalized.

Returns:

Tuple with two elements:

  • record of diagnostic request message that was sent

  • tuple with diagnostic response messages that were received in the response

Return type:

Tuple[uds.message.UdsMessageRecord, Tuple[uds.message.UdsMessageRecord, Ellipsis]]