oep-client-python 0.0.45__py3-none-any.whl → 0.0.47__py3-none-any.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.
- oep_client/__init__.py +1 -1
- oep_client/acquire.py +85 -33
- oep_client/conformance/__init__.py +1 -1
- oep_client/conformance/capture_serial.py +1 -1
- oep_client/conformance/core_smoke.py +1 -1
- oep_client/conformance/host_core.py +1 -1
- oep_client/conformance/host_deadline.py +1 -1
- oep_client/conformance/host_requests.py +4 -4
- oep_client/conformance/host_wait.py +1 -1
- oep_client/conformance/oep_smoke.py +1 -1
- oep_client/fixture.py +8 -2
- oep_client/interfaces.py +1 -1
- oep_client/memo.py +1 -1
- oep_client/registry.py +1 -1
- oep_client/virtual_fixture_drive.py +2 -2
- {oep_client_python-0.0.45.dist-info → oep_client_python-0.0.47.dist-info}/METADATA +1 -1
- {oep_client_python-0.0.45.dist-info → oep_client_python-0.0.47.dist-info}/RECORD +20 -20
- {oep_client_python-0.0.45.dist-info → oep_client_python-0.0.47.dist-info}/WHEEL +0 -0
- {oep_client_python-0.0.45.dist-info → oep_client_python-0.0.47.dist-info}/entry_points.txt +0 -0
- {oep_client_python-0.0.45.dist-info → oep_client_python-0.0.47.dist-info}/licenses/LICENSE +0 -0
oep_client/__init__.py
CHANGED
oep_client/acquire.py
CHANGED
|
@@ -11,14 +11,25 @@ probe's facts out.
|
|
|
11
11
|
|
|
12
12
|
Logic channels go to oep.fixture.logic, analog ones to oep.fixture.analog; with both, oep.fixture.capture-group
|
|
13
13
|
starts them together, a trigger on either track as the group's trigger source (capture §4.4). A line is named as a
|
|
14
|
-
script keeps it - the probe's channel name (fn 0's channel_name, core §7.5) or a port's line label (
|
|
15
|
-
|
|
14
|
+
script keeps it - the probe's channel name (fn 0's channel_name, core §7.5) or a port's line label (host guide §5.3:
|
|
15
|
+
S.N by its role, S@P by the target pin) - and looked up on the session (a channel number holds for one boot only); a track's channels are its plan roles
|
|
16
16
|
0..C-1 in the order given. The plans are released afterwards.
|
|
17
17
|
|
|
18
18
|
Modes: "oneshot" (the probe's memory), "repeat" (`segments` acquisitions read and released as they come: with a
|
|
19
19
|
trigger one part each, layout "segments"; without, a timeline), "stream" (for `seconds`, sent as taken,
|
|
20
20
|
put together on disk while it runs: a timeline, cut where data was lost).
|
|
21
21
|
|
|
22
|
+
A stream can run while the script does its steps on the same session (marking sections, sending console commands):
|
|
23
|
+
`during=steps` in place of `seconds` streams until steps(wait) returns, `wait(seconds)` collecting while it waits.
|
|
24
|
+
Steps should call wait often (the probe holds only its stream buffer meanwhile); a loss with on_loss "stop" raises
|
|
25
|
+
StreamStopped out of wait, and the stream ends there.
|
|
26
|
+
|
|
27
|
+
def steps(wait):
|
|
28
|
+
for duty in (64, 128):
|
|
29
|
+
with rec.section(2, f"duty={duty}"):
|
|
30
|
+
console.write(f"PWM {duty}\n".encode()); wait(0.5)
|
|
31
|
+
res = acquire.capture(hst, acquire.Request(chans, 1_000_000, 0, mode="stream", during=steps))
|
|
32
|
+
|
|
22
33
|
Times: tick 0 of a part is its first logic sample, `start_ns` on the probe's clock; an analog channel starts at
|
|
23
34
|
t0_ticks = (its segment's start_ns - that) plus its skew_ns, in ticks. These are the probe's estimates; each track's
|
|
24
35
|
uncertainty is kept. ADC values are kept raw with the probe's linear conversion; the input range, reference, Vrefint
|
|
@@ -37,13 +48,14 @@ import array
|
|
|
37
48
|
import math
|
|
38
49
|
import struct
|
|
39
50
|
import sys
|
|
51
|
+
from collections.abc import Callable
|
|
40
52
|
from dataclasses import dataclass, field
|
|
41
53
|
from fractions import Fraction
|
|
42
54
|
from pathlib import Path
|
|
43
55
|
|
|
44
56
|
from . import registry as _reg
|
|
45
57
|
|
|
46
|
-
__all__ = ["Analog", "Bits", "Changes", "OnDisk", "Part", "Request", "Result", "capture", "capture_at"]
|
|
58
|
+
__all__ = ["Analog", "Bits", "Changes", "OnDisk", "Part", "Request", "Result", "StreamStopped", "capture", "capture_at"]
|
|
47
59
|
|
|
48
60
|
TRIGGERS = ("high", "low", "rise", "fall", "both")
|
|
49
61
|
ANALOG_TRIGGERS = ("high", "low", "rise", "fall")
|
|
@@ -52,7 +64,8 @@ ANALOG_TRIGGERS = ("high", "low", "rise", "fall")
|
|
|
52
64
|
@dataclass
|
|
53
65
|
class Request:
|
|
54
66
|
channels: list[tuple[str, str]] # logic: (name to record, the line): the probe's channel name (fn 0's
|
|
55
|
-
# channel_name, GPIO47) or a port's line label (S.N, x035.swdio
|
|
67
|
+
# channel_name, GPIO47) or a port's line label (S.N, x035.swdio; S@P,
|
|
68
|
+
# x035@pb9), in order
|
|
56
69
|
rate: int # logic samples per second asked for (the probe may answer another)
|
|
57
70
|
samples: int
|
|
58
71
|
trigger: tuple | None = None # (logic channel, one of TRIGGERS) or (analog channel, rise / fall / high /
|
|
@@ -69,6 +82,8 @@ class Request:
|
|
|
69
82
|
segments: int | None = None # repeat: how many acquisitions
|
|
70
83
|
on_loss: str = "stop" # stream: "stop" at the first loss, or "continue" to the end
|
|
71
84
|
spool_dir: str | None = None # stream: where its channels are put together on disk while it runs
|
|
85
|
+
during: Callable[[Callable[[float], None]], None] | None = None # stream: instead of `seconds`, runs until this
|
|
86
|
+
# returns - called with wait(seconds), which collects while it waits
|
|
72
87
|
|
|
73
88
|
def __post_init__(self):
|
|
74
89
|
names = [n for n, _ in self.channels] + [n for n, *_ in self.analog]
|
|
@@ -92,8 +107,10 @@ class Request:
|
|
|
92
107
|
raise ValueError("repeat: logic channels only")
|
|
93
108
|
elif self.segments is not None:
|
|
94
109
|
raise ValueError("segments is for repeat only")
|
|
95
|
-
if self.
|
|
96
|
-
raise ValueError("a stream
|
|
110
|
+
if self.during is not None and (self.mode != "stream" or self.seconds is not None):
|
|
111
|
+
raise ValueError("during is for a stream, in place of seconds")
|
|
112
|
+
if self.mode == "stream" and self.during is None and not (self.seconds and self.seconds > 0):
|
|
113
|
+
raise ValueError("a stream needs seconds (how long) or during")
|
|
97
114
|
if self.arm not in ("pretrigger", "now"):
|
|
98
115
|
raise ValueError(f"arm {self.arm!r}: pretrigger or now")
|
|
99
116
|
logic = {n for n, _ in self.channels}
|
|
@@ -567,7 +584,8 @@ def _describe(core, hst, fn: int) -> list[tuple[int, bytes]]:
|
|
|
567
584
|
|
|
568
585
|
def _channels(core, hst, lines: list[str]) -> list[int]:
|
|
569
586
|
"""The probe's channel numbers (valid for this boot) of lines named as kept in scripts: a channel name (fn 0's
|
|
570
|
-
channel_name, core §7.5; GPIO47) or a port's line label (
|
|
587
|
+
channel_name, core §7.5; GPIO47) or a port's line label (host guide §5.3: S.N by its role, x035.swdio; S@P by the target pin, x035@pb9). ASCII
|
|
588
|
+
case aside."""
|
|
571
589
|
if not lines:
|
|
572
590
|
return []
|
|
573
591
|
from . import registry, settings
|
|
@@ -581,11 +599,13 @@ def _channels(core, hst, lines: list[str]) -> list[int]:
|
|
|
581
599
|
labels = None
|
|
582
600
|
out = []
|
|
583
601
|
for line in lines:
|
|
584
|
-
|
|
585
|
-
if
|
|
602
|
+
label = settings.parse_label(line)
|
|
603
|
+
if label is not None:
|
|
586
604
|
if labels is None:
|
|
587
605
|
labels = settings.labels(hst)
|
|
588
|
-
|
|
606
|
+
port, role, pin = label
|
|
607
|
+
ch = (settings.line_from_labels(labels, role, port) if role
|
|
608
|
+
else settings.pin_from_labels(labels, pin, port))
|
|
589
609
|
if ch is None:
|
|
590
610
|
raise ValueError(f"{line}: no channel carries that label (host guide §5.3)")
|
|
591
611
|
else:
|
|
@@ -1133,6 +1153,35 @@ STREAM_MAX_DELAY_MS = 20 # ... or after this long. With (0, 0) the P4X sent eac
|
|
|
1133
1153
|
# quiet lines) as a transfer of its own, 2000 a second, and dropped 35 % it could not send
|
|
1134
1154
|
|
|
1135
1155
|
|
|
1156
|
+
class StreamStopped(Exception):
|
|
1157
|
+
"""Raised by a stream's `wait` (Request.during) when data was lost and on_loss is "stop": the stream stops there."""
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
def _drive(req: Request, poll, lost) -> None:
|
|
1161
|
+
"""Collect a started stream: for req.seconds, or while req.during(wait) runs - its `wait(seconds)` collecting
|
|
1162
|
+
meanwhile. poll(seconds) takes what comes, lost() says whether anything was lost; with on_loss "stop" a loss ends
|
|
1163
|
+
it (a StreamStopped out of wait, caught here)."""
|
|
1164
|
+
import time
|
|
1165
|
+
|
|
1166
|
+
def wait(seconds: float) -> None:
|
|
1167
|
+
deadline = time.monotonic() + seconds
|
|
1168
|
+
while True:
|
|
1169
|
+
now = time.monotonic()
|
|
1170
|
+
if now >= deadline:
|
|
1171
|
+
return
|
|
1172
|
+
poll(min(STREAM_POLL_S, deadline - now))
|
|
1173
|
+
if req.on_loss == "stop" and lost():
|
|
1174
|
+
raise StreamStopped("data was lost while streaming")
|
|
1175
|
+
|
|
1176
|
+
try:
|
|
1177
|
+
if req.during is None:
|
|
1178
|
+
wait(req.seconds)
|
|
1179
|
+
else:
|
|
1180
|
+
req.during(wait)
|
|
1181
|
+
except StreamStopped:
|
|
1182
|
+
pass
|
|
1183
|
+
|
|
1184
|
+
|
|
1136
1185
|
def _collect_group(group, tracks, link, req: Request, oc, spool=None):
|
|
1137
1186
|
"""_collect for a group's streaming tracks (capture §4.1: each subscribed, started at once): -> ({fn: Received},
|
|
1138
1187
|
seconds). The first track's Received goes to the spool as it comes; a loss in any track stops it with "stop"."""
|
|
@@ -1141,20 +1190,22 @@ def _collect_group(group, tracks, link, req: Request, oc, spool=None):
|
|
|
1141
1190
|
t.subscribe(STREAM_MIN_BYTES, STREAM_MAX_DELAY_MS)
|
|
1142
1191
|
group.start(tracks)
|
|
1143
1192
|
t_read = time.monotonic()
|
|
1144
|
-
|
|
1193
|
+
got = {t.fn: oc.Received() for t in tracks}
|
|
1145
1194
|
lead = tracks[0].fn
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
break
|
|
1150
|
-
got = group.stream(link, tracks, seconds=min(STREAM_POLL_S, deadline - now), into=got)
|
|
1195
|
+
|
|
1196
|
+
def poll(seconds):
|
|
1197
|
+
group.stream(link, tracks, seconds=seconds, into=got)
|
|
1151
1198
|
if spool is not None:
|
|
1152
1199
|
spool.take(got[lead])
|
|
1153
|
-
|
|
1200
|
+
|
|
1201
|
+
def lost():
|
|
1202
|
+
return (spool is not None and spool.lost) or any(
|
|
1154
1203
|
g.gaps or (g.start or 0) > 0 for fn, g in got.items() if spool is None or fn != lead)
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1204
|
+
|
|
1205
|
+
try:
|
|
1206
|
+
_drive(req, poll, lost)
|
|
1207
|
+
finally:
|
|
1208
|
+
group.stop() # also when the caller's `during` raised: the probe is left stopped
|
|
1158
1209
|
got = group.finish(link, tracks, got)
|
|
1159
1210
|
return got, time.monotonic() - t_read
|
|
1160
1211
|
|
|
@@ -1182,25 +1233,26 @@ def _analog_runs(an, acfg, got) -> tuple[list, list]:
|
|
|
1182
1233
|
|
|
1183
1234
|
|
|
1184
1235
|
def _collect(track, link, req: Request, oc, spool=None):
|
|
1185
|
-
"""Subscribe, start, collect for req.seconds, stop and collect the rest -> (Received,
|
|
1186
|
-
at once with on_loss "stop"."""
|
|
1236
|
+
"""Subscribe, start, collect for req.seconds (or while req.during runs), stop and collect the rest -> (Received,
|
|
1237
|
+
seconds). A loss stops it at once with on_loss "stop"."""
|
|
1187
1238
|
import time
|
|
1188
1239
|
track.subscribe(STREAM_MIN_BYTES, STREAM_MAX_DELAY_MS) # batched: a capture wants bandwidth, not a frame per block
|
|
1189
1240
|
track.start()
|
|
1190
1241
|
t_read = time.monotonic()
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
break
|
|
1196
|
-
got = track.stream(link, seconds=min(STREAM_POLL_S, deadline - now), into=got)
|
|
1242
|
+
got = oc.Received()
|
|
1243
|
+
|
|
1244
|
+
def poll(seconds): # stream() renews the lease across calls on the same Received
|
|
1245
|
+
track.stream(link, seconds=seconds, into=got)
|
|
1197
1246
|
if spool is not None: # put together as it comes: memory holds a poll's worth, not the stream
|
|
1198
1247
|
spool.take(got)
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1248
|
+
|
|
1249
|
+
def lost():
|
|
1250
|
+
return spool.lost if spool is not None else bool(got.gaps or (got.start or 0) > 0)
|
|
1251
|
+
|
|
1252
|
+
try:
|
|
1253
|
+
_drive(req, poll, lost)
|
|
1254
|
+
finally:
|
|
1255
|
+
track.stop()
|
|
1204
1256
|
got = track.finish(link, got)
|
|
1205
1257
|
return got, time.monotonic() - t_read
|
|
1206
1258
|
|
|
@@ -145,7 +145,7 @@ def checker_sources_sha256():
|
|
|
145
145
|
for name in CHECKER_SOURCES}
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
REVIEWED_CORE_SHA256 = '
|
|
148
|
+
REVIEWED_CORE_SHA256 = '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a' # oep-spec docs/oep-core.ja.md
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
def require_reviewed_contract(registry, spec=None):
|
|
@@ -17,7 +17,7 @@ def refused_stale(reply):
|
|
|
17
17
|
return reply[3:5]==b'\0\4' and refusal_carries('unavailable',reply[5:],b'\1\1\0\6')
|
|
18
18
|
from .host_deadline import reviewed_identity as core_identity
|
|
19
19
|
|
|
20
|
-
REVIEWED={'interfaces/oep-if-capture.ja.md':'
|
|
20
|
+
REVIEWED={'interfaces/oep-if-capture.ja.md':'786bf349dfe322cee7b0d13e9d250cee2d0778bef3590ae751b2e87b11bb2fd3',
|
|
21
21
|
'interfaces/oep-if-common.ja.md':'25fed0b1b8b7f246a8b71d02cea810249803b1c3c1e9c3df466c04f38687f70c'}
|
|
22
22
|
|
|
23
23
|
def reviewed_identity(path):
|
|
@@ -8,7 +8,7 @@ import struct
|
|
|
8
8
|
from . import ops, require, tlvs
|
|
9
9
|
from .. import conformance as _helpers
|
|
10
10
|
|
|
11
|
-
REVIEWED_CORE_SHA256 = '
|
|
11
|
+
REVIEWED_CORE_SHA256 = '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a' # oep-spec docs/oep-core.ja.md
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class CoreSmokeChecks:
|
|
@@ -4,7 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
import struct
|
|
5
5
|
from . import require,spec_identity
|
|
6
6
|
|
|
7
|
-
REVIEWED_CORE_SHA256='
|
|
7
|
+
REVIEWED_CORE_SHA256='0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a'
|
|
8
8
|
CORE_OPS={'confirm':1,'list':2,'describe':3,'clock':4,'open':16,'end':17,'keepalive':18,'lock_state':19}
|
|
9
9
|
# the settings' ops (core §13.5 / §13.7, transports §7.3): their numbers reviewed, their results not read here
|
|
10
10
|
SETTINGS_OPS={'get':32,'set':33,'unset':34,'save':35,'state':36,'network':37}
|
|
@@ -9,7 +9,7 @@ from pathlib import Path
|
|
|
9
9
|
from . import require,spec_identity
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
REVIEWED={'docs/oep-core.ja.md':'
|
|
12
|
+
REVIEWED={'docs/oep-core.ja.md':'0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
|
|
13
13
|
'docs/oep-transports.ja.md':'2e99bf8039a3d8f5b55c80b66ac97ac40ddf7ad4711079177ffc947c5790103f'}
|
|
14
14
|
QUICK_MS=1000 # core_quick_op_max_ms
|
|
15
15
|
|
|
@@ -11,12 +11,12 @@ from . import require, spec_identity
|
|
|
11
11
|
|
|
12
12
|
REVIEWED = {
|
|
13
13
|
'interfaces/oep-if-plan.ja.md': 'da8bd60af53499573c07bc33dbd8c4df93eb61a93b91dc57907f26620ae36bbf',
|
|
14
|
-
'interfaces/oep-if-fixture.ja.md': '
|
|
15
|
-
'docs/oep-core.ja.md': '
|
|
14
|
+
'interfaces/oep-if-fixture.ja.md': '777a972349a14d1efa6e4575d3118b4e0566b81a6f22320401d529e4dca585f1',
|
|
15
|
+
'docs/oep-core.ja.md': '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
|
|
16
16
|
'interfaces/oep-if-debug.ja.md': '1f490ab984c5820b29acfee923b9400849a3d0011c9ed6bb7144397d8dd29d38',
|
|
17
|
-
'interfaces/oep-if-capture.ja.md': '
|
|
17
|
+
'interfaces/oep-if-capture.ja.md': '786bf349dfe322cee7b0d13e9d250cee2d0778bef3590ae751b2e87b11bb2fd3',
|
|
18
18
|
}
|
|
19
|
-
REVIEWED_REGISTRY_SHA256='
|
|
19
|
+
REVIEWED_REGISTRY_SHA256='5fccf16a1d0ea2857834f2f4d83deca2294b3d5ef65b80e06a3b9020f78224ae'
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def reviewed_identity(spec):
|
|
@@ -6,7 +6,7 @@ from .. import registry as _reg
|
|
|
6
6
|
SAVE=_reg.CORE.op['save'] # fn 0's save (core §13.7)
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
REVIEWED={'docs/oep-core.ja.md':'
|
|
9
|
+
REVIEWED={'docs/oep-core.ja.md':'0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
|
|
10
10
|
'docs/oep-transports.ja.md':'2e99bf8039a3d8f5b55c80b66ac97ac40ddf7ad4711079177ffc947c5790103f'}
|
|
11
11
|
QUICK_MS=1000 # core_quick_op_max_ms
|
|
12
12
|
|
|
@@ -7,7 +7,7 @@ import struct
|
|
|
7
7
|
from . import ops, require, tlvs
|
|
8
8
|
|
|
9
9
|
REVIEWED_INTERFACES = { # oep-spec interfaces/
|
|
10
|
-
'oep-if-fixture.ja.md': '
|
|
10
|
+
'oep-if-fixture.ja.md': '777a972349a14d1efa6e4575d3118b4e0566b81a6f22320401d529e4dca585f1',
|
|
11
11
|
'oep-if-plan.ja.md': 'da8bd60af53499573c07bc33dbd8c4df93eb61a93b91dc57907f26620ae36bbf',
|
|
12
12
|
'oep-if-debug.ja.md': '1f490ab984c5820b29acfee923b9400849a3d0011c9ed6bb7144397d8dd29d38',
|
|
13
13
|
'oep-if-common.ja.md': '25fed0b1b8b7f246a8b71d02cea810249803b1c3c1e9c3df466c04f38687f70c',
|
oep_client/fixture.py
CHANGED
|
@@ -559,8 +559,11 @@ class SpiController(_TargetDeclarations, Interface):
|
|
|
559
559
|
|
|
560
560
|
def transfer(self, items: list[SpiItem]) -> list[SpiDone]:
|
|
561
561
|
rd = m.Reader(self._call(self.TRANSFER, self.transfer_body(items)).payload)
|
|
562
|
+
n = rd.u8() # the answer's count (core §2.3)
|
|
563
|
+
if n != len(items):
|
|
564
|
+
raise m.ProtocolError(f"spi-controller transfer: {n} answered for {len(items)} asked")
|
|
562
565
|
done = []
|
|
563
|
-
for _ in
|
|
566
|
+
for _ in range(n):
|
|
564
567
|
gap, setup, hold = rd.take("III")
|
|
565
568
|
done.append(SpiDone(gap_ns=gap, setup_ns=setup, hold_ns=hold, rx=rd.counted("H")))
|
|
566
569
|
rd.tail()
|
|
@@ -631,7 +634,10 @@ class Pwm(_TargetDeclarations, Interface):
|
|
|
631
634
|
"""(role, hz, duty) each, in order -> what the probe made of each."""
|
|
632
635
|
body = struct.pack("<B", len(outputs)) + b"".join(struct.pack("<BIH", r, hz, d) for r, hz, d in outputs)
|
|
633
636
|
rd = m.Reader(self._call(self.SET, body).payload)
|
|
634
|
-
|
|
637
|
+
n = rd.u8() # the answer's count (core §2.3)
|
|
638
|
+
if n != len(outputs):
|
|
639
|
+
raise m.ProtocolError(f"pwm set: {n} answered for {len(outputs)} asked")
|
|
640
|
+
made = self._outputs(rd, n)
|
|
635
641
|
rd.tail()
|
|
636
642
|
return made
|
|
637
643
|
|
oep_client/interfaces.py
CHANGED
|
@@ -129,7 +129,7 @@ KNOWN: dict[str, Known] = {
|
|
|
129
129
|
"oep.probe.link": Known("the link test (source, sink) and, when its ops offer it, port_speed on a UART bridge"),
|
|
130
130
|
"oep.probe.memo": Known("the memo area: named objects the host keeps on the probe (list, read, write, delete)",
|
|
131
131
|
tags=_d("oep.probe.memo", ("max_object", "max object bytes", _u32),
|
|
132
|
-
("max_objects", "max objects",
|
|
132
|
+
("max_objects", "max objects", _u16))),
|
|
133
133
|
"oep.probe.plan": Known("the plan: which channel each role of an interface uses (plan_apply, plan_release)",
|
|
134
134
|
tags=_d("oep.probe.plan", ("plan_roles", "plan roles", _u32))),
|
|
135
135
|
"oep.probe.restart": Known("the probe restarts itself, answering first",
|
oep_client/memo.py
CHANGED
|
@@ -51,7 +51,7 @@ class Memo:
|
|
|
51
51
|
self.fn = core.find(hst, _R.name) if fn is None else fn
|
|
52
52
|
found = dict(core.describe(hst, self.fn))
|
|
53
53
|
self.max_object = struct.unpack("<I", found[_R.tlv["describe"]["max_object"]])[0]
|
|
54
|
-
self.max_objects = struct.unpack("<
|
|
54
|
+
self.max_objects = struct.unpack("<H", found[_R.tlv["describe"]["max_objects"]])[0]
|
|
55
55
|
|
|
56
56
|
def _frame(self) -> int:
|
|
57
57
|
return getattr(self.h.link, "max_frame", reg.MIN_MAX_FRAME)
|
oep_client/registry.py
CHANGED
|
@@ -305,7 +305,7 @@ class FixtureDrive:
|
|
|
305
305
|
if nanos // 1_000_000 > MAX_OP_MS:
|
|
306
306
|
raise unsupported_fixed()
|
|
307
307
|
up = lambda ns: -(-ns // step) * step # noqa: E731 the nearest step at or above
|
|
308
|
-
out =
|
|
308
|
+
out = bytes([n]) # n first (core §2.3)
|
|
309
309
|
for k, (gap, setup, hold, tx) in enumerate(items):
|
|
310
310
|
wire = bytes(reverse_bits(b) for b in tx) if st.bit_order else tx # the order on MOSI (§4)
|
|
311
311
|
miso = self.spi_device[fn](st.mode, wire)[:len(tx)] if tx else b""
|
|
@@ -336,7 +336,7 @@ class FixtureDrive:
|
|
|
336
336
|
raise unsupported_fixed()
|
|
337
337
|
if any(r not in planned for r in roles):
|
|
338
338
|
raise unavailable("wrong_state")
|
|
339
|
-
out =
|
|
339
|
+
out = bytes([n]) # n first (core §2.3)
|
|
340
340
|
for role, hz, duty in rows:
|
|
341
341
|
if hz == 0:
|
|
342
342
|
made = (0, 1, 0) # stopped: the line driven low
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: oep-client-python
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.47
|
|
4
4
|
Summary: Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench
|
|
5
5
|
Project-URL: Homepage, https://github.com/Open-Embedded-Probe/oep-client-python
|
|
6
6
|
Project-URL: Repository, https://github.com/Open-Embedded-Probe/oep-client-python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
oep_client/__init__.py,sha256=
|
|
1
|
+
oep_client/__init__.py,sha256=SJtIdmZwlVWpTrZFXfUmNy4LSawSb5TuRDhPAnsFzcI,164
|
|
2
2
|
oep_client/__main__.py,sha256=kbXBtEmFdhRXbVqXEbWCO-_5aDa-KyqMcW2HLZb5fjc,31510
|
|
3
|
-
oep_client/acquire.py,sha256=
|
|
3
|
+
oep_client/acquire.py,sha256=js4hRYX2kG7JVfQuLgO6fveRF9t1nOjz7PozuRbkUU0,102529
|
|
4
4
|
oep_client/arm.py,sha256=SszSLae8zErD4T-a1uQ6s6o3Lz7pe2SR8d3Qy-wi5rY,15633
|
|
5
5
|
oep_client/capture.py,sha256=fvLqs4Ltot4pyOdQiCWIzf_v1j_iduCxU4rrX6oWfg8,76245
|
|
6
6
|
oep_client/capture_blocks.py,sha256=dPrrZ8K-ISF80w6UumKVst5XNt0IjUk9lxbVvFnUEqg,20836
|
|
@@ -13,22 +13,22 @@ oep_client/decode.py,sha256=6pTFVBT0MLAKedZLVKyd5yT8hjrRw4fdDjnoDiE9XRs,2380
|
|
|
13
13
|
oep_client/discovery.py,sha256=oES0_NkR1Hc9E_cgPcfW8qfevQcVuYmayMaHuqufdO8,20180
|
|
14
14
|
oep_client/dump.py,sha256=9rfO07q1EOY4aLFZkm_9RO8awjxNQa75DIDeKAoF_ac,12995
|
|
15
15
|
oep_client/endpoint.py,sha256=A4fCeCwMCXOpsY4zeVy1LG_rG5SvYfImKRP153dIC5I,237768
|
|
16
|
-
oep_client/fixture.py,sha256=
|
|
16
|
+
oep_client/fixture.py,sha256=gMc6TRAlXBEMBFg6aCBkGGJvbIJsGBSfUdk0genD_Y8,34397
|
|
17
17
|
oep_client/frames.py,sha256=FM1AGn5NY_e-r1yKBsDkEEOqNrk5XTrlKA5Mq6Ycqiw,4984
|
|
18
18
|
oep_client/hardware.py,sha256=RboxkRxkQJ3DbNJEXyyiOFYlLFKGxrlcSwHho8zFC1U,30256
|
|
19
19
|
oep_client/hid_stream.py,sha256=1dG1C5rSqSWs2f0WpzMOKdFd3oY_mzF7z9SxUztjpQA,14093
|
|
20
20
|
oep_client/host.py,sha256=sVNbxZmG1jLj0NdzcepJh-NqouQX9Z7-_NOjhcqxJTQ,47875
|
|
21
|
-
oep_client/interfaces.py,sha256=
|
|
21
|
+
oep_client/interfaces.py,sha256=11u--9TC658b39QpEDB5BLhZeNDJUtRvl-2UFV2Aaj4,12222
|
|
22
22
|
oep_client/kept_session.py,sha256=S45NwNjeZry5kc5HAyk_orqXKAYf26MuyjJ2ojT51FQ,8084
|
|
23
23
|
oep_client/link.py,sha256=w69EoUga16HPW5Vw-8YnQtND3QxhRbcoteJJ8bMYHUk,146085
|
|
24
24
|
oep_client/linktest.py,sha256=zj9Ek28VkjyuIPsiU3iF-UEZmY_xMnNjNL-vK-jOQ3Q,10258
|
|
25
|
-
oep_client/memo.py,sha256=
|
|
25
|
+
oep_client/memo.py,sha256=UOrbgFg7MHK6VtHbddzaH6DXy1Gz6rjLZAyih7WsZpY,3710
|
|
26
26
|
oep_client/message.py,sha256=Kw-PwkMCwa8VGUBd1HWTXe8Epe4FwNcBx8262mWx2rk,14152
|
|
27
27
|
oep_client/names.py,sha256=ohrRvQNURraYyJ-BtjHRwxGt_GLq-t8IO0aOji9Dhe0,3531
|
|
28
28
|
oep_client/pins.py,sha256=iXswbqvze0KED1WNHLnjG5sn-_SjoJrIvcjj84LU_jU,53670
|
|
29
29
|
oep_client/probe_log.py,sha256=gAamfON2M7lMH3xOn4Wpmes_Wp0H4c2EBNbpXjIvCMM,4927
|
|
30
30
|
oep_client/pytest_conformance.py,sha256=-bcJU2E1UE4xjQ7HZjaIgtp0l65cIibBTNFnaW2tews,2929
|
|
31
|
-
oep_client/registry.py,sha256=
|
|
31
|
+
oep_client/registry.py,sha256=zWT_wlKQ0Awet7hAbm_SGarBjRT1oXAvKEdExUJJ-pw,22611
|
|
32
32
|
oep_client/riscv.py,sha256=o_YElQuJZoBUzqO7QV9VkWVeD4UE2pUx_ciR_TMHRWI,60419
|
|
33
33
|
oep_client/rp2350.py,sha256=7OMyj270k3AY1e3-ljicPwOjf9jOlokbT6QNkA0b0yY,4227
|
|
34
34
|
oep_client/settings.py,sha256=wVRpvAmcvDygVE9PCbo4-7k-tq6pIzKh7VRlmtLO1Fk,26391
|
|
@@ -45,9 +45,9 @@ oep_client/virtual_bench_serve.py,sha256=LPjvXcfVpixOyhGM1-oZpDqjJfD53eKOrhpAdoX
|
|
|
45
45
|
oep_client/virtual_bench_trigger.py,sha256=2c3gGOM8wXucTXbc1bTKQ5haX7bAkGJeOryGghrtcRk,23874
|
|
46
46
|
oep_client/virtual_bench_usb.py,sha256=cnewgbsl30b0PgwkfebwSf3xjKyPg9y8vTd5Jew5r9o,4001
|
|
47
47
|
oep_client/virtual_core.py,sha256=F-UxtQIld4eE04_M8j4ANMlQ12jXANzfTnfn59kUWHk,10716
|
|
48
|
-
oep_client/virtual_fixture_drive.py,sha256=
|
|
48
|
+
oep_client/virtual_fixture_drive.py,sha256=3i5ss_bxIJFsRDb5S-GJ0Nb9QDyOBv_SwF9CDP6nPfE,21844
|
|
49
49
|
oep_client/virtual_names.py,sha256=p72ME65R9Jy56xmVYnVCtapK3Id8iFpAdI5xLe2tNZ0,1449
|
|
50
|
-
oep_client/conformance/__init__.py,sha256=
|
|
50
|
+
oep_client/conformance/__init__.py,sha256=P_RyiWnULdDQMKyo0eCnE7VLv3v7Ps7lnVCY1hfOjdA,64739
|
|
51
51
|
oep_client/conformance/allocator.py,sha256=dYR5ZcCVW-LjoZVx4W9Ad76L8Ol8Pu1aOkj78A9UY1E,6251
|
|
52
52
|
oep_client/conformance/allocator_model.py,sha256=j6l1E1Hlju1jNeFQ_N0a2mDaegaTeyk6iScqzMpvvTc,1563
|
|
53
53
|
oep_client/conformance/allocator_sample.py,sha256=xtiXuZa3VDTilrZArIWOiRyOkuXJ98_rY2M65sIVvpo,855
|
|
@@ -72,7 +72,7 @@ oep_client/conformance/capture_group_model.py,sha256=mZV51aKXcmP0-hWes2QTjwU9siq
|
|
|
72
72
|
oep_client/conformance/capture_group_sample.py,sha256=VA30d65lOp9KGIK2eaCnLA_4MJwF6QY4voCL8ByQ0lU,1022
|
|
73
73
|
oep_client/conformance/capture_metadata.py,sha256=5IZufTjSu1g2yRu7yCdR6aPn0C78ujxLfJ2uJfUjgD0,4063
|
|
74
74
|
oep_client/conformance/capture_metadata_model.py,sha256=m10SLdFzhOu53-dpkEaSLjCYtO3w1uu4zTamXkT7bX4,1511
|
|
75
|
-
oep_client/conformance/capture_serial.py,sha256=
|
|
75
|
+
oep_client/conformance/capture_serial.py,sha256=Gycz8TawI9lLkdxasblojuEKNGx3Ki1xXqFrjoelwJY,8667
|
|
76
76
|
oep_client/conformance/capture_serial_sample.py,sha256=vJ8xNwZFH-_9V0LoAZU5tJ79yxO0KMgTFOQAXG3FPAI,4271
|
|
77
77
|
oep_client/conformance/capture_timeline.py,sha256=FSzYmkqQ0JIDuWlpohM9kdI5pvCT7H4Zo3J2k73XuZo,21772
|
|
78
78
|
oep_client/conformance/capture_timeline_lifecycle.py,sha256=CzxjyhmaRiBb_2qY9qo60A_qMkaz-Y9h7a8hFffMYrk,16034
|
|
@@ -82,7 +82,7 @@ oep_client/conformance/clock.py,sha256=bDqBjih71zg_mhkgCSryzKI_N8FEoGoGv9jO4PMYD
|
|
|
82
82
|
oep_client/conformance/clock_model.py,sha256=jyB8oTVR5sqbzeJCCWxdQBnzNNl4_uITLLYQ-yx8pRU,2568
|
|
83
83
|
oep_client/conformance/clock_sample.py,sha256=x24mSpQoOamrXrinmnF_Tk4NPk76LwS6ZhfuK2SCwCo,673
|
|
84
84
|
oep_client/conformance/core_fixed_fields.py,sha256=LRFP9yGOjDHQM1diX1HMdwXh9jMgAOY6xIC-woCikSk,6297
|
|
85
|
-
oep_client/conformance/core_smoke.py,sha256=
|
|
85
|
+
oep_client/conformance/core_smoke.py,sha256=np7SZ3yVdD0imiFyjBjAT_J8KK_EmtUiJAeplUNpYR8,10815
|
|
86
86
|
oep_client/conformance/corr.py,sha256=P6ljdsXpBq-vyEXRWOB1MqACQjT6HRBXgfAxgkyPjl4,6552
|
|
87
87
|
oep_client/conformance/cut.py,sha256=4B8szd6_QtcGtYMWgP86ABsXUDOFVgwWaWCpTWMDO80,7942
|
|
88
88
|
oep_client/conformance/cut_model.py,sha256=bHPnK8vKoInKVslW0KlJXRRgpGK-7ktIVGUEXo60X34,4791
|
|
@@ -117,21 +117,21 @@ oep_client/conformance/gpio_lifecycle_model.py,sha256=K0nzlXf-43kj3jsfaAuzEWOftO
|
|
|
117
117
|
oep_client/conformance/gpio_lifecycle_sample.py,sha256=Yk1WENQ-2tbPCM2yUY4Yk9dgWkjIfL42VtUSpx1qhhM,369
|
|
118
118
|
oep_client/conformance/gpio_model.py,sha256=CXy42K8cdRSTBxLC44h-gTYhjh3HrduSehsgsbvmDpo,5633
|
|
119
119
|
oep_client/conformance/gpio_sample.py,sha256=JHsOrjkYcM738IGSzP5q7v5vANETwKT6-csCTxH55MQ,490
|
|
120
|
-
oep_client/conformance/host_core.py,sha256=
|
|
120
|
+
oep_client/conformance/host_core.py,sha256=RaCD86ehLC1w35hjXu0ekQ6hKTtoljdnReYTttll4KE,12634
|
|
121
121
|
oep_client/conformance/host_core_sample.py,sha256=egU8Xw-f3eHx_CmUooN1yW1lzltOam6IsJbnD8uOx9I,3803
|
|
122
|
-
oep_client/conformance/host_deadline.py,sha256=
|
|
122
|
+
oep_client/conformance/host_deadline.py,sha256=P0Yh3lZrq35_zQkEPhXjjX2aORXGkpPJvgxWtfNPvFM,6978
|
|
123
123
|
oep_client/conformance/host_deadline_sample.py,sha256=G471jEc2HxDIu52Acw_aHDSxFAEC72OBCuvn2YQtAdU,5136
|
|
124
124
|
oep_client/conformance/host_notifications.py,sha256=LGRJhOS66_36MYG8fHLcyHroXtoZRQVJgammDieVhQY,9307
|
|
125
125
|
oep_client/conformance/host_notifications_sample.py,sha256=auze2DdWtUOdQMHnfDF8WXLAiETv3OuODR6y77VmsTQ,1788
|
|
126
126
|
oep_client/conformance/host_request_sample.py,sha256=Oq60q350EhDxhe2FESnUF04YhJ6HDjDSHTe4FR55H9M,1848
|
|
127
|
-
oep_client/conformance/host_requests.py,sha256=
|
|
127
|
+
oep_client/conformance/host_requests.py,sha256=rBpaPPuGF1qCXufvvLEBc1hQujDzUawIc6J4fWltUj8,10718
|
|
128
128
|
oep_client/conformance/host_resend.py,sha256=P8tFWtr6TwQ33ph-JO0l8EXyJGxSjC6fBeyKQ4AhqxU,5519
|
|
129
129
|
oep_client/conformance/host_resend_sample.py,sha256=nwaru9ZVcxpcTi1OEritp8PSF6Qfic_IRGuutH2aBA4,4808
|
|
130
130
|
oep_client/conformance/host_tlv.py,sha256=h5SZT9r3DCsxMLcRacdyKOoZNQHSL8DzRgT1VPu_86A,6140
|
|
131
131
|
oep_client/conformance/host_tlv_sample.py,sha256=V6ORb5E2i76dc8O73Bew0eO2CbjG-ZPc02JLi6w5vmY,743
|
|
132
132
|
oep_client/conformance/host_values.py,sha256=VnjEB5TQbI34fuyAx0OGVbiyfI2ZH_of9I4TLT7Dyyk,4742
|
|
133
133
|
oep_client/conformance/host_values_sample.py,sha256=7C58mSP9jjrkNSgSb3uNK44VrdPXOznof_oe5UCcZro,1532
|
|
134
|
-
oep_client/conformance/host_wait.py,sha256=
|
|
134
|
+
oep_client/conformance/host_wait.py,sha256=B9h0mjhIbo8DH9LwUwP8OXL1weeKkPOOeW_YGU4H-CA,5591
|
|
135
135
|
oep_client/conformance/host_wait_sample.py,sha256=7SkJ8H_9ScMv8gLnT85xBKj_GXciPvAzmH-KxfMWYCg,3257
|
|
136
136
|
oep_client/conformance/i2c.py,sha256=fNDweyCLlCsv7fCwmmQMC7di5AG1HzDCflW0miWwcjc,18041
|
|
137
137
|
oep_client/conformance/i2c_model.py,sha256=HLYqRKdKMvlCGMcgYxSS3dy50Zf7aPojN_gO5fBvy6U,9759
|
|
@@ -160,7 +160,7 @@ oep_client/conformance/notification_sequence_sample.py,sha256=awSniydBvRoy03PCR5
|
|
|
160
160
|
oep_client/conformance/notify_hw.py,sha256=Baf3XXgmW7f-t2x8ML6CGUQqQ6PiVigm69Xe1GSkcpA,14933
|
|
161
161
|
oep_client/conformance/oep_declaration_model.py,sha256=_Zq_eLLkHNGcDfA0tPptWpqT4tZbCsVrdjE2k9lAcco,2947
|
|
162
162
|
oep_client/conformance/oep_declarations.py,sha256=0DrrDdveGEiSMp5fjy-ZJjR0mjAxv2TQLylZl_hnqfo,7492
|
|
163
|
-
oep_client/conformance/oep_smoke.py,sha256=
|
|
163
|
+
oep_client/conformance/oep_smoke.py,sha256=GVXTShmEILQczq1KkoOHkA3-gMbDf4-HqxW71YIrYY0,12488
|
|
164
164
|
oep_client/conformance/outcome_model.py,sha256=jnKDNvkLBsSFQqQQEqCDt3zliKZx0b5LiLCHafrBv4U,3697
|
|
165
165
|
oep_client/conformance/outcome_sample.py,sha256=6dbEwddcY0z4jGZsazp_gGI_Vu0em-0rOrGN2BVUMzI,673
|
|
166
166
|
oep_client/conformance/outcomes.py,sha256=FktfF9aaexnXCgSNDYU6OZeqRuLd3ppFMXE1UrW-H2o,10047
|
|
@@ -255,8 +255,8 @@ oep_client/conformance/wire_options_sample.py,sha256=dog-yvUcu693M8b51tA5TnhAnKr
|
|
|
255
255
|
oep_client/conformance/writer_lease.py,sha256=5wDd4XIJWFPFlRY91wHlJs5U7ANp3xPpGgU2Eki7e8g,7331
|
|
256
256
|
oep_client/conformance/writer_lease_model.py,sha256=FxhDqqzdFOa_SSHSvjdQFh49Wn3YuZ98ISSlRRxrq9E,1721
|
|
257
257
|
oep_client/conformance/writer_lease_sample.py,sha256=oowRwYUNAE4f6rEE2HmYlSS9dDWE0TGegkcsqVH8Nak,455
|
|
258
|
-
oep_client_python-0.0.
|
|
259
|
-
oep_client_python-0.0.
|
|
260
|
-
oep_client_python-0.0.
|
|
261
|
-
oep_client_python-0.0.
|
|
262
|
-
oep_client_python-0.0.
|
|
258
|
+
oep_client_python-0.0.47.dist-info/METADATA,sha256=e38LWsb7vSB_jpzlmyLWSQeBrHvSb9dREoKRv8V0nKQ,55269
|
|
259
|
+
oep_client_python-0.0.47.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
|
|
260
|
+
oep_client_python-0.0.47.dist-info/entry_points.txt,sha256=XEt39Jz7oQyU9Hfg_tV6eDGofNxWYrjSfslxKP-fh70,135
|
|
261
|
+
oep_client_python-0.0.47.dist-info/licenses/LICENSE,sha256=ntlalztb3L1OaNAxmQdHlubu5fVhjMc9oRZi3PeQhXg,1076
|
|
262
|
+
oep_client_python-0.0.47.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|