pyxcp 0.22.2__cp311-cp311-win_amd64.whl → 0.22.8__cp311-cp311-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.8"
Binary file
Binary file
Binary file
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.8
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=U-rXeTf4QzBHk-d_dEPJjgDiScf1TRpEvDl8-vejXIM,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,10 +24,10 @@ 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.cp311-win_amd64.pyd,sha256=JeOL-R8ep4MkqT9myBgPnPHF0QtbVPidNwLc8QfmB5E,270336
29
- pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd,sha256=VEKqOdMfTgJtql7AzV02MvnIVnzMcuiG9SkLQndPUQs,268288
30
- pyxcp/cpp_ext/cpp_ext.cp39-win_amd64.pyd,sha256=8x9Qi2NfQlFE7rrizE03LlYmtkqccp46NkWWTszL_3c,250880
27
+ pyxcp/cpp_ext/cpp_ext.cp310-win_amd64.pyd,sha256=Ty4RoQrpJF8KbTuHbGCG0GAU2TEugQaECYMq5nrMiQk,273920
28
+ pyxcp/cpp_ext/cpp_ext.cp311-win_amd64.pyd,sha256=ciUVzvCe1v8Lx5z24PDqCrSYeGBsVQV1PcjYqWTKtkA,276480
29
+ pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd,sha256=CbLeNvyOb2VG-0BurZJfewoV4cerrNpKEPQTKR7pM3U,273920
30
+ pyxcp/cpp_ext/cpp_ext.cp39-win_amd64.pyd,sha256=gkLRVZ9JENr9blmv5MKHx1t-dKhrjOA0gNhwyZqvBBk,256512
31
31
  pyxcp/cpp_ext/daqlist.hpp,sha256=sgqodW4vnN82s05mFyXQnpQox4KR3VDhP5FB_VhsmQc,7075
32
32
  pyxcp/cpp_ext/event.hpp,sha256=Z-1yxsEKsr81NnLVEWJ2ANA8FV7YsM7EbNxaw-elheE,1200
33
33
  pyxcp/cpp_ext/extension_wrapper.cpp,sha256=3vEo7PljGHw6w1mNB08jHe4B6CMSg0jCWPJucpmhmDw,4438
@@ -39,10 +39,10 @@ pyxcp/daq_stim/optimize/__init__.py,sha256=E4HzY8P0aeegNgu71hUcbL-yR6Fzg5PGe8PSi
39
39
  pyxcp/daq_stim/optimize/binpacking.py,sha256=zTNjpt91MnGW5ha9Z07hQtuoJ7tspyRwRlLYbE6GMGs,1249
40
40
  pyxcp/daq_stim/scheduler.cpp,sha256=a7VK7kP2Hs8yMlcDAkXwJ0bH88lr_yz156sphcHS7Z4,715
41
41
  pyxcp/daq_stim/scheduler.hpp,sha256=U_6tUbebmzX5vVZS0EFSgTaPsyxMg6yRXHG_aPWA0x4,1884
42
- pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=CDzLe0700zMhIViduzFyuIYqWEJQyeUhdRZcPAjSydY,181248
43
- pyxcp/daq_stim/stim.cp311-win_amd64.pyd,sha256=chIGiox6ct6XBjFHGMt2jR31p1LH9QmQoQLpnI0rIvg,183808
44
- pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=9ETHV6JKdEAhUy5Np4EWUYdGPfG2q5sDNaj1hR1Cxxc,181248
45
- pyxcp/daq_stim/stim.cp39-win_amd64.pyd,sha256=Ui-1OGZyWEC8J2fNptVWztxbJL0vt0KGzCb0nsi46w4,175104
42
+ pyxcp/daq_stim/stim.cp310-win_amd64.pyd,sha256=lHFzlfWynww-VU6gO-vJYO-aDPeEoVw-LssJ1UYqLq0,186880
43
+ pyxcp/daq_stim/stim.cp311-win_amd64.pyd,sha256=9cCCa56D9bZOBpIonPOnqH0G4PrQHXiEZryqFR3a3Cw,189440
44
+ pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=CMzj7jyJ72v66aqw3GoMMl9wE9O6YrMAZrY1B3XZjTE,186880
45
+ pyxcp/daq_stim/stim.cp39-win_amd64.pyd,sha256=rsq112DVYvzSAl4oV4GCtACvXBAr__glgmtGs8LLm2A,181248
46
46
  pyxcp/daq_stim/stim.cpp,sha256=F2OG67W4KKwTTiUCxm-9egIv3TLFdOkRunX6xf7YOtc,177
47
47
  pyxcp/daq_stim/stim.hpp,sha256=U-uInRrA6OCdMl1l1SWbQ_KEPpnNYrWut924IvbW6R0,18508
48
48
  pyxcp/daq_stim/stim_wrapper.cpp,sha256=5LbWkK86h_4mHd83dnwCU7BRvVYit8ijxBMT7pthtOE,1830
@@ -87,19 +87,20 @@ pyxcp/recorder/mio.hpp,sha256=5ASJLKSEykH0deAQD5uak-_yAgd5p2n8t06315GSGrg,63346
87
87
  pyxcp/recorder/reader.hpp,sha256=qbz-LFg87h4yLaGiv_8zP-95UebbwICei0tvgHu6uII,5190
88
88
  pyxcp/recorder/reco.py,sha256=6N6FIwfCEVMpi5dr3eUOQa1lowcg2LCnS_sy_-b-UiQ,8725
89
89
  pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=GJ8vjxZgdGPCPQmEwbh6Tt6aMpcXAf8zlEgz3gvBRf4,370176
91
- pyxcp/recorder/rekorder.cp311-win_amd64.pyd,sha256=qA2puY2O0bpsnXnLYq91RAEPQIvoeiOmLgYKEgKFI00,371712
92
- pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=qZ4YHhO4l7YhhiyOF3b-IS9eCwdYXypZrtWoJAI6o40,369664
93
- pyxcp/recorder/rekorder.cp39-win_amd64.pyd,sha256=nTXGO-1YyrtzXJpx02c5ZaIUcCL02ssk6ctXIz18eME,356352
90
+ pyxcp/recorder/rekorder.cp310-win_amd64.pyd,sha256=nf82Ajn-gShv1tvZVItg4o1dRKSkZDZf2np5j_wXnVg,378880
91
+ pyxcp/recorder/rekorder.cp311-win_amd64.pyd,sha256=tDdihMCmKWjp0Tp092r7zvwk1ztAMbG-Mug8Tb8pucU,380416
92
+ pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=4Wq1cgT0RVqyXNwfrE195LI-u3OxUXMCzMxYl89_twU,378368
93
+ pyxcp/recorder/rekorder.cp39-win_amd64.pyd,sha256=End-lUEkXt7aYi08zGP1t8hD26vzUIHjqPeN1fnGwzo,364032
94
94
  pyxcp/recorder/rekorder.cpp,sha256=U0LMyk8pZXx9emgS_WPVthvn_9IpgE7JGrh4kg-8CX4,1900
95
95
  pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
96
96
  pyxcp/recorder/setup.py,sha256=_99XFPQAd5V4LcJaSGJwdnbxgxJ7kl8DEXfHsnKO1Yg,998
97
97
  pyxcp/recorder/test_reko.py,sha256=M8lfKBmBUl-28IMVoD6lU5Bnorz7fYFOvcAjfVZxuXA,1014
98
- pyxcp/recorder/unfolder.hpp,sha256=KrzZqXJgCr9tXD7k-2tWq1GT-A3SoThug4jyF4WLDWU,45177
98
+ pyxcp/recorder/unfolder.hpp,sha256=1DOjH3YlExYtJfQpmnyxWiQTgM87ON59tNlhC6o2ACE,48082
99
99
  pyxcp/recorder/wrap.cpp,sha256=S3frBevIrPE5m3kt_mXe9TDOwWPJFiVa7Rt9FGMCv2A,8909
100
100
  pyxcp/recorder/writer.hpp,sha256=rNjtRTtJes5z-BzKR2K56P_Kvc9MEVQgycu8J0wKf1g,11284
101
101
  pyxcp/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
102
  pyxcp/scripts/pyxcp_probe_can_drivers.py,sha256=P_gscDTAofbSVA_Wd1GATrnyWGTf1-Dz_oPdlRFfjuk,567
103
+ pyxcp/scripts/xcp_examples.py,sha256=q2wNXHVZu4GjcIlZwp2j9Sqm5QH39Olro4BQaLoIqiM,2583
103
104
  pyxcp/scripts/xcp_fetch_a2l.py,sha256=72818jdJiLsDuWWfkAPxekZ7fzRRz_A4RVSy06LQNe4,1239
104
105
  pyxcp/scripts/xcp_id_scanner.py,sha256=2P53qrvM-rYFTBbbm7eAKyOxESkKrorieND-KoZZ9mo,421
105
106
  pyxcp/scripts/xcp_info.py,sha256=pjI7EaT7I47b16VyFnrCxWtRjzmCO4HmVPdc0Q2YpvI,3945
@@ -120,15 +121,15 @@ pyxcp/transport/base.py,sha256=MQwdDpff34YOHyabP-NdV1Jq-w2umXMSMSNdc4nMGDU,16281
120
121
  pyxcp/transport/base_transport.hpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
122
  pyxcp/transport/can.py,sha256=cQ8lrwBL7Ar0GSf48987TztR9wqYS_UnXUngzhaHXe0,14909
122
123
  pyxcp/transport/eth.py,sha256=xPzN2oSALoPKJVvZpBljPSV1AxfpjRusOzymO-TD1Rw,8711
123
- pyxcp/transport/sxi.py,sha256=_r1aEeMVy1tNPVStHH0iaaHTqnC-Uy3FwWDrYpeByI8,4699
124
+ pyxcp/transport/sxi.py,sha256=vM8WZIKuu_dNuqkxZM_1n6iQkQCCzo4ykWpiG6ba8Fk,4695
124
125
  pyxcp/transport/transport_wrapper.cpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
126
  pyxcp/transport/usb_transport.py,sha256=JuYrwkWsUdibdVNA57LBEQT3a3ykOgWPdWcfqj96nDE,8343
126
127
  pyxcp/types.py,sha256=hY4Bb3qT3ZoabGnSKLY6S84MvVyuOCxwVONfs2skx2Y,26043
127
128
  pyxcp/utils.py,sha256=tujhw__jUSVIljHfHekN-nzERXC_1orVRBGKNyGqBuo,2961
128
129
  pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
130
  pyxcp/vector/map.py,sha256=7Gnhvr79geMeqqGVIJPxODXGwABdNDinnqzhpooN5TE,2306
130
- pyxcp-0.22.2.dist-info/entry_points.txt,sha256=hGDdVkAmhSdsUN_p1aIuhchORwtzkBIQ-HhPUfttXBs,262
131
- pyxcp-0.22.2.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
132
- pyxcp-0.22.2.dist-info/METADATA,sha256=0sffU2Eh2iGMohh8qCBicPAbz69-5QJpQz_1YoYAdVs,4075
133
- pyxcp-0.22.2.dist-info/WHEEL,sha256=-FZBVKyKauScY3vLa8vJR6hBCpAJfFykw2MOwlNKr1g,98
134
- pyxcp-0.22.2.dist-info/RECORD,,
131
+ pyxcp-0.22.8.dist-info/entry_points.txt,sha256=2JbL-pWn9UxpBrS64aWiFFkq9x2A7y-dkrxYlfQqIJU,307
132
+ pyxcp-0.22.8.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
133
+ pyxcp-0.22.8.dist-info/METADATA,sha256=Q12PIGTD3wxIYuDFBDn5PmwOVIHtbkVA4pylr2MKvt8,4075
134
+ pyxcp-0.22.8.dist-info/WHEEL,sha256=-FZBVKyKauScY3vLa8vJR6hBCpAJfFykw2MOwlNKr1g,98
135
+ pyxcp-0.22.8.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