pyxcp 0.22.35__cp311-cp311-macosx_11_0_arm64.whl → 0.23.1__cp311-cp311-macosx_11_0_arm64.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
@@ -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
@@ -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
- """
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,15 +1,15 @@
1
- pyxcp-0.22.35.dist-info/RECORD,,
2
- pyxcp-0.22.35.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
3
- pyxcp-0.22.35.dist-info/WHEEL,sha256=X6-NY9fCWtbM4tHMrme4ihtrUdAQgjDgPOLr1IYsKV8,134
4
- pyxcp-0.22.35.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
5
- pyxcp-0.22.35.dist-info/METADATA,sha256=1FG4ObUxb7QK7YO8yFEUJioWfGLPbX0gDB5apo2Hz3Q,4085
1
+ pyxcp-0.23.1.dist-info/RECORD,,
2
+ pyxcp-0.23.1.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
3
+ pyxcp-0.23.1.dist-info/WHEEL,sha256=X6-NY9fCWtbM4tHMrme4ihtrUdAQgjDgPOLr1IYsKV8,134
4
+ pyxcp-0.23.1.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
5
+ pyxcp-0.23.1.dist-info/METADATA,sha256=SSK24XxtgfqPWfnBC70rkXdY_vWCxI3aI6FfQHGU34k,4084
6
6
  pyxcp/dllif.py,sha256=m4e-_dgDLCD6COU5W2LdeYUlib_Xxyxbh977bbS-VAU,3344
7
7
  pyxcp/checksum.py,sha256=aveS0z4vthLXABEFhTqELqFNi7LM6ZzDzq7dD5Xe9oo,11167
8
8
  pyxcp/asamkeydll.sh,sha256=iema12sub6qNE0xAuzwGtx0FmkdaaOKoXalhrtWVaa8,57
9
9
  pyxcp/asamkeydll.c,sha256=l5RHYcEPY_Q07G-W5IjCq0xci8YfUR-3uYt84OOkOJI,2836
10
10
  pyxcp/constants.py,sha256=Yemk_Gi_m78EEU0v-sdGCAodb9dv_vqP969IU3izA2M,1113
11
11
  pyxcp/cmdline.py,sha256=lNg_wedKShu_37RhuTIGlINGLSMrg6UqJmYpqQnJbQI,1477
12
- pyxcp/__init__.py,sha256=Syqs7GgVi938EmpSl12H_YqMJl5dUAfsPZfuDDc-HtE,528
12
+ pyxcp/__init__.py,sha256=ZKSl3JNYiFQiF3bEXjWiifj1t0TbnYBzGUeyKok01GY,527
13
13
  pyxcp/types.py,sha256=XJxJUh9bK5Urfia8IHVLJ-NFgQACYBd_n73L-AaeZts,25158
14
14
  pyxcp/timing.py,sha256=hzeQZ3P7ij_bfskoVMi10Iv5S4i_6TQYfnB8PXTX6c4,1645
15
15
  pyxcp/utils.py,sha256=Ax3TNT4OotRdJs_MVz83i7gTinpbOWwPnNVIL9WYTW4,3402
@@ -19,7 +19,7 @@ pyxcp/asam/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  pyxcp/asam/types.py,sha256=V4wSCGI1pXn0EsBemDyaHTBgY2wkV_BeLShnDIGGgDE,2310
20
20
  pyxcp/daq_stim/stim.cpp,sha256=sABgEfbQlt5kXbzAsndyhaDFWRWTJw3jJlNfanIVrRs,164
21
21
  pyxcp/daq_stim/__init__.py,sha256=HAfOpn4yeb4DYNZHr6pzpFGHisXbKEytXJ6KUatDMTk,9328
22
- pyxcp/daq_stim/scheduler.cpp,sha256=6YJV4IfKbIL9MJOVJqqabaeK5apUcFuDpwmoWRfyCSQ,687
22
+ pyxcp/daq_stim/scheduler.cpp,sha256=2XW9PmxrJR8DfYMVszGwBX-KANVviwPcUNBvnjw5MlM,1443
23
23
  pyxcp/daq_stim/stim.hpp,sha256=1DwAhkY7XJN14aD2BxLJ4O1j4_a6RvpePIbAG1U8iOA,17904
24
24
  pyxcp/daq_stim/stim.cpython-310-darwin.so,sha256=RqFNsPbyPi8oHidN2ACHa6aPRQadF14q068jvjDhGKE,237576
25
25
  pyxcp/daq_stim/scheduler.hpp,sha256=H-kwyZBV3S8q6YlCq6OLUbaNXskyCOS4z3SRP32ikPY,1809
@@ -33,10 +33,10 @@ pyxcp/transport/sxi.py,sha256=gbFTOA-O0q0RwZUbRgN3hCdkoutxMt15TgVjVwdvWsY,4625
33
33
  pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  pyxcp/transport/__init__.py,sha256=wIeYkGygucYdXEzymJcDvimnwZgqJY8KRv7Mk__aUSU,428
35
35
  pyxcp/transport/usb_transport.py,sha256=27c19S67BMq1Eup6ViX-SiYpEq93bMTwe031RsE4Xm0,8130
36
- pyxcp/transport/can.py,sha256=bzKV9Lh5suKdZ5dm3ZEz1osOqkRZNlxrVAW7vr38JSM,14485
36
+ pyxcp/transport/can.py,sha256=uFPG_Caf1BwIo2pKheZLs0VfPth1KoEPxuKtI2qt9as,18250
37
37
  pyxcp/transport/base.py,sha256=i9VdWqGNqx5LMdFkD8SmmMQSRoDDXAjMRS3p6KD1A8E,15912
38
38
  pyxcp/config/legacy.py,sha256=Uhu_6bp_W8yGmZ2s3TFzf8-5mGwLdeTss56BMYWpsZY,5100
39
- pyxcp/config/__init__.py,sha256=vIYPtzzNI4kUmevpOsSFgbfuBXPq7e2bhIIwWcqPcqQ,41835
39
+ pyxcp/config/__init__.py,sha256=hM1eQtllcZeZ4zo9YzscO2Z5EOpV3hWyZgY9GZMiavw,42085
40
40
  pyxcp/tests/test_utils.py,sha256=gqv3bhhWfKKdKDkqnELqsOHCfpRRZwlReEy87Ya4Z2w,850
41
41
  pyxcp/tests/test_master.py,sha256=a_Q8Fa49y_3vnrp-VFZ-22cHWjq58RC2daF6EcfbhZc,69434
42
42
  pyxcp/tests/test_daq.py,sha256=mThMsweEwxzIFRQQ88BNz_60OQ-xmC5OamIxHx9VWis,5358
@@ -70,7 +70,7 @@ pyxcp/examples/conf_nixnet.json,sha256=R-RKw172YhssO_9rud5McxtjesphEadA9Ub2OEKHp
70
70
  pyxcp/examples/conf_sxi.json,sha256=rDh7LyaqtvYoYjMaVo1gqEkS_hiTGdXlW4O6ivzGhFo,149
71
71
  pyxcp/examples/conf_can_vector.json,sha256=VtGmyt9ORPTo9yirv1fZM_XT9DARFFNwai11RaCNRWo,238
72
72
  pyxcp/examples/conf_can_user.toml,sha256=BqCID-GvaNbA6pbqRbyRMuzKAsJaYVube0ql4CvkMoY,298
73
- pyxcp/examples/xcp_user_supplied_driver.py,sha256=TD8Ggzdb2T9o6Z-VMvuJMREMpzufI5u27ThaadCxhDg,1024
73
+ pyxcp/examples/xcp_user_supplied_driver.py,sha256=Wyep2KhtcFC2GzZuJPj5ikSqWIWYsf5D0mfs1jCtYX0,1104
74
74
  pyxcp/examples/xcp_skel.py,sha256=F2g2C79jiYZl0cpRHfzWusfn1ZvodOS_r1Az6aknZL4,1110
75
75
  pyxcp/examples/xcp_unlock.py,sha256=vl2Zv7Z6EuBxI2ZxbGQK6-0tZBVqd72FZllsvIfuJ5w,652
76
76
  pyxcp/examples/xcphello.py,sha256=yB1YEpxCLuCnjvN5pjZbB3obfSMEEdtfrER57KQ8KE4,2560
@@ -85,7 +85,7 @@ pyxcp/scripts/xmraw_converter.py,sha256=W_Znm5OzBKfcyiUgwHIaLYdc2DEusX6jv2b03KAH
85
85
  pyxcp/scripts/xcp_profile.py,sha256=5IoBMv8tV64nxKCVaJ4bBF7dl3_fqqsQ2tr0OoM87Vw,588
86
86
  pyxcp/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  pyxcp/scripts/xcp_fetch_a2l.py,sha256=tLdrU03xmnfz_-FeYSq-TH5ZsDLvpQRBvXpO5NZZohU,1199
88
- pyxcp/scripts/xcp_info.py,sha256=sslBR_FBXYGG_W-SW1pZvtLBvyGO3jQKko-SqGqR2_0,5565
88
+ pyxcp/scripts/xcp_info.py,sha256=vXGNjO8tFJhiudp9ItZ9946NIRStj4brEpY4nNo9bTo,5505
89
89
  pyxcp/scripts/xcp_examples.py,sha256=rsvpb6moMhBxAcP5hBnHug9x-6i65WVwL5Q_tHty59c,2519
90
90
  pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=qnNLYa6hInzNrVyYh7xXYt_SB5b-tgMJHXJwIkz7lbE,547
91
91
  pyxcp/recorder/build_gcc_arm.sh,sha256=spqHf6D8Jd4NACYG65SNjb-BLMntELwBDO4PpHUiyYc,238