pyxcp 0.22.23__cp38-cp38-win_amd64.whl → 0.22.25__cp38-cp38-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 +1 -1
- pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd +0 -0
- pyxcp/cpp_ext/daqlist.hpp +12 -6
- pyxcp/cpp_ext/extension_wrapper.cpp +5 -2
- pyxcp/daq_stim/__init__.py +6 -2
- pyxcp/daq_stim/stim.cp38-win_amd64.pyd +0 -0
- pyxcp/daq_stim/stim_wrapper.cpp +3 -1
- pyxcp/examples/run_daq.py +36 -26
- pyxcp/master/master.py +204 -187
- pyxcp/recorder/rekorder.cp38-win_amd64.pyd +0 -0
- pyxcp/types.py +2 -1
- {pyxcp-0.22.23.dist-info → pyxcp-0.22.25.dist-info}/METADATA +1 -1
- {pyxcp-0.22.23.dist-info → pyxcp-0.22.25.dist-info}/RECORD +16 -16
- {pyxcp-0.22.23.dist-info → pyxcp-0.22.25.dist-info}/LICENSE +0 -0
- {pyxcp-0.22.23.dist-info → pyxcp-0.22.25.dist-info}/WHEEL +0 -0
- {pyxcp-0.22.23.dist-info → pyxcp-0.22.25.dist-info}/entry_points.txt +0 -0
pyxcp/__init__.py
CHANGED
|
Binary file
|
pyxcp/cpp_ext/daqlist.hpp
CHANGED
|
@@ -15,10 +15,9 @@ class DaqList {
|
|
|
15
15
|
|
|
16
16
|
DaqList(
|
|
17
17
|
std::string_view meas_name, std::uint16_t event_num, bool stim, bool enable_timestamps,
|
|
18
|
-
const std::vector<daq_list_initialzer_t>& measurements
|
|
18
|
+
const std::vector<daq_list_initialzer_t>& measurements, std::uint8_t priority=0x00, std::uint8_t prescaler=0x01
|
|
19
19
|
) :
|
|
20
|
-
m_name(meas_name), m_event_num(event_num), m_stim(stim), m_enable_timestamps(enable_timestamps) {
|
|
21
|
-
// std::cout << "DAQ-List: " << meas_name << " " << event_num << " " << stim << " " << enable_timestamps << std::endl;
|
|
20
|
+
m_name(meas_name), m_event_num(event_num), m_priority(priority), m_prescaler(prescaler), m_stim(stim), m_enable_timestamps(enable_timestamps) {
|
|
22
21
|
for (const auto& measurement : measurements) {
|
|
23
22
|
auto const& [name, address, ext, dt_name] = measurement;
|
|
24
23
|
m_measurements.emplace_back(McObject(name, address, static_cast<std::uint8_t>(ext), 0, dt_name));
|
|
@@ -37,6 +36,14 @@ class DaqList {
|
|
|
37
36
|
return m_event_num;
|
|
38
37
|
}
|
|
39
38
|
|
|
39
|
+
std::uint8_t get_priority() const {
|
|
40
|
+
return m_priority;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
std::uint8_t get_prescaler() const {
|
|
44
|
+
return m_prescaler;
|
|
45
|
+
}
|
|
46
|
+
|
|
40
47
|
void set_event_num(std::uint16_t event_num) {
|
|
41
48
|
m_event_num = event_num;
|
|
42
49
|
}
|
|
@@ -171,9 +178,6 @@ class DaqList {
|
|
|
171
178
|
ss << "\"" << header << "\",";
|
|
172
179
|
}
|
|
173
180
|
ss << "\n]";
|
|
174
|
-
|
|
175
|
-
// using flatten_odts_t = std::vector<std::vector<std::tuple<std::string, std::uint32_t, std::uint8_t, std::uint16_t,
|
|
176
|
-
// std::int16_t>>>;
|
|
177
181
|
ss << ")";
|
|
178
182
|
return ss.str();
|
|
179
183
|
}
|
|
@@ -185,6 +189,8 @@ class DaqList {
|
|
|
185
189
|
|
|
186
190
|
std::string m_name;
|
|
187
191
|
std::uint16_t m_event_num;
|
|
192
|
+
std::uint8_t m_priority;
|
|
193
|
+
std::uint8_t m_prescaler;
|
|
188
194
|
bool m_stim;
|
|
189
195
|
bool m_enable_timestamps;
|
|
190
196
|
std::vector<McObject> m_measurements;
|
|
@@ -59,12 +59,15 @@ PYBIND11_MODULE(cpp_ext, m) {
|
|
|
59
59
|
|
|
60
60
|
py::class_<DaqList>(m, "DaqList")
|
|
61
61
|
.def(
|
|
62
|
-
py::init<std::string_view, std::uint16_t, bool, bool, const std::vector<DaqList::daq_list_initialzer_t
|
|
63
|
-
"event_num"_a, "stim"_a, "enable_timestamps"_a, "measurements"_a
|
|
62
|
+
py::init<std::string_view, std::uint16_t, bool, bool, const std::vector<DaqList::daq_list_initialzer_t>&,
|
|
63
|
+
std::uint8_t, std::uint8_t>(), "name"_a, "event_num"_a, "stim"_a, "enable_timestamps"_a, "measurements"_a,
|
|
64
|
+
"priority"_a=0, "prescaler"_a=1
|
|
64
65
|
)
|
|
65
66
|
.def("__repr__", [](const DaqList& self) { return self.to_string(); })
|
|
66
67
|
.def_property("name", &DaqList::get_name, nullptr)
|
|
67
68
|
.def_property("event_num", &DaqList::get_event_num, &DaqList::set_event_num)
|
|
69
|
+
.def_property("priority", &DaqList::get_priority, nullptr)
|
|
70
|
+
.def_property("prescaler", &DaqList::get_prescaler, nullptr)
|
|
68
71
|
.def_property("stim", &DaqList::get_stim, nullptr)
|
|
69
72
|
.def_property("enable_timestamps", &DaqList::get_enable_timestamps, nullptr)
|
|
70
73
|
.def_property("measurements", &DaqList::get_measurements, nullptr)
|
pyxcp/daq_stim/__init__.py
CHANGED
|
@@ -38,7 +38,7 @@ class DaqProcessor:
|
|
|
38
38
|
def setup(self, start_datetime: Optional[CurrentDatetime] = None, write_multiple: bool = True):
|
|
39
39
|
if not self.xcp_master.slaveProperties.supportsDaq:
|
|
40
40
|
raise RuntimeError("DAQ functionality is not supported.")
|
|
41
|
-
self.daq_info = self.xcp_master.getDaqInfo()
|
|
41
|
+
self.daq_info = self.xcp_master.getDaqInfo(include_event_lists=False)
|
|
42
42
|
if start_datetime is None:
|
|
43
43
|
start_datetime = CurrentDatetime(time_ns())
|
|
44
44
|
self.start_datetime = start_datetime
|
|
@@ -134,7 +134,11 @@ class DaqProcessor:
|
|
|
134
134
|
## mode |= 0x20
|
|
135
135
|
###
|
|
136
136
|
self.xcp_master.setDaqListMode(
|
|
137
|
-
|
|
137
|
+
daq_list_number=i,
|
|
138
|
+
mode=mode,
|
|
139
|
+
event_channel_number=daq_list.event_num,
|
|
140
|
+
prescaler=daq_list.prescaler,
|
|
141
|
+
priority=daq_list.priority,
|
|
138
142
|
)
|
|
139
143
|
res = self.xcp_master.startStopDaqList(0x02, i)
|
|
140
144
|
self._first_pids.append(res.firstPid)
|
|
Binary file
|
pyxcp/daq_stim/stim_wrapper.cpp
CHANGED
|
@@ -15,7 +15,9 @@ using namespace py::literals;
|
|
|
15
15
|
|
|
16
16
|
PYBIND11_MODULE(stim, m) {
|
|
17
17
|
py::class_<DaqEventInfo>(m, "DaqEventInfo")
|
|
18
|
-
.def(py::init<const std::string&, std::int8_t, std::size_t, std::size_t, std::size_t, std::string_view, bool, bool, bool>()
|
|
18
|
+
.def(py::init<const std::string&, std::int8_t, std::size_t, std::size_t, std::size_t, std::string_view, bool, bool, bool>(),
|
|
19
|
+
"name"_a, "type_code"_a, "cycle"_a, "max_daq_lists"_a, "priority"_a, "consistency"_a, "daq_supported"_a,
|
|
20
|
+
"stim_supported"_a, "packed_supported"_a
|
|
19
21
|
);
|
|
20
22
|
|
|
21
23
|
py::class_<Stim>(m, "Stim")
|
pyxcp/examples/run_daq.py
CHANGED
|
@@ -8,7 +8,7 @@ from pyxcp.daq_stim import DaqList, DaqRecorder, DaqToCsv # noqa: F401
|
|
|
8
8
|
|
|
9
9
|
ap = ArgumentParser(description="DAQ test")
|
|
10
10
|
|
|
11
|
-
XCP_LITE =
|
|
11
|
+
XCP_LITE = False
|
|
12
12
|
|
|
13
13
|
#
|
|
14
14
|
# NOTE: UPDATE TO CORRECT ADDRESSES BEFORE RUNNING!!!
|
|
@@ -17,40 +17,44 @@ if XCP_LITE:
|
|
|
17
17
|
# Vectorgrp XCPlite.
|
|
18
18
|
DAQ_LISTS = [
|
|
19
19
|
DaqList(
|
|
20
|
-
"part_1",
|
|
21
|
-
0,
|
|
22
|
-
False,
|
|
23
|
-
False,
|
|
24
|
-
[
|
|
20
|
+
name="part_1",
|
|
21
|
+
event_num=0,
|
|
22
|
+
stim=False,
|
|
23
|
+
enable_timestamps=False,
|
|
24
|
+
measurements=[
|
|
25
25
|
("byteCounter", 0x00023648, 0, "U8"),
|
|
26
26
|
("wordCounter", 0x0002364C, 0, "U16"),
|
|
27
27
|
("dwordCounter", 0x00023650, 0, "U32"),
|
|
28
28
|
("sbyteCounter", 0x00023649, 0, "I8"),
|
|
29
29
|
],
|
|
30
|
+
priority=0,
|
|
31
|
+
prescaler=1,
|
|
30
32
|
),
|
|
31
33
|
DaqList(
|
|
32
|
-
"part_2",
|
|
33
|
-
7,
|
|
34
|
-
False,
|
|
35
|
-
False,
|
|
36
|
-
[
|
|
34
|
+
name="part_2",
|
|
35
|
+
event_num=7,
|
|
36
|
+
stim=False,
|
|
37
|
+
enable_timestamps=False,
|
|
38
|
+
measurements=[
|
|
37
39
|
("swordCounter", 0x00023654, 0, "I16"),
|
|
38
40
|
("sdwordCounter", 0x00023658, 0, "I32"),
|
|
39
41
|
("channel1", 0x00023630, 0, "F64"),
|
|
40
42
|
("channel2", 0x00023638, 0, "F64"),
|
|
41
43
|
("channel3", 0x00023640, 0, "F64"),
|
|
42
44
|
],
|
|
45
|
+
priority=0,
|
|
46
|
+
prescaler=1,
|
|
43
47
|
),
|
|
44
48
|
]
|
|
45
49
|
else:
|
|
46
50
|
# XCPsim from CANape.
|
|
47
51
|
DAQ_LISTS = [
|
|
48
52
|
DaqList(
|
|
49
|
-
"pwm_stuff",
|
|
50
|
-
2,
|
|
51
|
-
False,
|
|
52
|
-
True,
|
|
53
|
-
[
|
|
53
|
+
name="pwm_stuff",
|
|
54
|
+
event_num=2,
|
|
55
|
+
stim=False,
|
|
56
|
+
enable_timestamps=True,
|
|
57
|
+
measurements=[
|
|
54
58
|
("channel1", 0x1BD004, 0, "F32"),
|
|
55
59
|
("period", 0x001C0028, 0, "F32"),
|
|
56
60
|
("channel2", 0x1BD008, 0, "F32"),
|
|
@@ -58,13 +62,15 @@ else:
|
|
|
58
62
|
("PWM", 0x1BDDDF, 0, "U8"),
|
|
59
63
|
("Triangle", 0x1BDDDE, 0, "I8"),
|
|
60
64
|
],
|
|
65
|
+
priority=0,
|
|
66
|
+
prescaler=1,
|
|
61
67
|
),
|
|
62
68
|
DaqList(
|
|
63
|
-
"bytes",
|
|
64
|
-
1,
|
|
65
|
-
False,
|
|
66
|
-
True,
|
|
67
|
-
[
|
|
69
|
+
name="bytes",
|
|
70
|
+
event_num=1,
|
|
71
|
+
stim=False,
|
|
72
|
+
enable_timestamps=True,
|
|
73
|
+
measurements=[
|
|
68
74
|
("TestByte_000", 0x1BE11C, 0, "U8"),
|
|
69
75
|
("TestByte_015", 0x1BE158, 0, "U8"),
|
|
70
76
|
("TestByte_016", 0x1BE15C, 0, "U8"),
|
|
@@ -97,13 +103,15 @@ else:
|
|
|
97
103
|
("TestByte_344", 0x1BE67C, 0, "U8"),
|
|
98
104
|
("TestByte_346", 0x1BE684, 0, "U8"),
|
|
99
105
|
],
|
|
106
|
+
priority=0,
|
|
107
|
+
prescaler=1,
|
|
100
108
|
),
|
|
101
109
|
DaqList(
|
|
102
|
-
"words",
|
|
103
|
-
3,
|
|
104
|
-
False,
|
|
105
|
-
True,
|
|
106
|
-
[
|
|
110
|
+
name="words",
|
|
111
|
+
event_num=3,
|
|
112
|
+
stim=False,
|
|
113
|
+
enable_timestamps=True,
|
|
114
|
+
measurements=[
|
|
107
115
|
("TestWord_001", 0x1BE120, 0, "U16"),
|
|
108
116
|
("TestWord_003", 0x1BE128, 0, "U16"),
|
|
109
117
|
("TestWord_004", 0x1BE12C, 0, "U16"),
|
|
@@ -114,6 +122,8 @@ else:
|
|
|
114
122
|
("TestWord_009", 0x1BE140, 0, "U16"),
|
|
115
123
|
("TestWord_011", 0x1BE148, 0, "U16"),
|
|
116
124
|
],
|
|
125
|
+
priority=0,
|
|
126
|
+
prescaler=1,
|
|
117
127
|
),
|
|
118
128
|
]
|
|
119
129
|
|
pyxcp/master/master.py
CHANGED
|
@@ -310,7 +310,7 @@ class Master:
|
|
|
310
310
|
return result
|
|
311
311
|
|
|
312
312
|
@wrapped
|
|
313
|
-
def setRequest(self, mode: int,
|
|
313
|
+
def setRequest(self, mode: int, session_configuration_id: int):
|
|
314
314
|
"""Request to save to non-volatile memory.
|
|
315
315
|
|
|
316
316
|
Parameters
|
|
@@ -326,8 +326,8 @@ class Master:
|
|
|
326
326
|
return self.transport.request(
|
|
327
327
|
types.Command.SET_REQUEST,
|
|
328
328
|
mode,
|
|
329
|
-
|
|
330
|
-
|
|
329
|
+
session_configuration_id >> 8,
|
|
330
|
+
session_configuration_id & 0xFF,
|
|
331
331
|
)
|
|
332
332
|
|
|
333
333
|
@wrapped
|
|
@@ -394,7 +394,7 @@ class Master:
|
|
|
394
394
|
return result
|
|
395
395
|
|
|
396
396
|
@wrapped
|
|
397
|
-
def setMta(self, address: int,
|
|
397
|
+
def setMta(self, address: int, address_ext: int = 0x00):
|
|
398
398
|
"""Set Memory Transfer Address in slave.
|
|
399
399
|
|
|
400
400
|
Parameters
|
|
@@ -409,9 +409,9 @@ class Master:
|
|
|
409
409
|
and :meth:`programMax`.
|
|
410
410
|
|
|
411
411
|
"""
|
|
412
|
-
self.mta = types.MtaType(address,
|
|
412
|
+
self.mta = types.MtaType(address, address_ext) # Keep track of MTA (needed for error-handling).
|
|
413
413
|
addr = self.DWORD_pack(address)
|
|
414
|
-
return self.transport.request(types.Command.SET_MTA, 0, 0,
|
|
414
|
+
return self.transport.request(types.Command.SET_MTA, 0, 0, address_ext, *addr)
|
|
415
415
|
|
|
416
416
|
@wrapped
|
|
417
417
|
def upload(self, length: int):
|
|
@@ -450,7 +450,7 @@ class Master:
|
|
|
450
450
|
return response
|
|
451
451
|
|
|
452
452
|
@wrapped
|
|
453
|
-
def shortUpload(self, length: int, address: int,
|
|
453
|
+
def shortUpload(self, length: int, address: int, address_ext: int = 0x00):
|
|
454
454
|
"""Transfer data from slave to master.
|
|
455
455
|
As opposed to :meth:`upload` this service also includes address information.
|
|
456
456
|
|
|
@@ -470,7 +470,7 @@ class Master:
|
|
|
470
470
|
max_byte_count = self.slaveProperties.maxCto - 1
|
|
471
471
|
if byte_count > max_byte_count:
|
|
472
472
|
self.logger.warn(f"SHORT_UPLOAD: {byte_count} bytes exceeds the maximum value of {max_byte_count}.")
|
|
473
|
-
response = self.transport.request(types.Command.SHORT_UPLOAD, length, 0,
|
|
473
|
+
response = self.transport.request(types.Command.SHORT_UPLOAD, length, 0, address_ext, *addr)
|
|
474
474
|
return response[:byte_count]
|
|
475
475
|
|
|
476
476
|
@wrapped
|
|
@@ -496,7 +496,7 @@ class Master:
|
|
|
496
496
|
return types.BuildChecksumResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
497
497
|
|
|
498
498
|
@wrapped
|
|
499
|
-
def transportLayerCmd(self,
|
|
499
|
+
def transportLayerCmd(self, sub_command: int, *data: List[bytes]):
|
|
500
500
|
"""Execute transfer-layer specific command.
|
|
501
501
|
|
|
502
502
|
Parameters
|
|
@@ -508,10 +508,10 @@ class Master:
|
|
|
508
508
|
----
|
|
509
509
|
For details refer to XCP specification.
|
|
510
510
|
"""
|
|
511
|
-
return self.transport.request_optional_response(types.Command.TRANSPORT_LAYER_CMD,
|
|
511
|
+
return self.transport.request_optional_response(types.Command.TRANSPORT_LAYER_CMD, sub_command, *data)
|
|
512
512
|
|
|
513
513
|
@wrapped
|
|
514
|
-
def userCmd(self,
|
|
514
|
+
def userCmd(self, sub_command: int, data: bytes):
|
|
515
515
|
"""Execute proprietary command implemented in your XCP client.
|
|
516
516
|
|
|
517
517
|
Parameters
|
|
@@ -523,7 +523,7 @@ class Master:
|
|
|
523
523
|
.. note:: For details refer to your XCP client vendor.
|
|
524
524
|
"""
|
|
525
525
|
|
|
526
|
-
response = self.transport.request(types.Command.USER_CMD,
|
|
526
|
+
response = self.transport.request(types.Command.USER_CMD, sub_command, *data)
|
|
527
527
|
return response
|
|
528
528
|
|
|
529
529
|
@wrapped
|
|
@@ -547,7 +547,7 @@ class Master:
|
|
|
547
547
|
self.slaveProperties.transportMinor = result.transportMinor
|
|
548
548
|
return result
|
|
549
549
|
|
|
550
|
-
def fetch(self, length: int,
|
|
550
|
+
def fetch(self, length: int, limit_payload: int = None): # TODO: pull
|
|
551
551
|
"""Convenience function for data-transfer from slave to master
|
|
552
552
|
(Not part of the XCP Specification).
|
|
553
553
|
|
|
@@ -565,21 +565,21 @@ class Master:
|
|
|
565
565
|
----
|
|
566
566
|
address is not included because of services implicitly setting address information like :meth:`getID` .
|
|
567
567
|
"""
|
|
568
|
-
if
|
|
569
|
-
raise ValueError(f"Payload must be at least 8 bytes - given: {
|
|
568
|
+
if limit_payload and limit_payload < 8:
|
|
569
|
+
raise ValueError(f"Payload must be at least 8 bytes - given: {limit_payload}")
|
|
570
570
|
|
|
571
|
-
|
|
572
|
-
if
|
|
573
|
-
|
|
571
|
+
slave_block_mode = self.slaveProperties.slaveBlockMode
|
|
572
|
+
if slave_block_mode:
|
|
573
|
+
max_payload = 255
|
|
574
574
|
else:
|
|
575
|
-
|
|
576
|
-
payload = min(
|
|
577
|
-
|
|
578
|
-
chunks = range(length //
|
|
579
|
-
remaining = length %
|
|
575
|
+
max_payload = self.slaveProperties.maxCto - 1
|
|
576
|
+
payload = min(limit_payload, max_payload) if limit_payload else max_payload
|
|
577
|
+
chunk_size = payload
|
|
578
|
+
chunks = range(length // chunk_size)
|
|
579
|
+
remaining = length % chunk_size
|
|
580
580
|
result = []
|
|
581
581
|
for _ in chunks:
|
|
582
|
-
data = self.upload(
|
|
582
|
+
data = self.upload(chunk_size)
|
|
583
583
|
result.extend(data)
|
|
584
584
|
if remaining:
|
|
585
585
|
data = self.upload(remaining)
|
|
@@ -588,7 +588,7 @@ class Master:
|
|
|
588
588
|
|
|
589
589
|
pull = fetch # fetch() may be completely replaced by pull() someday.
|
|
590
590
|
|
|
591
|
-
def push(self, address: int, address_ext: int, data: bytes, callback=None):
|
|
591
|
+
def push(self, address: int, address_ext: int, data: bytes, callback: Optional[Callable] = None):
|
|
592
592
|
"""Convenience function for data-transfer from master to slave.
|
|
593
593
|
(Not part of the XCP Specification).
|
|
594
594
|
|
|
@@ -615,7 +615,7 @@ class Master:
|
|
|
615
615
|
callback=callback,
|
|
616
616
|
)
|
|
617
617
|
|
|
618
|
-
def flash_program(self, address: int, data: bytes, callback=None):
|
|
618
|
+
def flash_program(self, address: int, data: bytes, callback: Optional[Callable] = None):
|
|
619
619
|
"""Convenience function for flash programing.
|
|
620
620
|
(Not part of the XCP Specification).
|
|
621
621
|
|
|
@@ -707,7 +707,9 @@ class Master:
|
|
|
707
707
|
if callback:
|
|
708
708
|
callback(percent_complete)
|
|
709
709
|
|
|
710
|
-
def _block_downloader(
|
|
710
|
+
def _block_downloader(
|
|
711
|
+
self, data: bytes, dl_func: Optional[Callable] = None, dl_next_func: Optional[Callable] = None, minSt: int = 0
|
|
712
|
+
):
|
|
711
713
|
"""Re-usable block downloader.
|
|
712
714
|
|
|
713
715
|
Parameters
|
|
@@ -751,14 +753,14 @@ class Master:
|
|
|
751
753
|
delay(minSt)
|
|
752
754
|
|
|
753
755
|
@wrapped
|
|
754
|
-
def download(self, data: bytes,
|
|
756
|
+
def download(self, data: bytes, block_mode_length: Optional[int] = None, last: bool = False):
|
|
755
757
|
"""Transfer data from master to slave.
|
|
756
758
|
|
|
757
759
|
Parameters
|
|
758
760
|
----------
|
|
759
761
|
data : bytes
|
|
760
762
|
Data to send to slave.
|
|
761
|
-
|
|
763
|
+
block_mode_length : int or None
|
|
762
764
|
for block mode, the download request must contain the length of the whole block,
|
|
763
765
|
not just the length in the current packet. The whole block length can be given here for block-mode
|
|
764
766
|
transfers. For normal mode, the length indicates the actual packet's payload length.
|
|
@@ -768,20 +770,20 @@ class Master:
|
|
|
768
770
|
Adress is set via :meth:`setMta`
|
|
769
771
|
"""
|
|
770
772
|
|
|
771
|
-
if
|
|
773
|
+
if block_mode_length is None or last:
|
|
772
774
|
# standard mode
|
|
773
775
|
length = len(data)
|
|
774
776
|
response = self.transport.request(types.Command.DOWNLOAD, length, *data)
|
|
775
777
|
return response
|
|
776
778
|
else:
|
|
777
779
|
# block mode
|
|
778
|
-
if not isinstance(
|
|
779
|
-
raise TypeError("
|
|
780
|
-
self.transport.block_request(types.Command.DOWNLOAD,
|
|
780
|
+
if not isinstance(block_mode_length, int):
|
|
781
|
+
raise TypeError("block_mode_length must be int!")
|
|
782
|
+
self.transport.block_request(types.Command.DOWNLOAD, block_mode_length, *data)
|
|
781
783
|
return None
|
|
782
784
|
|
|
783
785
|
@wrapped
|
|
784
|
-
def downloadNext(self, data: bytes,
|
|
786
|
+
def downloadNext(self, data: bytes, remaining_block_length: int, last: bool = False):
|
|
785
787
|
"""Transfer data from master to slave (block mode).
|
|
786
788
|
|
|
787
789
|
Parameters
|
|
@@ -796,12 +798,12 @@ class Master:
|
|
|
796
798
|
|
|
797
799
|
if last:
|
|
798
800
|
# last DOWNLOAD_NEXT packet in a block: the slave device has to send the response after this.
|
|
799
|
-
response = self.transport.request(types.Command.DOWNLOAD_NEXT,
|
|
801
|
+
response = self.transport.request(types.Command.DOWNLOAD_NEXT, remaining_block_length, *data)
|
|
800
802
|
return response
|
|
801
803
|
else:
|
|
802
804
|
# the slave device won't respond to consecutive DOWNLOAD_NEXT packets in block mode,
|
|
803
805
|
# so we must not wait for any response
|
|
804
|
-
self.transport.block_request(types.Command.DOWNLOAD_NEXT,
|
|
806
|
+
self.transport.block_request(types.Command.DOWNLOAD_NEXT, remaining_block_length, *data)
|
|
805
807
|
return None
|
|
806
808
|
|
|
807
809
|
@wrapped
|
|
@@ -815,21 +817,21 @@ class Master:
|
|
|
815
817
|
return self.transport.request(types.Command.DOWNLOAD_MAX, *data)
|
|
816
818
|
|
|
817
819
|
@wrapped
|
|
818
|
-
def shortDownload(self, address,
|
|
820
|
+
def shortDownload(self, address: int, address_ext: int, data: bytes):
|
|
819
821
|
length = len(data)
|
|
820
822
|
addr = self.DWORD_pack(address)
|
|
821
|
-
return self.transport.request(types.Command.SHORT_DOWNLOAD, length, 0,
|
|
823
|
+
return self.transport.request(types.Command.SHORT_DOWNLOAD, length, 0, address_ext, *addr, *data)
|
|
822
824
|
|
|
823
825
|
@wrapped
|
|
824
|
-
def modifyBits(self,
|
|
826
|
+
def modifyBits(self, shift_value: int, and_mask: int, xor_mask: int):
|
|
825
827
|
# A = ( (A) & ((~((dword)(((word)~MA)<<S))) )^((dword)(MX<<S)) )
|
|
826
|
-
am = self.WORD_pack(
|
|
827
|
-
xm = self.WORD_pack(
|
|
828
|
-
return self.transport.request(types.Command.MODIFY_BITS,
|
|
828
|
+
am = self.WORD_pack(and_mask)
|
|
829
|
+
xm = self.WORD_pack(xor_mask)
|
|
830
|
+
return self.transport.request(types.Command.MODIFY_BITS, shift_value, *am, *xm)
|
|
829
831
|
|
|
830
832
|
# Page Switching Commands (PAG)
|
|
831
833
|
@wrapped
|
|
832
|
-
def setCalPage(self, mode: int,
|
|
834
|
+
def setCalPage(self, mode: int, logical_data_segment: int, logical_data_page: int):
|
|
833
835
|
"""Set calibration page.
|
|
834
836
|
|
|
835
837
|
Parameters
|
|
@@ -841,10 +843,10 @@ class Master:
|
|
|
841
843
|
logicalDataSegment : int
|
|
842
844
|
logicalDataPage : int
|
|
843
845
|
"""
|
|
844
|
-
return self.transport.request(types.Command.SET_CAL_PAGE, mode,
|
|
846
|
+
return self.transport.request(types.Command.SET_CAL_PAGE, mode, logical_data_segment, logical_data_page)
|
|
845
847
|
|
|
846
848
|
@wrapped
|
|
847
|
-
def getCalPage(self, mode: int,
|
|
849
|
+
def getCalPage(self, mode: int, logical_data_segment: int):
|
|
848
850
|
"""Get calibration page
|
|
849
851
|
|
|
850
852
|
Parameters
|
|
@@ -852,7 +854,7 @@ class Master:
|
|
|
852
854
|
mode : int
|
|
853
855
|
logicalDataSegment : int
|
|
854
856
|
"""
|
|
855
|
-
response = self.transport.request(types.Command.GET_CAL_PAGE, mode,
|
|
857
|
+
response = self.transport.request(types.Command.GET_CAL_PAGE, mode, logical_data_segment)
|
|
856
858
|
return response[2]
|
|
857
859
|
|
|
858
860
|
@wrapped
|
|
@@ -867,7 +869,7 @@ class Master:
|
|
|
867
869
|
return types.GetPagProcessorInfoResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
868
870
|
|
|
869
871
|
@wrapped
|
|
870
|
-
def getSegmentInfo(self, mode,
|
|
872
|
+
def getSegmentInfo(self, mode: int, segment_number: int, segment_info: int, mapping_index: int):
|
|
871
873
|
"""Get specific information for a segment.
|
|
872
874
|
|
|
873
875
|
Parameters
|
|
@@ -900,9 +902,9 @@ class Master:
|
|
|
900
902
|
response = self.transport.request(
|
|
901
903
|
types.Command.GET_SEGMENT_INFO,
|
|
902
904
|
mode,
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
905
|
+
segment_number,
|
|
906
|
+
segment_info,
|
|
907
|
+
mapping_index,
|
|
906
908
|
)
|
|
907
909
|
if mode == 0:
|
|
908
910
|
return types.GetSegmentInfoMode0Response.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
@@ -912,7 +914,7 @@ class Master:
|
|
|
912
914
|
return types.GetSegmentInfoMode2Response.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
913
915
|
|
|
914
916
|
@wrapped
|
|
915
|
-
def getPageInfo(self,
|
|
917
|
+
def getPageInfo(self, segment_number: int, page_number: int):
|
|
916
918
|
"""Get specific information for a page.
|
|
917
919
|
|
|
918
920
|
Parameters
|
|
@@ -920,14 +922,14 @@ class Master:
|
|
|
920
922
|
segmentNumber : int
|
|
921
923
|
pageNumber : int
|
|
922
924
|
"""
|
|
923
|
-
response = self.transport.request(types.Command.GET_PAGE_INFO, 0,
|
|
925
|
+
response = self.transport.request(types.Command.GET_PAGE_INFO, 0, segment_number, page_number)
|
|
924
926
|
return (
|
|
925
927
|
types.PageProperties.parse(bytes([response[0]]), byteOrder=self.slaveProperties.byteOrder),
|
|
926
928
|
response[1],
|
|
927
929
|
)
|
|
928
930
|
|
|
929
931
|
@wrapped
|
|
930
|
-
def setSegmentMode(self, mode,
|
|
932
|
+
def setSegmentMode(self, mode: int, segment_number: int):
|
|
931
933
|
"""Set mode for a segment.
|
|
932
934
|
|
|
933
935
|
Parameters
|
|
@@ -936,21 +938,22 @@ class Master:
|
|
|
936
938
|
1 = enable FREEZE Mode
|
|
937
939
|
segmentNumber : int
|
|
938
940
|
"""
|
|
939
|
-
return self.transport.request(types.Command.SET_SEGMENT_MODE, mode,
|
|
941
|
+
return self.transport.request(types.Command.SET_SEGMENT_MODE, mode, segment_number)
|
|
940
942
|
|
|
941
943
|
@wrapped
|
|
942
|
-
def getSegmentMode(self,
|
|
944
|
+
def getSegmentMode(self, segment_number: int):
|
|
943
945
|
"""Get mode for a segment.
|
|
944
946
|
|
|
945
947
|
Parameters
|
|
946
948
|
----------
|
|
947
949
|
segmentNumber : int
|
|
948
950
|
"""
|
|
949
|
-
response = self.transport.request(types.Command.GET_SEGMENT_MODE, 0,
|
|
950
|
-
|
|
951
|
+
response = self.transport.request(types.Command.GET_SEGMENT_MODE, 0, segment_number)
|
|
952
|
+
if response:
|
|
953
|
+
return response[1]
|
|
951
954
|
|
|
952
955
|
@wrapped
|
|
953
|
-
def copyCalPage(self,
|
|
956
|
+
def copyCalPage(self, src_segment: int, src_page: int, dst_segment: int, dst_page: int):
|
|
954
957
|
"""Copy page.
|
|
955
958
|
|
|
956
959
|
Parameters
|
|
@@ -960,33 +963,33 @@ class Master:
|
|
|
960
963
|
dstSegment : int
|
|
961
964
|
dstPage : int
|
|
962
965
|
"""
|
|
963
|
-
return self.transport.request(types.Command.COPY_CAL_PAGE,
|
|
966
|
+
return self.transport.request(types.Command.COPY_CAL_PAGE, src_segment, src_page, dst_segment, dst_page)
|
|
964
967
|
|
|
965
968
|
# DAQ
|
|
966
969
|
|
|
967
970
|
@wrapped
|
|
968
|
-
def setDaqPtr(self,
|
|
969
|
-
self.currentDaqPtr = types.DaqPtr(
|
|
970
|
-
|
|
971
|
-
response = self.transport.request(types.Command.SET_DAQ_PTR, 0, *
|
|
972
|
-
self.stim.setDaqPtr(
|
|
971
|
+
def setDaqPtr(self, daq_list_number: int, odt_number: int, odt_entry_number: int):
|
|
972
|
+
self.currentDaqPtr = types.DaqPtr(daq_list_number, odt_number, odt_entry_number) # Needed for errorhandling.
|
|
973
|
+
daq_list = self.WORD_pack(daq_list_number)
|
|
974
|
+
response = self.transport.request(types.Command.SET_DAQ_PTR, 0, *daq_list, odt_number, odt_entry_number)
|
|
975
|
+
self.stim.setDaqPtr(daq_list_number, odt_number, odt_entry_number)
|
|
973
976
|
return response
|
|
974
977
|
|
|
975
978
|
@wrapped
|
|
976
|
-
def clearDaqList(self,
|
|
979
|
+
def clearDaqList(self, daq_list_number: int):
|
|
977
980
|
"""Clear DAQ list configuration.
|
|
978
981
|
|
|
979
982
|
Parameters
|
|
980
983
|
----------
|
|
981
984
|
daqListNumber : int
|
|
982
985
|
"""
|
|
983
|
-
|
|
984
|
-
result = self.transport.request(types.Command.CLEAR_DAQ_LIST, 0, *
|
|
985
|
-
self.stim.clearDaqList(
|
|
986
|
+
daq_list = self.WORD_pack(daq_list_number)
|
|
987
|
+
result = self.transport.request(types.Command.CLEAR_DAQ_LIST, 0, *daq_list)
|
|
988
|
+
self.stim.clearDaqList(daq_list_number)
|
|
986
989
|
return result
|
|
987
990
|
|
|
988
991
|
@wrapped
|
|
989
|
-
def writeDaq(self,
|
|
992
|
+
def writeDaq(self, bit_offset: int, entry_size: int, address_ext: int, address: int):
|
|
990
993
|
"""Write element in ODT entry.
|
|
991
994
|
|
|
992
995
|
Parameters
|
|
@@ -999,19 +1002,19 @@ class Master:
|
|
|
999
1002
|
address : int
|
|
1000
1003
|
"""
|
|
1001
1004
|
addr = self.DWORD_pack(address)
|
|
1002
|
-
result = self.transport.request(types.Command.WRITE_DAQ,
|
|
1003
|
-
self.stim.writeDaq(
|
|
1005
|
+
result = self.transport.request(types.Command.WRITE_DAQ, bit_offset, entry_size, address_ext, *addr)
|
|
1006
|
+
self.stim.writeDaq(bit_offset, entry_size, address_ext, address)
|
|
1004
1007
|
return result
|
|
1005
1008
|
|
|
1006
1009
|
@wrapped
|
|
1007
|
-
def setDaqListMode(self, mode,
|
|
1008
|
-
dln = self.WORD_pack(
|
|
1009
|
-
ecn = self.WORD_pack(
|
|
1010
|
-
self.stim.setDaqListMode(mode,
|
|
1010
|
+
def setDaqListMode(self, mode: int, daq_list_number: int, event_channel_number: int, prescaler: int, priority: int):
|
|
1011
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1012
|
+
ecn = self.WORD_pack(event_channel_number)
|
|
1013
|
+
self.stim.setDaqListMode(mode, daq_list_number, event_channel_number, prescaler, priority)
|
|
1011
1014
|
return self.transport.request(types.Command.SET_DAQ_LIST_MODE, mode, *dln, *ecn, prescaler, priority)
|
|
1012
1015
|
|
|
1013
1016
|
@wrapped
|
|
1014
|
-
def getDaqListMode(self,
|
|
1017
|
+
def getDaqListMode(self, daq_list_number: int):
|
|
1015
1018
|
"""Get mode from DAQ list.
|
|
1016
1019
|
|
|
1017
1020
|
Parameters
|
|
@@ -1022,12 +1025,12 @@ class Master:
|
|
|
1022
1025
|
-------
|
|
1023
1026
|
`pyxcp.types.GetDaqListModeResponse`
|
|
1024
1027
|
"""
|
|
1025
|
-
dln = self.WORD_pack(
|
|
1028
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1026
1029
|
response = self.transport.request(types.Command.GET_DAQ_LIST_MODE, 0, *dln)
|
|
1027
1030
|
return types.GetDaqListModeResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1028
1031
|
|
|
1029
1032
|
@wrapped
|
|
1030
|
-
def startStopDaqList(self, mode: int,
|
|
1033
|
+
def startStopDaqList(self, mode: int, daq_list_number: int):
|
|
1031
1034
|
"""Start /stop/select DAQ list.
|
|
1032
1035
|
|
|
1033
1036
|
Parameters
|
|
@@ -1038,15 +1041,15 @@ class Master:
|
|
|
1038
1041
|
2 = select
|
|
1039
1042
|
daqListNumber : int
|
|
1040
1043
|
"""
|
|
1041
|
-
dln = self.WORD_pack(
|
|
1044
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1042
1045
|
response = self.transport.request(types.Command.START_STOP_DAQ_LIST, mode, *dln)
|
|
1043
|
-
self.stim.startStopDaqList(mode,
|
|
1044
|
-
|
|
1045
|
-
self.stim.set_first_pid(
|
|
1046
|
-
return
|
|
1046
|
+
self.stim.startStopDaqList(mode, daq_list_number)
|
|
1047
|
+
first_pid = types.StartStopDaqListResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1048
|
+
self.stim.set_first_pid(daq_list_number, first_pid.firstPid)
|
|
1049
|
+
return first_pid
|
|
1047
1050
|
|
|
1048
1051
|
@wrapped
|
|
1049
|
-
def startStopSynch(self, mode):
|
|
1052
|
+
def startStopSynch(self, mode: int):
|
|
1050
1053
|
"""Start/stop DAQ lists (synchronously).
|
|
1051
1054
|
|
|
1052
1055
|
Parameters
|
|
@@ -1061,20 +1064,20 @@ class Master:
|
|
|
1061
1064
|
return res
|
|
1062
1065
|
|
|
1063
1066
|
@wrapped
|
|
1064
|
-
def writeDaqMultiple(self,
|
|
1067
|
+
def writeDaqMultiple(self, daq_elements: dict):
|
|
1065
1068
|
"""Write multiple elements in ODT.
|
|
1066
1069
|
|
|
1067
1070
|
Parameters
|
|
1068
1071
|
----------
|
|
1069
1072
|
daqElements : list of `dict` containing the following keys: *bitOffset*, *size*, *address*, *addressExt*.
|
|
1070
1073
|
"""
|
|
1071
|
-
if len(
|
|
1074
|
+
if len(daq_elements) > self.slaveProperties.maxWriteDaqMultipleElements:
|
|
1072
1075
|
raise ValueError(f"At most {self.slaveProperties.maxWriteDaqMultipleElements} daqElements are permitted.")
|
|
1073
1076
|
data = bytearray()
|
|
1074
|
-
data.append(len(
|
|
1077
|
+
data.append(len(daq_elements))
|
|
1075
1078
|
|
|
1076
|
-
for
|
|
1077
|
-
data.extend(types.DaqElement.build(
|
|
1079
|
+
for daq_element in daq_elements:
|
|
1080
|
+
data.extend(types.DaqElement.build(daq_element, byteOrder=self.slaveProperties.byteOrder))
|
|
1078
1081
|
|
|
1079
1082
|
return self.transport.request(types.Command.WRITE_DAQ_MULTIPLE, *data)
|
|
1080
1083
|
|
|
@@ -1126,19 +1129,19 @@ class Master:
|
|
|
1126
1129
|
return types.GetDaqResolutionInfoResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1127
1130
|
|
|
1128
1131
|
@wrapped
|
|
1129
|
-
def getDaqListInfo(self,
|
|
1132
|
+
def getDaqListInfo(self, daq_list_number: int):
|
|
1130
1133
|
"""Get specific information for a DAQ list.
|
|
1131
1134
|
|
|
1132
1135
|
Parameters
|
|
1133
1136
|
----------
|
|
1134
1137
|
daqListNumber : int
|
|
1135
1138
|
"""
|
|
1136
|
-
dln = self.WORD_pack(
|
|
1139
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1137
1140
|
response = self.transport.request(types.Command.GET_DAQ_LIST_INFO, 0, *dln)
|
|
1138
1141
|
return types.GetDaqListInfoResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1139
1142
|
|
|
1140
1143
|
@wrapped
|
|
1141
|
-
def getDaqEventInfo(self,
|
|
1144
|
+
def getDaqEventInfo(self, event_channel_number: int):
|
|
1142
1145
|
"""Get specific information for an event channel.
|
|
1143
1146
|
|
|
1144
1147
|
Parameters
|
|
@@ -1149,12 +1152,12 @@ class Master:
|
|
|
1149
1152
|
-------
|
|
1150
1153
|
`pyxcp.types.GetEventChannelInfoResponse`
|
|
1151
1154
|
"""
|
|
1152
|
-
ecn = self.WORD_pack(
|
|
1155
|
+
ecn = self.WORD_pack(event_channel_number)
|
|
1153
1156
|
response = self.transport.request(types.Command.GET_DAQ_EVENT_INFO, 0, *ecn)
|
|
1154
1157
|
return types.GetEventChannelInfoResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1155
1158
|
|
|
1156
1159
|
@wrapped
|
|
1157
|
-
def dtoCtrProperties(self, modifier,
|
|
1160
|
+
def dtoCtrProperties(self, modifier: int, event_channel: int, related_event_channel: int, mode: int):
|
|
1158
1161
|
"""DTO CTR properties
|
|
1159
1162
|
|
|
1160
1163
|
Parameters
|
|
@@ -1170,14 +1173,16 @@ class Master:
|
|
|
1170
1173
|
"""
|
|
1171
1174
|
data = bytearray()
|
|
1172
1175
|
data.append(modifier)
|
|
1173
|
-
data.extend(self.WORD_pack(
|
|
1174
|
-
data.extend(self.WORD_pack(
|
|
1176
|
+
data.extend(self.WORD_pack(event_channel))
|
|
1177
|
+
data.extend(self.WORD_pack(related_event_channel))
|
|
1175
1178
|
data.append(mode)
|
|
1176
1179
|
response = self.transport.request(types.Command.DTO_CTR_PROPERTIES, *data)
|
|
1177
1180
|
return types.DtoCtrPropertiesResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1178
1181
|
|
|
1179
1182
|
@wrapped
|
|
1180
|
-
def setDaqPackedMode(
|
|
1183
|
+
def setDaqPackedMode(
|
|
1184
|
+
self, daq_list_number: int, daq_packed_mode: int, dpm_timestamp_mode: int = None, dpm_sample_count: int = None
|
|
1185
|
+
):
|
|
1181
1186
|
"""Set DAQ List Packed Mode.
|
|
1182
1187
|
|
|
1183
1188
|
Parameters
|
|
@@ -1186,19 +1191,19 @@ class Master:
|
|
|
1186
1191
|
daqPackedMode : int
|
|
1187
1192
|
"""
|
|
1188
1193
|
params = []
|
|
1189
|
-
dln = self.WORD_pack(
|
|
1194
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1190
1195
|
params.extend(dln)
|
|
1191
|
-
params.append(
|
|
1196
|
+
params.append(daq_packed_mode)
|
|
1192
1197
|
|
|
1193
|
-
if
|
|
1194
|
-
params.append(
|
|
1195
|
-
dsc = self.WORD_pack(
|
|
1198
|
+
if daq_packed_mode == 1 or daq_packed_mode == 2:
|
|
1199
|
+
params.append(dpm_timestamp_mode)
|
|
1200
|
+
dsc = self.WORD_pack(dpm_sample_count)
|
|
1196
1201
|
params.extend(dsc)
|
|
1197
1202
|
|
|
1198
1203
|
return self.transport.request(types.Command.SET_DAQ_PACKED_MODE, *params)
|
|
1199
1204
|
|
|
1200
1205
|
@wrapped
|
|
1201
|
-
def getDaqPackedMode(self,
|
|
1206
|
+
def getDaqPackedMode(self, daq_list_number: int):
|
|
1202
1207
|
"""Get DAQ List Packed Mode.
|
|
1203
1208
|
|
|
1204
1209
|
This command returns information of the currently active packed mode of
|
|
@@ -1208,7 +1213,7 @@ class Master:
|
|
|
1208
1213
|
----------
|
|
1209
1214
|
daqListNumber : int
|
|
1210
1215
|
"""
|
|
1211
|
-
dln = self.WORD_pack(
|
|
1216
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1212
1217
|
response = self.transport.request(types.Command.GET_DAQ_PACKED_MODE, *dln)
|
|
1213
1218
|
return types.GetDaqPackedModeResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1214
1219
|
|
|
@@ -1221,7 +1226,7 @@ class Master:
|
|
|
1221
1226
|
return result
|
|
1222
1227
|
|
|
1223
1228
|
@wrapped
|
|
1224
|
-
def allocDaq(self,
|
|
1229
|
+
def allocDaq(self, daq_count: int):
|
|
1225
1230
|
"""Allocate DAQ lists.
|
|
1226
1231
|
|
|
1227
1232
|
Parameters
|
|
@@ -1229,23 +1234,23 @@ class Master:
|
|
|
1229
1234
|
daqCount : int
|
|
1230
1235
|
number of DAQ lists to be allocated
|
|
1231
1236
|
"""
|
|
1232
|
-
dq = self.WORD_pack(
|
|
1237
|
+
dq = self.WORD_pack(daq_count)
|
|
1233
1238
|
result = self.transport.request(types.Command.ALLOC_DAQ, 0, *dq)
|
|
1234
|
-
self.stim.allocDaq(
|
|
1239
|
+
self.stim.allocDaq(daq_count)
|
|
1235
1240
|
return result
|
|
1236
1241
|
|
|
1237
1242
|
@wrapped
|
|
1238
|
-
def allocOdt(self,
|
|
1239
|
-
dln = self.WORD_pack(
|
|
1240
|
-
result = self.transport.request(types.Command.ALLOC_ODT, 0, *dln,
|
|
1241
|
-
self.stim.allocOdt(
|
|
1243
|
+
def allocOdt(self, daq_list_number: int, odt_count: int):
|
|
1244
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1245
|
+
result = self.transport.request(types.Command.ALLOC_ODT, 0, *dln, odt_count)
|
|
1246
|
+
self.stim.allocOdt(daq_list_number, odt_count)
|
|
1242
1247
|
return result
|
|
1243
1248
|
|
|
1244
1249
|
@wrapped
|
|
1245
|
-
def allocOdtEntry(self,
|
|
1246
|
-
dln = self.WORD_pack(
|
|
1247
|
-
result = self.transport.request(types.Command.ALLOC_ODT_ENTRY, 0, *dln,
|
|
1248
|
-
self.stim.allocOdtEntry(
|
|
1250
|
+
def allocOdtEntry(self, daq_list_number: int, odt_number: int, odt_entries_count: int):
|
|
1251
|
+
dln = self.WORD_pack(daq_list_number)
|
|
1252
|
+
result = self.transport.request(types.Command.ALLOC_ODT_ENTRY, 0, *dln, odt_number, odt_entries_count)
|
|
1253
|
+
self.stim.allocOdtEntry(daq_list_number, odt_number, odt_entries_count)
|
|
1249
1254
|
return result
|
|
1250
1255
|
|
|
1251
1256
|
# PGM
|
|
@@ -1270,7 +1275,7 @@ class Master:
|
|
|
1270
1275
|
return result
|
|
1271
1276
|
|
|
1272
1277
|
@wrapped
|
|
1273
|
-
def programClear(self, mode: int,
|
|
1278
|
+
def programClear(self, mode: int, clear_range: int):
|
|
1274
1279
|
"""Clear a part of non-volatile memory.
|
|
1275
1280
|
|
|
1276
1281
|
Parameters
|
|
@@ -1280,18 +1285,18 @@ class Master:
|
|
|
1280
1285
|
0x01 = the functional access mode is active
|
|
1281
1286
|
clearRange : int
|
|
1282
1287
|
"""
|
|
1283
|
-
cr = self.DWORD_pack(
|
|
1288
|
+
cr = self.DWORD_pack(clear_range)
|
|
1284
1289
|
response = self.transport.request(types.Command.PROGRAM_CLEAR, mode, 0, 0, *cr)
|
|
1285
1290
|
# ERR_ACCESS_LOCKED
|
|
1286
1291
|
return response
|
|
1287
1292
|
|
|
1288
1293
|
@wrapped
|
|
1289
|
-
def program(self, data: bytes,
|
|
1294
|
+
def program(self, data: bytes, block_length: int, last: bool = False):
|
|
1290
1295
|
"""Parameters
|
|
1291
1296
|
----------
|
|
1292
1297
|
data : bytes
|
|
1293
1298
|
Data to send to slave.
|
|
1294
|
-
|
|
1299
|
+
block_mode_length : int
|
|
1295
1300
|
the program request must contain the length of the whole block, not just the length
|
|
1296
1301
|
in the current packet.
|
|
1297
1302
|
last : bool
|
|
@@ -1310,12 +1315,12 @@ class Master:
|
|
|
1310
1315
|
# d.extend(self.AG_pack(e))
|
|
1311
1316
|
if last:
|
|
1312
1317
|
# last PROGRAM_NEXT packet in a block: the slave device has to send the response after this.
|
|
1313
|
-
response = self.transport.request(types.Command.PROGRAM,
|
|
1318
|
+
response = self.transport.request(types.Command.PROGRAM, block_length, *data)
|
|
1314
1319
|
return response
|
|
1315
1320
|
else:
|
|
1316
1321
|
# the slave device won't respond to consecutive PROGRAM_NEXT packets in block mode,
|
|
1317
1322
|
# so we must not wait for any response
|
|
1318
|
-
self.transport.block_request(types.Command.PROGRAM,
|
|
1323
|
+
self.transport.block_request(types.Command.PROGRAM, block_length, *data)
|
|
1319
1324
|
return None
|
|
1320
1325
|
|
|
1321
1326
|
@wrapped
|
|
@@ -1336,9 +1341,9 @@ class Master:
|
|
|
1336
1341
|
return result
|
|
1337
1342
|
|
|
1338
1343
|
@wrapped
|
|
1339
|
-
def getSectorInfo(self, mode,
|
|
1344
|
+
def getSectorInfo(self, mode: int, sector_number: int):
|
|
1340
1345
|
"""Get specific information for a sector."""
|
|
1341
|
-
response = self.transport.request(types.Command.GET_SECTOR_INFO, mode,
|
|
1346
|
+
response = self.transport.request(types.Command.GET_SECTOR_INFO, mode, sector_number)
|
|
1342
1347
|
if mode == 0 or mode == 1:
|
|
1343
1348
|
return types.GetSectorInfoResponseMode01.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1344
1349
|
elif mode == 2:
|
|
@@ -1351,17 +1356,17 @@ class Master:
|
|
|
1351
1356
|
return self.transport.request(types.Command.PROGRAM_PREPARE, 0x00, *cs)
|
|
1352
1357
|
|
|
1353
1358
|
@wrapped
|
|
1354
|
-
def programFormat(self,
|
|
1359
|
+
def programFormat(self, compression_method: int, encryption_method: int, programming_method: int, access_method: int):
|
|
1355
1360
|
return self.transport.request(
|
|
1356
1361
|
types.Command.PROGRAM_FORMAT,
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1362
|
+
compression_method,
|
|
1363
|
+
encryption_method,
|
|
1364
|
+
programming_method,
|
|
1365
|
+
access_method,
|
|
1361
1366
|
)
|
|
1362
1367
|
|
|
1363
1368
|
@wrapped
|
|
1364
|
-
def programNext(self, data: bytes,
|
|
1369
|
+
def programNext(self, data: bytes, remaining_block_length: int, last: bool = False):
|
|
1365
1370
|
# d = bytearray()
|
|
1366
1371
|
# d.append(len(data))
|
|
1367
1372
|
# if self.slaveProperties.addressGranularity == types.AddressGranularity.DWORD:
|
|
@@ -1370,16 +1375,16 @@ class Master:
|
|
|
1370
1375
|
# d.extend(self.AG_pack(e))
|
|
1371
1376
|
if last:
|
|
1372
1377
|
# last PROGRAM_NEXT packet in a block: the slave device has to send the response after this.
|
|
1373
|
-
response = self.transport.request(types.Command.PROGRAM_NEXT,
|
|
1378
|
+
response = self.transport.request(types.Command.PROGRAM_NEXT, remaining_block_length, *data)
|
|
1374
1379
|
return response
|
|
1375
1380
|
else:
|
|
1376
1381
|
# the slave device won't respond to consecutive PROGRAM_NEXT packets in block mode,
|
|
1377
1382
|
# so we must not wait for any response
|
|
1378
|
-
self.transport.block_request(types.Command.PROGRAM_NEXT,
|
|
1383
|
+
self.transport.block_request(types.Command.PROGRAM_NEXT, remaining_block_length, *data)
|
|
1379
1384
|
return None
|
|
1380
1385
|
|
|
1381
1386
|
@wrapped
|
|
1382
|
-
def programMax(self, data):
|
|
1387
|
+
def programMax(self, data: bytes):
|
|
1383
1388
|
d = bytearray()
|
|
1384
1389
|
if self.slaveProperties.addressGranularity == types.AddressGranularity.WORD:
|
|
1385
1390
|
d.extend(b"\x00") # alignment bytes
|
|
@@ -1390,11 +1395,11 @@ class Master:
|
|
|
1390
1395
|
return self.transport.request(types.Command.PROGRAM_MAX, *d)
|
|
1391
1396
|
|
|
1392
1397
|
@wrapped
|
|
1393
|
-
def programVerify(self,
|
|
1398
|
+
def programVerify(self, ver_mode: int, ver_type: int, ver_value: int):
|
|
1394
1399
|
data = bytearray()
|
|
1395
|
-
data.extend(self.WORD_pack(
|
|
1396
|
-
data.extend(self.DWORD_pack(
|
|
1397
|
-
return self.transport.request(types.Command.PROGRAM_VERIFY,
|
|
1400
|
+
data.extend(self.WORD_pack(ver_type))
|
|
1401
|
+
data.extend(self.DWORD_pack(ver_value))
|
|
1402
|
+
return self.transport.request(types.Command.PROGRAM_VERIFY, ver_mode, *data)
|
|
1398
1403
|
|
|
1399
1404
|
# DBG
|
|
1400
1405
|
|
|
@@ -1617,9 +1622,9 @@ class Master:
|
|
|
1617
1622
|
return types.DbgLlbtResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1618
1623
|
|
|
1619
1624
|
@wrapped
|
|
1620
|
-
def timeCorrelationProperties(self,
|
|
1625
|
+
def timeCorrelationProperties(self, set_properties: int, get_properties_request: int, cluster_id: int):
|
|
1621
1626
|
response = self.transport.request(
|
|
1622
|
-
types.Command.TIME_CORRELATION_PROPERTIES,
|
|
1627
|
+
types.Command.TIME_CORRELATION_PROPERTIES, set_properties, get_properties_request, 0, *self.WORD_pack(cluster_id)
|
|
1623
1628
|
)
|
|
1624
1629
|
return types.TimeCorrelationPropertiesResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1625
1630
|
|
|
@@ -1631,14 +1636,14 @@ class Master:
|
|
|
1631
1636
|
response = self.transportLayerCmd(types.TransportLayerCommands.GET_SLAVE_ID, ord("X"), ord("C"), ord("P"), mode)
|
|
1632
1637
|
return types.GetSlaveIdResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1633
1638
|
|
|
1634
|
-
def getDaqId(self,
|
|
1635
|
-
response = self.transportLayerCmd(types.TransportLayerCommands.GET_DAQ_ID, *self.WORD_pack(
|
|
1639
|
+
def getDaqId(self, daq_list_number: int):
|
|
1640
|
+
response = self.transportLayerCmd(types.TransportLayerCommands.GET_DAQ_ID, *self.WORD_pack(daq_list_number))
|
|
1636
1641
|
# if response:
|
|
1637
1642
|
return types.GetDaqIdResponse.parse(response, byteOrder=self.slaveProperties.byteOrder)
|
|
1638
1643
|
|
|
1639
|
-
def setDaqId(self,
|
|
1644
|
+
def setDaqId(self, daq_list_number: int, identifier: int):
|
|
1640
1645
|
response = self.transportLayerCmd(
|
|
1641
|
-
types.TransportLayerCommands.SET_DAQ_ID, *self.WORD_pack(
|
|
1646
|
+
types.TransportLayerCommands.SET_DAQ_ID, *self.WORD_pack(daq_list_number), *self.DWORD_pack(identifier)
|
|
1642
1647
|
)
|
|
1643
1648
|
return response
|
|
1644
1649
|
|
|
@@ -1665,7 +1670,7 @@ class Master:
|
|
|
1665
1670
|
self.logger.debug(f"Our checksum : 0x{cc:08X}")
|
|
1666
1671
|
return cs.checksum == cc
|
|
1667
1672
|
|
|
1668
|
-
def getDaqInfo(self):
|
|
1673
|
+
def getDaqInfo(self, include_event_lists=True):
|
|
1669
1674
|
"""Get DAQ information: processor, resolution, events."""
|
|
1670
1675
|
result = {}
|
|
1671
1676
|
dpi = self.getDaqProcessorInfo()
|
|
@@ -1706,45 +1711,46 @@ class Master:
|
|
|
1706
1711
|
result["resolution"] = resolutionInfo
|
|
1707
1712
|
channels = []
|
|
1708
1713
|
daq_events = []
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
"
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1714
|
+
if include_event_lists:
|
|
1715
|
+
for ecn in range(dpi.maxEventChannel):
|
|
1716
|
+
eci = self.getDaqEventInfo(ecn)
|
|
1717
|
+
cycle = eci["eventChannelTimeCycle"]
|
|
1718
|
+
maxDaqList = eci["maxDaqList"]
|
|
1719
|
+
priority = eci["eventChannelPriority"]
|
|
1720
|
+
time_unit = eci["eventChannelTimeUnit"]
|
|
1721
|
+
consistency = eci["daqEventProperties"]["consistency"]
|
|
1722
|
+
daq_supported = eci["daqEventProperties"]["daq"]
|
|
1723
|
+
stim_supported = eci["daqEventProperties"]["stim"]
|
|
1724
|
+
packed_supported = eci["daqEventProperties"]["packed"]
|
|
1725
|
+
name = self.fetch(eci.eventChannelNameLength)
|
|
1726
|
+
if name:
|
|
1727
|
+
name = decode_bytes(name)
|
|
1728
|
+
channel = {
|
|
1729
|
+
"name": name,
|
|
1730
|
+
"priority": eci["eventChannelPriority"],
|
|
1731
|
+
"unit": eci["eventChannelTimeUnit"],
|
|
1732
|
+
"cycle": eci["eventChannelTimeCycle"],
|
|
1733
|
+
"maxDaqList": eci["maxDaqList"],
|
|
1734
|
+
"properties": {
|
|
1735
|
+
"consistency": consistency,
|
|
1736
|
+
"daq": daq_supported,
|
|
1737
|
+
"stim": stim_supported,
|
|
1738
|
+
"packed": packed_supported,
|
|
1739
|
+
},
|
|
1740
|
+
}
|
|
1741
|
+
daq_event_info = DaqEventInfo(
|
|
1742
|
+
name,
|
|
1743
|
+
types.EVENT_CHANNEL_TIME_UNIT_TO_EXP[time_unit],
|
|
1744
|
+
cycle,
|
|
1745
|
+
maxDaqList,
|
|
1746
|
+
priority,
|
|
1747
|
+
consistency,
|
|
1748
|
+
daq_supported,
|
|
1749
|
+
stim_supported,
|
|
1750
|
+
packed_supported,
|
|
1751
|
+
)
|
|
1752
|
+
daq_events.append(daq_event_info)
|
|
1753
|
+
channels.append(channel)
|
|
1748
1754
|
result["channels"] = channels
|
|
1749
1755
|
self.stim.setDaqEventInfo(daq_events)
|
|
1750
1756
|
return result
|
|
@@ -1970,15 +1976,26 @@ class Master:
|
|
|
1970
1976
|
extra_msg: Optional[str] = kws.get("extra_msg")
|
|
1971
1977
|
if extra_msg:
|
|
1972
1978
|
kws.pop("extra_msg")
|
|
1979
|
+
else:
|
|
1980
|
+
extra_msg = ""
|
|
1981
|
+
silent: Optional[bool] = kws.get("silent")
|
|
1982
|
+
if silent:
|
|
1983
|
+
kws.pop("silent")
|
|
1984
|
+
else:
|
|
1985
|
+
silent = False
|
|
1973
1986
|
res = cmd(*args, **kws)
|
|
1974
1987
|
except SystemExit as e:
|
|
1988
|
+
# print(f"\tUnexpected error while executing command {cmd.__name__!r}: {e!r}")
|
|
1975
1989
|
if e.error_code == types.XcpError.ERR_CMD_UNKNOWN:
|
|
1976
1990
|
# This is a rather common use-case, so let the user know that there is some functionality missing.
|
|
1977
|
-
if
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1991
|
+
if not silent:
|
|
1992
|
+
if extra_msg:
|
|
1993
|
+
self.logger.warning(f"Optional command {cmd.__name__!r} not implemented -- {extra_msg!r}")
|
|
1994
|
+
else:
|
|
1995
|
+
self.logger.warning(f"Optional command {cmd.__name__!r} not implemented.")
|
|
1996
|
+
return (types.TryCommandResult.NOT_IMPLEMENTED, e)
|
|
1997
|
+
else:
|
|
1998
|
+
return (types.TryCommandResult.XCP_ERROR, e)
|
|
1982
1999
|
except Exception as e:
|
|
1983
2000
|
return (types.TryCommandResult.OTHER_ERROR, e)
|
|
1984
2001
|
else:
|
|
Binary file
|
pyxcp/types.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pyxcp/__init__.py,sha256=
|
|
1
|
+
pyxcp/__init__.py,sha256=NDu785DrhpFkKcUgVKRBeBhp6NC9yp9DVxG_MGx_3Dg,548
|
|
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,22 +24,22 @@ pyxcp/constants.py,sha256=9yGfujC0ImTYQWfn41wyw8pluJTSrhMGWIVeIZTgsLg,1160
|
|
|
24
24
|
pyxcp/cpp_ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
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.cp38-win_amd64.pyd,sha256=
|
|
28
|
-
pyxcp/cpp_ext/daqlist.hpp,sha256=
|
|
27
|
+
pyxcp/cpp_ext/cpp_ext.cp38-win_amd64.pyd,sha256=FvxLTjwiAyCQBEoqKOZ-fci6t1caxfVchOpwv7ruPzY,279552
|
|
28
|
+
pyxcp/cpp_ext/daqlist.hpp,sha256=g2hlxgoQorAGKHedZFZ0c2FQh1APMIA9sVB6M6hD_n8,7277
|
|
29
29
|
pyxcp/cpp_ext/event.hpp,sha256=Z-1yxsEKsr81NnLVEWJ2ANA8FV7YsM7EbNxaw-elheE,1200
|
|
30
|
-
pyxcp/cpp_ext/extension_wrapper.cpp,sha256
|
|
30
|
+
pyxcp/cpp_ext/extension_wrapper.cpp,sha256=FXFjyruBjQYqjCYZZcajdYv6dvNnCggMAbWLqJmfuTM,4756
|
|
31
31
|
pyxcp/cpp_ext/helper.hpp,sha256=ONAsVupIqqmNDp8bgGWS0TfSYeCFkk3kwwZbbqsh0HQ,7813
|
|
32
32
|
pyxcp/cpp_ext/mcobject.hpp,sha256=A5GKcfjYMcfm3hfTQfFuS4JYNFTvfmzAcMXCe01GOs4,6429
|
|
33
33
|
pyxcp/cpp_ext/tsqueue.hpp,sha256=FWMemzXNgV5dQ7gYmTCzC0QYfgl0VI9JCybYelBcCHU,1026
|
|
34
|
-
pyxcp/daq_stim/__init__.py,sha256=
|
|
34
|
+
pyxcp/daq_stim/__init__.py,sha256=xQNF6MlVnPHtjj5fKEvXnLWxIJs_Fqd5XVMN4lcFaC8,9532
|
|
35
35
|
pyxcp/daq_stim/optimize/__init__.py,sha256=FUWK0GkNpNT-sUlhibp7xa2aSYpm6Flh5yA2w2IOJqg,2520
|
|
36
36
|
pyxcp/daq_stim/optimize/binpacking.py,sha256=Iltho5diKlJG-ltbmx053U2vOFRlCISolXK61T14l_I,1257
|
|
37
37
|
pyxcp/daq_stim/scheduler.cpp,sha256=a7VK7kP2Hs8yMlcDAkXwJ0bH88lr_yz156sphcHS7Z4,715
|
|
38
38
|
pyxcp/daq_stim/scheduler.hpp,sha256=U_6tUbebmzX5vVZS0EFSgTaPsyxMg6yRXHG_aPWA0x4,1884
|
|
39
|
-
pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=
|
|
39
|
+
pyxcp/daq_stim/stim.cp38-win_amd64.pyd,sha256=X_ftCGxwZ4slT40A21gSUwJq8J-vB8Q_VUvZgQkRB2c,189440
|
|
40
40
|
pyxcp/daq_stim/stim.cpp,sha256=F2OG67W4KKwTTiUCxm-9egIv3TLFdOkRunX6xf7YOtc,177
|
|
41
41
|
pyxcp/daq_stim/stim.hpp,sha256=U-uInRrA6OCdMl1l1SWbQ_KEPpnNYrWut924IvbW6R0,18508
|
|
42
|
-
pyxcp/daq_stim/stim_wrapper.cpp,sha256=
|
|
42
|
+
pyxcp/daq_stim/stim_wrapper.cpp,sha256=iT2yxJ3LRG7HoYC1bwhM3tCAxF9X_HHierBNsLRmTJg,1995
|
|
43
43
|
pyxcp/dllif.py,sha256=nXzD5toh_z9Zjj3x3trigURfwE98fYaL4RmUlI7FaqY,3308
|
|
44
44
|
pyxcp/errormatrix.py,sha256=iY3VlAem7pNfpK4scD_087wxMlLxNuidB7bbpiUiAyc,45464
|
|
45
45
|
pyxcp/examples/conf_can.toml,sha256=4o-M4xmh7pCzuQLfXnIOLIXqx5aZjMAZ6jtjYJ8hLBQ,370
|
|
@@ -56,7 +56,7 @@ pyxcp/examples/ex_csv.py,sha256=GNWQ3IatXj3Kg5MUX6p8tzJRUppGreON9dkrNiqdTtk,2461
|
|
|
56
56
|
pyxcp/examples/ex_excel.py,sha256=VpoqRTv-rHz-MnaFKt5f7MqDrK9OLYyRJvVWzCFsayc,2828
|
|
57
57
|
pyxcp/examples/ex_mdf.py,sha256=zfivlNkbbsfvwqsISttaoQk1R888r7UUtwSqocE60sU,3759
|
|
58
58
|
pyxcp/examples/ex_sqlite.py,sha256=ludD0EIziBhBNnC3MOrQTGs06cl7iNyL2yefwe53zNc,4268
|
|
59
|
-
pyxcp/examples/run_daq.py,sha256=
|
|
59
|
+
pyxcp/examples/run_daq.py,sha256=KXL9myK3w7RCIgjZblU2i1XOP5l4V0YRQKNRXF7ISIo,5518
|
|
60
60
|
pyxcp/examples/xcp_policy.py,sha256=io9tS2W-7PvR8ZzU203KolFrDp67eorUlwNWvA4kC5k,1921
|
|
61
61
|
pyxcp/examples/xcp_read_benchmark.py,sha256=zOG0Yrji10vA0vhHa27KK7zgc3JDpzXzXsFnIU4C_AM,956
|
|
62
62
|
pyxcp/examples/xcp_skel.py,sha256=YXLQC8nn8aAwYSVuBGhr1dvmdMBjmO1Ee1w3e5sy16s,1159
|
|
@@ -66,7 +66,7 @@ pyxcp/examples/xcphello.py,sha256=xbcWq8StRJyUZBLUvknsXv7VkEBD5SU0SJjlZTHsSzs,26
|
|
|
66
66
|
pyxcp/examples/xcphello_recorder.py,sha256=QHWJsq5h5CI9t5qEmMSorZyzirTpoXz4nzuKTMzbZCA,3409
|
|
67
67
|
pyxcp/master/__init__.py,sha256=QQbkUJM1WQ-5p2MiNFYxLAmHhNsCQLzDp-S4aoOFxoA,318
|
|
68
68
|
pyxcp/master/errorhandler.py,sha256=U5QuvGRDM9kRNwY5kbkTOnthp19RHoXEGCsaBNiFTps,14973
|
|
69
|
-
pyxcp/master/master.py,sha256=
|
|
69
|
+
pyxcp/master/master.py,sha256=y5i5HTw5g4HKHW8tXfpNc0hmaQjle-3dsUkVFqPjUXc,78365
|
|
70
70
|
pyxcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
71
|
pyxcp/recorder/__init__.py,sha256=pg-cdOaoj-D-woFxFb2p6SpFTNTdpQEIknHdDaQ9ROE,2695
|
|
72
72
|
pyxcp/recorder/build_clang.cmd,sha256=JvFngSnb28XcBGXxC6MGrcOCGYfahOIvHpgRpqbA6HQ,175
|
|
@@ -83,7 +83,7 @@ pyxcp/recorder/mio.hpp,sha256=5ASJLKSEykH0deAQD5uak-_yAgd5p2n8t06315GSGrg,63346
|
|
|
83
83
|
pyxcp/recorder/reader.hpp,sha256=rr9XZ_ciL6eF2_xEqyt9XYNqTIze9ytAsnf8uYukO9U,5201
|
|
84
84
|
pyxcp/recorder/reco.py,sha256=6N6FIwfCEVMpi5dr3eUOQa1lowcg2LCnS_sy_-b-UiQ,8725
|
|
85
85
|
pyxcp/recorder/recorder.rst,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
|
-
pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=
|
|
86
|
+
pyxcp/recorder/rekorder.cp38-win_amd64.pyd,sha256=_XW8GKdICxi0mzTRHwZ7Fc_afbCMOPrCQpNa-EozKnE,377856
|
|
87
87
|
pyxcp/recorder/rekorder.cpp,sha256=U0LMyk8pZXx9emgS_WPVthvn_9IpgE7JGrh4kg-8CX4,1900
|
|
88
88
|
pyxcp/recorder/rekorder.hpp,sha256=sWvRch9bVt6mmgrFHp5mwWhap7HoFG4geeb7UqEIzio,7638
|
|
89
89
|
pyxcp/recorder/setup.py,sha256=_99XFPQAd5V4LcJaSGJwdnbxgxJ7kl8DEXfHsnKO1Yg,998
|
|
@@ -117,12 +117,12 @@ pyxcp/transport/eth.py,sha256=xPzN2oSALoPKJVvZpBljPSV1AxfpjRusOzymO-TD1Rw,8711
|
|
|
117
117
|
pyxcp/transport/sxi.py,sha256=vM8WZIKuu_dNuqkxZM_1n6iQkQCCzo4ykWpiG6ba8Fk,4695
|
|
118
118
|
pyxcp/transport/transport_wrapper.cpp,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
119
119
|
pyxcp/transport/usb_transport.py,sha256=JuYrwkWsUdibdVNA57LBEQT3a3ykOgWPdWcfqj96nDE,8343
|
|
120
|
-
pyxcp/types.py,sha256=
|
|
120
|
+
pyxcp/types.py,sha256=wm3tOocuAln4jpH_mDguPRYtIzHSQ_KQBYNATFB2WXc,26068
|
|
121
121
|
pyxcp/utils.py,sha256=unlg0CoNwcWYfd-BE0hZJ93uhlAoW_nryv9tS_R3C44,2969
|
|
122
122
|
pyxcp/vector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
123
123
|
pyxcp/vector/map.py,sha256=7Gnhvr79geMeqqGVIJPxODXGwABdNDinnqzhpooN5TE,2306
|
|
124
|
-
pyxcp-0.22.
|
|
125
|
-
pyxcp-0.22.
|
|
126
|
-
pyxcp-0.22.
|
|
127
|
-
pyxcp-0.22.
|
|
128
|
-
pyxcp-0.22.
|
|
124
|
+
pyxcp-0.22.25.dist-info/entry_points.txt,sha256=2JbL-pWn9UxpBrS64aWiFFkq9x2A7y-dkrxYlfQqIJU,307
|
|
125
|
+
pyxcp-0.22.25.dist-info/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
|
|
126
|
+
pyxcp-0.22.25.dist-info/METADATA,sha256=oFr467S0a1I-Um5vDrp45QypZVjupKHJVVvaLioflgs,4076
|
|
127
|
+
pyxcp-0.22.25.dist-info/WHEEL,sha256=NtstD-IOpW_lEkyZJDu2m1YPTvbwMU6Bl4jmuVneh1M,96
|
|
128
|
+
pyxcp-0.22.25.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|