pyxcp 0.22.35__cp312-cp312-macosx_11_0_arm64.whl → 0.23.1__cp312-cp312-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 +1 -1
- pyxcp/config/__init__.py +12 -2
- pyxcp/daq_stim/scheduler.cpp +51 -17
- pyxcp/examples/xcp_user_supplied_driver.py +24 -34
- pyxcp/scripts/xcp_info.py +1 -3
- pyxcp/transport/can.py +131 -16
- {pyxcp-0.22.35.dist-info → pyxcp-0.23.1.dist-info}/METADATA +1 -1
- {pyxcp-0.22.35.dist-info → pyxcp-0.23.1.dist-info}/RECORD +11 -11
- {pyxcp-0.22.35.dist-info → pyxcp-0.23.1.dist-info}/LICENSE +0 -0
- {pyxcp-0.22.35.dist-info → pyxcp-0.23.1.dist-info}/WHEEL +0 -0
- {pyxcp-0.22.35.dist-info → pyxcp-0.23.1.dist-info}/entry_points.txt +0 -0
pyxcp/__init__.py
CHANGED
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(
|
|
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
|
pyxcp/daq_stim/scheduler.cpp
CHANGED
|
@@ -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 ==
|
|
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
|
-
|
|
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
|
-
|
|
24
|
+
#endif // _WIN32
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
from typing import Dict, List, Optional
|
|
5
4
|
|
|
6
|
-
|
|
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
|
|
15
|
-
"""
|
|
11
|
+
class CustomCANInterface(CanInterfaceBase):
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
def init(self):
|
|
14
|
+
"""Initialize the CAN interface here."""
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
25
|
-
|
|
24
|
+
def send(self, msg: can.message.Message):
|
|
25
|
+
"""Send CAN frames."""
|
|
26
|
+
print(f"send({msg})")
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
@property
|
|
29
|
+
def filters(self):
|
|
30
|
+
"""Return the current CAN filters."""
|
|
31
|
+
return self._filters
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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,15 +1,15 @@
|
|
|
1
|
-
pyxcp-0.
|
|
2
|
-
pyxcp-0.
|
|
3
|
-
pyxcp-0.
|
|
4
|
-
pyxcp-0.
|
|
5
|
-
pyxcp-0.
|
|
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=HdXaJ5oV0dCHo2ILOORlQC0rLhdm1c_ApHYRuS7PtwE,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=
|
|
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
|
|
@@ -20,7 +20,7 @@ pyxcp/asam/types.py,sha256=V4wSCGI1pXn0EsBemDyaHTBgY2wkV_BeLShnDIGGgDE,2310
|
|
|
20
20
|
pyxcp/daq_stim/stim.cpython-312-darwin.so,sha256=L9OoS4MPieqeyB-AkHf-lEp9vAw9sRH7HuVJr-i7sNI,237656
|
|
21
21
|
pyxcp/daq_stim/stim.cpp,sha256=sABgEfbQlt5kXbzAsndyhaDFWRWTJw3jJlNfanIVrRs,164
|
|
22
22
|
pyxcp/daq_stim/__init__.py,sha256=HAfOpn4yeb4DYNZHr6pzpFGHisXbKEytXJ6KUatDMTk,9328
|
|
23
|
-
pyxcp/daq_stim/scheduler.cpp,sha256=
|
|
23
|
+
pyxcp/daq_stim/scheduler.cpp,sha256=2XW9PmxrJR8DfYMVszGwBX-KANVviwPcUNBvnjw5MlM,1443
|
|
24
24
|
pyxcp/daq_stim/stim.hpp,sha256=1DwAhkY7XJN14aD2BxLJ4O1j4_a6RvpePIbAG1U8iOA,17904
|
|
25
25
|
pyxcp/daq_stim/stim.cpython-310-darwin.so,sha256=RqFNsPbyPi8oHidN2ACHa6aPRQadF14q068jvjDhGKE,237576
|
|
26
26
|
pyxcp/daq_stim/scheduler.hpp,sha256=H-kwyZBV3S8q6YlCq6OLUbaNXskyCOS4z3SRP32ikPY,1809
|
|
@@ -34,10 +34,10 @@ pyxcp/transport/sxi.py,sha256=gbFTOA-O0q0RwZUbRgN3hCdkoutxMt15TgVjVwdvWsY,4625
|
|
|
34
34
|
pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
35
|
pyxcp/transport/__init__.py,sha256=wIeYkGygucYdXEzymJcDvimnwZgqJY8KRv7Mk__aUSU,428
|
|
36
36
|
pyxcp/transport/usb_transport.py,sha256=27c19S67BMq1Eup6ViX-SiYpEq93bMTwe031RsE4Xm0,8130
|
|
37
|
-
pyxcp/transport/can.py,sha256=
|
|
37
|
+
pyxcp/transport/can.py,sha256=uFPG_Caf1BwIo2pKheZLs0VfPth1KoEPxuKtI2qt9as,18250
|
|
38
38
|
pyxcp/transport/base.py,sha256=i9VdWqGNqx5LMdFkD8SmmMQSRoDDXAjMRS3p6KD1A8E,15912
|
|
39
39
|
pyxcp/config/legacy.py,sha256=Uhu_6bp_W8yGmZ2s3TFzf8-5mGwLdeTss56BMYWpsZY,5100
|
|
40
|
-
pyxcp/config/__init__.py,sha256=
|
|
40
|
+
pyxcp/config/__init__.py,sha256=hM1eQtllcZeZ4zo9YzscO2Z5EOpV3hWyZgY9GZMiavw,42085
|
|
41
41
|
pyxcp/tests/test_utils.py,sha256=gqv3bhhWfKKdKDkqnELqsOHCfpRRZwlReEy87Ya4Z2w,850
|
|
42
42
|
pyxcp/tests/test_master.py,sha256=a_Q8Fa49y_3vnrp-VFZ-22cHWjq58RC2daF6EcfbhZc,69434
|
|
43
43
|
pyxcp/tests/test_daq.py,sha256=mThMsweEwxzIFRQQ88BNz_60OQ-xmC5OamIxHx9VWis,5358
|
|
@@ -71,7 +71,7 @@ pyxcp/examples/conf_nixnet.json,sha256=R-RKw172YhssO_9rud5McxtjesphEadA9Ub2OEKHp
|
|
|
71
71
|
pyxcp/examples/conf_sxi.json,sha256=rDh7LyaqtvYoYjMaVo1gqEkS_hiTGdXlW4O6ivzGhFo,149
|
|
72
72
|
pyxcp/examples/conf_can_vector.json,sha256=VtGmyt9ORPTo9yirv1fZM_XT9DARFFNwai11RaCNRWo,238
|
|
73
73
|
pyxcp/examples/conf_can_user.toml,sha256=BqCID-GvaNbA6pbqRbyRMuzKAsJaYVube0ql4CvkMoY,298
|
|
74
|
-
pyxcp/examples/xcp_user_supplied_driver.py,sha256=
|
|
74
|
+
pyxcp/examples/xcp_user_supplied_driver.py,sha256=Wyep2KhtcFC2GzZuJPj5ikSqWIWYsf5D0mfs1jCtYX0,1104
|
|
75
75
|
pyxcp/examples/xcp_skel.py,sha256=F2g2C79jiYZl0cpRHfzWusfn1ZvodOS_r1Az6aknZL4,1110
|
|
76
76
|
pyxcp/examples/xcp_unlock.py,sha256=vl2Zv7Z6EuBxI2ZxbGQK6-0tZBVqd72FZllsvIfuJ5w,652
|
|
77
77
|
pyxcp/examples/xcphello.py,sha256=yB1YEpxCLuCnjvN5pjZbB3obfSMEEdtfrER57KQ8KE4,2560
|
|
@@ -86,7 +86,7 @@ pyxcp/scripts/xmraw_converter.py,sha256=W_Znm5OzBKfcyiUgwHIaLYdc2DEusX6jv2b03KAH
|
|
|
86
86
|
pyxcp/scripts/xcp_profile.py,sha256=5IoBMv8tV64nxKCVaJ4bBF7dl3_fqqsQ2tr0OoM87Vw,588
|
|
87
87
|
pyxcp/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
88
88
|
pyxcp/scripts/xcp_fetch_a2l.py,sha256=tLdrU03xmnfz_-FeYSq-TH5ZsDLvpQRBvXpO5NZZohU,1199
|
|
89
|
-
pyxcp/scripts/xcp_info.py,sha256=
|
|
89
|
+
pyxcp/scripts/xcp_info.py,sha256=vXGNjO8tFJhiudp9ItZ9946NIRStj4brEpY4nNo9bTo,5505
|
|
90
90
|
pyxcp/scripts/xcp_examples.py,sha256=rsvpb6moMhBxAcP5hBnHug9x-6i65WVwL5Q_tHty59c,2519
|
|
91
91
|
pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=qnNLYa6hInzNrVyYh7xXYt_SB5b-tgMJHXJwIkz7lbE,547
|
|
92
92
|
pyxcp/recorder/build_gcc_arm.sh,sha256=spqHf6D8Jd4NACYG65SNjb-BLMntELwBDO4PpHUiyYc,238
|
|
File without changes
|
|
File without changes
|
|
File without changes
|