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