pyxcp 0.22.10__tar.gz → 0.22.12__tar.gz
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-0.22.10 → pyxcp-0.22.12}/PKG-INFO +1 -1
- {pyxcp-0.22.10 → pyxcp-0.22.12}/build_ext.py +12 -2
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyproject.toml +1 -1
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/__init__.py +1 -1
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/config/__init__.py +4 -1
- pyxcp-0.22.12/pyxcp/examples/ex_csv.py +85 -0
- pyxcp-0.22.12/pyxcp/examples/ex_excel.py +95 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/reader.hpp +2 -2
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/unfolder.hpp +4 -4
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/base.py +8 -4
- {pyxcp-0.22.10 → pyxcp-0.22.12}/CMakeLists.txt +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/LICENSE +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/README.md +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/EtasCANMonitoring.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/EtasCANMonitoring.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCP_Common.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCPonCAN.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCPonEth.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCPonFlx.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCPonSxI.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/XCPonUSB.aml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/ifdata_CAN.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/ifdata_Eth.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/ifdata_Flx.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/ifdata_SxI.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/aml/ifdata_USB.a2l +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/asam/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/asam/types.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/asamkeydll.c +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/asamkeydll.sh +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/checksum.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cmdline.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/config/legacy.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/constants.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/bin.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/blockmem.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/daqlist.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/event.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/extension_wrapper.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/helper.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/mcobject.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/cpp_ext/tsqueue.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/optimize/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/optimize/binpacking.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/scheduler.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/scheduler.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/stim.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/stim.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/daq_stim/stim_wrapper.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/dllif.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/errormatrix.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_can.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_can_user.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_can_vector.json +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_can_vector.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_eth.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_nixnet.json +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_socket_can.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_sxi.json +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/conf_sxi.toml +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/ex_arrow.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/ex_mdf.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/ex_sqlite.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/run_daq.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcp_policy.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcp_read_benchmark.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcp_skel.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcp_unlock.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcp_user_supplied_driver.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcphello.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/examples/xcphello_recorder.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/master/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/master/errorhandler.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/master/master.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/py.typed +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/build_clang.cmd +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/build_clang.sh +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/build_gcc.cmd +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/build_gcc.sh +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/build_gcc_arm.sh +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/converter/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/lz4.c +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/lz4.h +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/lz4hc.c +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/lz4hc.h +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/mio.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/reco.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/recorder.rst +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/rekorder.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/rekorder.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/setup.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/test_reko.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/wrap.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/recorder/writer.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/pyxcp_probe_can_drivers.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/xcp_examples.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/xcp_fetch_a2l.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/xcp_id_scanner.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/xcp_info.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/scripts/xcp_profile.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/stim/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_asam_types.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_binpacking.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_can.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_checksum.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_daq.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_frame_padding.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_master.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_transport.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/tests/test_utils.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/timing.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/base_transport.hpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/can.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/eth.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/sxi.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/transport_wrapper.cpp +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/transport/usb_transport.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/types.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/utils.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/vector/__init__.py +0 -0
- {pyxcp-0.22.10 → pyxcp-0.22.12}/pyxcp/vector/map.py +0 -0
|
@@ -92,10 +92,20 @@ def banner(msg: str) -> None:
|
|
|
92
92
|
print("=" * 80)
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
def get_env_int(name: str, default: int = 0) -> int:
|
|
96
|
+
return int(os.environ.get(name, default))
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def get_env_bool(name: str, default: int = 0) -> bool:
|
|
100
|
+
return get_env_int(name, default)
|
|
101
|
+
|
|
102
|
+
|
|
95
103
|
def build_extension(debug: bool = False, use_temp_dir: bool = False) -> None:
|
|
96
104
|
print("build_ext::build_extension()")
|
|
97
105
|
|
|
98
|
-
|
|
106
|
+
use_temp_dir = use_temp_dir or get_env_bool("BUILD_TEMP")
|
|
107
|
+
debug = debug or get_env_bool("BUILD_DEBUG")
|
|
108
|
+
|
|
99
109
|
cfg = "Debug" if debug else "Release"
|
|
100
110
|
print(f" BUILD-TYPE: {cfg!r}")
|
|
101
111
|
|
|
@@ -144,4 +154,4 @@ def build_extension(debug: bool = False, use_temp_dir: bool = False) -> None:
|
|
|
144
154
|
if __name__ == "__main__":
|
|
145
155
|
includes = subprocess.getoutput("pybind11-config --cmakedir") # nosec
|
|
146
156
|
os.environ["pybind11_DIR"] = includes
|
|
147
|
-
build_extension(
|
|
157
|
+
build_extension()
|
|
@@ -36,7 +36,7 @@ dynamic = ["license", "readme", "authors", "requires-python", "description", "cl
|
|
|
36
36
|
[tool.poetry]
|
|
37
37
|
authors = ["Christoph Schueler <cpu.gems@googlemail.com>"]
|
|
38
38
|
name = "pyxcp"
|
|
39
|
-
version = "0.22.
|
|
39
|
+
version = "0.22.12"
|
|
40
40
|
readme = "README.md"
|
|
41
41
|
description = "Universal Calibration Protocol for Python"
|
|
42
42
|
keywords = ["automotive", "ecu", "xcp", "asam", "autosar"]
|
|
@@ -932,8 +932,11 @@ class PyXCP(Application):
|
|
|
932
932
|
self.subapp.start()
|
|
933
933
|
exit(2)
|
|
934
934
|
else:
|
|
935
|
+
if logging.getLogger().hasHandlers():
|
|
936
|
+
self.log = logging.getLogger()
|
|
937
|
+
else:
|
|
938
|
+
self._setup_logger()
|
|
935
939
|
self._read_configuration(self.config_file)
|
|
936
|
-
self._setup_logger()
|
|
937
940
|
|
|
938
941
|
def _setup_logger(self):
|
|
939
942
|
from pyxcp.types import Command
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import csv
|
|
5
|
+
from array import array
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from mmap import PAGESIZE
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, List
|
|
10
|
+
|
|
11
|
+
from pyxcp.recorder import XcpLogFileDecoder
|
|
12
|
+
from pyxcp.recorder.converter import MAP_TO_ARRAY
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
MAP_TO_SQL = {
|
|
16
|
+
"U8": "INTEGER",
|
|
17
|
+
"I8": "INTEGER",
|
|
18
|
+
"U16": "INTEGER",
|
|
19
|
+
"I16": "INTEGER",
|
|
20
|
+
"U32": "INTEGER",
|
|
21
|
+
"I32": "INTEGER",
|
|
22
|
+
"U64": "INTEGER",
|
|
23
|
+
"I64": "INTEGER",
|
|
24
|
+
"F32": "FLOAT",
|
|
25
|
+
"F64": "FLOAT",
|
|
26
|
+
"F16": "FLOAT",
|
|
27
|
+
"BF16": "FLOAT",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger("PyXCP")
|
|
31
|
+
|
|
32
|
+
parser = argparse.ArgumentParser(description="Use .xmraw files in an Apache Arrow application.")
|
|
33
|
+
parser.add_argument("xmraw_file", help=".xmraw file")
|
|
34
|
+
args = parser.parse_args()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class Storage:
|
|
39
|
+
name: str
|
|
40
|
+
arrow_type: Any
|
|
41
|
+
arr: array
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class StorageContainer:
|
|
46
|
+
name: str
|
|
47
|
+
arr: List[Storage] = field(default_factory=[])
|
|
48
|
+
ts0: List[int] = field(default_factory=lambda: array("Q"))
|
|
49
|
+
ts1: List[int] = field(default_factory=lambda: array("Q"))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class Decoder(XcpLogFileDecoder):
|
|
53
|
+
|
|
54
|
+
def __init__(self, recording_file_name: str):
|
|
55
|
+
super().__init__(recording_file_name)
|
|
56
|
+
|
|
57
|
+
def initialize(self) -> None:
|
|
58
|
+
self.arrow_tables = []
|
|
59
|
+
self.csv_writers = []
|
|
60
|
+
for dl in self.daq_lists:
|
|
61
|
+
result = []
|
|
62
|
+
for name, type_str in dl.headers:
|
|
63
|
+
array_txpe = MAP_TO_ARRAY[type_str]
|
|
64
|
+
sql_type = MAP_TO_SQL[type_str]
|
|
65
|
+
sd = Storage(name, sql_type, array(array_txpe))
|
|
66
|
+
result.append(sd)
|
|
67
|
+
sc = StorageContainer(dl.name, result)
|
|
68
|
+
writer = csv.writer(open(f"{sc.name}.csv", "w", newline=""), dialect="excel")
|
|
69
|
+
headers = ["ts0", "ts1"] + [e.name for e in sc.arr]
|
|
70
|
+
writer.writerow(headers)
|
|
71
|
+
self.csv_writers.append(writer)
|
|
72
|
+
self.arrow_tables.append(sc)
|
|
73
|
+
print("\nInserting data...")
|
|
74
|
+
|
|
75
|
+
def finalize(self) -> None:
|
|
76
|
+
print("Done.")
|
|
77
|
+
|
|
78
|
+
def on_daq_list(self, daq_list_num: int, timestamp0: int, timestamp1: int, measurements: list) -> None:
|
|
79
|
+
sc = self.arrow_tables[daq_list_num]
|
|
80
|
+
writer = self.csv_writers[daq_list_num]
|
|
81
|
+
data = [timestamp0, timestamp1, *measurements]
|
|
82
|
+
writer.writerow(data)
|
|
83
|
+
|
|
84
|
+
decoder = Decoder(args.xmraw_file)
|
|
85
|
+
decoder.run()
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import xlsxwriter
|
|
5
|
+
from array import array
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from mmap import PAGESIZE
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, List
|
|
10
|
+
|
|
11
|
+
from pyxcp.recorder import XcpLogFileDecoder
|
|
12
|
+
from pyxcp.recorder.converter import MAP_TO_ARRAY
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
MAP_TO_SQL = {
|
|
16
|
+
"U8": "INTEGER",
|
|
17
|
+
"I8": "INTEGER",
|
|
18
|
+
"U16": "INTEGER",
|
|
19
|
+
"I16": "INTEGER",
|
|
20
|
+
"U32": "INTEGER",
|
|
21
|
+
"I32": "INTEGER",
|
|
22
|
+
"U64": "INTEGER",
|
|
23
|
+
"I64": "INTEGER",
|
|
24
|
+
"F32": "FLOAT",
|
|
25
|
+
"F64": "FLOAT",
|
|
26
|
+
"F16": "FLOAT",
|
|
27
|
+
"BF16": "FLOAT",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger("PyXCP")
|
|
31
|
+
|
|
32
|
+
parser = argparse.ArgumentParser(description="Use .xmraw files in an Apache Arrow application.")
|
|
33
|
+
parser.add_argument("xmraw_file", help=".xmraw file")
|
|
34
|
+
args = parser.parse_args()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class Storage:
|
|
39
|
+
name: str
|
|
40
|
+
arrow_type: Any
|
|
41
|
+
arr: array
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class StorageContainer:
|
|
46
|
+
name: str
|
|
47
|
+
arr: List[Storage] = field(default_factory=[])
|
|
48
|
+
ts0: List[int] = field(default_factory=lambda: array("Q"))
|
|
49
|
+
ts1: List[int] = field(default_factory=lambda: array("Q"))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class Decoder(XcpLogFileDecoder):
|
|
53
|
+
|
|
54
|
+
def __init__(self, recording_file_name: str):
|
|
55
|
+
super().__init__(recording_file_name)
|
|
56
|
+
self.xls_file_name = Path(recording_file_name).with_suffix(".xlsx")
|
|
57
|
+
try:
|
|
58
|
+
os.unlink(self.xls_file_name)
|
|
59
|
+
except Exception as e:
|
|
60
|
+
print(e)
|
|
61
|
+
|
|
62
|
+
def initialize(self) -> None:
|
|
63
|
+
self.arrow_tables = []
|
|
64
|
+
self.xls_workbook = xlsxwriter.Workbook(self.xls_file_name)
|
|
65
|
+
self.xls_sheets = []
|
|
66
|
+
self.rows = []
|
|
67
|
+
for dl in self.daq_lists:
|
|
68
|
+
result = []
|
|
69
|
+
for name, type_str in dl.headers:
|
|
70
|
+
array_txpe = MAP_TO_ARRAY[type_str]
|
|
71
|
+
sql_type = MAP_TO_SQL[type_str]
|
|
72
|
+
sd = Storage(name, sql_type, array(array_txpe))
|
|
73
|
+
result.append(sd)
|
|
74
|
+
sc = StorageContainer(dl.name, result)
|
|
75
|
+
sheet = self.xls_workbook.add_worksheet(sc.name)
|
|
76
|
+
self.xls_sheets.append(sheet)
|
|
77
|
+
headers = ["ts0", "ts1"] + [e.name for e in sc.arr]
|
|
78
|
+
sheet.write_row(0, 0, headers)
|
|
79
|
+
self.rows.append(1)
|
|
80
|
+
self.arrow_tables.append(sc)
|
|
81
|
+
print("\nInserting data...")
|
|
82
|
+
|
|
83
|
+
def finalize(self) -> None:
|
|
84
|
+
self.xls_workbook.close()
|
|
85
|
+
print("Done.")
|
|
86
|
+
|
|
87
|
+
def on_daq_list(self, daq_list_num: int, timestamp0: int, timestamp1: int, measurements: list) -> None:
|
|
88
|
+
sheet = self.xls_sheets[daq_list_num]
|
|
89
|
+
row = self.rows[daq_list_num]
|
|
90
|
+
data = [timestamp0, timestamp1] + measurements
|
|
91
|
+
sheet.write_row(row, 0, data)
|
|
92
|
+
self.rows[daq_list_num] += 1
|
|
93
|
+
|
|
94
|
+
decoder = Decoder(args.xmraw_file)
|
|
95
|
+
decoder.run()
|
|
@@ -33,11 +33,11 @@ class XcpLogFileReader {
|
|
|
33
33
|
if (detail::VERSION != m_header.version) {
|
|
34
34
|
throw std::runtime_error("File version mismatch.");
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
#if 0
|
|
37
37
|
if (m_header.num_containers < 1) {
|
|
38
38
|
throw std::runtime_error("At least one container required.");
|
|
39
39
|
}
|
|
40
|
-
|
|
40
|
+
#endif
|
|
41
41
|
m_offset += detail::FILE_HEADER_SIZE;
|
|
42
42
|
|
|
43
43
|
if ((m_header.options & XMRAW_HAS_METADATA) == XMRAW_HAS_METADATA) {
|
|
@@ -640,9 +640,11 @@ struct MeasurementParameters {
|
|
|
640
640
|
|
|
641
641
|
#undef max // Thanks to Windows.
|
|
642
642
|
|
|
643
|
-
auto get_overflow_value() const {
|
|
643
|
+
auto get_overflow_value() const -> std::uint64_t {
|
|
644
644
|
std::uint64_t ov_value{};
|
|
645
645
|
switch (m_ts_size) {
|
|
646
|
+
case 0:
|
|
647
|
+
return 0ULL;
|
|
646
648
|
case 1:
|
|
647
649
|
ov_value = std::numeric_limits<std::uint8_t>::max();
|
|
648
650
|
break;
|
|
@@ -659,9 +661,7 @@ struct MeasurementParameters {
|
|
|
659
661
|
throw std::runtime_error("Invalid timestamp size");
|
|
660
662
|
}
|
|
661
663
|
ov_value++;
|
|
662
|
-
std::cout << "TS-V: " << ov_value << " scale: " << m_ts_scale_factor << std::endl;
|
|
663
664
|
ov_value = static_cast<std::uint64_t>(ov_value * m_ts_scale_factor);
|
|
664
|
-
std::cout << "OVRF-Value: " << ov_value << std::endl;
|
|
665
665
|
return ov_value;
|
|
666
666
|
}
|
|
667
667
|
|
|
@@ -1080,7 +1080,7 @@ class DAQPolicyBase {
|
|
|
1080
1080
|
virtual void set_parameters(const MeasurementParameters& params) noexcept {
|
|
1081
1081
|
m_overflow_value = params.get_overflow_value();
|
|
1082
1082
|
m_overflow_counter = 0ULL;
|
|
1083
|
-
std::cout << "Overflow value: " << m_overflow_value << ", Overflow counter: " << m_overflow_counter << std::endl;
|
|
1083
|
+
// std::cout << "Overflow value: " << m_overflow_value << ", Overflow counter: " << m_overflow_counter << std::endl;
|
|
1084
1084
|
initialize();
|
|
1085
1085
|
}
|
|
1086
1086
|
|
|
@@ -82,10 +82,9 @@ class LegacyFrameAcquisitionPolicy(FrameAcquisitionPolicy):
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
def feed(self, frame_type: types.FrameCategory, counter: int, timestamp: int, payload: bytes) -> None:
|
|
85
|
-
# print(f"{frame_type.name:8} {counter:6} {timestamp:7.7f} {hexDump(payload)}")
|
|
86
85
|
if frame_type not in self.filtered_out:
|
|
87
86
|
queue = self.QUEUE_MAP.get(frame_type)
|
|
88
|
-
if queue:
|
|
87
|
+
if queue is not None:
|
|
89
88
|
queue.append((counter, timestamp, payload))
|
|
90
89
|
|
|
91
90
|
|
|
@@ -118,7 +117,7 @@ class StdoutPolicy(FrameAcquisitionPolicy):
|
|
|
118
117
|
|
|
119
118
|
def feed(self, frame_type: types.FrameCategory, counter: int, timestamp: int, payload: bytes) -> None:
|
|
120
119
|
if frame_type not in self.filtered_out:
|
|
121
|
-
print(f"{frame_type.name:8} {counter:6} {timestamp:
|
|
120
|
+
print(f"{frame_type.name:8} {counter:6} {timestamp:8d} {hexDump(payload)}")
|
|
122
121
|
|
|
123
122
|
|
|
124
123
|
class EmptyFrameError(Exception):
|
|
@@ -210,7 +209,12 @@ class BaseTransport(metaclass=abc.ABCMeta):
|
|
|
210
209
|
|
|
211
210
|
@property
|
|
212
211
|
def start_datetime(self) -> int:
|
|
213
|
-
"""
|
|
212
|
+
"""datetime of program start.
|
|
213
|
+
|
|
214
|
+
Returns
|
|
215
|
+
-------
|
|
216
|
+
int
|
|
217
|
+
"""
|
|
214
218
|
return self._start_datetime
|
|
215
219
|
|
|
216
220
|
def start_listener(self):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|