pyxcp 0.22.2__cp310-cp310-win_amd64.whl → 0.22.7__cp310-cp310-win_amd64.whl

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

Potentially problematic release.


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

pyxcp/__init__.py CHANGED
@@ -17,4 +17,4 @@ tb_install(show_locals=True, max_frames=3) # Install custom exception handler.
17
17
 
18
18
  # if you update this manually, do not forget to update
19
19
  # .bumpversion.cfg and pyproject.toml.
20
- __version__ = "0.22.2"
20
+ __version__ = "0.22.7"
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -7,6 +7,7 @@
7
7
  #include <charconv>
8
8
  #include <cstring>
9
9
  #include <iostream>
10
+ #include <limits>
10
11
  #include <map>
11
12
  #if __has_include(<stdfloat>)
12
13
  #include <stdfloat>
@@ -637,6 +638,33 @@ struct MeasurementParameters {
637
638
  return m_first_pids;
638
639
  }
639
640
 
641
+ #undef max // Thanks to Windows.
642
+
643
+ auto get_overflow_value() const {
644
+ std::uint64_t ov_value{};
645
+ switch (m_ts_size) {
646
+ case 1:
647
+ ov_value = std::numeric_limits<std::uint8_t>::max();
648
+ break;
649
+ case 2:
650
+ ov_value = std::numeric_limits<std::uint16_t>::max();
651
+ break;
652
+ case 4:
653
+ ov_value = std::numeric_limits<std::uint32_t>::max();
654
+ break;
655
+ // case 8:
656
+ // ov_value = std::numeric_limits<std::uint64_t>::max() + 1;
657
+ // break;
658
+ default:
659
+ throw std::runtime_error("Invalid timestamp size");
660
+ }
661
+ ov_value++;
662
+ std::cout << "TS-V: " << ov_value << " scale: " << m_ts_scale_factor << std::endl;
663
+ ov_value = static_cast<std::uint64_t>(ov_value * m_ts_scale_factor);
664
+ std::cout << "OVRF-Value: " << ov_value << std::endl;
665
+ return ov_value;
666
+ }
667
+
640
668
  std::uint8_t m_byte_order;
641
669
  std::uint8_t m_id_field_size;
642
670
  bool m_timestamps_supported;
@@ -1050,6 +1078,9 @@ class DAQPolicyBase {
1050
1078
  }
1051
1079
 
1052
1080
  virtual void set_parameters(const MeasurementParameters& params) noexcept {
1081
+ m_overflow_value = params.get_overflow_value();
1082
+ m_overflow_counter = 0ULL;
1083
+ std::cout << "Overflow value: " << m_overflow_value << ", Overflow counter: " << m_overflow_counter << std::endl;
1053
1084
  initialize();
1054
1085
  }
1055
1086
 
@@ -1058,6 +1089,9 @@ class DAQPolicyBase {
1058
1089
  virtual void initialize() = 0;
1059
1090
 
1060
1091
  virtual void finalize() = 0;
1092
+ private:
1093
+ std::uint64_t m_overflow_value{};
1094
+ std::uint64_t m_overflow_counter{};
1061
1095
  };
1062
1096
 
1063
1097
  class DaqRecorderPolicy : public DAQPolicyBase {
@@ -1164,6 +1198,38 @@ struct ValueHolder {
1164
1198
  std::any m_value;
1165
1199
  };
1166
1200
 
1201
+ class Overflow {
1202
+ public:
1203
+
1204
+ Overflow(std::uint64_t overflow_value) : m_overflow_value(overflow_value), m_overflow_counter(0ULL), m_previous_timestamp(0ULL) {
1205
+ }
1206
+
1207
+ auto get_previous_timestamp() const noexcept {
1208
+ return m_previous_timestamp;
1209
+ }
1210
+
1211
+ void set_previous_timestamp(std::uint64_t timestamp) noexcept {
1212
+ m_previous_timestamp = timestamp;
1213
+ }
1214
+
1215
+ void inc_overflow_counter() noexcept {
1216
+ m_overflow_counter++;
1217
+ }
1218
+
1219
+ auto get_overflow_counter() const noexcept {
1220
+ return m_overflow_counter;
1221
+ }
1222
+
1223
+ auto get_value() const noexcept {
1224
+ return m_overflow_value * m_overflow_counter;
1225
+ }
1226
+
1227
+ private:
1228
+ std::uint64_t m_overflow_value{};
1229
+ std::uint64_t m_overflow_counter{};
1230
+ std::uint64_t m_previous_timestamp{};
1231
+ };
1232
+
1167
1233
  class XcpLogFileDecoder {
1168
1234
  public:
1169
1235
 
@@ -1172,6 +1238,11 @@ class XcpLogFileDecoder {
1172
1238
  if (metadata != "") {
1173
1239
  auto des = Deserializer(metadata);
1174
1240
  m_params = des.run();
1241
+
1242
+ for (auto idx=0; idx < m_params.get_daq_lists().size(); ++idx) {
1243
+ m_overflows.emplace_back(Overflow(m_params.get_overflow_value()));
1244
+ }
1245
+
1175
1246
  m_decoder = std::make_unique<DAQProcessor>(m_params);
1176
1247
  } else {
1177
1248
  // cannot proceed!!!
@@ -1215,7 +1286,18 @@ class XcpLogFileDecoder {
1215
1286
  auto result = m_decoder->feed(timestamp, str_data);
1216
1287
  if (result) {
1217
1288
  const auto& [daq_list, ts0, ts1, meas] = *result;
1218
- on_daq_list(daq_list, ts0, ts1, meas);
1289
+
1290
+ auto& overflow = m_overflows[daq_list];
1291
+
1292
+ if (overflow.get_previous_timestamp() > ts1) {
1293
+ overflow.inc_overflow_counter();
1294
+ // Maybe on debug-level?
1295
+ // std::cout << "Overflow detected, counter: " << overflow.get_overflow_counter() << " " << overflow.get_previous_timestamp() << " " << ts1 << std::endl;
1296
+ }
1297
+
1298
+ on_daq_list(daq_list, ts0, ts1 + overflow.get_value(), meas);
1299
+
1300
+ overflow.set_previous_timestamp(ts1);
1219
1301
  }
1220
1302
  }
1221
1303
  }
@@ -1244,6 +1326,7 @@ class XcpLogFileDecoder {
1244
1326
  XcpLogFileReader m_reader;
1245
1327
  std::unique_ptr<DAQProcessor> m_decoder;
1246
1328
  MeasurementParameters m_params;
1329
+ std::vector<Overflow> m_overflows;
1247
1330
  };
1248
1331
 
1249
1332
  #endif // RECORDER_UNFOLDER_HPP
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python
2
+
3
+ """
4
+ Copy pyXCP examples to a given directory.
5
+ """
6
+
7
+ import argparse
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ from pyxcp import console
12
+
13
+
14
+ pyver = sys.version_info
15
+ if pyver.major == 3 and pyver.minor <= 9:
16
+ import pkg_resources
17
+
18
+ def copy_files_from_package(package_name: str, source_directory: str, args: argparse.Namespace) -> None:
19
+ destination_directory = args.output_directory
20
+ force = args.force
21
+ for fn in pkg_resources.resource_listdir(package_name, source_directory):
22
+ source_file = Path(pkg_resources.resource_filename(package_name, f"{source_directory}/{fn}"))
23
+ if source_file.suffix == ".py":
24
+ dest_file = Path(destination_directory) / fn
25
+ if dest_file.exists() and not force:
26
+ console.print(f"[white]Destination file [blue]{fn!r} [white]already exists. Skipping.")
27
+ continue
28
+ console.print(f"[blue]{source_file} [white]==> [green]{dest_file}")
29
+ data = source_file.read_text(encoding="utf-8")
30
+ dest_file.parent.mkdir(parents=True, exist_ok=True)
31
+ dest_file.write_text(data, encoding="utf-8")
32
+
33
+ else:
34
+ import importlib.resources
35
+
36
+ def copy_files_from_package(package_name: str, source_directory: str, args: argparse.Namespace) -> None:
37
+ destination_directory = args.output_directory
38
+ force = args.force
39
+ for fn in importlib.resources.files(f"{package_name}.{source_directory}").iterdir():
40
+ if fn.suffix == ".py":
41
+ data = fn.read_text(encoding="utf-8")
42
+ dest_file = Path(destination_directory) / fn.name
43
+ if dest_file.exists() and not force:
44
+ console.print(f"[white]Destination file [blue]{fn.name!r} [white]already exists. Skipping.")
45
+ continue
46
+ console.print(f"[blue]{fn} [white]==> [green]{dest_file}")
47
+ dest_file.parent.mkdir(parents=True, exist_ok=True)
48
+ dest_file.write_text(data, encoding="utf-8")
49
+
50
+
51
+ def main():
52
+ parser = argparse.ArgumentParser(description=__doc__)
53
+
54
+ parser.add_argument("output_directory", metavar="output_directory", type=Path, help="output directory")
55
+
56
+ parser.add_argument("-f", "--force", action="store_true", help="overwrite existing files.")
57
+
58
+ args = parser.parse_args()
59
+ print("Copying pyXCP examples...\n")
60
+ copy_files_from_package("pyxcp", "examples", args)
61
+
62
+
63
+ if __name__ == "__main__":
64
+ main()
pyxcp/transport/sxi.py CHANGED
@@ -109,7 +109,7 @@ class SxI(BaseTransport):
109
109
  while True:
110
110
  if self.closeEvent.is_set():
111
111
  return
112
- if not self.comm_port.in_waiting():
112
+ if not self.comm_port.in_waiting:
113
113
  continue
114
114
 
115
115
  recv_timestamp = self.timestamp.value
@@ -129,5 +129,5 @@ class SxI(BaseTransport):
129
129
  self.post_send_timestamp = self.timestamp.value
130
130
 
131
131
  def close_connection(self) -> None:
132
- if hasattr(self, "comm_port") and self.comm_port.is_open() and not self.has_user_supplied_interface:
132
+ if hasattr(self, "comm_port") and self.comm_port.is_open and not self.has_user_supplied_interface:
133
133
  self.comm_port.close()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyxcp
3
- Version: 0.22.2
3
+ Version: 0.22.7
4
4
  Summary: Universal Calibration Protocol for Python
5
5
  Home-page: https://github.com/christoph2/pyxcp
6
6
  License: LGPLv3
@@ -1,4 +1,4 @@
1
- pyxcp/__init__.py,sha256=dWd-0mhqqHeqKqaSDFeRYxEgUTCGlD8QC6kUYKoIrb4,547
1
+ pyxcp/__init__.py,sha256=HAermm5O8lCj5L2HmTnSaPzPaHdQ1oWQXKL9emQBenQ,547
2
2
  pyxcp/aml/EtasCANMonitoring.a2l,sha256=EJYwe3Z3H24vyWAa6lUgcdKnQY8pwFxjyCN6ZU1ST8w,1509
3
3
  pyxcp/aml/EtasCANMonitoring.aml,sha256=xl0DdyeiIaLW0mmmJNAyJS0CQdOLSxt9dxfgrdSlU8Y,2405
4
4
  pyxcp/aml/ifdata_CAN.a2l,sha256=NCUnCUEEgRbZYSLGtUGwL2e7zJ8hrp0SbmLHGv8uY58,612
@@ -24,9 +24,9 @@ pyxcp/constants.py,sha256=9yGfujC0ImTYQWfn41wyw8pluJTSrhMGWIVeIZTgsLg,1160
24
24
  pyxcp/cpp_ext/__init__.py,sha256=iCsEqSZQIsaNSjQkgTp-DKvOCkRtV6QOydnSUDx5jVk,136
25
25
  pyxcp/cpp_ext/bin.hpp,sha256=PwJloZek21la-RBSda2Hc0u_6gID0sfTduPeplaAyR4,2561
26
26
  pyxcp/cpp_ext/blockmem.hpp,sha256=ysaJwmTWGTfE54Outk3gJYOfAVFd_QaonBMtXLcXwCc,1242
27
- pyxcp/cpp_ext/cpp_ext.cp310-win_amd64.pyd,sha256=tOAKbuG3lEU2tB1qa8qdyT5BaZMHwevOJZM7_KZFocg,268288
28
- pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd,sha256=VEKqOdMfTgJtql7AzV02MvnIVnzMcuiG9SkLQndPUQs,268288
29
- pyxcp/cpp_ext/cpp_ext.cp39-win_amd64.pyd,sha256=8x9Qi2NfQlFE7rrizE03LlYmtkqccp46NkWWTszL_3c,250880
27
+ pyxcp/cpp_ext/cpp_ext.cp310-win_amd64.pyd,sha256=7k2rFoOAPO12R7UPL9z1m5peEe8gtOF6hXcrzdfsBrY,273920
28
+ pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd,sha256=dx9iU5JjJ7scvygwefDzmSl1jBi1_ppd6_6o_iPh6R4,273920
29
+ pyxcp/cpp_ext/cpp_ext.cp39-win_amd64.pyd,sha256=x094HR8qLNWKi9Y69coYQbcxYU4dUfpzn8TfY722m1A,256512
30
30
  pyxcp/cpp_ext/daqlist.hpp,sha256=sgqodW4vnN82s05mFyXQnpQox4KR3VDhP5FB_VhsmQc,7075
31
31
  pyxcp/cpp_ext/event.hpp,sha256=Z-1yxsEKsr81NnLVEWJ2ANA8FV7YsM7EbNxaw-elheE,1200
32
32
  pyxcp/cpp_ext/extension_wrapper.cpp,sha256=3vEo7PljGHw6w1mNB08jHe4B6CMSg0jCWPJucpmhmDw,4438
@@ -38,9 +38,9 @@ pyxcp/daq_stim/optimize/__init__.py,sha256=E4HzY8P0aeegNgu71hUcbL-yR6Fzg5PGe8PSi
38
38
  pyxcp/daq_stim/optimize/binpacking.py,sha256=zTNjpt91MnGW5ha9Z07hQtuoJ7tspyRwRlLYbE6GMGs,1249
39
39
  pyxcp/daq_stim/scheduler.cpp,sha256=a7VK7kP2Hs8yMlcDAkXwJ0bH88lr_yz156sphcHS7Z4,715
40
40
  pyxcp/daq_stim/scheduler.hpp,sha256=U_6tUbebmzX5vVZS0EFSgTaPsyxMg6yRXHG_aPWA0x4,1884
41
- pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=CDzLe0700zMhIViduzFyuIYqWEJQyeUhdRZcPAjSydY,181248
42
- pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=9ETHV6JKdEAhUy5Np4EWUYdGPfG2q5sDNaj1hR1Cxxc,181248
43
- pyxcp/daq_stim/stim.cp39-win_amd64.pyd,sha256=Ui-1OGZyWEC8J2fNptVWztxbJL0vt0KGzCb0nsi46w4,175104
41
+ pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=igOn1yLfbDHhiQn2TFk8Ji5j2AxeNrHXQhL0rjYxmkw,186880
42
+ pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=IE7vep2HcbF_BvNilnZ5MzCW795ZiLssvIpF2FmDOns,186880
43
+ pyxcp/daq_stim/stim.cp39-win_amd64.pyd,sha256=FsgkFCVZEfDAOtt5BFHPUVoaZ40qodDv3KlDW7dRXFA,181248
44
44
  pyxcp/daq_stim/stim.cpp,sha256=F2OG67W4KKwTTiUCxm-9egIv3TLFdOkRunX6xf7YOtc,177
45
45
  pyxcp/daq_stim/stim.hpp,sha256=U-uInRrA6OCdMl1l1SWbQ_KEPpnNYrWut924IvbW6R0,18508
46
46
  pyxcp/daq_stim/stim_wrapper.cpp,sha256=5LbWkK86h_4mHd83dnwCU7BRvVYit8ijxBMT7pthtOE,1830
@@ -85,18 +85,19 @@ pyxcp/recorder/mio.hpp,sha256=5ASJLKSEykH0deAQD5uak-_yAgd5p2n8t06315GSGrg,63346
85
85
  pyxcp/recorder/reader.hpp,sha256=qbz-LFg87h4yLaGiv_8zP-95UebbwICei0tvgHu6uII,5190
86
86
  pyxcp/recorder/reco.py,sha256=6N6FIwfCEVMpi5dr3eUOQa1lowcg2LCnS_sy_-b-UiQ,8725
87
87
  pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
- pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=GJ8vjxZgdGPCPQmEwbh6Tt6aMpcXAf8zlEgz3gvBRf4,370176
89
- pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=qZ4YHhO4l7YhhiyOF3b-IS9eCwdYXypZrtWoJAI6o40,369664
90
- pyxcp/recorder/rekorder.cp39-win_amd64.pyd,sha256=nTXGO-1YyrtzXJpx02c5ZaIUcCL02ssk6ctXIz18eME,356352
88
+ pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=sKMjdhSJCGR_SfSf3Vp_GQ1zXfPgQV4YsVi0QmB11Eo,378880
89
+ pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=AywLPn7f7P0CFhDiw8HCyXJZwlHMs7mPwcS5jtyUK48,378368
90
+ pyxcp/recorder/rekorder.cp39-win_amd64.pyd,sha256=TOUnbTj1bdkroFUXe4rKNn3U-lgcbMClO_frCmYu5y0,364032
91
91
  pyxcp/recorder/rekorder.cpp,sha256=U0LMyk8pZXx9emgS_WPVthvn_9IpgE7JGrh4kg-8CX4,1900
92
92
  pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
93
93
  pyxcp/recorder/setup.py,sha256=_99XFPQAd5V4LcJaSGJwdnbxgxJ7kl8DEXfHsnKO1Yg,998
94
94
  pyxcp/recorder/test_reko.py,sha256=M8lfKBmBUl-28IMVoD6lU5Bnorz7fYFOvcAjfVZxuXA,1014
95
- pyxcp/recorder/unfolder.hpp,sha256=KrzZqXJgCr9tXD7k-2tWq1GT-A3SoThug4jyF4WLDWU,45177
95
+ pyxcp/recorder/unfolder.hpp,sha256=1DOjH3YlExYtJfQpmnyxWiQTgM87ON59tNlhC6o2ACE,48082
96
96
  pyxcp/recorder/wrap.cpp,sha256=S3frBevIrPE5m3kt_mXe9TDOwWPJFiVa7Rt9FGMCv2A,8909
97
97
  pyxcp/recorder/writer.hpp,sha256=rNjtRTtJes5z-BzKR2K56P_Kvc9MEVQgycu8J0wKf1g,11284
98
98
  pyxcp/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
99
  pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=P_gscDTAofbSVA_Wd1GATrnyWGTf1-Dz_oPdlRFfjuk,567
100
+ pyxcp/scripts/xcp_examples.py,sha256=q2wNXHVZu4GjcIlZwp2j9Sqm5QH39Olro4BQaLoIqiM,2583
100
101
  pyxcp/scripts/xcp_fetch_a2l.py,sha256=72818jdJiLsDuWWfkAPxekZ7fzRRz_A4RVSy06LQNe4,1239
101
102
  pyxcp/scripts/xcp_id_scanner.py,sha256=2P53qrvM-rYFTBbbm7eAKyOxESkKrorieND-KoZZ9mo,421
102
103
  pyxcp/scripts/xcp_info.py,sha256=pjI7EaT7I47b16VyFnrCxWtRjzmCO4HmVPdc0Q2YpvI,3945
@@ -117,15 +118,15 @@ pyxcp/transport/base.py,sha256=MQwdDpff34YOHyabP-NdV1Jq-w2umXMSMSNdc4nMGDU,16281
117
118
  pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
119
  pyxcp/transport/can.py,sha256=cQ8lrwBL7Ar0GSf48987TztR9wqYS_UnXUngzhaHXe0,14909
119
120
  pyxcp/transport/eth.py,sha256=xPzN2oSALoPKJVvZpBljPSV1AxfpjRusOzymO-TD1Rw,8711
120
- pyxcp/transport/sxi.py,sha256=_r1aEeMVy1tNPVStHH0iaaHTqnC-Uy3FwWDrYpeByI8,4699
121
+ pyxcp/transport/sxi.py,sha256=vM8WZIKuu_dNuqkxZM_1n6iQkQCCzo4ykWpiG6ba8Fk,4695
121
122
  pyxcp/transport/transport_wrapper.cpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
123
  pyxcp/transport/usb_transport.py,sha256=JuYrwkWsUdibdVNA57LBEQT3a3ykOgWPdWcfqj96nDE,8343
123
124
  pyxcp/types.py,sha256=hY4Bb3qT3ZoabGnSKLY6S84MvVyuOCxwVONfs2skx2Y,26043
124
125
  pyxcp/utils.py,sha256=tujhw__jUSVIljHfHekN-nzERXC_1orVRBGKNyGqBuo,2961
125
126
  pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
127
  pyxcp/vector/map.py,sha256=7Gnhvr79geMeqqGVIJPxODXGwABdNDinnqzhpooN5TE,2306
127
- pyxcp-0.22.2.dist-info/entry_points.txt,sha256=hGDdVkAmhSdsUN_p1aIuhchORwtzkBIQ-HhPUfttXBs,262
128
- pyxcp-0.22.2.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
129
- pyxcp-0.22.2.dist-info/METADATA,sha256=0sffU2Eh2iGMohh8qCBicPAbz69-5QJpQz_1YoYAdVs,4075
130
- pyxcp-0.22.2.dist-info/WHEEL,sha256=Jr_qyVDoEAnAI5RcZqNdiGEGsXCke4YuTFjHKZdYyb4,98
131
- pyxcp-0.22.2.dist-info/RECORD,,
128
+ pyxcp-0.22.7.dist-info/entry_points.txt,sha256=2JbL-pWn9UxpBrS64aWiFFkq9x2A7y-dkrxYlfQqIJU,307
129
+ pyxcp-0.22.7.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
130
+ pyxcp-0.22.7.dist-info/METADATA,sha256=zoXY0v3Td95HJM71PFRg79OtAW2qyf-pBEKV51it5Fg,4075
131
+ pyxcp-0.22.7.dist-info/WHEEL,sha256=Jr_qyVDoEAnAI5RcZqNdiGEGsXCke4YuTFjHKZdYyb4,98
132
+ pyxcp-0.22.7.dist-info/RECORD,,
@@ -1,5 +1,6 @@
1
1
  [console_scripts]
2
2
  pyxcp-probe-can-drivers=pyxcp.scripts.pyxcp_probe_can_drivers:main
3
+ xcp-examples=pyxcp.scripts.xcp_examples:main
3
4
  xcp-fetch-a2l=pyxcp.scripts.xcp_fetch_a2l:main
4
5
  xcp-id-scanner=pyxcp.scripts.xcp_id_scanner:main
5
6
  xcp-info=pyxcp.scripts.xcp_info:main
File without changes