pyxcp 0.23.3__cp312-cp312-win_arm64.whl → 0.25.6__cp312-cp312-win_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.
Files changed (87) hide show
  1. pyxcp/__init__.py +1 -1
  2. pyxcp/asamkeydll.exe +0 -0
  3. pyxcp/cmdline.py +15 -30
  4. pyxcp/config/__init__.py +73 -20
  5. pyxcp/cpp_ext/aligned_buffer.hpp +168 -0
  6. pyxcp/cpp_ext/bin.hpp +7 -6
  7. pyxcp/cpp_ext/cpp_ext.cp310-win_arm64.pyd +0 -0
  8. pyxcp/cpp_ext/cpp_ext.cp311-win_arm64.pyd +0 -0
  9. pyxcp/cpp_ext/cpp_ext.cp312-win_arm64.pyd +0 -0
  10. pyxcp/cpp_ext/daqlist.hpp +241 -73
  11. pyxcp/cpp_ext/extension_wrapper.cpp +123 -15
  12. pyxcp/cpp_ext/framing.hpp +360 -0
  13. pyxcp/cpp_ext/mcobject.hpp +5 -3
  14. pyxcp/cpp_ext/sxi_framing.hpp +332 -0
  15. pyxcp/daq_stim/__init__.py +182 -45
  16. pyxcp/daq_stim/optimize/binpacking.py +2 -2
  17. pyxcp/daq_stim/scheduler.cpp +8 -8
  18. pyxcp/daq_stim/stim.cp310-win_arm64.pyd +0 -0
  19. pyxcp/daq_stim/stim.cp311-win_arm64.pyd +0 -0
  20. pyxcp/daq_stim/stim.cp312-win_arm64.pyd +0 -0
  21. pyxcp/errormatrix.py +2 -2
  22. pyxcp/examples/run_daq.py +5 -3
  23. pyxcp/examples/xcp_policy.py +6 -6
  24. pyxcp/examples/xcp_read_benchmark.py +2 -2
  25. pyxcp/examples/xcp_skel.py +1 -2
  26. pyxcp/examples/xcp_unlock.py +10 -12
  27. pyxcp/examples/xcp_user_supplied_driver.py +1 -2
  28. pyxcp/examples/xcphello.py +2 -15
  29. pyxcp/examples/xcphello_recorder.py +2 -2
  30. pyxcp/master/__init__.py +1 -0
  31. pyxcp/master/errorhandler.py +248 -13
  32. pyxcp/master/master.py +838 -250
  33. pyxcp/recorder/.idea/.gitignore +8 -0
  34. pyxcp/recorder/.idea/misc.xml +4 -0
  35. pyxcp/recorder/.idea/modules.xml +8 -0
  36. pyxcp/recorder/.idea/recorder.iml +6 -0
  37. pyxcp/recorder/.idea/sonarlint/issuestore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728 +7 -0
  38. pyxcp/recorder/.idea/sonarlint/issuestore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae +0 -0
  39. pyxcp/recorder/.idea/sonarlint/issuestore/b/4/b49006702b459496a8e8c94ebe60947108361b91 +0 -0
  40. pyxcp/recorder/.idea/sonarlint/issuestore/index.pb +7 -0
  41. pyxcp/recorder/.idea/sonarlint/securityhotspotstore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728 +0 -0
  42. pyxcp/recorder/.idea/sonarlint/securityhotspotstore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae +0 -0
  43. pyxcp/recorder/.idea/sonarlint/securityhotspotstore/b/4/b49006702b459496a8e8c94ebe60947108361b91 +0 -0
  44. pyxcp/recorder/.idea/sonarlint/securityhotspotstore/index.pb +7 -0
  45. pyxcp/recorder/.idea/vcs.xml +10 -0
  46. pyxcp/recorder/__init__.py +5 -10
  47. pyxcp/recorder/converter/__init__.py +4 -10
  48. pyxcp/recorder/reader.hpp +0 -1
  49. pyxcp/recorder/reco.py +1 -0
  50. pyxcp/recorder/rekorder.cp310-win_arm64.pyd +0 -0
  51. pyxcp/recorder/rekorder.cp311-win_arm64.pyd +0 -0
  52. pyxcp/recorder/rekorder.cp312-win_arm64.pyd +0 -0
  53. pyxcp/recorder/unfolder.hpp +129 -107
  54. pyxcp/recorder/wrap.cpp +3 -8
  55. pyxcp/scripts/xcp_fetch_a2l.py +2 -2
  56. pyxcp/scripts/xcp_id_scanner.py +1 -2
  57. pyxcp/scripts/xcp_info.py +66 -51
  58. pyxcp/scripts/xcp_profile.py +1 -2
  59. pyxcp/tests/test_daq.py +1 -1
  60. pyxcp/tests/test_framing.py +262 -0
  61. pyxcp/tests/test_master.py +210 -100
  62. pyxcp/tests/test_transport.py +138 -42
  63. pyxcp/timing.py +1 -1
  64. pyxcp/transport/__init__.py +8 -5
  65. pyxcp/transport/base.py +187 -143
  66. pyxcp/transport/can.py +117 -13
  67. pyxcp/transport/eth.py +55 -20
  68. pyxcp/transport/hdf5_policy.py +167 -0
  69. pyxcp/transport/sxi.py +126 -52
  70. pyxcp/transport/transport_ext.cp310-win_arm64.pyd +0 -0
  71. pyxcp/transport/transport_ext.cp311-win_arm64.pyd +0 -0
  72. pyxcp/transport/transport_ext.cp312-win_arm64.pyd +0 -0
  73. pyxcp/transport/transport_ext.hpp +214 -0
  74. pyxcp/transport/transport_wrapper.cpp +249 -0
  75. pyxcp/transport/usb_transport.py +47 -31
  76. pyxcp/types.py +0 -13
  77. pyxcp/{utils.py → utils/__init__.py} +3 -4
  78. pyxcp/utils/cli.py +78 -0
  79. pyxcp-0.25.6.dist-info/METADATA +341 -0
  80. pyxcp-0.25.6.dist-info/RECORD +153 -0
  81. {pyxcp-0.23.3.dist-info → pyxcp-0.25.6.dist-info}/WHEEL +1 -1
  82. pyxcp/examples/conf_sxi.json +0 -9
  83. pyxcp/examples/conf_sxi.toml +0 -7
  84. pyxcp-0.23.3.dist-info/METADATA +0 -219
  85. pyxcp-0.23.3.dist-info/RECORD +0 -131
  86. {pyxcp-0.23.3.dist-info → pyxcp-0.25.6.dist-info}/entry_points.txt +0 -0
  87. {pyxcp-0.23.3.dist-info → pyxcp-0.25.6.dist-info/licenses}/LICENSE +0 -0
pyxcp/utils/cli.py ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Reusable command-line parser utilities.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ import sys
10
+ from collections.abc import Sequence
11
+
12
+
13
+ class StrippingParser:
14
+ """Base class for parsers that can strip recognized arguments from sys.argv.
15
+
16
+ This is useful when multiple argument parsers are used in a single process (chained),
17
+ and downstream parsers should not see arguments already handled by an
18
+ upstream parser.
19
+ """
20
+
21
+ def __init__(self, parser: argparse.ArgumentParser) -> None:
22
+ """Initialize with an existing ArgumentParser instance."""
23
+ self._parser = parser
24
+
25
+ @property
26
+ def parser(self) -> argparse.ArgumentParser:
27
+ """Return the underlying ArgumentParser instance."""
28
+ return self._parser
29
+
30
+ def parse_known(self, argv: Sequence[str] | None = None) -> tuple[argparse.Namespace, list[str]]:
31
+ """Parse known args from ``argv`` and return (namespace, remaining).
32
+
33
+ Does not mutate ``sys.argv``.
34
+ """
35
+ if argv is None:
36
+ argv = sys.argv[1:]
37
+ namespace, remaining = self._parser.parse_known_args(argv)
38
+
39
+ # Emulate standard -h/--help behavior if "help" is in the namespace
40
+ if getattr(namespace, "help", False):
41
+ # Print help and exit similarly to ArgumentParser
42
+ # We need a temporary full parser to render standard help including program name
43
+ full = argparse.ArgumentParser(description=self._parser.description)
44
+ for action in self._parser._actions:
45
+ if action.option_strings and action.dest == "help":
46
+ continue
47
+ full._add_action(action)
48
+ full.print_help()
49
+ sys.exit(0)
50
+
51
+ return namespace, list(remaining)
52
+
53
+ def strip_from_argv(self, argv: list[str] | None = None) -> None:
54
+ """Remove this parser's recognized options from ``sys.argv`` in-place.
55
+
56
+ If ``argv`` is provided, it is treated as a mutable list whose content
57
+ will be replaced with the stripped version (first element preserved as
58
+ program name). If omitted, ``sys.argv`` is modified.
59
+ """
60
+ arg_list = argv if argv is not None else sys.argv
61
+ if not arg_list:
62
+ return
63
+ _, remaining = self.parse_known(arg_list[1:])
64
+ # Rebuild argv with program name + remaining
65
+ prog = arg_list[0]
66
+ arg_list[:] = [prog] + remaining
67
+
68
+ def parse_and_strip(self, argv: list[str] | None = None) -> argparse.Namespace:
69
+ """Parse options and strip them from argv; returns the parsed namespace."""
70
+ arg_list = argv if argv is not None else sys.argv
71
+ if not arg_list:
72
+ # Fallback for empty list
73
+ return self.parse_known([])[0]
74
+ namespace, remaining = self.parse_known(arg_list[1:])
75
+ # mutate
76
+ prog = arg_list[0]
77
+ arg_list[:] = [prog] + remaining
78
+ return namespace
@@ -0,0 +1,341 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyxcp
3
+ Version: 0.25.6
4
+ Summary: Universal Calibration Protocol for Python
5
+ License: LGPLv3
6
+ License-File: LICENSE
7
+ Keywords: automotive,ecu,xcp,asam,autosar
8
+ Author: Christoph Schueler
9
+ Author-email: cpu.gems@googlemail.com
10
+ Requires-Python: >=3.10,<4.0
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
14
+ Classifier: License :: Other/Proprietary License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Topic :: Scientific/Engineering
22
+ Classifier: Topic :: Software Development
23
+ Requires-Dist: bandit (>=1.7.8,<2.0.0)
24
+ Requires-Dist: chardet (>=5.2.0,<6.0.0)
25
+ Requires-Dist: construct (>=2.10.68,<3.0.0)
26
+ Requires-Dist: line-profiler-pycharm (>=1.1.0,<2.0.0)
27
+ Requires-Dist: mako (>=1.2.4,<2.0.0)
28
+ Requires-Dist: pydantic (>=2.5,<3)
29
+ Requires-Dist: pyserial (>=3.5,<4.0)
30
+ Requires-Dist: python-can (>=4.2.2,<5.0.0)
31
+ Requires-Dist: pytz (>=2025.2,<2026.0)
32
+ Requires-Dist: pyusb (>=1.2.1,<2.0.0)
33
+ Requires-Dist: rich (>=14.0.0,<15.0.0)
34
+ Requires-Dist: toml (>=0.10.2,<0.11.0)
35
+ Requires-Dist: tomlkit (>=0.13.3,<0.14.0)
36
+ Requires-Dist: traitlets (<=5.11.2)
37
+ Requires-Dist: uptime (>=3.0.1,<4.0.0)
38
+ Project-URL: Homepage, https://github.com/christoph2/pyxcp
39
+ Description-Content-Type: text/x-rst
40
+
41
+ Readme
42
+ ======
43
+
44
+ .. image:: pyxcp_social.svg
45
+ :align: center
46
+
47
+ Reliable Python tooling for the ASAM MCD-1 XCP protocol (measurement,
48
+ calibration, flashing) with multiple transports (CAN, Ethernet, USB,
49
+ Serial) and handy CLI utilities.
50
+
51
+ |PyPI| |Python Versions| |License: LGPL v3+| |Code style: black|
52
+
53
+ ``pyXCP`` is a production-ready Python library for communicating with
54
+ XCP-enabled devices, most commonly automotive ECUs. Use it to take
55
+ measurements, adjust parameters (calibration), stream DAQ/STIM, and
56
+ program devices during development.
57
+
58
+ Highlights:
59
+
60
+ - Transports: Ethernet (TCP/IP), CAN, USB, Serial (SxI)
61
+ - Cross-platform: Windows, Linux, macOS
62
+ - Rich CLI tools for common XCP tasks
63
+ - Extensible architecture and layered design
64
+
65
+ --------------
66
+
67
+ Installation
68
+ ------------
69
+
70
+ The easiest way is from PyPI:
71
+
72
+ .. code:: shell
73
+
74
+ pip install pyxcp
75
+
76
+ To install from the main branch:
77
+
78
+ .. code:: shell
79
+
80
+ pip install git+https://github.com/christoph2/pyxcp.git
81
+
82
+ Requirements
83
+ ~~~~~~~~~~~~
84
+
85
+ - Python >= 3.10
86
+ - Building from source requires a working C/C++ toolchain (native
87
+ extensions are used for performance). Wheels are provided for common
88
+ platforms and Python versions; if a wheel is not available, pip will
89
+ build from source.
90
+ - An XCP slave device (or simulator)
91
+
92
+ Quick start
93
+ -----------
94
+
95
+ The tutorial walks you through typical tasks end-to-end: see `tutorial <tutorial.rst>`_.
96
+
97
+ Minimal example using the built-in argument parser and context manager:
98
+
99
+ .. code:: python
100
+
101
+ from pyxcp.cmdline import ArgumentParser
102
+
103
+ ap = ArgumentParser(description="pyXCP hello world")
104
+
105
+ with ap.run() as x:
106
+ x.connect()
107
+ identifier = x.identifier(0x01)
108
+ print(f"ID: {identifier!r}")
109
+ print(x.slaveProperties)
110
+ x.disconnect()
111
+
112
+ Configuration
113
+ ~~~~~~~~~~~~~
114
+
115
+ ``pyXCP`` supports a
116
+ `traitlets <https://github.com/ipython/traitlets>`__\-based configuration system.
117
+
118
+ - Recommended Python config example and generator: `tutorial <tutorial.rst>`__ and `configuration <configuration.rst>`__
119
+ - Legacy TOML examples remain available for compatibility.
120
+
121
+ Command‑line tools
122
+ ~~~~~~~~~~~~~~~~~~
123
+
124
+ Installed entry points (see pyproject.toml):
125
+
126
+ - xcp-info — print capabilities and properties
127
+ - xcp-id-scanner — scan for slave identifiers
128
+ - xcp-fetch-a2l — retrieve A2L from target (if supported)
129
+ - xcp-profile — generate/convert config files
130
+ - xcp-examples — launch assorted demos/examples
131
+ - xmraw-converter — convert recorder .xmraw data
132
+ - pyxcp-probe-can-drivers — list available CAN interfaces
133
+
134
+ Run any tool with -h for options.
135
+
136
+ Features
137
+ --------
138
+
139
+ - Multiple transport layers: Ethernet (TCP), CAN, USB, SxI (serial/UART)
140
+ - Data Acquisition (DAQ) and Stimulation (STIM)
141
+ - Calibration (read/write parameters)
142
+ - Flashing/programming workflows
143
+ - A2L (ASAM MCD‑2 MC) support
144
+ - Recorder utilities and converters (see `recorder <recorder.rst>`__)
145
+ - Extensible architecture for custom transports
146
+
147
+ Documentation
148
+ -------------
149
+
150
+ - Getting started tutorial: `tutorial <tutorial.rst>`__
151
+ - Configuration: `configuration <configuration.rst>`__
152
+ - CAN driver setup and troubleshooting: `howto_can_driver <howto_can_driver.rst>`__
153
+ - Recorder: `recorder <recorder.rst>`__
154
+ - Troubleshooting: `troubleshooting <troubleshooting.rst>`__
155
+ - Troubleshooting matrix (common errors, root causes, fixes):
156
+ `troubleshooting_matrix <troubleshooting_matrix.rst>`__
157
+
158
+ To build the Sphinx documentation locally:
159
+
160
+ 1. Install doc requirements:
161
+ ``pip install -r docs/requirements.txt``
162
+ 2. Build:
163
+ ``sphinx-build -b html docs docs/_build/html``
164
+ 3. Open
165
+ ``docs/_build/html/index.html``
166
+
167
+ Compatibility
168
+ -------------
169
+
170
+ - Operating systems: Windows, Linux, macOS
171
+ - Python: 3.10 - 3.14, CPython wheels where available
172
+ - CAN backends: python-can compatible drivers (see `howto_can_driver <howto_can_driver.rst>`__)
173
+
174
+ Contributing
175
+ ------------
176
+
177
+ Contributions are welcome! Please: - Read `CODE_OF_CONDUCT <../CODE_OF_CONDUCT.md>`__ - Open an
178
+ issue or discussion before large changes - Use
179
+ `pre-commit <https://github.com/pre-commit/pre-commit>`__ to run linters
180
+ and tests locally
181
+
182
+ License
183
+ -------
184
+
185
+ GNU Lesser General Public License v3 or later (LGPLv3+). See LICENSE for
186
+ details.
187
+
188
+ References
189
+ ----------
190
+
191
+ - ASAM MCD‑1 XCP standard:
192
+ https://www.asam.net/standards/detail/mcd-1-xcp/
193
+
194
+ About ASAM MCD‑1 XCP
195
+ --------------------
196
+
197
+ XCP (Universal Measurement and Calibration Protocol) is an ASAM standard
198
+ defining a vendor‑neutral protocol to access internal data of electronic
199
+ control units (ECUs) for measurement, calibration (parameter tuning),
200
+ and programming. XCP decouples the protocol from the physical transport,
201
+ so the same command set can be carried over different buses such as CAN,
202
+ FlexRay, Ethernet, USB, or Serial.
203
+
204
+ - Roles: An XCP Master (this library) communicates with an XCP Slave
205
+ (your device/ECU or simulator).
206
+ - Layered concept: XCP defines an application layer and transport
207
+ layers. ``pyXCP`` implements the application layer and multiple transport
208
+ bindings.
209
+ - Use cases:
210
+
211
+ - Measurement: Read variables from the ECU in real‑time, including
212
+ high‑rate DAQ streaming.
213
+ - Calibration: Read/write parameters (calibration data) in RAM/flash.
214
+ - Programming: Download new program/data to flash (where the slave
215
+ supports it).
216
+
217
+ For the authoritative description, see the ASAM page:
218
+ https://www.asam.net/standards/detail/mcd-1-xcp/
219
+
220
+ XCP in a nutshell
221
+ -----------------
222
+
223
+ - Connect/Session: The master establishes a connection, negotiates
224
+ capabilities/features, and optionally unlocks protected functions via
225
+ seed & key.
226
+ - Addressing: Memory is accessed via absolute or segment‑relative
227
+ addresses. Addressing modes are described in the associated A2L file
228
+ (ASAM MCD‑2 MC), which maps symbolic names to addresses, data types,
229
+ and conversion rules.
230
+ - Events: The slave exposes events (e.g., “1 ms task”, “Combustion
231
+ cycle”), which trigger DAQ sampling. The master assigns signals (ODTs)
232
+ to these events for time‑aligned acquisition.
233
+ - DAQ/STIM: DAQ = Data Acquisition (slave → master), STIM = Stimulation
234
+ (master → slave). Both use event‑driven lists for deterministic
235
+ timing.
236
+ - Timestamps: DAQ may carry timestamps from the slave for precise time
237
+ correlation.
238
+ - Security: Access to sensitive commands (e.g., programming,
239
+ calibration) can be protected by a seed & key algorithm negotiated at
240
+ runtime.
241
+ - Checksums: XCP defines checksum services useful for verifying memory
242
+ regions (e.g., after flashing).
243
+
244
+ Relation to A2L (ASAM MCD‑2 MC)
245
+ -------------------------------
246
+
247
+ While XCP defines the protocol, the A2L file describes the measurement
248
+ and calibration objects (characteristics, measurements), data types,
249
+ conversion rules, and memory layout. In practice, you use ``pyXCP`` together
250
+ with an A2L to: - Resolve symbolic names to addresses and data types. -
251
+ Configure DAQ lists from human‑readable signal names. - Interpret raw
252
+ values using the appropriate conversion methods.
253
+
254
+ ``pyXCP`` provides utilities to fetch A2L data when supported by the slave
255
+ and to work with A2L‑described objects. See also
256
+ `pya2ldb <https://github.com/christoph2/pya2l>`__!
257
+
258
+ Transports and addressing
259
+ -------------------------
260
+
261
+ XCP is transport‑agnostic. ``pyXCP`` supports multiple transports and
262
+ addressing schemes: - CAN (XCP on CAN): Robust and ubiquitous in
263
+ vehicles; limited payload and bandwidth; suited for many calibration
264
+ tasks and moderate DAQ rates. - Ethernet (XCP on TCP/UDP): High
265
+ bandwidth with low latency; well suited for rich DAQ and programming
266
+ workflows. - USB: High throughput for lab setups; requires device
267
+ support. - Serial/SxI: Simple point‑to‑point links for embedded targets
268
+ and simulators.
269
+
270
+ The exact capabilities (e.g., max CTO/DTO, checksum types, timestamping)
271
+ are negotiated at connect time and depend on the slave and transport.
272
+
273
+ Supported features (overview)
274
+ -----------------------------
275
+
276
+ The scope of features depends on the connected slave. At the library
277
+ level, ``pyXCP`` provides: - Session management: CONNECT/DISCONNECT,
278
+ GET_STATUS/SLAVE_PROPERTIES, communication mode setup, error handling. -
279
+ Memory access: Upload/short upload, Download/Download Next,
280
+ verifications, optional paged memory where supported. - DAQ/STIM:
281
+ Configuration of DAQ lists/ODTs, event assignment, data streaming,
282
+ timestamp handling when available. - Programming helpers: Building
283
+ blocks for program/erase/write flows (exact sequence per slave’s flash
284
+ algorithm and A2L description). - Security/Seed & Key: Pluggable
285
+ seed‑to‑key resolution including 32↔64‑bit bridge on Windows. -
286
+ Utilities: Identifier scanning, A2L helpers, recorder and converters.
287
+
288
+ Refer to `tutorial <tutorial.rst>`__ and `configuration <configuration.rst>`__ for feature usage,
289
+ and xcp-info for a capability dump of your target.
290
+
291
+ Compliance and versions
292
+ -----------------------
293
+
294
+ ``pyXCP`` aims to be compatible with commonly used parts of ASAM MCD‑1 XCP.
295
+ Specific optional features are enabled when a slave advertises them
296
+ during CONNECT. Because implementations vary across vendors and ECU
297
+ projects, always consult your A2L and use xcp-info to confirm negotiated
298
+ options (e.g., checksum type, timestamp unit, max DTO size, address
299
+ granularity).
300
+
301
+ If you rely on a particular XCP feature/profile not mentioned here,
302
+ please open an issue with details about your slave and A2L so we can
303
+ clarify support and—if feasible—add coverage.
304
+
305
+ Safety, performance, and limitations
306
+ ------------------------------------
307
+
308
+ - Safety‑critical systems: XCP is a development and testing protocol. Do
309
+ not enable measurement/calibration on safety‑critical systems in the
310
+ field unless your system‑level safety case covers it.
311
+ - Performance: Achievable DAQ rates depend on transport bandwidth, ECU
312
+ event rates, DTO sizes, and host processing. Ethernet typically yields
313
+ the highest throughput.
314
+ - Latency/jitter: Event scheduling in the slave and OS scheduling on the
315
+ host can affect determinism. Use timestamps to correlate data
316
+ precisely.
317
+ - Access control: Seed & key protects sensitive functions; your
318
+ organization’s policy should govern algorithm distribution and access.
319
+
320
+ Further resources
321
+ -----------------
322
+
323
+ - ASAM MCD‑1 XCP standard (overview and membership):
324
+ https://www.asam.net/standards/detail/mcd-1-xcp/
325
+ - ASAM MCD‑2 MC (A2L) for object descriptions:
326
+ https://www.asam.net/standards/detail/mcd-2-mc/
327
+ - Introduction to DAQ/STIM concepts (ASAM publications and vendor docs)
328
+ - Related: CCP (legacy predecessor to XCP), ASAM MDF for measurement
329
+ data storage
330
+
331
+ .. |CI| image:: https://github.com/christoph2/pyxcp/workflows/Python%20application/badge.svg
332
+ :target: https://github.com/christoph2/pyxcp/actions
333
+ .. |PyPI| image:: https://img.shields.io/pypi/v/pyxcp.svg
334
+ :target: https://pypi.org/project/pyxcp/
335
+ .. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pyxcp.svg
336
+ :target: https://pypi.org/project/pyxcp/
337
+ .. |License: LGPL v3+| image:: https://img.shields.io/badge/License-LGPL%20v3%2B-blue.svg
338
+ :target: https://www.gnu.org/licenses/lgpl-3.0
339
+ .. |Code style: black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
340
+ :target: https://github.com/psf/black
341
+
@@ -0,0 +1,153 @@
1
+ pyxcp/__init__.py,sha256=6HPxFiiIwIZMKF542IgvDiJ32LZS2ZoS4q_gYkafSwg,547
2
+ pyxcp/aml/EtasCANMonitoring.a2l,sha256=EJYwe3Z3H24vyWAa6lUgcdKnQY8pwFxjyCN6ZU1ST8w,1509
3
+ pyxcp/aml/EtasCANMonitoring.aml,sha256=xl0DdyeiIaLW0mmmJNAyJS0CQdOLSxt9dxfgrdSlU8Y,2405
4
+ pyxcp/aml/ifdata_CAN.a2l,sha256=NCUnCUEEgRbZYSLGtUGwL2e7zJ8hrp0SbmLHGv8uY58,612
5
+ pyxcp/aml/ifdata_Eth.a2l,sha256=w4Vek0Xc5Rt7zroZztY0FEJTyVnk-E21wq_itxX2hI4,250
6
+ pyxcp/aml/ifdata_Flx.a2l,sha256=oXIIwl3DA9JCyVRGKaLEedauC0q4JoRWQly-qTiYAaw,1891
7
+ pyxcp/aml/ifdata_SxI.a2l,sha256=PPTZvyKKtp12qDiv9oHlW32ocPD7elJaOHklfg56r5E,316
8
+ pyxcp/aml/ifdata_USB.a2l,sha256=bN59aYL19CFr5EMwkoUZYLnH5uSubqGGNsg8dPYNDd0,3656
9
+ pyxcp/aml/XCP_Common.aml,sha256=CW9lgPw2V6qxtgZaT9wUGTP9FtaH6tse0_rzQ_Tcc7E,15445
10
+ pyxcp/aml/XCPonCAN.aml,sha256=WpWvKPZLDHEMaTUljCu6WidVkiLL8kmZ4VIZBoXQyl4,3849
11
+ pyxcp/aml/XCPonEth.aml,sha256=koFPs6hvInPrSSk6OHI1pF3Mq2bslT7TWBoTAjjYPWw,2247
12
+ pyxcp/aml/XCPonFlx.aml,sha256=Q3byhPQ1DvPFoCkX6ta4A9KPAXAiIDBbuKz3bVHbP8s,4760
13
+ pyxcp/aml/XCPonSxI.aml,sha256=sIHrBrvLHJkIcW77P7nVp17hTeKbEMRj3ssUsI7-Umw,3301
14
+ pyxcp/aml/XCPonUSB.aml,sha256=Xcu52ZckyuEX0v5rwYQxz8gJCAs4qyepXmd_bkCJVlA,4953
15
+ pyxcp/asam/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ pyxcp/asam/types.py,sha256=_gKcpBF5mon_SDWZBUW0PGBMcb37yrvhhEuk1wslg-s,2441
17
+ pyxcp/asamkeydll.c,sha256=dVEvU0S1kgIo62S0La-T8xHSw668LM_DYc_fiQ0No6g,2952
18
+ pyxcp/asamkeydll.exe,sha256=nOrsvVJrVILKslJVPSR1luxhBoMcM58V2xDevWfwHDw,11264
19
+ pyxcp/asamkeydll.sh,sha256=DC2NKUMwvi39OQgJ6514Chr4wc1LYbTmQHmMq9jAHHs,59
20
+ pyxcp/checksum.py,sha256=hO2JW_eiO9I0A4eiqovMV9d_y5oidq_w8jKdAE4FeOo,11899
21
+ pyxcp/cmdline.py,sha256=PltxEwPp6KnXkStI3u3_K9fLNAfCDQauIxMktMzMhxA,2357
22
+ pyxcp/config/__init__.py,sha256=kZ-6hotQYuVa4C6cEGUSqga6CTezKCC2HRa89yVQtXM,48272
23
+ pyxcp/config/legacy.py,sha256=4QdDheX8DbBKv5JVT72_C_cjCgKvZmhN3tJ6hsvBEtI,5220
24
+ pyxcp/constants.py,sha256=9yGfujC0ImTYQWfn41wyw8pluJTSrhMGWIVeIZTgsLg,1160
25
+ pyxcp/cpp_ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ pyxcp/cpp_ext/aligned_buffer.hpp,sha256=KoUYDjvIJRc2IDOSQXbbSfQ6pdhnBcCi_bxZFC9C6Ko,5448
27
+ pyxcp/cpp_ext/bin.hpp,sha256=WF7ljBEbATQ3wplk7pna4qWtM0MJVHRs5pnILxfkbGU,2673
28
+ pyxcp/cpp_ext/blockmem.hpp,sha256=ysaJwmTWGTfE54Outk3gJYOfAVFd_QaonBMtXLcXwCc,1242
29
+ pyxcp/cpp_ext/cpp_ext.cp310-win_arm64.pyd,sha256=DenFVbetxIENRikCdHjkPwEaI_g-h-MrDNJPkfI01xA,393728
30
+ pyxcp/cpp_ext/cpp_ext.cp311-win_arm64.pyd,sha256=0CzHXuHtxHxYIaO2YbLp8IDa8cLa5URR5Y81J6xuB9c,394240
31
+ pyxcp/cpp_ext/cpp_ext.cp312-win_arm64.pyd,sha256=RNn9rXcjYlYtqWn_UilHF4_qlHVHXwFrYGhUZKew_WU,373248
32
+ pyxcp/cpp_ext/daqlist.hpp,sha256=Dv5v9JvaP3Xhe4uTrYfdBsySElIRO50H9Bu4Xl92yfQ,13996
33
+ pyxcp/cpp_ext/event.hpp,sha256=Z-1yxsEKsr81NnLVEWJ2ANA8FV7YsM7EbNxaw-elheE,1200
34
+ pyxcp/cpp_ext/extension_wrapper.cpp,sha256=TRrhjinnKkaH9wcY9Tx16kMoVEwSwAFoRVZ2Uot1hao,9852
35
+ pyxcp/cpp_ext/framing.hpp,sha256=8k2juQO0FJvMIiEXjZRMh4CtJdjRBBgH2N3CY57hbyY,11660
36
+ pyxcp/cpp_ext/helper.hpp,sha256=ONAsVupIqqmNDp8bgGWS0TfSYeCFkk3kwwZbbqsh0HQ,7813
37
+ pyxcp/cpp_ext/mcobject.hpp,sha256=t_sjka8_TaWF0EG7mIx8feWAF6uf_CyMtuvCmhE4DB4,6522
38
+ pyxcp/cpp_ext/sxi_framing.hpp,sha256=FvaDOFD5zK8AJUn6yBVoTr-pclstmr478_q_W6COANo,11837
39
+ pyxcp/cpp_ext/tsqueue.hpp,sha256=FWMemzXNgV5dQ7gYmTCzC0QYfgl0VI9JCybYelBcCHU,1026
40
+ pyxcp/daq_stim/__init__.py,sha256=mWHeLkq9fuoylNypGz_CCKShYN_3c3Su6IEB76Z4U2M,16509
41
+ pyxcp/daq_stim/optimize/__init__.py,sha256=FUWK0GkNpNT-sUlhibp7xa2aSYpm6Flh5yA2w2IOJqg,2520
42
+ pyxcp/daq_stim/optimize/binpacking.py,sha256=RcRTMNmcb5oIAY2G5RHygb_g0GgNf35-cp3utIeUA9w,1257
43
+ pyxcp/daq_stim/scheduler.cpp,sha256=uUR4RUpukE5qZpJNbT_1ARFslAbWupGv0TQJHO_OM0s,1466
44
+ pyxcp/daq_stim/scheduler.hpp,sha256=U_6tUbebmzX5vVZS0EFSgTaPsyxMg6yRXHG_aPWA0x4,1884
45
+ pyxcp/daq_stim/stim.cp310-win_arm64.pyd,sha256=jKEznebDYNCjeQZ8MwjOkp_n3vzqFdsK49pyfpFu4-0,215552
46
+ pyxcp/daq_stim/stim.cp311-win_arm64.pyd,sha256=_bLXkDdwxuPQiOfRhdPUeOW3igFCYCuy9CnZjpC9Yao,216576
47
+ pyxcp/daq_stim/stim.cp312-win_arm64.pyd,sha256=n9BZ11zTRp_MpWmuzGoTR9JiT2kNTuH1Of219gkav-0,216576
48
+ pyxcp/daq_stim/stim.cpp,sha256=F2OG67W4KKwTTiUCxm-9egIv3TLFdOkRunX6xf7YOtc,177
49
+ pyxcp/daq_stim/stim.hpp,sha256=U-uInRrA6OCdMl1l1SWbQ_KEPpnNYrWut924IvbW6R0,18508
50
+ pyxcp/daq_stim/stim_wrapper.cpp,sha256=iT2yxJ3LRG7HoYC1bwhM3tCAxF9X_HHierBNsLRmTJg,1995
51
+ pyxcp/dllif.py,sha256=qeo7quKQ-_7TjRh_umTD-g0utBcCJd1q4GBRl2m93-M,3444
52
+ pyxcp/errormatrix.py,sha256=ZAl8N-JZRVYWeSls135FWAk-xw4KsPgvUscqeAkZpFQ,45464
53
+ pyxcp/examples/conf_can.toml,sha256=4o-M4xmh7pCzuQLfXnIOLIXqx5aZjMAZ6jtjYJ8hLBQ,370
54
+ pyxcp/examples/conf_can_user.toml,sha256=IJhcc60tKMDgNhviYtHr2OjEl_ID4CsfMKchDeMFdJs,314
55
+ pyxcp/examples/conf_can_vector.json,sha256=spux_wLX4EZdEpUqD2SU9-9uPDc2U1poeMaYo7QQT2M,249
56
+ pyxcp/examples/conf_can_vector.toml,sha256=VXkHgJ9OjSnaz4BpIKsYg53oSNsj9F0LrTSDh8vHJMk,262
57
+ pyxcp/examples/conf_eth.toml,sha256=BQE8UwZlBL4vNPQ_IDXVzrK9klFH9FhDCX68fXdSp_w,199
58
+ pyxcp/examples/conf_nixnet.json,sha256=BvXPrljPGzaRTNPch3K0XfU3KSBP1sVDDNP7yY850OQ,444
59
+ pyxcp/examples/conf_socket_can.toml,sha256=gTacQGm0p6fhPCMWC3ScLq9Xj-xJmNbjNXkjO4o7r8k,269
60
+ pyxcp/examples/run_daq.py,sha256=-AmT1UhY8V4vHmi3jwcw2WrV9b0GhFqULEybWjtkgTo,5676
61
+ pyxcp/examples/xcp_policy.py,sha256=XpXPLAH1y0xiTAcVUSp9TiHtoD8-AsoqffwJuKQPrhc,1921
62
+ pyxcp/examples/xcp_read_benchmark.py,sha256=HJu29FJQB-lqOqx2z4tF_vtB5a2zpHYLgsWSohP7Nj0,956
63
+ pyxcp/examples/xcp_skel.py,sha256=eRjn6m5TuddOUYpHtw8MZhADdaZHAb2AKZJlRIbauac,1157
64
+ pyxcp/examples/xcp_unlock.py,sha256=Ch4EJkLuDBWJgtBNQFKqENhvTQqKDAE0LJZMQUhktmk,732
65
+ pyxcp/examples/xcp_user_supplied_driver.py,sha256=ycYVdjqjQrBr99CKZ-FG3IgAxTCfbUzSFH99JJ36ZQs,1134
66
+ pyxcp/examples/xcphello.py,sha256=6hLOzeqPyNERxQn94_Vup87FbGeRjmjPBe4ZLl6tkmU,2356
67
+ pyxcp/examples/xcphello_recorder.py,sha256=c7ldGXpjyHe7DCit_S8D5AkqVX81pleLEvLDugcdCeU,3409
68
+ pyxcp/master/__init__.py,sha256=RbMGgWZWRMEpembwgV-kkdSfQxuUZeXsybcspAhMzj0,320
69
+ pyxcp/master/errorhandler.py,sha256=Hyn6geDgrH7EJdpgPWuQYbe_fDOQ2zzYFqRnHFny1Fw,26628
70
+ pyxcp/master/master.py,sha256=aTcoKqRKVeX2wwE4Ox0n7POW6VQbscgWbYDi9x9cXWs,101460
71
+ pyxcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ pyxcp/recorder/.idea/.gitignore,sha256=G_3s42Re2O01YDDyLMIATcP0Af8GCsPSTegRw7zYLhY,184
73
+ pyxcp/recorder/.idea/misc.xml,sha256=XfcpM2YHByf1o3XaftWMr5UIaGSVc9LMzRnZmUp1ynM,142
74
+ pyxcp/recorder/.idea/modules.xml,sha256=vq9Gc9pRmTRFr3iP9TcHkz1CYfObW6QVQGGRViKwRhM,277
75
+ pyxcp/recorder/.idea/recorder.iml,sha256=m0L-3jEfCtu6qHTzY3iOsTfFMLvuspSBrkE8PBlhyOo,248
76
+ pyxcp/recorder/.idea/sonarlint/issuestore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728,sha256=YKcXNhekpl1LD7TEGHPjjXbmwyfY0c50DyveDrMVFxo,602
77
+ pyxcp/recorder/.idea/sonarlint/issuestore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
+ pyxcp/recorder/.idea/sonarlint/issuestore/b/4/b49006702b459496a8e8c94ebe60947108361b91,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ pyxcp/recorder/.idea/sonarlint/issuestore/index.pb,sha256=pt_itWgvTAnMANXontA5cYFLHGjruv10VB_c2Ij5YFs,184
80
+ pyxcp/recorder/.idea/sonarlint/securityhotspotstore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ pyxcp/recorder/.idea/sonarlint/securityhotspotstore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ pyxcp/recorder/.idea/sonarlint/securityhotspotstore/b/4/b49006702b459496a8e8c94ebe60947108361b91,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ pyxcp/recorder/.idea/sonarlint/securityhotspotstore/index.pb,sha256=pt_itWgvTAnMANXontA5cYFLHGjruv10VB_c2Ij5YFs,184
84
+ pyxcp/recorder/.idea/vcs.xml,sha256=BStFtkvzuXVRrIMy3OssQHjOMNmxZlh8j_BEkJyMaHY,428
85
+ pyxcp/recorder/__init__.py,sha256=FwlOc4Ci3DRYBT6VaRy_RcioUPpA8MvtM-9ju71Z_GM,2776
86
+ pyxcp/recorder/build_clang.cmd,sha256=JvFngSnb28XcBGXxC6MGrcOCGYfahOIvHpgRpqbA6HQ,175
87
+ pyxcp/recorder/build_clang.sh,sha256=zmU3nZxaNH1pxGWMyQ-S541TuVqxS00p3iPR9NUP4Ec,181
88
+ pyxcp/recorder/build_gcc.cmd,sha256=zj732DdvqDzGAFg7dvF83DUpf8Qf6rQ0cqEaID15Z80,238
89
+ pyxcp/recorder/build_gcc.sh,sha256=nCSh7G8xtxWtDNrMqNUxcjnm_CFpMeduIF0X-RSJtHA,211
90
+ pyxcp/recorder/build_gcc_arm.sh,sha256=jEo6Mgt_aVDL3nHtffecXOrN6gRsEoaA3S4pPrAzpCE,240
91
+ pyxcp/recorder/converter/__init__.py,sha256=wSWMl0xY-nG7f649SXQZ0_1MD196pWw9sr96tqjV-Uo,14893
92
+ pyxcp/recorder/lz4.c,sha256=rOy3JE2SsOXvJ8a9pgGEfGpbDJnJR03dSVej0CwPmjg,120974
93
+ pyxcp/recorder/lz4.h,sha256=Kz_2V6kvOunNHoPl9-EqxWDVCvYXbU0J-pkSnCeXubs,46483
94
+ pyxcp/recorder/lz4hc.c,sha256=E56iE5CQ6fhQIVi3qNpxiIIP2sTGeC80JtVPyhidV6Q,88870
95
+ pyxcp/recorder/lz4hc.h,sha256=dtxPbesyAongP7CK_pL0M2DL707iMm9jGKrl8hXXRNk,20592
96
+ pyxcp/recorder/mio.hpp,sha256=5ASJLKSEykH0deAQD5uak-_yAgd5p2n8t06315GSGrg,63346
97
+ pyxcp/recorder/reader.hpp,sha256=ssdaAaG_fHKrJMuMo_tfcCaCjFrIC5HQGNXgR343bVY,5131
98
+ pyxcp/recorder/reco.py,sha256=2CPKxIZNSr6BhjfPrWtxdt81zaJlgU-e73RneG9IsJA,8727
99
+ pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ pyxcp/recorder/rekorder.cp310-win_arm64.pyd,sha256=xPIWYTtkGv8E8UciTeXYqWO0RBVOCLr-Cb99Tmw72Hc,425984
101
+ pyxcp/recorder/rekorder.cp311-win_arm64.pyd,sha256=-0eUYfUSKYNhU1x5ritZzlnvzfUohW4Vq3Yk4BR42-o,425984
102
+ pyxcp/recorder/rekorder.cp312-win_arm64.pyd,sha256=Isbgj3M7IlTtuyNniMnFWgUP_uroC47Shq5gqTFX9EU,417792
103
+ pyxcp/recorder/rekorder.cpp,sha256=U0LMyk8pZXx9emgS_WPVthvn_9IpgE7JGrh4kg-8CX4,1900
104
+ pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
105
+ pyxcp/recorder/setup.py,sha256=_99XFPQAd5V4LcJaSGJwdnbxgxJ7kl8DEXfHsnKO1Yg,998
106
+ pyxcp/recorder/test_reko.py,sha256=M8lfKBmBUl-28IMVoD6lU5Bnorz7fYFOvcAjfVZxuXA,1014
107
+ pyxcp/recorder/unfolder.hpp,sha256=USNXbsKWFa807I_XCJyG846uW2kVlUhqvSK2jR1uvsE,49691
108
+ pyxcp/recorder/wrap.cpp,sha256=oCsEOnRsvLlaWjyN09X7mcHLzzqCyLskREKb6kmyqNE,8707
109
+ pyxcp/recorder/writer.hpp,sha256=rNjtRTtJes5z-BzKR2K56P_Kvc9MEVQgycu8J0wKf1g,11284
110
+ pyxcp/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=P_gscDTAofbSVA_Wd1GATrnyWGTf1-Dz_oPdlRFfjuk,567
112
+ pyxcp/scripts/xcp_examples.py,sha256=q2wNXHVZu4GjcIlZwp2j9Sqm5QH39Olro4BQaLoIqiM,2583
113
+ pyxcp/scripts/xcp_fetch_a2l.py,sha256=mRS42707lEFjH9q9ip2TgIOstc6QBnZ3IMMkf7GtEtk,1239
114
+ pyxcp/scripts/xcp_id_scanner.py,sha256=zsqjEJko8OtzRtHZT6YVVanD7hbaGPv0qsC_jK1Gzig,419
115
+ pyxcp/scripts/xcp_info.py,sha256=sYkh48FyXtmRZg3uM27YjM-6A_oBV82BujuueM-NOhI,6437
116
+ pyxcp/scripts/xcp_profile.py,sha256=NPZWVTVUiyNulaYIeShw3VO0ChhE9OtN-rMWgjHiTn0,613
117
+ pyxcp/scripts/xmraw_converter.py,sha256=LvjiKAWHUKs5QZNiIDT-vdNgPG0Gioas2MzLJOo62-Y,684
118
+ pyxcp/stim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ pyxcp/tests/test_asam_types.py,sha256=0M08q8dJIVx-rkUtFKTqUhhW9NkThYL83LW3d_yCols,587
120
+ pyxcp/tests/test_binpacking.py,sha256=kxLwYNzop775BkV68WXBoXVnLIuP0y4EKIW7u9niMKc,7623
121
+ pyxcp/tests/test_can.py,sha256=fLLATWZxZK3vG-jDwjkWSOCqzy1UmtdV304-3qD6kRQ,63996
122
+ pyxcp/tests/test_checksum.py,sha256=ZQ9-7bpKBLNKk1jxQ61AKAVUTWReOBYCZ8ikNo2jmII,1808
123
+ pyxcp/tests/test_daq.py,sha256=1uUK0Y3svHx-cqx1LKfThhBxJcgG9lmV7OCYRUQlxHw,5537
124
+ pyxcp/tests/test_daq_opt.py,sha256=GznXj4lVGfLWa8nJ2w3t_IlUQeq8HOspqEHbQq3zJ4I,13011
125
+ pyxcp/tests/test_frame_padding.py,sha256=b7D0oh_n33iFhi_FKav6LkA0smJB4vg5bTMKu-jIaf0,3205
126
+ pyxcp/tests/test_framing.py,sha256=Ul9ZcG6Jq3DDC1JCsPTP9K1y6GiKFwoip8S5Rqz8qKc,7971
127
+ pyxcp/tests/test_master.py,sha256=8HYqmKqSv1OS6BvsKmDQDrm8udvopPBzYzV75Ry7KjE,75456
128
+ pyxcp/tests/test_transport.py,sha256=AYmYywlS6qFRFfTnji0pWEScZuYaapzzO8LfrB4fNPI,5948
129
+ pyxcp/tests/test_utils.py,sha256=SrURAFc_6jtHng3PSZ5gpqXzVBVuPoMPB0YNvOvaIE0,880
130
+ pyxcp/timing.py,sha256=mKefaRHUKTuWlBuSHXRauNen_KJCO3P1e7TJMUkwE9k,1702
131
+ pyxcp/transport/__init__.py,sha256=gKZy_GXJFpPoJ1V7j14hPF6u5k-LeM1cIXTREeKRQvk,417
132
+ pyxcp/transport/base.py,sha256=Eb5qLeAP-VXQwHcX2M58Rdl0jZ8K_RFYSoE-Pq6kW64,18784
133
+ pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ pyxcp/transport/can.py,sha256=JeASLHW2A66Zaq6X5XG9vdfX-eXdhWbttbaMR0Zow20,24032
135
+ pyxcp/transport/eth.py,sha256=8QRzHIQIzzM9T5fbAIMk7FLSQLkMsCJa3UPW_61rXDw,10530
136
+ pyxcp/transport/hdf5_policy.py,sha256=KIewRq5AI-EPNPzw-MHb5lriF-K4Jt5cuaxYFvreonU,5544
137
+ pyxcp/transport/sxi.py,sha256=P3ppV-MzuvLMGPldm8sB_nXKyTCRJeqraQj8yzRwmqI,7379
138
+ pyxcp/transport/transport_ext.cp310-win_arm64.pyd,sha256=Qbtsyu3vXjS9lyLRm7GPgnEeKpoqfZhZcVu7hvejizg,455168
139
+ pyxcp/transport/transport_ext.cp311-win_arm64.pyd,sha256=NJLfvFMgynxEsTJ-KcbInbATzkuNLRakSk-JSFgXB9U,455680
140
+ pyxcp/transport/transport_ext.cp312-win_arm64.pyd,sha256=XPIDxCCJSCQ18Ue809YeosOEByt3Qt50fG0yZLUC_2A,418304
141
+ pyxcp/transport/transport_ext.hpp,sha256=ABxcvoDPua_IUJ9NhrmxcSoTr3ofLVXlezHtN_bHY5w,6511
142
+ pyxcp/transport/transport_wrapper.cpp,sha256=fJmsiGrH4WZvDri2rJpwTosTHTqlANpWi4kHu7vda8M,12485
143
+ pyxcp/transport/usb_transport.py,sha256=K_tAESxgSVllJinoYanJbFB_j28yOId6m5EgdXvPItQ,8902
144
+ pyxcp/types.py,sha256=Hwan9e9VmFud5nYgI_iS0c3LVlh2IfmpKXbml-obfD0,25963
145
+ pyxcp/utils/__init__.py,sha256=d4QmrEZiK7xtdCThhZapV2Zbyi0YB_ELNDL49mkji5Y,3509
146
+ pyxcp/utils/cli.py,sha256=BnwQvMk8GERns4B-2I0hDuBk9pE-krc_o36NkBsezB8,3027
147
+ pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
+ pyxcp/vector/map.py,sha256=7Gnhvr79geMeqqGVIJPxODXGwABdNDinnqzhpooN5TE,2306
149
+ pyxcp-0.25.6.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
150
+ pyxcp-0.25.6.dist-info/licenses/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
151
+ pyxcp-0.25.6.dist-info/METADATA,sha256=Mk0PCY9QH3eMJ3O4GV0mTTWSMgkKlSBJuZ9pqsN0EGU,12775
152
+ pyxcp-0.25.6.dist-info/WHEEL,sha256=2OrXvuvO0Q8KtvYHaCXJr4ZHJ7u3YqiFdY-BJEkKGf0,98
153
+ pyxcp-0.25.6.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-win_arm64
@@ -1,9 +0,0 @@
1
- {
2
- "TRANSPORT": "SXI",
3
- "PORT": "COM10",
4
- "BITRATE": 38400,
5
- "BYTESIZE": 8,
6
- "PARITY": "N",
7
- "STOPBITS": 1,
8
- "CREATE_DAQ_TIMESTAMPS": false
9
- }
@@ -1,7 +0,0 @@
1
- TRANSPORT = "SXI"
2
- PORT = "COM10"
3
- BITRATE = 38400
4
- PARITY = "N"
5
- BYTESIZE = 8
6
- STOPBITS = 1
7
- CREATE_DAQ_TIMESTAMPS = false