pyxcp 0.23.1__cp313-cp313-macosx_11_0_arm64.whl → 0.23.3__cp313-cp313-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.23.1"
20
+ __version__ = "0.23.3"
pyxcp/cmdline.py CHANGED
@@ -8,7 +8,11 @@ import warnings
8
8
  from dataclasses import dataclass
9
9
  from typing import List
10
10
 
11
- from pyxcp.config import create_application, reset_application # noqa: F401
11
+ from pyxcp.config import ( # noqa: F401
12
+ create_application,
13
+ get_application,
14
+ reset_application,
15
+ )
12
16
  from pyxcp.master import Master
13
17
 
14
18
 
@@ -23,28 +27,56 @@ class Option:
23
27
  help: str = ""
24
28
  type: str = ""
25
29
  default: str = ""
30
+ action: str = ""
26
31
 
27
32
 
28
33
  class FakeParser:
34
+ """Parser that collects arguments for later processing."""
29
35
 
30
- options: List[Option] = []
36
+ def __init__(self):
37
+ self.options = []
31
38
 
32
- def add_argument(self, short_opt: str, long_opt: str = "", dest: str = "", help: str = "", type: str = "", default: str = ""):
33
- warnings.warn("Argument parser extension is currently not supported.", DeprecationWarning, 2)
34
- self.options.append(Option(short_opt, long_opt, dest, help, type, default))
39
+ def add_argument(self, short_opt, long_opt="", dest="", help="", type=None, default=None, action=None):
40
+ """Collect argument definitions without issuing warnings."""
41
+ self.options.append(Option(short_opt, long_opt, dest, help, type, default, action))
35
42
 
36
43
 
37
44
  class ArgumentParser:
38
- def __init__(self, callout=None, *args, **kws):
45
+ """Argument parser for pyXCP applications.
46
+
47
+ This class provides a way to add custom command-line arguments to pyXCP applications.
48
+ It also supports a callout function that will be called with the master instance and
49
+ the parsed arguments.
50
+ """
51
+
52
+ def __init__(self, callout=None, description=None, *args, **kws):
39
53
  self._parser = FakeParser()
40
- if callout is not None:
41
- warnings.warn("callout argument is currently not supported.", DeprecationWarning, 2)
54
+ self._callout = callout
55
+ self._description = description
42
56
 
43
57
  def run(self, policy=None, transport_layer_interface=None):
44
- application = create_application(self.parser.options)
58
+ """Create and configure a master instance.
59
+
60
+ Args:
61
+ policy: Optional policy to use for the master
62
+ transport_layer_interface: Optional transport layer interface to use
63
+
64
+ Returns:
65
+ A configured master instance
66
+ """
67
+ # Create the application with custom arguments and callout
68
+ application = get_application(self.parser.options, self._callout)
69
+
70
+ # Create the master instance
45
71
  master = Master(
46
72
  application.transport.layer, config=application, policy=policy, transport_layer_interface=transport_layer_interface
47
73
  )
74
+
75
+ # If there's a callout function, call it with the master and args
76
+ if application.callout is not None and hasattr(application, "custom_args"):
77
+ args = application.custom_args.get_args()
78
+ application.callout(master, args)
79
+
48
80
  return master
49
81
 
50
82
  @property
pyxcp/config/__init__.py CHANGED
@@ -17,6 +17,7 @@ from traitlets import (
17
17
  Dict,
18
18
  Enum,
19
19
  Float,
20
+ HasTraits,
20
21
  Integer,
21
22
  List,
22
23
  TraitError,
@@ -24,6 +25,7 @@ from traitlets import (
24
25
  Union,
25
26
  )
26
27
  from traitlets.config import Application, Configurable, Instance, default
28
+ from traitlets.config.loader import Config
27
29
 
28
30
  from pyxcp.config import legacy
29
31
 
@@ -491,10 +493,22 @@ If set, the `app_name` does not have to be previously defined in
491
493
 
492
494
 
493
495
  class CanCustom(Configurable, CanBase):
494
- """ """
496
+ """Generic custom CAN interface.
497
+
498
+ Enable basic CanBase options so user-provided python-can backends can
499
+ consume common parameters like bitrate, fd, data_bitrate, poll_interval,
500
+ receive_own_messages, and optional timing.
501
+ """
495
502
 
496
503
  interface_name = "custom"
497
504
 
505
+ # Allow usage of the basic options from CanBase for custom backends
506
+ has_fd = True
507
+ has_data_bitrate = True
508
+ has_poll_interval = True
509
+ has_receive_own_messages = True
510
+ has_timing = True
511
+
498
512
 
499
513
  class Virtual(Configurable, CanBase):
500
514
  """ """
@@ -829,6 +843,68 @@ if there is no response to a command.""",
829
843
  self.usb = Usb(config=self.config, parent=self)
830
844
 
831
845
 
846
+ class CustomArgs(Configurable):
847
+ """Class to handle custom command-line arguments."""
848
+
849
+ def __init__(self, **kwargs):
850
+ super().__init__(**kwargs)
851
+ self._custom_args = {}
852
+
853
+ def add_argument(self, short_opt, long_opt="", dest="", help="", type=None, default=None, action=None):
854
+ """Add a custom argument dynamically.
855
+
856
+ This mimics the argparse.ArgumentParser.add_argument method.
857
+ """
858
+ if not dest and long_opt:
859
+ dest = long_opt.lstrip("-").replace("-", "_")
860
+
861
+ # Store the argument definition
862
+ self._custom_args[dest] = {
863
+ "short_opt": short_opt,
864
+ "long_opt": long_opt,
865
+ "help": help,
866
+ "type": type,
867
+ "default": default,
868
+ "action": action,
869
+ "value": default,
870
+ }
871
+
872
+ # Dynamically add a trait for this argument
873
+ trait_type = Any()
874
+ if type == bool or action == "store_true" or action == "store_false":
875
+ trait_type = Bool(default)
876
+ elif type == int:
877
+ trait_type = Integer(default)
878
+ elif type == float:
879
+ trait_type = Float(default)
880
+ elif type == str:
881
+ trait_type = Unicode(default)
882
+
883
+ # Add the trait to this instance
884
+ self.add_trait(dest, trait_type)
885
+ setattr(self, dest, default)
886
+
887
+ def update_from_options(self, options):
888
+ """Update trait values from parsed options."""
889
+ for option in options:
890
+ if option.dest and option.dest in self._custom_args:
891
+ if option.default is not None:
892
+ setattr(self, option.dest, option.default)
893
+ self._custom_args[option.dest]["value"] = option.default
894
+
895
+ def get_args(self):
896
+ """Return an object with all custom arguments as attributes."""
897
+
898
+ class Args:
899
+ pass
900
+
901
+ args = Args()
902
+ for name, arg_def in self._custom_args.items():
903
+ setattr(args, name, arg_def["value"])
904
+
905
+ return args
906
+
907
+
832
908
  class General(Configurable):
833
909
  """ """
834
910
 
@@ -929,7 +1005,12 @@ class PyXCP(Application):
929
1005
  description = "pyXCP application"
930
1006
  config_file = Unicode(default_value="pyxcp_conf.py", help="base name of config file").tag(config=True)
931
1007
 
932
- classes = List([General, Transport])
1008
+ # Add callout function support
1009
+ callout = Callable(default_value=None, allow_none=True, help="Callback function to be called with master and args").tag(
1010
+ config=True
1011
+ )
1012
+
1013
+ classes = List([General, Transport, CustomArgs])
933
1014
 
934
1015
  subcommands = dict(
935
1016
  profile=(
@@ -985,6 +1066,7 @@ class PyXCP(Application):
985
1066
  self.read_configuration_file(file_name, emit_warning)
986
1067
  self.general = General(config=self.config, parent=self)
987
1068
  self.transport = Transport(parent=self)
1069
+ self.custom_args = CustomArgs(config=self.config, parent=self)
988
1070
 
989
1071
  def read_configuration_file(self, file_name: str, emit_warning: bool = True):
990
1072
  self.legacy_config: bool = False
@@ -1086,7 +1168,7 @@ class PyXCP(Application):
1086
1168
  application: typing.Optional[PyXCP] = None
1087
1169
 
1088
1170
 
1089
- def create_application(options: typing.Optional[typing.List[typing.Any]] = None) -> PyXCP:
1171
+ def create_application(options: typing.Optional[typing.List[typing.Any]] = None, callout=None) -> PyXCP:
1090
1172
  global application
1091
1173
  if options is None:
1092
1174
  options = []
@@ -1095,15 +1177,24 @@ def create_application(options: typing.Optional[typing.List[typing.Any]] = None)
1095
1177
  application = PyXCP()
1096
1178
  application.initialize(sys.argv)
1097
1179
  application.start()
1180
+
1181
+ # Set callout function if provided
1182
+ if callout is not None:
1183
+ application.callout = callout
1184
+
1185
+ # Process custom arguments if provided
1186
+ if options and hasattr(application, "custom_args"):
1187
+ application.custom_args.update_from_options(options)
1188
+
1098
1189
  return application
1099
1190
 
1100
1191
 
1101
- def get_application(options: typing.Optional[typing.List[typing.Any]] = None) -> PyXCP:
1192
+ def get_application(options: typing.Optional[typing.List[typing.Any]] = None, callout=None) -> PyXCP:
1102
1193
  if options is None:
1103
1194
  options = []
1104
1195
  global application
1105
1196
  if application is None:
1106
- application = create_application(options)
1197
+ application = create_application(options, callout)
1107
1198
  return application
1108
1199
 
1109
1200
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -16,14 +16,14 @@ def callout(master, args):
16
16
 
17
17
 
18
18
  ap = ArgumentParser(description="pyXCP hello world.", callout=callout)
19
- # ap.parser.add_argument(
20
- # "-d",
21
- # "--daq-info",
22
- # dest="daq_info",
23
- # help="Display DAQ-info",
24
- # default=False,
25
- # action="store_true",
26
- # )
19
+ ap.parser.add_argument(
20
+ "-d",
21
+ "--daq-info",
22
+ dest="daq_info",
23
+ help="Display DAQ-info",
24
+ default=False,
25
+ action="store_true",
26
+ )
27
27
 
28
28
  with ap.run() as x:
29
29
  x.connect()
@@ -0,0 +1,219 @@
1
+ Metadata-Version: 2.3
2
+ Name: pyxcp
3
+ Version: 0.23.3
4
+ Summary: Universal Calibration Protocol for Python
5
+ License: LGPLv3
6
+ Keywords: automotive,ecu,xcp,asam,autosar
7
+ Author: Christoph Schueler
8
+ Author-email: cpu.gems@googlemail.com
9
+ Requires-Python: >=3.10,<4.0
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
13
+ Classifier: License :: Other/Proprietary License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Scientific/Engineering
21
+ Classifier: Topic :: Software Development
22
+ Requires-Dist: bandit (>=1.7.8,<2.0.0)
23
+ Requires-Dist: chardet (>=5.2.0,<6.0.0)
24
+ Requires-Dist: construct (>=2.10.68,<3.0.0)
25
+ Requires-Dist: line-profiler-pycharm (>=1.1.0,<2.0.0)
26
+ Requires-Dist: mako (>=1.2.4,<2.0.0)
27
+ Requires-Dist: pyserial (>=3.5,<4.0)
28
+ Requires-Dist: python-can (>=4.2.2,<5.0.0)
29
+ Requires-Dist: pytz (>=2025.2,<2026.0)
30
+ Requires-Dist: pyusb (>=1.2.1,<2.0.0)
31
+ Requires-Dist: rich (>=14.0.0,<15.0.0)
32
+ Requires-Dist: toml (>=0.10.2,<0.11.0)
33
+ Requires-Dist: tomlkit (>=0.13.3,<0.14.0)
34
+ Requires-Dist: traitlets (<=5.11.2)
35
+ Requires-Dist: uptime (>=3.0.1,<4.0.0)
36
+ Project-URL: Homepage, https://github.com/christoph2/pyxcp
37
+ Description-Content-Type: text/markdown
38
+
39
+ # pyXCP
40
+
41
+ Reliable Python tooling for the ASAM MCD‑1 XCP protocol (measurement, calibration, flashing) with multiple transports (CAN, Ethernet, USB, Serial) and handy CLI utilities.
42
+
43
+ [![CI](https://github.com/christoph2/pyxcp/workflows/Python%20application/badge.svg)](https://github.com/christoph2/pyxcp/actions)
44
+ [![PyPI](https://img.shields.io/pypi/v/pyxcp.svg)](https://pypi.org/project/pyxcp/)
45
+ [![Python Versions](https://img.shields.io/pypi/pyversions/pyxcp.svg)](https://pypi.org/project/pyxcp/)
46
+ [![License: LGPL v3+](https://img.shields.io/badge/License-LGPL%20v3%2B-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0)
47
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
48
+
49
+ pyXCP is a production-ready Python library for communicating with XCP-enabled devices, most commonly automotive ECUs. Use it to take measurements, adjust parameters (calibration), stream DAQ/STIM, and program devices during development.
50
+
51
+ Highlights:
52
+ - Transports: Ethernet (TCP/IP), CAN, USB, Serial (SxI)
53
+ - Cross‑platform: Windows, Linux, macOS
54
+ - Rich CLI tools for common XCP tasks
55
+ - Extensible architecture and layered design
56
+
57
+ ---
58
+
59
+ ## Installation
60
+
61
+ The easiest way is from PyPI:
62
+
63
+ ```shell
64
+ pip install pyxcp
65
+ ```
66
+
67
+ To install from the main branch:
68
+
69
+ ```shell
70
+ pip install git+https://github.com/christoph2/pyxcp.git
71
+ ```
72
+
73
+
74
+ ### Requirements
75
+ - Python >= 3.10
76
+ - Building from source requires a working C/C++ toolchain (native extensions are used for performance). Wheels are provided for common platforms and Python versions; if a wheel is not available, pip will build from source.
77
+ - An XCP slave device (or simulator)
78
+
79
+ ## Quick start
80
+
81
+ The tutorial walks you through typical tasks end‑to‑end: see docs/tutorial.md.
82
+
83
+ Minimal example using the built‑in argument parser and context manager:
84
+
85
+ ```python
86
+ from pyxcp.cmdline import ArgumentParser
87
+
88
+ ap = ArgumentParser(description="pyXCP hello world")
89
+
90
+ with ap.run() as x:
91
+ x.connect()
92
+ identifier = x.identifier(0x01)
93
+ print(f"ID: {identifier!r}")
94
+ print(x.slaveProperties)
95
+ x.disconnect()
96
+ ```
97
+
98
+ ### Configuration
99
+ pyXCP supports a [traitlets](https://github.com/ipython/traitlets)‑based configuration system.
100
+ - Recommended Python config example and generator: docs/tutorial.md and docs/configuration.md
101
+ - Legacy TOML examples remain available for compatibility.
102
+
103
+ ### Command‑line tools
104
+ Installed entry points (see pyproject.toml):
105
+ - xcp-info — print capabilities and properties
106
+ - xcp-id-scanner — scan for slave identifiers
107
+ - xcp-fetch-a2l — retrieve A2L from target (if supported)
108
+ - xcp-profile — generate/convert config files
109
+ - xcp-examples — launch assorted demos/examples
110
+ - xmraw-converter — convert recorder .xmraw data
111
+ - pyxcp-probe-can-drivers — list available CAN interfaces
112
+
113
+ Run any tool with -h for options.
114
+
115
+ ## Features
116
+ - Multiple transport layers: Ethernet (TCP), CAN, USB, SxI (serial/UART)
117
+ - Data Acquisition (DAQ) and Stimulation (STIM)
118
+ - Calibration (read/write parameters)
119
+ - Flashing/programming workflows
120
+ - A2L (ASAM MCD‑2 MC) support
121
+ - Recorder utilities and converters (see docs/recorder.md)
122
+ - Extensible architecture for custom transports
123
+
124
+ ## Documentation
125
+ - Getting started tutorial: docs/tutorial.md
126
+ - Configuration: docs/configuration.md
127
+ - CAN driver setup and troubleshooting: docs/howto_can_driver.md
128
+ - Recorder: docs/recorder.md
129
+
130
+ To build the Sphinx documentation locally:
131
+ 1. Install doc requirements: `pip install -r docs/requirements.txt`
132
+ 2. Build: `sphinx-build -b html docs docs/_build/html`
133
+ 3. Open `docs/_build/html/index.html`
134
+
135
+ ## Compatibility
136
+ - Operating systems: Windows, Linux, macOS
137
+ - Python: 3.10 - 3.14, CPython wheels where available
138
+ - CAN backends: python-can compatible drivers (see docs/howto_can_driver.md)
139
+
140
+ ## Contributing
141
+ Contributions are welcome! Please:
142
+ - Read CODE_OF_CONDUCT.md
143
+ - Open an issue or discussion before large changes
144
+ - Use [pre-commit](https://github.com/pre-commit/pre-commit) to run linters and tests locally
145
+
146
+ ## License
147
+ GNU Lesser General Public License v3 or later (LGPLv3+). See LICENSE for details.
148
+
149
+ ## References
150
+ - ASAM MCD‑1 XCP standard: https://www.asam.net/standards/detail/mcd-1-xcp/
151
+
152
+
153
+ ## About ASAM MCD‑1 XCP
154
+ XCP (Universal Measurement and Calibration Protocol) is an ASAM standard defining a vendor‑neutral protocol to access internal data of electronic control units (ECUs) for measurement, calibration (parameter tuning), and programming. XCP decouples the protocol from the physical transport, so the same command set can be carried over different buses such as CAN, FlexRay, Ethernet, USB, or Serial.
155
+
156
+ - Roles: An XCP Master (this library) communicates with an XCP Slave (your device/ECU or simulator).
157
+ - Layered concept: XCP defines an application layer and transport layers. pyXCP implements the application layer and multiple transport bindings.
158
+ - Use cases:
159
+ - Measurement: Read variables from the ECU in real‑time, including high‑rate DAQ streaming.
160
+ - Calibration: Read/write parameters (calibration data) in RAM/flash.
161
+ - Programming: Download new program/data to flash (where the slave supports it).
162
+
163
+ For the authoritative description, see the ASAM page: https://www.asam.net/standards/detail/mcd-1-xcp/
164
+
165
+ ## XCP in a nutshell
166
+ - Connect/Session: The master establishes a connection, negotiates capabilities/features, and optionally unlocks protected functions via seed & key.
167
+ - Addressing: Memory is accessed via absolute or segment‑relative addresses. Addressing modes are described in the associated A2L file (ASAM MCD‑2 MC), which maps symbolic names to addresses, data types, and conversion rules.
168
+ - Events: The slave exposes events (e.g., “1 ms task”, “Combustion cycle”), which trigger DAQ sampling. The master assigns signals (ODTs) to these events for time‑aligned acquisition.
169
+ - DAQ/STIM: DAQ = Data Acquisition (slave → master), STIM = Stimulation (master → slave). Both use event‑driven lists for deterministic timing.
170
+ - Timestamps: DAQ may carry timestamps from the slave for precise time correlation.
171
+ - Security: Access to sensitive commands (e.g., programming, calibration) can be protected by a seed & key algorithm negotiated at runtime.
172
+ - Checksums: XCP defines checksum services useful for verifying memory regions (e.g., after flashing).
173
+
174
+ ## Relation to A2L (ASAM MCD‑2 MC)
175
+ While XCP defines the protocol, the A2L file describes the measurement and calibration objects (characteristics, measurements), data types, conversion rules, and memory layout. In practice, you use pyXCP together with an A2L to:
176
+ - Resolve symbolic names to addresses and data types.
177
+ - Configure DAQ lists from human‑readable signal names.
178
+ - Interpret raw values using the appropriate conversion methods.
179
+
180
+ pyXCP provides utilities to fetch A2L data when supported by the slave and to work with A2L‑described objects.
181
+ See also [pya2ldb](https://github.com/christoph2/pya2l)!
182
+
183
+ ## Transports and addressing
184
+ XCP is transport‑agnostic. pyXCP supports multiple transports and addressing schemes:
185
+ - CAN (XCP on CAN): Robust and ubiquitous in vehicles; limited payload and bandwidth; suited for many calibration tasks and moderate DAQ rates.
186
+ - Ethernet (XCP on TCP/UDP): High bandwidth with low latency; well suited for rich DAQ and programming workflows.
187
+ - USB: High throughput for lab setups; requires device support.
188
+ - Serial/SxI: Simple point‑to‑point links for embedded targets and simulators.
189
+
190
+ The exact capabilities (e.g., max CTO/DTO, checksum types, timestamping) are negotiated at connect time and depend on the slave and transport.
191
+
192
+ ## Supported features (overview)
193
+ The scope of features depends on the connected slave. At the library level, pyXCP provides:
194
+ - Session management: CONNECT/DISCONNECT, GET_STATUS/SLAVE_PROPERTIES, communication mode setup, error handling.
195
+ - Memory access: Upload/short upload, Download/Download Next, verifications, optional paged memory where supported.
196
+ - DAQ/STIM: Configuration of DAQ lists/ODTs, event assignment, data streaming, timestamp handling when available.
197
+ - Programming helpers: Building blocks for program/erase/write flows (exact sequence per slave’s flash algorithm and A2L description).
198
+ - Security/Seed & Key: Pluggable seed‑to‑key resolution including 32↔64‑bit bridge on Windows.
199
+ - Utilities: Identifier scanning, A2L helpers, recorder and converters.
200
+
201
+ Refer to docs/tutorial.md and docs/configuration.md for feature usage, and xcp-info for a capability dump of your target.
202
+
203
+ ## Compliance and versions
204
+ pyXCP aims to be compatible with commonly used parts of ASAM MCD‑1 XCP. Specific optional features are enabled when a slave advertises them during CONNECT. Because implementations vary across vendors and ECU projects, always consult your A2L and use xcp-info to confirm negotiated options (e.g., checksum type, timestamp unit, max DTO size, address granularity).
205
+
206
+ If you rely on a particular XCP feature/profile not mentioned here, please open an issue with details about your slave and A2L so we can clarify support and—if feasible—add coverage.
207
+
208
+ ## Safety, performance, and limitations
209
+ - Safety‑critical systems: XCP is a development and testing protocol. Do not enable measurement/calibration on safety‑critical systems in the field unless your system‑level safety case covers it.
210
+ - Performance: Achievable DAQ rates depend on transport bandwidth, ECU event rates, DTO sizes, and host processing. Ethernet typically yields the highest throughput.
211
+ - Latency/jitter: Event scheduling in the slave and OS scheduling on the host can affect determinism. Use timestamps to correlate data precisely.
212
+ - Access control: Seed & key protects sensitive functions; your organization’s policy should govern algorithm distribution and access.
213
+
214
+ ## Further resources
215
+ - ASAM MCD‑1 XCP standard (overview and membership): https://www.asam.net/standards/detail/mcd-1-xcp/
216
+ - ASAM MCD‑2 MC (A2L) for object descriptions: https://www.asam.net/standards/detail/mcd-2-mc/
217
+ - Introduction to DAQ/STIM concepts (ASAM publications and vendor docs)
218
+ - Related: CCP (legacy predecessor to XCP), ASAM MDF for measurement data storage
219
+
@@ -1,15 +1,10 @@
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=F-Ac6CTANed3x6yT1zUARTuatIT2Q9bQ5nEN9psYMVw,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
1
  pyxcp/dllif.py,sha256=m4e-_dgDLCD6COU5W2LdeYUlib_Xxyxbh977bbS-VAU,3344
7
2
  pyxcp/checksum.py,sha256=aveS0z4vthLXABEFhTqELqFNi7LM6ZzDzq7dD5Xe9oo,11167
8
3
  pyxcp/asamkeydll.sh,sha256=iema12sub6qNE0xAuzwGtx0FmkdaaOKoXalhrtWVaa8,57
9
4
  pyxcp/asamkeydll.c,sha256=l5RHYcEPY_Q07G-W5IjCq0xci8YfUR-3uYt84OOkOJI,2836
10
5
  pyxcp/constants.py,sha256=Yemk_Gi_m78EEU0v-sdGCAodb9dv_vqP969IU3izA2M,1113
11
- pyxcp/cmdline.py,sha256=lNg_wedKShu_37RhuTIGlINGLSMrg6UqJmYpqQnJbQI,1477
12
- pyxcp/__init__.py,sha256=ZKSl3JNYiFQiF3bEXjWiifj1t0TbnYBzGUeyKok01GY,527
6
+ pyxcp/cmdline.py,sha256=EoN-_AJm0lz1egPzNcmIFO2Uqo4c0lBXSAB25Uc6N9Q,2441
7
+ pyxcp/__init__.py,sha256=xnPPit4jAVldx2bKWWiSZtRc0VT5AvbgWRINbIEhBGM,527
13
8
  pyxcp/types.py,sha256=XJxJUh9bK5Urfia8IHVLJ-NFgQACYBd_n73L-AaeZts,25158
14
9
  pyxcp/timing.py,sha256=hzeQZ3P7ij_bfskoVMi10Iv5S4i_6TQYfnB8PXTX6c4,1645
15
10
  pyxcp/utils.py,sha256=Ax3TNT4OotRdJs_MVz83i7gTinpbOWwPnNVIL9WYTW4,3402
@@ -17,16 +12,16 @@ pyxcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
12
  pyxcp/errormatrix.py,sha256=cYcsJ11Qm39DPuaR4BJ9fMpS3Hkphd_ezIQOKjI-pQE,44586
18
13
  pyxcp/asam/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
14
  pyxcp/asam/types.py,sha256=V4wSCGI1pXn0EsBemDyaHTBgY2wkV_BeLShnDIGGgDE,2310
20
- pyxcp/daq_stim/stim.cpython-312-darwin.so,sha256=L9OoS4MPieqeyB-AkHf-lEp9vAw9sRH7HuVJr-i7sNI,237656
15
+ pyxcp/daq_stim/stim.cpython-312-darwin.so,sha256=iCayaiyPuwlGaM_z9euCx5n0pjbSxI0ASw_OvS4V2PU,237880
21
16
  pyxcp/daq_stim/stim.cpp,sha256=sABgEfbQlt5kXbzAsndyhaDFWRWTJw3jJlNfanIVrRs,164
22
17
  pyxcp/daq_stim/__init__.py,sha256=HAfOpn4yeb4DYNZHr6pzpFGHisXbKEytXJ6KUatDMTk,9328
23
18
  pyxcp/daq_stim/scheduler.cpp,sha256=2XW9PmxrJR8DfYMVszGwBX-KANVviwPcUNBvnjw5MlM,1443
24
- pyxcp/daq_stim/stim.cpython-313-darwin.so,sha256=JckkNq4XWuV8DlLGKqhgeZFQhY3R_c7vqDScyInky0s,237896
19
+ pyxcp/daq_stim/stim.cpython-313-darwin.so,sha256=8LQQ_pMJ5zCwvg25Nel5fZ5TpoY1EpgeRJfTAU6UdpA,238120
25
20
  pyxcp/daq_stim/stim.hpp,sha256=1DwAhkY7XJN14aD2BxLJ4O1j4_a6RvpePIbAG1U8iOA,17904
26
- pyxcp/daq_stim/stim.cpython-310-darwin.so,sha256=RqFNsPbyPi8oHidN2ACHa6aPRQadF14q068jvjDhGKE,237576
21
+ pyxcp/daq_stim/stim.cpython-310-darwin.so,sha256=pE7imb11QMYyQv8HTO54EmnJrS5GsocxWJJT5vCPHyw,237784
27
22
  pyxcp/daq_stim/scheduler.hpp,sha256=H-kwyZBV3S8q6YlCq6OLUbaNXskyCOS4z3SRP32ikPY,1809
28
23
  pyxcp/daq_stim/stim_wrapper.cpp,sha256=7iL1-4BPavo5bfrph20Fvicn6HxGEZQqYLvdxniJBYU,1945
29
- pyxcp/daq_stim/stim.cpython-311-darwin.so,sha256=oN-S3od2B7sR4AiyS-Bg0l9gohjT7Ne5ouula-mTGF8,237656
24
+ pyxcp/daq_stim/stim.cpython-311-darwin.so,sha256=BH5vuWJS2JJsD1SBdfDSV-ze1_6YQ0ZHMzlukI4y3iE,237864
30
25
  pyxcp/daq_stim/optimize/__init__.py,sha256=joAKvAvlYQEi7VF2oVftn_ohgRO231wnc3e8fY231L4,2453
31
26
  pyxcp/daq_stim/optimize/binpacking.py,sha256=AZHABtAnzBVJ-MVUGLrxuAp_bAtv3C-gMxrXXXrgi-Y,1216
32
27
  pyxcp/transport/transport_wrapper.cpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -38,7 +33,7 @@ pyxcp/transport/usb_transport.py,sha256=27c19S67BMq1Eup6ViX-SiYpEq93bMTwe031RsE4
38
33
  pyxcp/transport/can.py,sha256=uFPG_Caf1BwIo2pKheZLs0VfPth1KoEPxuKtI2qt9as,18250
39
34
  pyxcp/transport/base.py,sha256=i9VdWqGNqx5LMdFkD8SmmMQSRoDDXAjMRS3p6KD1A8E,15912
40
35
  pyxcp/config/legacy.py,sha256=Uhu_6bp_W8yGmZ2s3TFzf8-5mGwLdeTss56BMYWpsZY,5100
41
- pyxcp/config/__init__.py,sha256=hM1eQtllcZeZ4zo9YzscO2Z5EOpV3hWyZgY9GZMiavw,42085
36
+ pyxcp/config/__init__.py,sha256=z9bXNb2Hp-h2ZtASCyGk3JWP3OGoOL5Hmvazl-L_ANE,45258
42
37
  pyxcp/tests/test_utils.py,sha256=gqv3bhhWfKKdKDkqnELqsOHCfpRRZwlReEy87Ya4Z2w,850
43
38
  pyxcp/tests/test_master.py,sha256=a_Q8Fa49y_3vnrp-VFZ-22cHWjq58RC2daF6EcfbhZc,69434
44
39
  pyxcp/tests/test_daq.py,sha256=mThMsweEwxzIFRQQ88BNz_60OQ-xmC5OamIxHx9VWis,5358
@@ -75,7 +70,7 @@ pyxcp/examples/conf_can_user.toml,sha256=BqCID-GvaNbA6pbqRbyRMuzKAsJaYVube0ql4Cv
75
70
  pyxcp/examples/xcp_user_supplied_driver.py,sha256=Wyep2KhtcFC2GzZuJPj5ikSqWIWYsf5D0mfs1jCtYX0,1104
76
71
  pyxcp/examples/xcp_skel.py,sha256=F2g2C79jiYZl0cpRHfzWusfn1ZvodOS_r1Az6aknZL4,1110
77
72
  pyxcp/examples/xcp_unlock.py,sha256=vl2Zv7Z6EuBxI2ZxbGQK6-0tZBVqd72FZllsvIfuJ5w,652
78
- pyxcp/examples/xcphello.py,sha256=yB1YEpxCLuCnjvN5pjZbB3obfSMEEdtfrER57KQ8KE4,2560
73
+ pyxcp/examples/xcphello.py,sha256=JK9U_QkFP0AwKlZK9lFB66GAqUDFRoXL3XMYO5EdRQQ,2550
79
74
  pyxcp/examples/run_daq.py,sha256=JObp9HtjJphwr5sVQ4Jj3Q5GZHGNCK12tYTfR-6qcr4,5461
80
75
  pyxcp/examples/conf_socket_can.toml,sha256=JB9zHHaya2mDXf0zPY7zEKiBDX2chzBBRxt7h3LxxDk,257
81
76
  pyxcp/examples/conf_sxi.toml,sha256=r81OD0mCLk_h7vrN5MBJk0HFbiWi3bQZtFgFVrW6qcM,118
@@ -95,7 +90,7 @@ pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
90
  pyxcp/recorder/mio.hpp,sha256=emP4qMXTxOe1wRSkB_U0hgOVz4aMUgG5dqcCvNNkAjs,61632
96
91
  pyxcp/recorder/build_gcc.cmd,sha256=A1xt8AS7VZxjJq21VzX8cOT7wl9ap_AIXBWbcIEddCw,237
97
92
  pyxcp/recorder/writer.hpp,sha256=rNjtRTtJes5z-BzKR2K56P_Kvc9MEVQgycu8J0wKf1g,11284
98
- pyxcp/recorder/rekorder.cpython-310-darwin.so,sha256=_9fho09EvAI6zydNN-PFNkRADzMczO4caH0vh76m_pM,529744
93
+ pyxcp/recorder/rekorder.cpython-310-darwin.so,sha256=ibNGz9FIbkRqVm_uypRLTmMYDXk_slTGFX92NGJ_8zo,529952
99
94
  pyxcp/recorder/lz4hc.c,sha256=GhoLtpQF6ViHkhQ_TaLw9UCzSB_MO-fdflgjR_xFFfM,86829
100
95
  pyxcp/recorder/lz4.h,sha256=BkRLAtxukE15Z2yO0Pjrq-n6hw5W6jkGFR5f14MzpEU,45604
101
96
  pyxcp/recorder/rekorder.cpp,sha256=LtN3Ud_pigNZ70gJ5-tyFJZN-3PMDVwqbbH694--TxQ,1841
@@ -105,30 +100,35 @@ pyxcp/recorder/reader.hpp,sha256=rr9XZ_ciL6eF2_xEqyt9XYNqTIze9ytAsnf8uYukO9U,520
105
100
  pyxcp/recorder/__init__.py,sha256=jeTmKvfjIenxHxt7zn6HMjnDpuPQU0d9SdnYK_t3gdE,2850
106
101
  pyxcp/recorder/test_reko.py,sha256=sIM_BBY9sq1ZUTawoxmDzdtd5qHPT9w6eVYZoY4iFik,980
107
102
  pyxcp/recorder/build_clang.cmd,sha256=vIWwC1zF_WChakjfj8VaUCN6X8HwyqvGgFRdUub1TtE,174
108
- pyxcp/recorder/rekorder.cpython-311-darwin.so,sha256=EjeiXD_X-rt9sBfAbxrYnkVZCEMEIktJBaUnIVtgasw,529888
103
+ pyxcp/recorder/rekorder.cpython-311-darwin.so,sha256=yipq_IYZmbl9oZiQl3y2KMVDTwUZaR_eAj49pMO7y2Q,530096
109
104
  pyxcp/recorder/reco.py,sha256=SAO_XMKSBWHhdzxfkmV9ZoPvJjale4BGi8O9p5Sd_iE,8448
110
105
  pyxcp/recorder/setup.py,sha256=piwBqaIX6SY1CyjKlantmd3I_VS6rk56sELvmPguKNM,957
111
106
  pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
112
107
  pyxcp/recorder/lz4hc.h,sha256=U_uN3Q2wIi3_dbEceJ16xHJZGotUiBTcnL6O5ARPi8M,20179
113
- pyxcp/recorder/rekorder.cpython-312-darwin.so,sha256=0O9Ptej3oQV0sXa7oMrpqCF1U0_geZUDZWysrp5znO8,529904
108
+ pyxcp/recorder/rekorder.cpython-312-darwin.so,sha256=oHDwC6EfLs_nubiPM1viGknTvjv_aR44o7PG9i_JXjk,546624
114
109
  pyxcp/recorder/lz4.c,sha256=k5b33lJ7yENd6cdWn7eZjlZUWoS088LYCMAjXAF3RTk,118145
115
110
  pyxcp/recorder/build_gcc.sh,sha256=uvMhL4faEJmhG_8rzSOxEBRRqrACC0kmZgaERN8GkUs,209
116
- pyxcp/recorder/rekorder.cpython-313-darwin.so,sha256=8f5kav7HAQZSfgBDnf412_wkZP7Ue3I6AwQjhC9LrSw,530144
111
+ pyxcp/recorder/rekorder.cpython-313-darwin.so,sha256=PVPZLLUZNJymgk7rw7a-OAmjcafy_HIklAfh50izYA4,546880
117
112
  pyxcp/recorder/unfolder.hpp,sha256=3gJKT2eMOZuT8o_M2NFLthdUIWd460vdwzlHaf-fQII,47998
118
113
  pyxcp/recorder/converter/__init__.py,sha256=mqzH3jxGpFrtS2dHyfDLCYKeJycav3_-6z8svlI07eU,14452
119
114
  pyxcp/stim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
115
  pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
116
  pyxcp/vector/map.py,sha256=dSxM15eXvZh6izITdJmFxr1rplDUlfaJUbtrm2Xv-dE,2224
122
117
  pyxcp/cpp_ext/event.hpp,sha256=X2_ThYx8fzz-XR9McmsKM2Hb9I2x7XZeQGy1OyUs6iE,1133
123
- pyxcp/cpp_ext/cpp_ext.cpython-313-darwin.so,sha256=2uXRx7kmeWoO72pf6FeIYSV0Un1CDwg6j45hrIB89RE,321696
118
+ pyxcp/cpp_ext/cpp_ext.cpython-313-darwin.so,sha256=1BYTOrfgtRA3puKr4vLOiRruk8HiMsat0qe8ywXYRUs,321856
124
119
  pyxcp/cpp_ext/blockmem.hpp,sha256=wSUDTgwO9zNn0c29hZ_MRH7cHDIFKma2MYVxip9ARNE,1184
125
120
  pyxcp/cpp_ext/mcobject.hpp,sha256=A5GKcfjYMcfm3hfTQfFuS4JYNFTvfmzAcMXCe01GOs4,6429
126
121
  pyxcp/cpp_ext/tsqueue.hpp,sha256=PuDd0kmj61afjW0yva6T8pZL3m4fPCeWsuvEyx2M-80,980
127
122
  pyxcp/cpp_ext/extension_wrapper.cpp,sha256=XHpMp0e1gNwAiNquAXuyd2fXnlqbEu5V7zCP_SNvWKs,4755
128
- pyxcp/cpp_ext/cpp_ext.cpython-312-darwin.so,sha256=bQzwe_FuXE0nfXcJAuK2Ot6y5uhbTlT7Z_x6o4ZXd3w,321456
123
+ pyxcp/cpp_ext/cpp_ext.cpython-312-darwin.so,sha256=eIk77ElRY2MpQOD0_dtT8BuvSffqHUZN1VHyjkXazcM,321600
129
124
  pyxcp/cpp_ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
125
  pyxcp/cpp_ext/helper.hpp,sha256=ONAsVupIqqmNDp8bgGWS0TfSYeCFkk3kwwZbbqsh0HQ,7813
131
126
  pyxcp/cpp_ext/bin.hpp,sha256=0CatarJ7jFewlg9EIxsDPxC4wnORHutx-1PLHpf9iqw,2457
132
- pyxcp/cpp_ext/cpp_ext.cpython-311-darwin.so,sha256=C9qO_m2DNXOuFNFd2gZQ0NnX-wD9geUR1g7fIgESKh0,321456
127
+ pyxcp/cpp_ext/cpp_ext.cpython-311-darwin.so,sha256=fzNGtnJwuLv2Ner1sg8quHySZ5yh4SqjHM0-I8oHqP8,321600
133
128
  pyxcp/cpp_ext/daqlist.hpp,sha256=Q1Gejo8i1rP2PzyUh4UHJ2z-kG0WNnkbBj7N8DAdzaM,7071
134
- pyxcp/cpp_ext/cpp_ext.cpython-310-darwin.so,sha256=qlnVkp7k-ci_gds4AynKJrN8drfwE1wuZwuZhne0cig,321376
129
+ pyxcp/cpp_ext/cpp_ext.cpython-310-darwin.so,sha256=5sPtzwLXzXBbJ2zI2kGk0gF83xnDHvKbt0XasjPfe1c,321520
130
+ pyxcp-0.23.3.dist-info/RECORD,,
131
+ pyxcp-0.23.3.dist-info/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
132
+ pyxcp-0.23.3.dist-info/WHEEL,sha256=F-Ac6CTANed3x6yT1zUARTuatIT2Q9bQ5nEN9psYMVw,134
133
+ pyxcp-0.23.3.dist-info/entry_points.txt,sha256=LkHsEwubm30s4oiyCy0cKj6k97ALvQ6KjAVdyEcqu7g,358
134
+ pyxcp-0.23.3.dist-info/METADATA,sha256=wQmqlFOaiVIYsJGLg5m2M0aHyit3Ofwl7T1FEjWiWNg,11688
@@ -1,107 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: pyxcp
3
- Version: 0.23.1
4
- Summary: Universal Calibration Protocol for Python
5
- License: LGPLv3
6
- Keywords: automotive,ecu,xcp,asam,autosar
7
- Author: Christoph Schueler
8
- Author-email: cpu.gems@googlemail.com
9
- Requires-Python: >=3.10,<4.0
10
- Classifier: Development Status :: 5 - Production/Stable
11
- Classifier: Intended Audience :: Developers
12
- Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
13
- Classifier: License :: Other/Proprietary License
14
- Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Programming Language :: Python :: 3.8
20
- Classifier: Programming Language :: Python :: 3.9
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: pyserial (>=3.5,<4.0)
29
- Requires-Dist: python-can (>=4.2.2,<5.0.0)
30
- Requires-Dist: pytz (>=2025.2,<2026.0)
31
- Requires-Dist: pyusb (>=1.2.1,<2.0.0)
32
- Requires-Dist: rich (>=14.0.0,<15.0.0)
33
- Requires-Dist: toml (>=0.10.2,<0.11.0)
34
- Requires-Dist: tomlkit (>=0.13.3,<0.14.0)
35
- Requires-Dist: traitlets (<=5.11.2)
36
- Requires-Dist: uptime (>=3.0.1,<4.0.0)
37
- Project-URL: Homepage, https://github.com/christoph2/pyxcp
38
- Description-Content-Type: text/markdown
39
-
40
- # pyXCP
41
-
42
- [![Codacy Badge](https://api.codacy.com/project/badge/Grade/85f774708b2542d98d02df55c743d24a)](https://app.codacy.com/app/christoph2/pyxcp?utm_source=github.com&utm_medium=referral&utm_content=christoph2/pyxcp&utm_campaign=Badge_Grade_Settings)
43
- [![Maintainability](https://api.codeclimate.com/v1/badges/4c639f3695f2725e392a/maintainability)](https://codeclimate.com/github/christoph2/pyxcp/maintainability)
44
- [![Build Status](https://github.com/christoph2/pyxcp/workflows/Python%20application/badge.svg)](https://github.com/christoph2/pyxcp/actions)
45
- [![Build status](https://ci.appveyor.com/api/projects/status/r00l4i4co095e9ht?svg=true)](https://ci.appveyor.com/project/christoph2/pyxcp)
46
- [![Coverage Status](https://coveralls.io/repos/github/christoph2/pyxcp/badge.svg?branch=master)](https://coveralls.io/github/christoph2/pyxcp?branch=master)
47
- [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
48
- [![GPL License](http://img.shields.io/badge/license-GPL-blue.svg)](http://opensource.org/licenses/GPL-2.0)
49
-
50
- pyXCP is a lightweight Python library which talks to ASAM MCD-1 XCP enabled devices.
51
- These are mainly, but not only, automotive ECUs (Electronic Control Units).
52
-
53
- XCP is used to take measurements, to adjust parameters, and to flash during the development process.
54
-
55
- XCP also replaces the older CCP (CAN Calibration Protocol).
56
-
57
- ---
58
-
59
- ## Installation
60
-
61
- pyXCP is hosted on Github, get the latest release: [https://github.com/christoph2/pyxcp](https://github.com/christoph2/pyxcp)
62
-
63
- You can install pyxcp from source:
64
-
65
- ```
66
- pip install -r requirements.txt
67
- python setup.py install
68
- ```
69
-
70
- Alternatively, you can install pyxcp from source with pip:
71
-
72
- ```
73
- pip install git+https://github.com/christoph2/pyxcp.git
74
- ```
75
-
76
- Alternatively, get pyxcp from [PyPI](https://pypi.org/project/pyxcp/):
77
-
78
- ```
79
- pip install pyxcp
80
- ```
81
-
82
- ### Requirements
83
-
84
- - Python >= 3.7
85
- - A running XCP slave (of course).
86
- - If you are using a 64bit Windows version and want to use seed-and-key .dlls (to unlock resources), a GCC compiler capable of creating 32bit
87
- executables is required:
88
-
89
- These .dlls almost always ship as 32bit versions, but you can't load a 32bit .dll into a 64bit process, so a small bridging program (asamkeydll.exe) is
90
- required.
91
-
92
- ## First steps
93
-
94
- T.B.D.
95
-
96
- ## Features
97
-
98
- T.B.D.
99
-
100
- ## References
101
-
102
- - [Offical home of XCP](https://www.asam.net/standards/detail/mcd-1-xcp/)
103
-
104
- ## License
105
-
106
- GNU Lesser General Public License v3 or later (LGPLv3+)
107
-
File without changes