|
23 | 23 | from typing import Callable, Optional, Union, Dict, List, Any, cast, Type |
24 | 24 |
|
25 | 25 |
|
26 | | -class SessionTiming(TypedDict): |
| 26 | +class SessionTiming: |
| 27 | + """Container for server provided P2 & P2* timeouts.""" |
| 28 | + |
27 | 29 | p2_server_max: Optional[float] |
| 30 | + """P2 server max provided by the server. ``None`` if not provided yet """ |
28 | 31 | p2_star_server_max: Optional[float] |
| 32 | + """P2* server max provided by the server. ``None`` if not provided yet """ |
| 33 | + |
| 34 | + def __init__(self, p2_server_max:Optional[float]=None, p2_star_server_max:Optional[float]=None) -> None: |
| 35 | + self.p2_server_max = p2_server_max |
| 36 | + self.p2_star_server_max = p2_star_server_max |
29 | 37 |
|
30 | 38 |
|
31 | 39 | class Client: |
@@ -111,7 +119,7 @@ def __init__(self, conn: BaseConnection, config: ClientConfig = default_client_c |
111 | 119 | self.payload_override = Client.PayloadOverrider() |
112 | 120 | self.last_response = None |
113 | 121 |
|
114 | | - self.session_timing = cast(SessionTiming, dict(p2_server_max=None, p2_star_server_max=None)) # python 3.7 cast |
| 122 | + self.session_timing = SessionTiming(p2_server_max=None, p2_star_server_max=None) |
115 | 123 |
|
116 | 124 | self.refresh_config() |
117 | 125 |
|
@@ -204,6 +212,15 @@ def decorated(self: "Client", *args, **kwargs): |
204 | 212 | def service_log_prefix(self, service: Type[BaseService]): |
205 | 213 | return "%s<0x%02x>" % (service.get_name(), service.request_id()) |
206 | 214 |
|
| 215 | + def get_session_timing(self) -> SessionTiming: |
| 216 | + """Return the session timing provided by the server, including P2 & P2* timeouts. |
| 217 | + If the timeout values are ``None``, it means that no timing has been given by the server yet and the timings form the client configuration |
| 218 | + (:ref:`p2_timeout<config_p2_timeout>`, :ref:`p2_star_timeout<config_p2_star_timeout>`) |
| 219 | +
|
| 220 | + :return: The session timings |
| 221 | + """ |
| 222 | + return self.session_timing |
| 223 | + |
207 | 224 | @standard_error_management |
208 | 225 | def change_session(self, newsession: int) -> Optional[services.DiagnosticSessionControl.InterpretedResponse]: |
209 | 226 | """ |
@@ -238,8 +255,8 @@ def change_session(self, newsession: int) -> Optional[services.DiagnosticSession |
238 | 255 | if self.config['use_server_timing']: |
239 | 256 | self.logger.info('%s - Received new timing parameters. P2=%.3fs and P2*=%.3fs. Using these value from now on.' % |
240 | 257 | (self.service_log_prefix(services.DiagnosticSessionControl), response.service_data.p2_server_max, response.service_data.p2_star_server_max)) |
241 | | - self.session_timing['p2_server_max'] = response.service_data.p2_server_max |
242 | | - self.session_timing['p2_star_server_max'] = response.service_data.p2_star_server_max |
| 258 | + self.session_timing.p2_server_max = response.service_data.p2_server_max |
| 259 | + self.session_timing.p2_star_server_max = response.service_data.p2_star_server_max |
243 | 260 |
|
244 | 261 | return response |
245 | 262 |
|
@@ -2174,7 +2191,7 @@ def send_request(self, request: Request, timeout: int = -1) -> Optional[Response |
2174 | 2191 | if timeout < 0: |
2175 | 2192 | # Timeout not provided by user: defaults to Client request_timeout value |
2176 | 2193 | overall_timeout = self.config['request_timeout'] |
2177 | | - p2 = self.config['p2_timeout'] if self.session_timing['p2_server_max'] is None else self.session_timing['p2_server_max'] |
| 2194 | + p2 = self.config['p2_timeout'] if self.session_timing.p2_server_max is None else self.session_timing.p2_server_max |
2178 | 2195 | if overall_timeout is not None: |
2179 | 2196 | single_request_timeout = min(overall_timeout, p2) |
2180 | 2197 | else: |
@@ -2285,7 +2302,7 @@ def send_request(self, request: Request, timeout: int = -1) -> Optional[Response |
2285 | 2302 | done_receiving = False |
2286 | 2303 | if not using_p2_star: |
2287 | 2304 | # Received a 0x78 NRC: timeout is now set to P2* |
2288 | | - p2_star = self.config['p2_star_timeout'] if self.session_timing['p2_star_server_max'] is None else self.session_timing['p2_star_server_max'] |
| 2305 | + p2_star = self.config['p2_star_timeout'] if self.session_timing.p2_star_server_max is None else self.session_timing.p2_star_server_max |
2289 | 2306 | single_request_timeout = p2_star |
2290 | 2307 | using_p2_star = True |
2291 | 2308 | self.logger.debug("Server requested to wait with response code %s (0x%02x), single request timeout is now set to P2* (%.3f seconds)" % |
|
0 commit comments