pyxcp 0.22.35__cp313-cp313-win_amd64.whl → 0.23.1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pyxcp might be problematic. Click here for more details.

pyxcp/__init__.py CHANGED
@@ -17,4 +17,4 @@ tb_install(show_locals=True, max_frames=3) # Install custom exception handler.
17
17
 
18
18
  # if you update this manually, do not forget to update
19
19
  # .bumpversion.cfg and pyproject.toml.
20
- __version__ = "0.22.35"
20
+ __version__ = "0.23.1"
pyxcp/config/__init__.py CHANGED
@@ -490,6 +490,12 @@ If set, the `app_name` does not have to be previously defined in
490
490
  )
491
491
 
492
492
 
493
+ class CanCustom(Configurable, CanBase):
494
+ """ """
495
+
496
+ interface_name = "custom"
497
+
498
+
493
499
  class Virtual(Configurable, CanBase):
494
500
  """ """
495
501
 
@@ -542,11 +548,13 @@ CAN_INTERFACE_MAP = {
542
548
  "usb2can": Usb2Can,
543
549
  "vector": Vector,
544
550
  "virtual": Virtual,
551
+ "custom": CanCustom,
545
552
  }
546
553
 
547
554
 
548
555
  class Can(Configurable):
549
- VALID_INTERFACES = can.interfaces.VALID_INTERFACES
556
+ VALID_INTERFACES = set(can.interfaces.VALID_INTERFACES)
557
+ VALID_INTERFACES.add("custom")
550
558
 
551
559
  interface = Enum(
552
560
  values=VALID_INTERFACES, default_value=None, allow_none=True, help="CAN interface supported by python-can"
@@ -605,6 +613,7 @@ timing-related parameters.
605
613
  classes = List(
606
614
  [
607
615
  CanAlystii,
616
+ CanCustom,
608
617
  CanTact,
609
618
  Etas,
610
619
  Gs_Usb,
@@ -640,6 +649,7 @@ timing-related parameters.
640
649
  " {type(self.interface).__name__} {self.interface}."
641
650
  )
642
651
  self.canalystii = CanAlystii(config=self.config, parent=self)
652
+ self.cancustom = CanCustom(config=self.config, parent=self)
643
653
  self.cantact = CanTact(config=self.config, parent=self)
644
654
  self.etas = Etas(config=self.config, parent=self)
645
655
  self.gs_usb = Gs_Usb(config=self.config, parent=self)
@@ -798,7 +808,7 @@ class Transport(Configurable):
798
808
  allow_none=True,
799
809
  help="Choose one of the supported XCP transport layers.",
800
810
  ).tag(config=True)
801
- create_daq_timestamps = Bool(False, help="Record time of frame reception or set timestamp to 0.").tag(config=True)
811
+ create_daq_timestamps = Bool(True, help="Record time of frame reception or set timestamp to 0.").tag(config=True)
802
812
  timeout = Float(
803
813
  2.0,
804
814
  help="""raise `XcpTimeoutError` after `timeout` seconds
Binary file
Binary file
Binary file
Binary file
@@ -1,28 +1,62 @@
1
-
2
1
  #include "scheduler.hpp"
3
2
 
4
3
  #if defined(_WIN32)
5
4
 
5
+ #include <cstdio>
6
+ #include <cstdint>
7
+
6
8
  VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired) {
7
- if (lpParam == NULL) {
8
- printf("TimerRoutine lpParam is NULL\n");
9
+ if (lpParam == nullptr) {
10
+ std::printf("TimerRoutine lpParam is NULL\n");
11
+ return;
12
+ }
13
+
14
+ const auto* param = static_cast<const int*>(lpParam);
15
+ std::printf("Timer routine called. Parameter is %d.\n", *param);
16
+
17
+ if (TimerOrWaitFired) {
18
+ std::printf("The wait timed out.\n");
9
19
  } else {
10
- // lpParam points to the argument; in this case it is an int
11
-
12
- printf("Timer routine called. Parameter is %d.\n", *(int*)lpParam);
13
- if (TimerOrWaitFired) {
14
- printf("The wait timed out.\n");
15
- } else {
16
- printf("The wait event was signaled.\n");
17
- }
20
+ std::printf("The wait event was signaled.\n");
18
21
  }
19
22
  }
20
23
 
21
- #include <xmmintrin.h>
24
+ #endif // _WIN32
22
25
 
23
- void mul4_vectorized(float* ptr) {
24
- __m128 f = _mm_loadu_ps(ptr);
25
- f = _mm_mul_ps(f, f);
26
- _mm_storeu_ps(ptr, f);
26
+ // Vectorized multiply implementation with bounds checking
27
+ namespace {
28
+ constexpr size_t VECTOR_SIZE = 4;
27
29
  }
28
- #endif
30
+
31
+ #if defined(_M_X64) || defined(_M_IX86) || defined(__SSE__)
32
+ #include <xmmintrin.h>
33
+
34
+ void mul4_vectorized(float* ptr) {
35
+ if (ptr == nullptr) return;
36
+
37
+ __m128 f = _mm_loadu_ps(ptr);
38
+ f = _mm_mul_ps(f, f);
39
+ _mm_storeu_ps(ptr, f);
40
+ }
41
+
42
+ #elif defined(_M_ARM64) || defined(__ARM_NEON)
43
+ #include <arm_neon.h>
44
+
45
+ void mul4_vectorized(float* ptr) {
46
+ if (ptr == nullptr) return;
47
+
48
+ float32x4_t f = vld1q_f32(ptr);
49
+ f = vmulq_f32(f, f);
50
+ vst1q_f32(ptr, f);
51
+ }
52
+
53
+ #else
54
+ // Scalar fallback
55
+ void mul4_vectorized(float* ptr) {
56
+ if (ptr == nullptr) return;
57
+
58
+ for (size_t i = 0; i < VECTOR_SIZE; ++i) {
59
+ ptr[i] *= ptr[i];
60
+ }
61
+ }
62
+ #endif
Binary file
Binary file
Binary file
Binary file
@@ -1,54 +1,44 @@
1
1
  #!/usr/bin/env python
2
- """User supplied CAN driver.
3
2
 
4
- Run as:
3
+ from typing import Dict, List, Optional
5
4
 
6
- .. code-block:: shell
5
+ import can
7
6
 
8
- python xcp_user_supplied_driver.py -c conf_can_user.toml
9
- """
10
7
  from pyxcp.cmdline import ArgumentParser
11
8
  from pyxcp.transport.can import CanInterfaceBase
12
9
 
13
10
 
14
- class MyCI(CanInterfaceBase):
15
- """
11
+ class CustomCANInterface(CanInterfaceBase):
16
12
 
17
- Relevant options in your configuration file (e.g. conf_can_user.toml):
13
+ def init(self):
14
+ """Initialize the CAN interface here."""
18
15
 
19
- TRANSPORT = "CAN"
20
- CAN_DRIVER = "MyCI" # The name of your custom driver class.
16
+ def set_filters(self, filters):
17
+ print(f"set_filters({filters})")
18
+ self._filters = filters
21
19
 
22
- """
20
+ def recv(self, timeout: Optional[float] = None) -> Optional[can.message.Message]:
21
+ """Receive CAN frames."""
22
+ return can.message.Message()
23
23
 
24
- def init(self, parent, receive_callback):
25
- self.parent = parent
24
+ def send(self, msg: can.message.Message):
25
+ """Send CAN frames."""
26
+ print(f"send({msg})")
26
27
 
27
- def connect(self):
28
- pass
28
+ @property
29
+ def filters(self):
30
+ """Return the current CAN filters."""
31
+ return self._filters
29
32
 
30
- def close(self):
31
- pass
33
+ @property
34
+ def state(self):
35
+ """Return the current state of the CAN interface."""
36
+ return can.BusState.ACTIVE
32
37
 
33
- def get_timestamp_resolution(self):
34
- pass
35
-
36
- def read(self):
37
- pass
38
-
39
- def transmit(self, payload: bytes):
40
- print("\tTX-PAYLOAD", payload)
41
38
 
39
+ custom_interface = CustomCANInterface()
42
40
 
43
41
  ap = ArgumentParser(description="User supplied CAN driver.")
44
- with ap.run() as x:
42
+ with ap.run(transport_layer_interface=custom_interface) as x:
45
43
  x.connect()
46
44
  x.disconnect()
47
-
48
- """
49
- This do-nothing example will output
50
-
51
- TX-PAYLOAD b'\xff\x00'
52
-
53
- and then timeout (0xff is the service code for CONNECT_REQ).
54
- """
Binary file
Binary file
Binary file
Binary file
pyxcp/scripts/xcp_info.py CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env python
2
2
 
3
- """XCP info/exploration tool.
4
- """
3
+ """XCP info/exploration tool."""
5
4
 
6
5
  from pprint import pprint
7
6
 
@@ -21,7 +20,6 @@ def getPagInfo(x):
21
20
  for i in range(pag.maxSegments):
22
21
  segment = {}
23
22
  status, std_info = x.try_command(x.getSegmentInfo, 0x01, i, 0, 0)
24
- std_info = x.getSegmentInfo(0x01, i, 2, 0)
25
23
  if status == TryCommandResult.OK:
26
24
  segment["maxPages"] = std_info.maxPages
27
25
  segment["addressExtension"] = std_info.addressExtension
pyxcp/transport/can.py CHANGED
@@ -1,13 +1,20 @@
1
1
  #!/usr/bin/env python
2
- """
3
- """
2
+ """ """
4
3
 
5
4
  import functools
6
5
  import operator
6
+ from abc import ABC, abstractmethod
7
7
  from bisect import bisect_left
8
- from typing import Any, Dict, Optional, Type
9
-
10
- from can import CanError, CanInitializationError, Message, detect_available_configs
8
+ from enum import IntEnum
9
+ from typing import Any, Dict, List, Optional, Union
10
+
11
+ from can import (
12
+ BusState,
13
+ CanError,
14
+ CanInitializationError,
15
+ Message,
16
+ detect_available_configs,
17
+ )
11
18
  from can.bus import BusABC
12
19
  from can.interface import _get_class_for_interface
13
20
  from rich.console import Console
@@ -27,6 +34,55 @@ MAX_DLC_CLASSIC = 8
27
34
  CAN_FD_DLCS = (12, 16, 20, 24, 32, 48, 64) # Discrete CAN-FD DLCs in case DLC > 8.
28
35
 
29
36
 
37
+ class FilterState(IntEnum):
38
+ REJECT_ALL = 0
39
+ ACCEPT_ALL = 1
40
+ FILTERING = 2
41
+
42
+
43
+ class SoftwareFilter:
44
+ """Additional CAN filters in software."""
45
+
46
+ def __init__(self) -> None:
47
+ self.filters = None
48
+ self.reject_all()
49
+
50
+ def set_filters(self, filters: List[Dict]) -> None:
51
+ self.filters = filters
52
+ self.filtering()
53
+
54
+ def reject_all(self) -> None:
55
+ self.filter_state = FilterState.REJECT_ALL
56
+
57
+ def accept_all(self) -> None:
58
+ self.filter_state = FilterState.ACCEPT_ALL
59
+
60
+ def filtering(self) -> None:
61
+ self.filter_state = FilterState.FILTERING
62
+
63
+ @property
64
+ def state(self) -> FilterState:
65
+ return self.filter_state
66
+
67
+ def accept(self, msg: Message) -> bool:
68
+ """
69
+ Based on: https://github.com/hardbyte/python-can/blob/bc248e8aaf96280a574c06e8e7d2778a67f091e3/can/bus.py#L430
70
+ """
71
+ if self.filter_state == FilterState.REJECT_ALL:
72
+ return False
73
+ elif self.filter_state == FilterState.ACCEPT_ALL or self.filters is None:
74
+ return True
75
+ for filter in self.filters:
76
+ if "extended" in filter:
77
+ if filter["extended"] != msg.is_extended_id:
78
+ continue
79
+ can_id = filter["can_id"]
80
+ can_mask = filter["can_mask"]
81
+ if (can_id ^ msg.arbitration_id) & can_mask == 0:
82
+ return True
83
+ return False
84
+
85
+
30
86
  class IdentifierOutOfRangeError(Exception):
31
87
  """Signals an identifier greater then :obj:`MAX_11_BIT_IDENTIFIER` or :obj:`MAX_29_BIT_IDENTIFIER`."""
32
88
 
@@ -235,32 +291,47 @@ class PythonCanWrapper:
235
291
  self.interface_name: str = interface_name
236
292
  self.timeout: int = timeout
237
293
  self.parameters = parameters
238
- self.can_interface_class: Type[BusABC] = _get_class_for_interface(self.interface_name)
294
+ if not self.parent.has_user_supplied_interface:
295
+ self.can_interface_class = _get_class_for_interface(self.interface_name)
296
+ else:
297
+ self.can_interface_class = None
239
298
  self.can_interface: BusABC
240
299
  self.connected: bool = False
300
+ self.software_filter = SoftwareFilter()
301
+ self.saved_filters = []
241
302
 
242
- def connect(self):
303
+ def connect(self) -> None:
243
304
  if self.connected:
244
305
  return
245
306
  can_filters = []
246
307
  can_filters.append(self.parent.can_id_slave.create_filter_from_id()) # Primary CAN filter.
247
- if self.parent.has_user_supplied_interface:
248
- self.can_interface = self.parent.transport_layer_interface
249
- else:
250
- self.can_interface = self.can_interface_class(interface=self.interface_name, **self.parameters)
251
308
  if self.parent.daq_identifier:
252
309
  # Add filters for DAQ identifiers.
253
310
  for daq_id in self.parent.daq_identifier:
254
311
  can_filters.append(daq_id.create_filter_from_id())
255
- self.can_interface.set_filters(can_filters)
312
+ if self.parent.has_user_supplied_interface:
313
+ self.saved_filters = self.parent.transport_layer_interface.filters
314
+ if self.saved_filters:
315
+ merged_filters = can_filters[::]
316
+ for fltr in self.saved_filters:
317
+ if fltr not in merged_filters:
318
+ merged_filters.append(fltr)
319
+ self.can_interface = self.parent.transport_layer_interface
320
+ self.can_interface.set_filters(merged_filters)
321
+ self.software_filter.set_filters(can_filters) # Filter unwanted traffic.
322
+ else:
323
+ self.can_interface = self.can_interface_class(interface=self.interface_name, can_filters=can_filters, **self.parameters)
324
+ self.software_filter.accept_all()
256
325
  self.parent.logger.info(f"XCPonCAN - Using Interface: '{self.can_interface!s}'")
257
326
  self.parent.logger.info(f"XCPonCAN - Filters used: {self.can_interface.filters}")
258
327
  self.parent.logger.info(f"XCPonCAN - State: {self.can_interface.state!s}")
259
328
  self.connected = True
260
329
 
261
- def close(self):
330
+ def close(self) -> None:
262
331
  if self.connected and not self.parent.has_user_supplied_interface:
263
332
  self.can_interface.shutdown()
333
+ if self.saved_filters:
334
+ self.can_interface.set_filters(self.saved_filters)
264
335
  self.connected = False
265
336
 
266
337
  def transmit(self, payload: bytes) -> None:
@@ -282,6 +353,8 @@ class PythonCanWrapper:
282
353
  else:
283
354
  if frame is None or not len(frame.data):
284
355
  return None # Timeout condition.
356
+ if not self.software_filter.accept(frame):
357
+ return None # Filter out unwanted traffic.
285
358
  extended = frame.is_extended_id
286
359
  identifier = Identifier.make_identifier(frame.arbitration_id, extended)
287
360
  return Frame(
@@ -326,9 +399,14 @@ class Can(BaseTransport):
326
399
  self.daq_identifier.append(Identifier(daq_id))
327
400
  self.max_dlc_required = self.config.max_dlc_required
328
401
  self.padding_value = self.config.padding_value
329
- self.interface_name = self.config.interface
330
- self.interface_configuration = detect_available_configs(interfaces=[self.interface_name])
331
- parameters = self.get_interface_parameters()
402
+ if transport_layer_interface is None:
403
+ self.interface_name = self.config.interface
404
+ self.interface_configuration = detect_available_configs(interfaces=[self.interface_name])
405
+ parameters = self.get_interface_parameters()
406
+ else:
407
+ self.interface_name = "custom"
408
+ # print("TRY GET PARAMs", self.get_interface_parameters())
409
+ parameters = {}
332
410
  self.can_interface = PythonCanWrapper(self, self.interface_name, config.timeout, **parameters)
333
411
  self.logger.info(f"XCPonCAN - Interface-Type: {self.interface_name!r} Parameters: {list(parameters.items())}")
334
412
  self.logger.info(
@@ -439,3 +517,40 @@ def calculate_filter(ids: list):
439
517
  cmask = functools.reduce(operator.or_, raw_ids) ^ cfilter
440
518
  cmask ^= 0x1FFFFFFF if any_extended_ids else 0x7FF
441
519
  return (cfilter, cmask)
520
+
521
+
522
+ class CanInterfaceBase(ABC):
523
+ """
524
+ Base class for custom CAN interfaces.
525
+ This is basically a subset of python-CANs `BusABC`.
526
+ """
527
+
528
+ @abstractmethod
529
+ def set_filters(self, filters: Optional[List[Dict[str, Union[int, bool]]]] = None) -> None:
530
+ """Apply filtering to all messages received by this Bus.
531
+
532
+ filters:
533
+ A list of dictionaries, each containing a 'can_id', 'can_mask', and 'extended' field, e.g.:
534
+ [{"can_id": 0x11, "can_mask": 0x21, "extended": False}]
535
+ """
536
+
537
+ @abstractmethod
538
+ def recv(self, timeout: Optional[float] = None) -> Optional[Message]:
539
+ """Block waiting for a message from the Bus."""
540
+
541
+ @abstractmethod
542
+ def send(self, msg: Message) -> None:
543
+ """Transmit a message to the CAN bus."""
544
+
545
+ @property
546
+ @abstractmethod
547
+ def filters(self) -> Optional[List[Dict[str, Union[int, bool]]]]:
548
+ """Modify the filters of this bus."""
549
+
550
+ @property
551
+ @abstractmethod
552
+ def state(self) -> BusState:
553
+ """Return the current state of the hardware."""
554
+
555
+ def __repr__(self):
556
+ return f"{self.__class__.__name__}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyxcp
3
- Version: 0.22.35
3
+ Version: 0.23.1
4
4
  Summary: Universal Calibration Protocol for Python
5
5
  License: LGPLv3
6
6
  Keywords: automotive,ecu,xcp,asam,autosar
@@ -1,4 +1,4 @@
1
- pyxcp/__init__.py,sha256=cCzCFYz2VXdbLl-oeEcA066T-ZfWBKS32tHhx2YcVag,548
1
+ pyxcp/__init__.py,sha256=HQBiOPfZK2f7NGrXX2R-3kzx2bnjcg1nj3e6BhJPCrw,547
2
2
  pyxcp/aml/EtasCANMonitoring.a2l,sha256=EJYwe3Z3H24vyWAa6lUgcdKnQY8pwFxjyCN6ZU1ST8w,1509
3
3
  pyxcp/aml/EtasCANMonitoring.aml,sha256=xl0DdyeiIaLW0mmmJNAyJS0CQdOLSxt9dxfgrdSlU8Y,2405
4
4
  pyxcp/aml/ifdata_CAN.a2l,sha256=NCUnCUEEgRbZYSLGtUGwL2e7zJ8hrp0SbmLHGv8uY58,612
@@ -18,16 +18,16 @@ pyxcp/asamkeydll.c,sha256=dVEvU0S1kgIo62S0La-T8xHSw668LM_DYc_fiQ0No6g,2952
18
18
  pyxcp/asamkeydll.sh,sha256=DC2NKUMwvi39OQgJ6514Chr4wc1LYbTmQHmMq9jAHHs,59
19
19
  pyxcp/checksum.py,sha256=hO2JW_eiO9I0A4eiqovMV9d_y5oidq_w8jKdAE4FeOo,11899
20
20
  pyxcp/cmdline.py,sha256=na3ZbWQ-5ezsi1MrkuxMTCAXonUF3X6-LutoneyE3dU,1529
21
- pyxcp/config/__init__.py,sha256=vIYPtzzNI4kUmevpOsSFgbfuBXPq7e2bhIIwWcqPcqQ,41835
21
+ pyxcp/config/__init__.py,sha256=hM1eQtllcZeZ4zo9YzscO2Z5EOpV3hWyZgY9GZMiavw,42085
22
22
  pyxcp/config/legacy.py,sha256=4QdDheX8DbBKv5JVT72_C_cjCgKvZmhN3tJ6hsvBEtI,5220
23
23
  pyxcp/constants.py,sha256=9yGfujC0ImTYQWfn41wyw8pluJTSrhMGWIVeIZTgsLg,1160
24
24
  pyxcp/cpp_ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  pyxcp/cpp_ext/bin.hpp,sha256=PwJloZek21la-RBSda2Hc0u_6gID0sfTduPeplaAyR4,2561
26
26
  pyxcp/cpp_ext/blockmem.hpp,sha256=ysaJwmTWGTfE54Outk3gJYOfAVFd_QaonBMtXLcXwCc,1242
27
- pyxcp/cpp_ext/cpp_ext.cp310-win_amd64.pyd,sha256=X1rZXoHpHAprFWKGpSA55a-diCAzV1hCDxulqR5BtOE,285184
28
- pyxcp/cpp_ext/cpp_ext.cp311-win_amd64.pyd,sha256=FGLv2Mk_VY7IX8Ekrc1pei465rcClJ6FCq383yxHRlQ,286720
29
- pyxcp/cpp_ext/cpp_ext.cp312-win_amd64.pyd,sha256=EYY4A_4gx1ZiIBBeGCSkIzvPyeUCAT2Rr98hwv7TJpk,291840
30
- pyxcp/cpp_ext/cpp_ext.cp313-win_amd64.pyd,sha256=zctyoJArDAmRM7cdMxp8eTLjgvGZNltHsccXp1X-7OU,291328
27
+ pyxcp/cpp_ext/cpp_ext.cp310-win_amd64.pyd,sha256=06wlmKXUq518IN8Pqp6z37nfjhBeZmiyEu1EmPZXQeg,285184
28
+ pyxcp/cpp_ext/cpp_ext.cp311-win_amd64.pyd,sha256=0OnABdaqJW_BSavyeIdDfVTv3jFIETJkooMERA5jFPo,286720
29
+ pyxcp/cpp_ext/cpp_ext.cp312-win_amd64.pyd,sha256=PTdXxjZYSuYuCu00VhwQm2axTKC2qNF14Tt_D9LVLfg,291840
30
+ pyxcp/cpp_ext/cpp_ext.cp313-win_amd64.pyd,sha256=w2H0qj9JYsWkP10d1CU2-cz6PbNzH7z6JvYBHaKlhUM,291328
31
31
  pyxcp/cpp_ext/daqlist.hpp,sha256=g2hlxgoQorAGKHedZFZ0c2FQh1APMIA9sVB6M6hD_n8,7277
32
32
  pyxcp/cpp_ext/event.hpp,sha256=Z-1yxsEKsr81NnLVEWJ2ANA8FV7YsM7EbNxaw-elheE,1200
33
33
  pyxcp/cpp_ext/extension_wrapper.cpp,sha256=xFs3IcrvHPHA82-n11WPzt8HATGqcks02p84SjQ2BKM,4855
@@ -37,12 +37,12 @@ pyxcp/cpp_ext/tsqueue.hpp,sha256=FWMemzXNgV5dQ7gYmTCzC0QYfgl0VI9JCybYelBcCHU,102
37
37
  pyxcp/daq_stim/__init__.py,sha256=2KsvP9RUV5gwFKTA1BBgsppAegR13ykrqjRtgY0zAx4,9560
38
38
  pyxcp/daq_stim/optimize/__init__.py,sha256=FUWK0GkNpNT-sUlhibp7xa2aSYpm6Flh5yA2w2IOJqg,2520
39
39
  pyxcp/daq_stim/optimize/binpacking.py,sha256=Iltho5diKlJG-ltbmx053U2vOFRlCISolXK61T14l_I,1257
40
- pyxcp/daq_stim/scheduler.cpp,sha256=a7VK7kP2Hs8yMlcDAkXwJ0bH88lr_yz156sphcHS7Z4,715
40
+ pyxcp/daq_stim/scheduler.cpp,sha256=NuNkAz3Dv849f51_T36YPck2dl-YsdDdG-cozc7XN9U,1504
41
41
  pyxcp/daq_stim/scheduler.hpp,sha256=U_6tUbebmzX5vVZS0EFSgTaPsyxMg6yRXHG_aPWA0x4,1884
42
- pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=AI-gVCR1lauZUYplnGqeX-c7oX9pHa8liWW7nKeVYOo,204288
43
- pyxcp/daq_stim/stim.cp311-win_amd64.pyd,sha256=RPq8Bl43UcgT0qWluCMMfGEdLjZAZRngHVZYYDAI1ww,205824
44
- pyxcp/daq_stim/stim.cp312-win_amd64.pyd,sha256=Mg8gSsRiidGBa2MdEIOjI9AD2uYsxD32y-LwHMUfRa8,209920
45
- pyxcp/daq_stim/stim.cp313-win_amd64.pyd,sha256=c7TLkUgw05kVUxh7wCEQ2sKZ8jYNgK1HMjXc8ka05b0,209920
42
+ pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=F0tp7tDp0H06jcSnnWizOKIEakeNwl0IPhFsT9dBYvY,204288
43
+ pyxcp/daq_stim/stim.cp311-win_amd64.pyd,sha256=vKADm1t9UviD7Yg6OTK0ht0zyAxxH_xvHJcfzyhaFTA,205824
44
+ pyxcp/daq_stim/stim.cp312-win_amd64.pyd,sha256=W0iiXJ_s5nju8trqorOuLIwMoF2bQm06kC1G2h6XZds,209920
45
+ pyxcp/daq_stim/stim.cp313-win_amd64.pyd,sha256=9AkQtgVGyB2Q7iW-YWo-8Vf7V97LWw9iBit8JKNnT7E,209920
46
46
  pyxcp/daq_stim/stim.cpp,sha256=F2OG67W4KKwTTiUCxm-9egIv3TLFdOkRunX6xf7YOtc,177
47
47
  pyxcp/daq_stim/stim.hpp,sha256=U-uInRrA6OCdMl1l1SWbQ_KEPpnNYrWut924IvbW6R0,18508
48
48
  pyxcp/daq_stim/stim_wrapper.cpp,sha256=iT2yxJ3LRG7HoYC1bwhM3tCAxF9X_HHierBNsLRmTJg,1995
@@ -62,7 +62,7 @@ pyxcp/examples/xcp_policy.py,sha256=io9tS2W-7PvR8ZzU203KolFrDp67eorUlwNWvA4kC5k,
62
62
  pyxcp/examples/xcp_read_benchmark.py,sha256=zOG0Yrji10vA0vhHa27KK7zgc3JDpzXzXsFnIU4C_AM,956
63
63
  pyxcp/examples/xcp_skel.py,sha256=YXLQC8nn8aAwYSVuBGhr1dvmdMBjmO1Ee1w3e5sy16s,1159
64
64
  pyxcp/examples/xcp_unlock.py,sha256=5F7oW17MboxKO3REYrGyhYX4Oc0Dg1oD3EQ3fQXB2Is,690
65
- pyxcp/examples/xcp_user_supplied_driver.py,sha256=bL-6HDvPjgRErvYVdaRL_Pg1GDxu02Jt_GG9LpXXP4c,1078
65
+ pyxcp/examples/xcp_user_supplied_driver.py,sha256=9fFiud6sbjkBjxmcdGwIO6yBc83sUykY388gvI5EcXU,1148
66
66
  pyxcp/examples/xcphello.py,sha256=ZNfnk0nyz6qiY2i5L0lFFng42RwZdREwevIJW7C5QCA,2638
67
67
  pyxcp/examples/xcphello_recorder.py,sha256=QHWJsq5h5CI9t5qEmMSorZyzirTpoXz4nzuKTMzbZCA,3409
68
68
  pyxcp/master/__init__.py,sha256=QQbkUJM1WQ-5p2MiNFYxLAmHhNsCQLzDp-S4aoOFxoA,318
@@ -84,10 +84,10 @@ pyxcp/recorder/mio.hpp,sha256=5ASJLKSEykH0deAQD5uak-_yAgd5p2n8t06315GSGrg,63346
84
84
  pyxcp/recorder/reader.hpp,sha256=rr9XZ_ciL6eF2_xEqyt9XYNqTIze9ytAsnf8uYukO9U,5201
85
85
  pyxcp/recorder/reco.py,sha256=6N6FIwfCEVMpi5dr3eUOQa1lowcg2LCnS_sy_-b-UiQ,8725
86
86
  pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=1epHArm46oNuEuUM_PqKtjEBjRCRsYVP-HO-b91juK0,385536
88
- pyxcp/recorder/rekorder.cp311-win_amd64.pyd,sha256=pIQrKREnVtqExyjN1Y-qquSuJvKhYcXPRFCeMpzo7yQ,387584
89
- pyxcp/recorder/rekorder.cp312-win_amd64.pyd,sha256=WUVGJBGkmki2yRs96OKk_lSvujGcYJQxWWQhAIJoP7A,392192
90
- pyxcp/recorder/rekorder.cp313-win_amd64.pyd,sha256=tILwhFb0_u4DJx9CMGeg-MFjsx9tSOpBYtbIGgO3auk,392192
87
+ pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=yqeVlyQA8MQ2zPxt9-JXyyEvc94gJ1QkBA7N6KImFeo,385536
88
+ pyxcp/recorder/rekorder.cp311-win_amd64.pyd,sha256=8Ix-n8z4PWJkEeZ4kDYtz1DCSrWSFVPs4FbYF4DTWo0,387584
89
+ pyxcp/recorder/rekorder.cp312-win_amd64.pyd,sha256=Rb_F4sqPANQx8SR_uP-aVmoL6TD6t4CZYA0pYfahR7Q,392192
90
+ pyxcp/recorder/rekorder.cp313-win_amd64.pyd,sha256=l_XH-sb9qFqHD0tVfLbwWfC2w6rZJOqoVS4lRuSGj2I,392192
91
91
  pyxcp/recorder/rekorder.cpp,sha256=U0LMyk8pZXx9emgS_WPVthvn_9IpgE7JGrh4kg-8CX4,1900
92
92
  pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
93
93
  pyxcp/recorder/setup.py,sha256=_99XFPQAd5V4LcJaSGJwdnbxgxJ7kl8DEXfHsnKO1Yg,998
@@ -100,7 +100,7 @@ pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=P_gscDTAofbSVA_Wd1GATrnyWGTf1-Dz
100
100
  pyxcp/scripts/xcp_examples.py,sha256=q2wNXHVZu4GjcIlZwp2j9Sqm5QH39Olro4BQaLoIqiM,2583
101
101
  pyxcp/scripts/xcp_fetch_a2l.py,sha256=72818jdJiLsDuWWfkAPxekZ7fzRRz_A4RVSy06LQNe4,1239
102
102
  pyxcp/scripts/xcp_id_scanner.py,sha256=2P53qrvM-rYFTBbbm7eAKyOxESkKrorieND-KoZZ9mo,421
103
- pyxcp/scripts/xcp_info.py,sha256=H4bDcJilgkzHWapuCT49A3dq04CAwrp7z0zv1ibwkZQ,5711
103
+ pyxcp/scripts/xcp_info.py,sha256=ZRwXIfQNw4KSrAw-9VlNMpzKzGPwkUasUiZ1SGBs8Hc,5649
104
104
  pyxcp/scripts/xcp_profile.py,sha256=ryJnx7cqQ40O05F3beuUEOthsiW_k9d_2wMf4Z9CWkc,615
105
105
  pyxcp/scripts/xmraw_converter.py,sha256=LvjiKAWHUKs5QZNiIDT-vdNgPG0Gioas2MzLJOo62-Y,684
106
106
  pyxcp/stim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -118,7 +118,7 @@ pyxcp/timing.py,sha256=zE6qPqOuidg6saNt7_zmbQgufxL9Id6akVYhAtpweQc,1705
118
118
  pyxcp/transport/__init__.py,sha256=31PaQLj76n5pXr68aJRWcYfrxEYWWgYoe9f_w3jZxsc,438
119
119
  pyxcp/transport/base.py,sha256=n_tCkebmpq3WXRZncOP5XWgUnSavaBBm3oGZhpeCF9U,16352
120
120
  pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- pyxcp/transport/can.py,sha256=pypHU1k5lZODrZpNLsC3IEJ5pPi58OZU_zryd9twr_M,14926
121
+ pyxcp/transport/can.py,sha256=Sm2qu5JOSZ-f-PdgHVknTm1JTAH_L2DNxTxb5OJUCpI,18806
122
122
  pyxcp/transport/eth.py,sha256=xPzN2oSALoPKJVvZpBljPSV1AxfpjRusOzymO-TD1Rw,8711
123
123
  pyxcp/transport/sxi.py,sha256=kWB9x5M1pS7GBtBW6R65KBX7zDI9zcRRZhFM8frmzU0,4760
124
124
  pyxcp/transport/transport_wrapper.cpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -127,8 +127,8 @@ pyxcp/types.py,sha256=mjp3FhsTTbS3D5VuC-dfdbMql0lJwEfbZjf8a2pHi1o,26158
127
127
  pyxcp/utils.py,sha256=_ag2QMt0IxVhiCLG5BIO8JzIGt-rdqYrY7DRAPQ4AtA,3530
128
128
  pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
129
  pyxcp/vector/map.py,sha256=7Gnhvr79geMeqqGVIJPxODXGwABdNDinnqzhpooN5TE,2306
130
- pyxcp-0.22.35.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
131
- pyxcp-0.22.35.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
132
- pyxcp-0.22.35.dist-info/METADATA,sha256=1FG4ObUxb7QK7YO8yFEUJioWfGLPbX0gDB5apo2Hz3Q,4085
133
- pyxcp-0.22.35.dist-info/WHEEL,sha256=mALHoYUTvmSuUvATXVCIUbSdKauf2WkQvaEK6Gk1YTE,98
134
- pyxcp-0.22.35.dist-info/RECORD,,
130
+ pyxcp-0.23.1.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
131
+ pyxcp-0.23.1.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
132
+ pyxcp-0.23.1.dist-info/METADATA,sha256=SSK24XxtgfqPWfnBC70rkXdY_vWCxI3aI6FfQHGU34k,4084
133
+ pyxcp-0.23.1.dist-info/WHEEL,sha256=mALHoYUTvmSuUvATXVCIUbSdKauf2WkQvaEK6Gk1YTE,98
134
+ pyxcp-0.23.1.dist-info/RECORD,,