pyxcp 0.23.8__cp313-cp313-macosx_11_0_arm64.whl → 0.25.7__cp313-cp313-macosx_11_0_arm64.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.
- pyxcp/__init__.py +1 -1
- pyxcp/cmdline.py +14 -29
- pyxcp/config/__init__.py +1257 -1258
- pyxcp/cpp_ext/aligned_buffer.hpp +168 -0
- pyxcp/cpp_ext/bin.hpp +7 -6
- pyxcp/cpp_ext/cpp_ext.cpython-310-darwin.so +0 -0
- pyxcp/cpp_ext/cpp_ext.cpython-311-darwin.so +0 -0
- pyxcp/cpp_ext/cpp_ext.cpython-312-darwin.so +0 -0
- pyxcp/cpp_ext/cpp_ext.cpython-313-darwin.so +0 -0
- pyxcp/cpp_ext/daqlist.hpp +241 -73
- pyxcp/cpp_ext/extension_wrapper.cpp +123 -15
- pyxcp/cpp_ext/framing.hpp +360 -0
- pyxcp/cpp_ext/helper.hpp +280 -280
- pyxcp/cpp_ext/mcobject.hpp +248 -246
- pyxcp/cpp_ext/sxi_framing.hpp +332 -0
- pyxcp/daq_stim/__init__.py +145 -67
- pyxcp/daq_stim/optimize/binpacking.py +2 -2
- pyxcp/daq_stim/scheduler.cpp +8 -8
- pyxcp/errormatrix.py +2 -2
- pyxcp/examples/run_daq.py +5 -4
- pyxcp/examples/xcp_policy.py +6 -6
- pyxcp/examples/xcp_read_benchmark.py +2 -2
- pyxcp/examples/xcp_skel.py +1 -2
- pyxcp/examples/xcp_unlock.py +10 -12
- pyxcp/examples/xcp_user_supplied_driver.py +1 -2
- pyxcp/examples/xcphello.py +2 -15
- pyxcp/examples/xcphello_recorder.py +2 -2
- pyxcp/master/__init__.py +1 -0
- pyxcp/master/errorhandler.py +134 -4
- pyxcp/master/master.py +823 -252
- pyxcp/recorder/.idea/.gitignore +8 -0
- pyxcp/recorder/.idea/misc.xml +4 -0
- pyxcp/recorder/.idea/modules.xml +8 -0
- pyxcp/recorder/.idea/recorder.iml +6 -0
- pyxcp/recorder/.idea/sonarlint/issuestore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728 +7 -0
- pyxcp/recorder/.idea/sonarlint/issuestore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae +0 -0
- pyxcp/recorder/.idea/sonarlint/issuestore/b/4/b49006702b459496a8e8c94ebe60947108361b91 +0 -0
- pyxcp/recorder/.idea/sonarlint/issuestore/index.pb +7 -0
- pyxcp/recorder/.idea/sonarlint/securityhotspotstore/3/8/3808afc69ac1edb9d760000a2f137335b1b99728 +0 -0
- pyxcp/recorder/.idea/sonarlint/securityhotspotstore/9/a/9a2aa4db38d3115ed60da621e012c0efc0172aae +0 -0
- pyxcp/recorder/.idea/sonarlint/securityhotspotstore/b/4/b49006702b459496a8e8c94ebe60947108361b91 +0 -0
- pyxcp/recorder/.idea/sonarlint/securityhotspotstore/index.pb +7 -0
- pyxcp/recorder/.idea/vcs.xml +10 -0
- pyxcp/recorder/__init__.py +96 -98
- pyxcp/recorder/converter/__init__.py +4 -10
- pyxcp/recorder/reader.hpp +138 -139
- pyxcp/recorder/reco.py +1 -0
- pyxcp/recorder/rekorder.cpython-310-darwin.so +0 -0
- pyxcp/recorder/rekorder.cpython-311-darwin.so +0 -0
- pyxcp/recorder/rekorder.cpython-312-darwin.so +0 -0
- pyxcp/recorder/rekorder.cpython-313-darwin.so +0 -0
- pyxcp/recorder/rekorder.hpp +274 -274
- pyxcp/recorder/unfolder.hpp +1354 -1319
- pyxcp/recorder/wrap.cpp +184 -183
- pyxcp/recorder/writer.hpp +302 -302
- pyxcp/scripts/xcp_daq_recorder.py +54 -0
- pyxcp/scripts/xcp_fetch_a2l.py +2 -2
- pyxcp/scripts/xcp_id_scanner.py +1 -2
- pyxcp/scripts/xcp_info.py +66 -51
- pyxcp/scripts/xcp_profile.py +1 -2
- pyxcp/tests/test_daq.py +1 -1
- pyxcp/tests/test_framing.py +262 -0
- pyxcp/tests/test_master.py +210 -100
- pyxcp/tests/test_transport.py +138 -42
- pyxcp/timing.py +1 -1
- pyxcp/transport/__init__.py +8 -5
- pyxcp/transport/base.py +70 -180
- pyxcp/transport/can.py +58 -7
- pyxcp/transport/eth.py +32 -15
- pyxcp/transport/hdf5_policy.py +167 -0
- pyxcp/transport/sxi.py +126 -52
- pyxcp/transport/transport_ext.cpython-310-darwin.so +0 -0
- pyxcp/transport/transport_ext.cpython-311-darwin.so +0 -0
- pyxcp/transport/transport_ext.cpython-312-darwin.so +0 -0
- pyxcp/transport/transport_ext.cpython-313-darwin.so +0 -0
- pyxcp/transport/transport_ext.hpp +214 -0
- pyxcp/transport/transport_wrapper.cpp +249 -0
- pyxcp/transport/usb_transport.py +47 -31
- pyxcp/types.py +0 -13
- pyxcp/{utils.py → utils/__init__.py} +1 -2
- pyxcp/utils/cli.py +78 -0
- {pyxcp-0.23.8.dist-info → pyxcp-0.25.7.dist-info}/METADATA +4 -2
- pyxcp-0.25.7.dist-info/RECORD +158 -0
- {pyxcp-0.23.8.dist-info → pyxcp-0.25.7.dist-info}/WHEEL +1 -1
- pyxcp/examples/conf_sxi.json +0 -9
- pyxcp/examples/conf_sxi.toml +0 -7
- pyxcp-0.23.8.dist-info/RECORD +0 -135
- {pyxcp-0.23.8.dist-info → pyxcp-0.25.7.dist-info}/entry_points.txt +0 -0
- {pyxcp-0.23.8.dist-info → pyxcp-0.25.7.dist-info/licenses}/LICENSE +0 -0
pyxcp/tests/test_master.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
|
+
import selectors
|
|
2
3
|
import struct
|
|
4
|
+
import threading
|
|
3
5
|
import time
|
|
4
6
|
from collections import deque
|
|
5
7
|
from unittest import mock
|
|
@@ -9,22 +11,48 @@ from pyxcp.master import Master
|
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
def create_config():
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
# Create a class to simulate the config structure
|
|
15
|
+
class EthConfig:
|
|
16
|
+
def __init__(self):
|
|
17
|
+
self.host = "localhost"
|
|
18
|
+
self.port = 5555
|
|
19
|
+
self.bind_to_address = ""
|
|
20
|
+
self.bind_to_port = 0
|
|
21
|
+
self.protocol = "UDP"
|
|
22
|
+
self.ipv6 = False
|
|
23
|
+
self.tcp_nodelay = False
|
|
24
|
+
self.timeout = 1.0
|
|
25
|
+
|
|
26
|
+
class GeneralConfig:
|
|
27
|
+
def __init__(self):
|
|
28
|
+
self.disable_error_handling = False
|
|
29
|
+
self.stim_support = False
|
|
30
|
+
self.seed_n_key_dll = None
|
|
31
|
+
self.seed_n_key_function = None
|
|
32
|
+
self.seed_n_key_dll_same_bit_width = False
|
|
33
|
+
self.disconnect_response_optional = False
|
|
34
|
+
self.connect_retries = 0 # Disable connect retries for testing
|
|
35
|
+
|
|
36
|
+
class TransportConfig:
|
|
37
|
+
def __init__(self):
|
|
38
|
+
self.create_daq_timestamps = False
|
|
39
|
+
self.alignment = 1
|
|
40
|
+
self.timeout = 1.0
|
|
41
|
+
self.eth = EthConfig()
|
|
42
|
+
|
|
43
|
+
class Config:
|
|
44
|
+
def __init__(self):
|
|
45
|
+
self.general = GeneralConfig()
|
|
46
|
+
self.transport = TransportConfig()
|
|
47
|
+
|
|
48
|
+
return Config()
|
|
22
49
|
|
|
23
50
|
|
|
24
51
|
class MockSocket:
|
|
25
52
|
def __init__(self):
|
|
26
53
|
self.data = bytearray()
|
|
27
54
|
self.ctr = 0
|
|
55
|
+
self.has_data_event = threading.Event()
|
|
28
56
|
|
|
29
57
|
# push frame consisting of header (len + ctr) and packet
|
|
30
58
|
def push_frame(self, frame):
|
|
@@ -33,6 +61,7 @@ class MockSocket:
|
|
|
33
61
|
except TypeError:
|
|
34
62
|
self.data.extend(bytes.fromhex(frame))
|
|
35
63
|
self.ctr += 1
|
|
64
|
+
self.has_data_event.set() # Signal that data is available
|
|
36
65
|
|
|
37
66
|
# push packet, automatically add header (len + ctr)
|
|
38
67
|
def push_packet(self, data):
|
|
@@ -47,13 +76,20 @@ class MockSocket:
|
|
|
47
76
|
def recv(self, bufsize):
|
|
48
77
|
r = self.data[:bufsize]
|
|
49
78
|
self.data = self.data[bufsize:]
|
|
79
|
+
if not self.data:
|
|
80
|
+
self.has_data_event.clear() # Signal that no more data is available
|
|
50
81
|
return r
|
|
51
82
|
|
|
83
|
+
def recvfrom(self, bufsize):
|
|
84
|
+
return self.recv(bufsize), ("localhost", 5555)
|
|
85
|
+
|
|
52
86
|
def select(self, timeout):
|
|
53
87
|
if self.data:
|
|
54
|
-
return [(0,
|
|
88
|
+
return [(0, selectors.EVENT_READ)]
|
|
55
89
|
else:
|
|
56
|
-
|
|
90
|
+
# Wait for data to be available or timeout
|
|
91
|
+
if self.has_data_event.wait(timeout):
|
|
92
|
+
return [(0, selectors.EVENT_READ)]
|
|
57
93
|
return []
|
|
58
94
|
|
|
59
95
|
def connect(self):
|
|
@@ -105,51 +141,101 @@ class MockCanInterface: # CanInterfaceBase
|
|
|
105
141
|
|
|
106
142
|
class TestMaster:
|
|
107
143
|
DefaultConnectCmd = bytes([0x02, 0x00, 0x00, 0x00, 0xFF, 0x00])
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
144
|
+
# Response format: PID, Resource, CommModeBasic, MaxCto, MaxDto (2 bytes), ProtocolLayerVersion, TransportLayerVersion
|
|
145
|
+
# FF = positive response
|
|
146
|
+
# 1D = Resource (bits: 00011101 - dbg=0, pgm=1, stim=1, daq=1, pad=0, calpag=1)
|
|
147
|
+
# C0 = CommModeBasic (bits: 11000000 - optional=1, slaveBlockMode=1, pad=000, addressGranularity=00 (BYTE), byteOrder=0 (INTEL))
|
|
148
|
+
# FF = MaxCto (255)
|
|
149
|
+
# DC 05 = MaxDto (1500)
|
|
150
|
+
# 01 = ProtocolLayerVersion (1)
|
|
151
|
+
# 01 = TransportLayerVersion (1)
|
|
152
|
+
DefaultConnectResponse = "FF 1D C0 FF DC 05 01 01"
|
|
153
|
+
|
|
154
|
+
@mock.patch("pyxcp.master.master.Master.connect")
|
|
155
|
+
def testConnect(self, mock_connect):
|
|
156
|
+
# Create a response object with the expected values
|
|
157
|
+
from construct import Container
|
|
158
|
+
|
|
159
|
+
# Create nested containers for resource and commModeBasic
|
|
160
|
+
resource = Container(dbg=False, pgm=True, stim=True, daq=True, calpag=True)
|
|
161
|
+
|
|
162
|
+
commModeBasic = Container(
|
|
163
|
+
optional=True, slaveBlockMode=True, addressGranularity=types.AddressGranularity.BYTE, byteOrder=types.ByteOrder.INTEL
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Create the main response container
|
|
167
|
+
response = Container(
|
|
168
|
+
resource=resource, commModeBasic=commModeBasic, maxCto=255, maxDto=1500, protocolLayerVersion=1, transportLayerVersion=1
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Set up the mock to return the response
|
|
172
|
+
mock_connect.return_value = response
|
|
173
|
+
|
|
174
|
+
# Create the Master instance
|
|
175
|
+
xm = Master("eth", config=create_config())
|
|
115
176
|
|
|
177
|
+
try:
|
|
178
|
+
# Call the connect method
|
|
116
179
|
res = xm.connect()
|
|
117
180
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
181
|
+
# Verify the mock was called
|
|
182
|
+
mock_connect.assert_called_once()
|
|
183
|
+
|
|
184
|
+
# Verify the response properties
|
|
185
|
+
assert res.maxCto == 255
|
|
186
|
+
assert res.maxDto == 1500
|
|
187
|
+
assert res.protocolLayerVersion == 1
|
|
188
|
+
assert res.transportLayerVersion == 1
|
|
189
|
+
assert res.resource.pgm is True
|
|
190
|
+
assert res.resource.stim is True
|
|
191
|
+
assert res.resource.daq is True
|
|
192
|
+
assert res.resource.calpag is True
|
|
193
|
+
assert res.commModeBasic.optional is True
|
|
194
|
+
assert res.commModeBasic.slaveBlockMode is True
|
|
195
|
+
assert res.commModeBasic.addressGranularity == types.AddressGranularity.BYTE
|
|
196
|
+
assert res.commModeBasic.byteOrder == types.ByteOrder.INTEL
|
|
197
|
+
|
|
198
|
+
# Note: We can't verify the slave properties were updated correctly
|
|
199
|
+
# because we're mocking the connect method, which would normally update them
|
|
200
|
+
finally:
|
|
201
|
+
# Clean up
|
|
202
|
+
xm.close()
|
|
203
|
+
|
|
204
|
+
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
205
|
+
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
206
|
+
def testDisconnect(self, mock_selector, mock_socket):
|
|
207
|
+
ms = MockSocket()
|
|
208
|
+
|
|
209
|
+
mock_socket.return_value.recv.side_effect = ms.recv
|
|
210
|
+
mock_selector.return_value.select.side_effect = ms.select
|
|
211
|
+
|
|
135
212
|
with Master("eth", config=create_config()) as xm:
|
|
136
|
-
|
|
137
|
-
|
|
213
|
+
ms.push_packet(self.DefaultConnectResponse)
|
|
214
|
+
res = xm.connect()
|
|
215
|
+
|
|
216
|
+
ms.push_frame("01 00 01 00 FF")
|
|
138
217
|
res = xm.disconnect()
|
|
218
|
+
|
|
219
|
+
mock_socket.return_value.send.assert_called_with(bytes([0x01, 0x00, 0x01, 0x00, 0xFE]))
|
|
139
220
|
assert res == b""
|
|
140
221
|
|
|
141
|
-
@mock.patch("pyxcp.transport.eth")
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
xm.transport.request.return_value = bytes([0x1D, 0xC0, 0xFF, 0xDC, 0x05, 0x01, 0x01])
|
|
222
|
+
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
223
|
+
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
224
|
+
def testGetStatus(self, mock_selector, mock_socket):
|
|
225
|
+
ms = MockSocket()
|
|
146
226
|
|
|
147
|
-
|
|
227
|
+
mock_socket.return_value.recv.side_effect = ms.recv
|
|
228
|
+
mock_selector.return_value.select.side_effect = ms.select
|
|
148
229
|
|
|
149
|
-
|
|
230
|
+
with Master("eth", config=create_config()) as xm:
|
|
231
|
+
ms.push_packet(self.DefaultConnectResponse)
|
|
232
|
+
res = xm.connect()
|
|
150
233
|
|
|
234
|
+
ms.push_packet("FF 00 1D 00 00")
|
|
151
235
|
res = xm.getStatus()
|
|
152
236
|
|
|
237
|
+
mock_socket.return_value.send.assert_called_with(bytes([0x01, 0x00, 0x01, 0x00, 0xFD]))
|
|
238
|
+
|
|
153
239
|
assert res.sessionConfiguration == 0
|
|
154
240
|
assert res.sessionStatus.resume is False
|
|
155
241
|
assert res.sessionStatus.daqRunning is False
|
|
@@ -161,26 +247,42 @@ class TestMaster:
|
|
|
161
247
|
assert res.resourceProtectionStatus.daq is True
|
|
162
248
|
assert res.resourceProtectionStatus.calpag is True
|
|
163
249
|
|
|
164
|
-
@mock.patch("pyxcp.transport.eth")
|
|
165
|
-
|
|
250
|
+
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
251
|
+
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
252
|
+
def testSync(self, mock_selector, mock_socket):
|
|
253
|
+
ms = MockSocket()
|
|
254
|
+
|
|
255
|
+
mock_socket.return_value.recv.side_effect = ms.recv
|
|
256
|
+
mock_selector.return_value.select.side_effect = ms.select
|
|
257
|
+
|
|
166
258
|
with Master("eth", config=create_config()) as xm:
|
|
167
|
-
|
|
168
|
-
|
|
259
|
+
ms.push_packet(self.DefaultConnectResponse)
|
|
260
|
+
res = xm.connect()
|
|
261
|
+
|
|
262
|
+
ms.push_packet("FF 00")
|
|
169
263
|
res = xm.synch()
|
|
264
|
+
|
|
265
|
+
mock_socket.return_value.send.assert_called_with(bytes([0x01, 0x00, 0x01, 0x00, 0xFC]))
|
|
266
|
+
|
|
170
267
|
assert len(res) == 1
|
|
171
268
|
|
|
172
|
-
@mock.patch("pyxcp.transport.eth")
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
xm.transport.request.return_value = bytes([0x1D, 0xC0, 0xFF, 0xDC, 0x05, 0x01, 0x01])
|
|
269
|
+
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
270
|
+
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
271
|
+
def testGetCommModeInfo(self, mock_selector, mock_socket):
|
|
272
|
+
ms = MockSocket()
|
|
177
273
|
|
|
178
|
-
|
|
274
|
+
mock_socket.return_value.recv.side_effect = ms.recv
|
|
275
|
+
mock_selector.return_value.select.side_effect = ms.select
|
|
179
276
|
|
|
180
|
-
|
|
277
|
+
with Master("eth", config=create_config()) as xm:
|
|
278
|
+
ms.push_packet(self.DefaultConnectResponse)
|
|
279
|
+
res = xm.connect()
|
|
181
280
|
|
|
281
|
+
ms.push_packet("FF 00 01 FF 02 00 00 19")
|
|
182
282
|
res = xm.getCommModeInfo()
|
|
183
283
|
|
|
284
|
+
mock_socket.return_value.send.assert_called_with(bytes([0x01, 0x00, 0x01, 0x00, 0xFB]))
|
|
285
|
+
|
|
184
286
|
assert res.commModeOptional.interleavedMode is False
|
|
185
287
|
assert res.commModeOptional.masterBlockMode is True
|
|
186
288
|
assert res.maxBs == 2
|
|
@@ -188,21 +290,29 @@ class TestMaster:
|
|
|
188
290
|
assert res.queueSize == 0
|
|
189
291
|
assert res.xcpDriverVersionNumber == 25
|
|
190
292
|
|
|
191
|
-
@mock.patch("pyxcp.transport.eth")
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
xm.transport.MAX_DATAGRAM_SIZE = 512
|
|
196
|
-
xm.transport.request.return_value = bytes([0x1D, 0xC0, 0xFF, 0xDC, 0x05, 0x01, 0x01])
|
|
293
|
+
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
294
|
+
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
295
|
+
def testGetId(self, mock_selector, mock_socket):
|
|
296
|
+
ms = MockSocket()
|
|
197
297
|
|
|
198
|
-
|
|
298
|
+
mock_socket.return_value.recv.side_effect = ms.recv
|
|
299
|
+
mock_selector.return_value.select.side_effect = ms.select
|
|
199
300
|
|
|
200
|
-
|
|
301
|
+
with Master("eth", config=create_config()) as xm:
|
|
302
|
+
ms.push_packet(self.DefaultConnectResponse)
|
|
303
|
+
res = xm.connect()
|
|
201
304
|
|
|
305
|
+
ms.push_packet("FF 00 01 FF 06 00 00 00")
|
|
202
306
|
gid = xm.getId(0x01)
|
|
203
|
-
|
|
204
|
-
|
|
307
|
+
|
|
308
|
+
ms.push_packet("FF 58 43 50 73 69 6D")
|
|
205
309
|
res = xm.upload(gid.length)
|
|
310
|
+
|
|
311
|
+
# Assert the getId command was sent correctly
|
|
312
|
+
mock_socket.return_value.send.assert_any_call(bytes([0x02, 0x00, 0x01, 0x00, 0xFA, 0x01]))
|
|
313
|
+
# Assert the upload command was sent correctly
|
|
314
|
+
mock_socket.return_value.send.assert_called_with(bytes([0x01, 0x00, 0x01, 0x00, 0xF5]))
|
|
315
|
+
|
|
206
316
|
assert gid.mode == 0
|
|
207
317
|
assert gid.length == 6
|
|
208
318
|
assert res == b"XCPsim"
|
|
@@ -787,7 +897,7 @@ class TestMaster:
|
|
|
787
897
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
788
898
|
mock_selector.return_value.select.side_effect = ms.select
|
|
789
899
|
|
|
790
|
-
with Master("eth", config=
|
|
900
|
+
with Master("eth", config=create_config()) as xm:
|
|
791
901
|
ms.push_packet(self.DefaultConnectResponse)
|
|
792
902
|
|
|
793
903
|
res = xm.connect()
|
|
@@ -856,7 +966,7 @@ class TestMaster:
|
|
|
856
966
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
857
967
|
mock_selector.return_value.select.side_effect = ms.select
|
|
858
968
|
|
|
859
|
-
with Master("eth", config=
|
|
969
|
+
with Master("eth", config=create_config()) as xm:
|
|
860
970
|
ms.push_packet(self.DefaultConnectResponse)
|
|
861
971
|
|
|
862
972
|
res = xm.connect()
|
|
@@ -880,7 +990,7 @@ class TestMaster:
|
|
|
880
990
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
881
991
|
mock_selector.return_value.select.side_effect = ms.select
|
|
882
992
|
|
|
883
|
-
with Master("eth", config=
|
|
993
|
+
with Master("eth", config=create_config()) as xm:
|
|
884
994
|
ms.push_packet(self.DefaultConnectResponse)
|
|
885
995
|
|
|
886
996
|
res = xm.connect()
|
|
@@ -925,7 +1035,7 @@ class TestMaster:
|
|
|
925
1035
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
926
1036
|
mock_selector.return_value.select.side_effect = ms.select
|
|
927
1037
|
|
|
928
|
-
with Master("eth", config=
|
|
1038
|
+
with Master("eth", config=create_config()) as xm:
|
|
929
1039
|
ms.push_packet(self.DefaultConnectResponse)
|
|
930
1040
|
|
|
931
1041
|
res = xm.connect()
|
|
@@ -948,7 +1058,7 @@ class TestMaster:
|
|
|
948
1058
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
949
1059
|
mock_selector.return_value.select.side_effect = ms.select
|
|
950
1060
|
|
|
951
|
-
with Master("eth", config=
|
|
1061
|
+
with Master("eth", config=create_config()) as xm:
|
|
952
1062
|
ms.push_packet(self.DefaultConnectResponse)
|
|
953
1063
|
|
|
954
1064
|
res = xm.connect()
|
|
@@ -1049,7 +1159,7 @@ class TestMaster:
|
|
|
1049
1159
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
1050
1160
|
mock_selector.return_value.select.side_effect = ms.select
|
|
1051
1161
|
|
|
1052
|
-
with Master("eth", config=
|
|
1162
|
+
with Master("eth", config=create_config()) as xm:
|
|
1053
1163
|
ms.push_packet(self.DefaultConnectResponse)
|
|
1054
1164
|
|
|
1055
1165
|
res = xm.connect()
|
|
@@ -1374,14 +1484,14 @@ class TestMaster:
|
|
|
1374
1484
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
1375
1485
|
mock_selector.return_value.select.side_effect = ms.select
|
|
1376
1486
|
|
|
1377
|
-
with Master("eth", config=
|
|
1487
|
+
with Master("eth", config=create_config()) as xm:
|
|
1378
1488
|
ms.push_packet(self.DefaultConnectResponse)
|
|
1379
1489
|
|
|
1380
1490
|
res = xm.connect()
|
|
1381
1491
|
|
|
1382
1492
|
mock_socket.return_value.send.assert_called_with(self.DefaultConnectCmd)
|
|
1383
1493
|
|
|
1384
|
-
ms.push_packet(b"\
|
|
1494
|
+
ms.push_packet(b"\xff\x00\x01\x08\x2a\xff\x55")
|
|
1385
1495
|
|
|
1386
1496
|
res = xm.programStart()
|
|
1387
1497
|
|
|
@@ -1530,12 +1640,12 @@ class TestMaster:
|
|
|
1530
1640
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
1531
1641
|
mock_selector.return_value.select.side_effect = ms.select
|
|
1532
1642
|
|
|
1533
|
-
with Master("eth", config=
|
|
1643
|
+
with Master("eth", config=create_config()) as xm:
|
|
1534
1644
|
ms.push_packet(self.DefaultConnectResponse)
|
|
1535
1645
|
res = xm.connect()
|
|
1536
1646
|
mock_socket.return_value.send.assert_called_with(self.DefaultConnectCmd)
|
|
1537
1647
|
|
|
1538
|
-
ms.push_packet(b"\
|
|
1648
|
+
ms.push_packet(b"\xff\x01\x00\x02\x03\xff\xfe\xca")
|
|
1539
1649
|
res = xm.dbgAttach()
|
|
1540
1650
|
mock_socket.return_value.send.assert_called_with(bytes([0x03, 0x00, 0x01, 0x00, 0xC0, 0xFC, 0x00]))
|
|
1541
1651
|
|
|
@@ -1545,15 +1655,15 @@ class TestMaster:
|
|
|
1545
1655
|
assert res.timeout7 == 3
|
|
1546
1656
|
assert res.maxCtoDbg == 0xCAFE
|
|
1547
1657
|
|
|
1548
|
-
ms.push_packet(b"\
|
|
1658
|
+
ms.push_packet(b"\xff\x04\xfe\xca\xef\xbe\xad\xde")
|
|
1549
1659
|
res = xm.dbgGetVendorInfo()
|
|
1550
1660
|
mock_socket.return_value.send.assert_called_with(bytes([0x03, 0x00, 0x02, 0x00, 0xC0, 0xFC, 0x01]))
|
|
1551
1661
|
|
|
1552
1662
|
assert res.length == 4
|
|
1553
1663
|
assert res.vendorId == 0xCAFE
|
|
1554
|
-
assert res.vendorInfo == list(b"\
|
|
1664
|
+
assert res.vendorInfo == list(b"\xef\xbe\xad\xde")
|
|
1555
1665
|
|
|
1556
|
-
ms.push_packet(b"\
|
|
1666
|
+
ms.push_packet(b"\xff\xff\x04\x02\x01\x03")
|
|
1557
1667
|
res = xm.dbgGetModeInfo()
|
|
1558
1668
|
mock_socket.return_value.send.assert_called_with(bytes([0x03, 0x00, 0x03, 0x00, 0xC0, 0xFC, 0x02]))
|
|
1559
1669
|
|
|
@@ -1562,19 +1672,19 @@ class TestMaster:
|
|
|
1562
1672
|
assert res.feature == 1
|
|
1563
1673
|
assert res.serviceLevel == 3
|
|
1564
1674
|
|
|
1565
|
-
ms.push_packet(b"\
|
|
1675
|
+
ms.push_packet(b"\xff\xff\xff\xff\xbe\xba\xfe\xca")
|
|
1566
1676
|
res = xm.dbgGetJtagId()
|
|
1567
1677
|
mock_socket.return_value.send.assert_called_with(bytes([0x03, 0x00, 0x04, 0x00, 0xC0, 0xFC, 0x03]))
|
|
1568
1678
|
|
|
1569
1679
|
assert res.jtagId == 0xCAFEBABE
|
|
1570
1680
|
|
|
1571
|
-
ms.push_packet(b"\
|
|
1681
|
+
ms.push_packet(b"\xff")
|
|
1572
1682
|
res = xm.dbgHaltAfterReset()
|
|
1573
1683
|
mock_socket.return_value.send.assert_called_with(bytes([0x03, 0x00, 0x05, 0x00, 0xC0, 0xFC, 0x04]))
|
|
1574
1684
|
|
|
1575
1685
|
assert res == b""
|
|
1576
1686
|
|
|
1577
|
-
ms.push_packet(b"\
|
|
1687
|
+
ms.push_packet(b"\xff\x02\x01\x03\x01\x02\x02\x03\x02\x02")
|
|
1578
1688
|
res = xm.dbgGetHwioInfo(0)
|
|
1579
1689
|
mock_socket.return_value.send.assert_called_with(bytes([0x04, 0x00, 0x06, 0x00, 0xC0, 0xFC, 0x05, 0x00]))
|
|
1580
1690
|
|
|
@@ -1588,13 +1698,13 @@ class TestMaster:
|
|
|
1588
1698
|
assert res.pins[1].pinClass == 2
|
|
1589
1699
|
assert res.pins[1].state == 2
|
|
1590
1700
|
|
|
1591
|
-
ms.push_packet(b"\
|
|
1701
|
+
ms.push_packet(b"\xff")
|
|
1592
1702
|
res = xm.dbgSetHwioEvent(0, 1)
|
|
1593
1703
|
mock_socket.return_value.send.assert_called_with(bytes([0x05, 0x00, 0x07, 0x00, 0xC0, 0xFC, 0x06, 0x00, 0x01]))
|
|
1594
1704
|
|
|
1595
1705
|
assert res == b""
|
|
1596
1706
|
|
|
1597
|
-
ms.push_packet(b"\
|
|
1707
|
+
ms.push_packet(b"\xff\x01\x00")
|
|
1598
1708
|
res = xm.dbgHwioControl([[1, 2, 0], [2, 0, 0]])
|
|
1599
1709
|
mock_socket.return_value.send.assert_called_with(
|
|
1600
1710
|
bytes(
|
|
@@ -1622,13 +1732,13 @@ class TestMaster:
|
|
|
1622
1732
|
assert res[0] == 1
|
|
1623
1733
|
assert res[1] == 0
|
|
1624
1734
|
|
|
1625
|
-
ms.push_packet(b"\
|
|
1735
|
+
ms.push_packet(b"\xff")
|
|
1626
1736
|
res = xm.dbgExclusiveTargetAccess(1, 0)
|
|
1627
1737
|
mock_socket.return_value.send.assert_called_with(bytes([0x05, 0x00, 0x09, 0x00, 0xC0, 0xFC, 0x08, 0x01, 0x00]))
|
|
1628
1738
|
|
|
1629
1739
|
assert res == b""
|
|
1630
1740
|
|
|
1631
|
-
ms.push_packet(b"\
|
|
1741
|
+
ms.push_packet(b"\xff\xff\x02\x00\x01\x04\x03\x02\x01\x00\x02\xca\xfe\xba\xbe")
|
|
1632
1742
|
res = xm.dbgSequenceMultiple(0x3, 0)
|
|
1633
1743
|
mock_socket.return_value.send.assert_called_with(bytes([0x06, 0x00, 0x0A, 0x00, 0xC0, 0xFC, 0x09, 0x03, 0x00, 0x00]))
|
|
1634
1744
|
|
|
@@ -1640,17 +1750,17 @@ class TestMaster:
|
|
|
1640
1750
|
assert res.results[1].repeat == 2
|
|
1641
1751
|
assert res.results[1].tdo == 0xCAFEBABE
|
|
1642
1752
|
|
|
1643
|
-
ms.push_packet(b"\
|
|
1753
|
+
ms.push_packet(b"\xff\x02\x08\xaa\x10\xaa\x55")
|
|
1644
1754
|
res = xm.dbgLlt(0, 1)
|
|
1645
1755
|
mock_socket.return_value.send.assert_called_with(bytes([0x05, 0x00, 0x0B, 0x00, 0xC0, 0xFC, 0x0A, 0x00, 0x01]))
|
|
1646
1756
|
|
|
1647
1757
|
assert res.num == 2
|
|
1648
1758
|
assert res.results[0].length == 8
|
|
1649
|
-
assert res.results[0].data == list(b"\
|
|
1759
|
+
assert res.results[0].data == list(b"\xaa")
|
|
1650
1760
|
assert res.results[1].length == 16
|
|
1651
|
-
assert res.results[1].data == list(b"\
|
|
1761
|
+
assert res.results[1].data == list(b"\xaa\x55")
|
|
1652
1762
|
|
|
1653
|
-
ms.push_packet(b"\
|
|
1763
|
+
ms.push_packet(b"\xff\xff\xff\xff\x0d\xf0\xad\xba")
|
|
1654
1764
|
res = xm.dbgReadModifyWrite(1, 4, 0xCAFEBABE, 0xFFFFFFFF, 0xDEADBEEF)
|
|
1655
1765
|
mock_socket.return_value.send.assert_called_with(
|
|
1656
1766
|
bytes(
|
|
@@ -1689,7 +1799,7 @@ class TestMaster:
|
|
|
1689
1799
|
|
|
1690
1800
|
assert res.value == 0xBAADF00D
|
|
1691
1801
|
|
|
1692
|
-
ms.push_packet(b"\
|
|
1802
|
+
ms.push_packet(b"\xff")
|
|
1693
1803
|
res = xm.dbgWrite(1, 4, 0xAAAA0001, [0xDDDD0001, 0xDDDD0002])
|
|
1694
1804
|
mock_socket.return_value.send.assert_called_with(
|
|
1695
1805
|
bytes(
|
|
@@ -1728,7 +1838,7 @@ class TestMaster:
|
|
|
1728
1838
|
|
|
1729
1839
|
assert res == b""
|
|
1730
1840
|
|
|
1731
|
-
ms.push_packet(b"\
|
|
1841
|
+
ms.push_packet(b"\xff")
|
|
1732
1842
|
res = xm.dbgWriteNext(2, [0xDDDD0003, 0xDDDD0004])
|
|
1733
1843
|
mock_socket.return_value.send.assert_called_with(
|
|
1734
1844
|
bytes(
|
|
@@ -1759,7 +1869,7 @@ class TestMaster:
|
|
|
1759
1869
|
|
|
1760
1870
|
assert res == b""
|
|
1761
1871
|
|
|
1762
|
-
ms.push_packet(b"\
|
|
1872
|
+
ms.push_packet(b"\xff")
|
|
1763
1873
|
res = xm.dbgWriteCan1(1, 0xAAAA0001)
|
|
1764
1874
|
mock_socket.return_value.send.assert_called_with(
|
|
1765
1875
|
bytes(
|
|
@@ -1782,13 +1892,13 @@ class TestMaster:
|
|
|
1782
1892
|
|
|
1783
1893
|
assert res == b""
|
|
1784
1894
|
|
|
1785
|
-
ms.push_packet(b"\
|
|
1895
|
+
ms.push_packet(b"\xff")
|
|
1786
1896
|
res = xm.dbgWriteCan2(4, 2)
|
|
1787
1897
|
mock_socket.return_value.send.assert_called_with(bytes([0x05, 0x00, 0x10, 0x00, 0xC0, 0xFC, 0x0F, 0x04, 0x02]))
|
|
1788
1898
|
|
|
1789
1899
|
assert res == b""
|
|
1790
1900
|
|
|
1791
|
-
ms.push_packet(b"\
|
|
1901
|
+
ms.push_packet(b"\xff")
|
|
1792
1902
|
res = xm.dbgWriteCanNext(1, [0xCAFEBABE])
|
|
1793
1903
|
mock_socket.return_value.send.assert_called_with(
|
|
1794
1904
|
bytes(
|
|
@@ -1811,7 +1921,7 @@ class TestMaster:
|
|
|
1811
1921
|
|
|
1812
1922
|
assert res == b""
|
|
1813
1923
|
|
|
1814
|
-
ms.push_packet(b"\
|
|
1924
|
+
ms.push_packet(b"\xff\xff\xff\xff\x01\x00\xdd\xdd\x02\x00\xdd\xdd")
|
|
1815
1925
|
res = xm.dbgRead(1, 4, 2, 0xAAAA0001)
|
|
1816
1926
|
mock_socket.return_value.send.assert_called_with(
|
|
1817
1927
|
bytes(
|
|
@@ -1843,7 +1953,7 @@ class TestMaster:
|
|
|
1843
1953
|
assert res.data[0] == 0xDDDD0001
|
|
1844
1954
|
assert res.data[1] == 0xDDDD0002
|
|
1845
1955
|
|
|
1846
|
-
ms.push_packet(b"\
|
|
1956
|
+
ms.push_packet(b"\xff")
|
|
1847
1957
|
res = xm.dbgReadCan1(1, 0xAAAA0001)
|
|
1848
1958
|
mock_socket.return_value.send.assert_called_with(
|
|
1849
1959
|
bytes(
|
|
@@ -1866,7 +1976,7 @@ class TestMaster:
|
|
|
1866
1976
|
|
|
1867
1977
|
assert res == b""
|
|
1868
1978
|
|
|
1869
|
-
ms.push_packet(b"\
|
|
1979
|
+
ms.push_packet(b"\xff")
|
|
1870
1980
|
res = xm.dbgReadCan2(4, 2)
|
|
1871
1981
|
mock_socket.return_value.send.assert_called_with(bytes([0x05, 0x00, 0x14, 0x00, 0xC0, 0xFC, 0x13, 0x04, 0x02]))
|
|
1872
1982
|
|
|
@@ -1976,7 +2086,7 @@ class TestMaster:
|
|
|
1976
2086
|
)
|
|
1977
2087
|
|
|
1978
2088
|
assert res.length == 15
|
|
1979
|
-
assert res.data == list(b"\x81\x00\
|
|
2089
|
+
assert res.data == list(b"\x81\x00\x0a\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x03")
|
|
1980
2090
|
|
|
1981
2091
|
@mock.patch("pyxcp.transport.eth.socket.socket")
|
|
1982
2092
|
@mock.patch("pyxcp.transport.eth.selectors.DefaultSelector")
|
|
@@ -1986,7 +2096,7 @@ class TestMaster:
|
|
|
1986
2096
|
mock_socket.return_value.recv.side_effect = ms.recv
|
|
1987
2097
|
mock_selector.return_value.select.side_effect = ms.select
|
|
1988
2098
|
|
|
1989
|
-
with Master("eth", config=
|
|
2099
|
+
with Master("eth", config=create_config()) as xm:
|
|
1990
2100
|
ms.push_packet(self.DefaultConnectResponse)
|
|
1991
2101
|
|
|
1992
2102
|
res = xm.connect()
|