oep-client-python 0.0.20__py3-none-any.whl → 0.0.21__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 CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.20"
5
+ __version__ = "0.0.21"
oep_client/__main__.py CHANGED
@@ -4,7 +4,7 @@
4
4
  oep config show <probe>
5
5
  oep config slot <probe> --name x035 --wire rvswd --pins 2,54 --attach at-boot --retry 1 --mechanism dmseq
6
6
  oep config bind <probe> --port 1 --mode last-reset --stream slot:x035
7
- oep config plan <probe> oep.fixture.uart#2 rx=48 tx=49 (the fn's whole plan; fn number or name#instance)
7
+ oep config plan <probe> oep.fixture.uart#1 rx=48 tx=49 (the fn's whole plan; fn number or name#instance)
8
8
  oep config remove <probe> bind 1 oep config save <probe> oep config erase <probe>
9
9
 
10
10
  <probe>: a serial port, tcp://HOST:PORT or usb[:VID:PID[:SERIAL]]. A change takes the lock (owner "oep config") and
@@ -79,7 +79,7 @@ def _config_parser(sub) -> None:
79
79
  bind.add_argument("--save", action="store_true")
80
80
  plan = cs.add_parser("plan", help="the pins an interface keeps (its whole plan, kept as a setting)")
81
81
  plan.add_argument("probe")
82
- plan.add_argument("fn", help="an fn, or an interface name with #k for its k-th instance (1 = the first)")
82
+ plan.add_argument("fn", help="an fn, or name#instance (the list instance, 0 = the first; #0 may be left out, core §7.2)")
83
83
  plan.add_argument("roles", nargs="+", help="ROLE=CHANNEL, ROLE a number or the interface's role name (rx, tx, line...)")
84
84
  plan.add_argument("--save", action="store_true")
85
85
  label = cs.add_parser("label", help="name a channel (shown in oep.core's describe)")
@@ -116,20 +116,21 @@ def _pins(hst, fn: int, text: str | None, wire: str) -> tuple[int, int]:
116
116
 
117
117
 
118
118
  def _plan_fn(hst, spec: str) -> tuple[int, dict[str, int]]:
119
- """fn and its role names (from the registry) for `spec`: an fn number, or name[#k] (k-th instance, 1-based)."""
119
+ """fn and its role names (from the registry) for `spec`: an fn number, or name[#instance] (the list's instance,
120
+ 0-based, core §7.2)."""
120
121
  from . import registry as reg
121
122
  if spec.isdigit():
122
123
  fn = int(spec)
123
124
  name = next((e.name for e in core.list_entries(hst) if e.fn == fn), "")
124
125
  else:
125
126
  name, _, k = spec.partition("#")
126
- fns = core.find_all(hst, name)
127
- if not fns:
127
+ entries = [e for e in core.list_entries(hst, name, exact=True)]
128
+ if not entries:
128
129
  raise SystemExit(f"the probe offers no {name}")
129
- index = int(k) - 1 if k else 0
130
- if not 0 <= index < len(fns):
131
- raise SystemExit(f"{name}: {len(fns)} instance(s), fns {fns}")
132
- fn = fns[index]
130
+ instance = int(k) if k else 0
131
+ fn = next((e.fn for e in entries if e.instance == instance), None)
132
+ if fn is None:
133
+ raise SystemExit(f"{name}: instances {sorted(e.instance for e in entries)}, not {instance}")
133
134
  iface = reg.INTERFACES.get(name)
134
135
  roles = dict(iface.enum.get("role", {})) if iface else {}
135
136
  return fn, roles
oep_client/config.py CHANGED
@@ -111,7 +111,7 @@ class Bind:
111
111
  def value(self) -> bytes:
112
112
  v = struct.pack("<BBBB", self.port, MODE[self.mode], self.selected if self.mode == "manual" else 0,
113
113
  len(self.streams))
114
- return v + b"".join(struct.pack("<BH", STREAM[kind], i) for kind, i in self.streams)
114
+ return v + b"".join(struct.pack("<BBH", 3, STREAM[kind], i) for kind, i in self.streams) # len, kind, id
115
115
 
116
116
 
117
117
  def item(it) -> bytes:
@@ -147,7 +147,12 @@ def decode(tag: int, v: bytes):
147
147
  mechanism=_name(MECHANISM, mech), lock=lock, max_speed=max_speed, idle_clock=_name(IDLE_CLOCK, idle))
148
148
  if tag == ITEM["bind"] and len(v) >= 4:
149
149
  port, mode, selected, n = struct.unpack_from("<BBBB", v)
150
- streams = [(_name(STREAM, v[4 + 3 * k]), struct.unpack_from("<H", v, 5 + 3 * k)[0]) for k in range(n)]
150
+ streams, at = [], 4
151
+ for _ in range(n): # len, kind, id: a longer one's tail skipped
152
+ if at >= len(v) or v[at] < 3 or at + 1 + v[at] > len(v):
153
+ return (tag, v)
154
+ streams.append((_name(STREAM, v[at + 1]), struct.unpack_from("<H", v, at + 2)[0]))
155
+ at += 1 + v[at]
151
156
  return Bind(port=port, mode=_name(MODE, mode), streams=streams, selected=selected)
152
157
  return (tag, v)
153
158
 
oep_client/endpoint.py CHANGED
@@ -217,6 +217,17 @@ class Slot:
217
217
  lock: tuple[int, bytes, bytes] | None # (scheme, mask, value)
218
218
 
219
219
 
220
+ def _bind_streams(v: bytes) -> list[int]:
221
+ """Where each stream of a bind value starts (probe.config §1.2: n × (len, kind, id), len >= 3, its tail skipped)."""
222
+ at, out = 4, []
223
+ for _ in range(v[3]):
224
+ if at >= len(v) or v[at] < 3 or at + 1 + v[at] > len(v):
225
+ raise Reject(m.MALFORMED)
226
+ out.append(at + 1)
227
+ at += 1 + v[at]
228
+ return out
229
+
230
+
220
231
  @dataclass(frozen=True)
221
232
  class Bind:
222
233
  port: int
@@ -1435,9 +1446,9 @@ class Endpoint:
1435
1446
  elif tag == ITEM["slot"]:
1436
1447
  fns.add(struct.unpack_from("<H", value, 1)[0])
1437
1448
  elif tag == ITEM["bind"]:
1438
- for k in range(value[3]):
1439
- if value[4 + 3 * k] == BIND_STREAM["fixture_uart"]:
1440
- fns.add(struct.unpack_from("<H", value, 5 + 3 * k)[0])
1449
+ for at in _bind_streams(value):
1450
+ if value[at] == BIND_STREAM["fixture_uart"]:
1451
+ fns.add(struct.unpack_from("<H", value, at + 1)[0])
1441
1452
  return fns
1442
1453
 
1443
1454
  def _apply_saved(self) -> None:
@@ -1459,9 +1470,9 @@ class Endpoint:
1459
1470
  new[(tag, key)] = value[:1] + pack(struct.unpack_from("<H", value, 1)[0]) + value[3:]
1460
1471
  elif tag == ITEM["bind"]:
1461
1472
  v = bytearray(value)
1462
- for k in range(v[3]):
1463
- if v[4 + 3 * k] == BIND_STREAM["fixture_uart"]:
1464
- v[5 + 3 * k:7 + 3 * k] = pack(struct.unpack_from("<H", v, 5 + 3 * k)[0])
1473
+ for at in _bind_streams(value):
1474
+ if v[at] == BIND_STREAM["fixture_uart"]:
1475
+ v[at + 1:at + 3] = pack(struct.unpack_from("<H", v, at + 1)[0])
1465
1476
  new[(tag, key)] = bytes(v)
1466
1477
  else:
1467
1478
  new[(tag, key)] = value
@@ -1574,9 +1585,10 @@ class Endpoint:
1574
1585
  return Slot(n, wire_fn, (swdio, swclk), attach, retry_s, max_speed, idle_clock, mech, name.decode(), lock)
1575
1586
 
1576
1587
  def _parse_bind(self, v: bytes, slots: dict[int, Slot]) -> Bind:
1577
- t = Take(v)
1578
- port, mode, selected, n = t.take("BBBB")
1579
- streams = tuple(t.take("BH") for _ in range(n))
1588
+ if len(v) < 4:
1589
+ raise Reject(m.MALFORMED)
1590
+ port, mode, selected, n = v[:4]
1591
+ streams = tuple((v[at], struct.unpack_from("<H", v, at + 1)[0]) for at in _bind_streams(v))
1580
1592
  if n == 0: # after the streams: later fields, skipped
1581
1593
  raise Reject(m.MALFORMED)
1582
1594
  if port not in self.serial_ports:
oep_client/fake.py CHANGED
@@ -191,34 +191,34 @@ def p4_x035() -> FakeProbe:
191
191
  _transports([(TRANSPORT["usb_serial_jtag"], 0xFF), (TRANSPORT["vendor_bulk"], 0),
192
192
  (TRANSPORT["hid"], 1), (TRANSPORT["usb_cdc"], 2)])
193
193
  + (catalog.u8(CORE_OEP_PID, 1), catalog.text(CORE_CHIP, "esp32p4 v1.0"))),
194
- Offered(1, 1, "oep.wire.rvswd", (
194
+ Offered(1, 0, "oep.wire.rvswd", (
195
195
  catalog.channel_group(1, [(1, 2), (2, 54)]), catalog.u32(MAX_CLOCK_HZ, 5_000_000), catalog.u8(IMPLEMENTATION, 1),
196
196
  catalog.u8(MAX_CONNECTIONS, 1))),
197
- Offered(2, 1, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
197
+ Offered(2, 0, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
198
198
  catalog.u16(MAX_LENGTH, 1000))),
199
- Offered(3, 1, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
200
- Offered(4, 2, "oep.fixture.gpio", _roles({1: pins})),
201
- Offered(5, 3, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
199
+ Offered(3, 0, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
200
+ Offered(4, 0, "oep.fixture.gpio", _roles({1: pins})),
201
+ Offered(5, 0, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
202
202
  catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
203
- Offered(6, 4, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
203
+ Offered(6, 1, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
204
204
  catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
205
205
  # the P4's PARLIO: w 1-16, one-shot / repeat / streaming
206
- Offered(7, 5, "oep.fixture.logic", _roles({k: pins for k in range(16)}) + (
206
+ Offered(7, 0, "oep.fixture.logic", _roles({k: pins for k in range(16)}) + (
207
207
  catalog.u32(MAX_CLOCK_HZ, 20_000_000), catalog.u32(MIN_CLOCK_HZ, 1_000),
208
208
  catalog.u16(MAX_LENGTH, 65000), catalog.u8(IMPLEMENTATION, 3))
209
209
  + _capture_decl(["one_shot", "repeat", "streaming"], 16, [1, 2, 4, 8, 16], 1 << 20, 8, 4096)),
210
- Offered(8, 6, "oep.fixture.i2c-target", _roles({1: pins, 2: pins}) + (
210
+ Offered(8, 0, "oep.fixture.i2c-target", _roles({1: pins, 2: pins}) + (
211
211
  catalog.u16(MAX_LENGTH, 128), catalog.u32(MAX_CLOCK_HZ, 1_000_000),
212
212
  catalog.u32(FEATURES, 0b11), catalog.u8(IMPLEMENTATION, 2))),
213
- Offered(9, 7, "oep.fixture.spi-target", _roles({1: pins, 2: pins, 3: pins, 4: pins}) + (
213
+ Offered(9, 0, "oep.fixture.spi-target", _roles({1: pins, 2: pins, 3: pins, 4: pins}) + (
214
214
  catalog.u16(MAX_LENGTH, 64), catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
215
- _config(10, 8, slots_max=1),
215
+ _config(10, 0, slots_max=1),
216
216
  # the P4's ADC1 (GPIO16-23): one ADC for all its channels, 611 Hz - 83.3 kHz in all; ESP32-style attenuations
217
- Offered(11, 1, "oep.fixture.analog", _roles({k: list(range(16, 24)) for k in range(4)}) + (
217
+ Offered(11, 0, "oep.fixture.analog", _roles({k: list(range(16, 24)) for k in range(4)}) + (
218
218
  catalog.u32(MAX_CLOCK_HZ, 83_333), catalog.u32(MIN_CLOCK_HZ, 611), catalog.u8(IMPLEMENTATION, 3))
219
219
  + _analog_decl([(0, 0, 950, 0), (1, 0, 1250, 2500), (2, 0, 1750, 6000), (3, 0, 3100, 12000)], 65536)),
220
220
  # the logic (fn 7) and the analog (fn 11) together; the ADC's 83.3 kHz is shared by its channels
221
- Offered(12, 1, "oep.fixture.capture-group", _group_decl([7, 11], [(83_333, [11])], {11: 5000})),
221
+ Offered(12, 0, "oep.fixture.capture-group", _group_decl([7, 11], [(83_333, [11])], {11: 5000})),
222
222
  ])
223
223
 
224
224
 
@@ -231,26 +231,26 @@ def esp32_v003() -> FakeProbe:
231
231
  _core("3.0.0", "esp32", "0070070d9394", 40, reserved, f"{NS}.esp32-v003",
232
232
  {16: "SWIO", 23: "NRST", 22: "DUT TX", 21: "DUT RX"},
233
233
  _transports([(TRANSPORT["uart_bridge"], 0xFF)])),
234
- Offered(1, 1, "oep.wire.swio", (catalog.channel_group(1, [(1, 16)]), catalog.role_channels(3, [23]),
234
+ Offered(1, 0, "oep.wire.swio", (catalog.channel_group(1, [(1, 16)]), catalog.role_channels(3, [23]),
235
235
  catalog.u8(IMPLEMENTATION, 1), catalog.u8(MAX_CONNECTIONS, 1))),
236
- Offered(2, 1, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b0111), catalog.u8(IMPLEMENTATION, 1),
236
+ Offered(2, 0, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b0111), catalog.u8(IMPLEMENTATION, 1),
237
237
  catalog.u16(MAX_LENGTH, 40))),
238
- Offered(3, 1, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
239
- Offered(4, 2, "oep.fixture.gpio", _roles({1: wired + [23]})),
240
- Offered(5, 3, "oep.fixture.uart", _roles({1: wired, 2: wired}) + (
238
+ Offered(3, 0, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
239
+ Offered(4, 0, "oep.fixture.gpio", _roles({1: wired + [23]})),
240
+ Offered(5, 0, "oep.fixture.uart", _roles({1: wired, 2: wired}) + (
241
241
  catalog.u32(MAX_CLOCK_HZ, 115_200), catalog.u8(IMPLEMENTATION, 2))),
242
242
  # the classic ESP32's GPIO sampler: a byte a sample (w 8), one-shot
243
- Offered(6, 4, "oep.fixture.logic", _roles({k: wired for k in range(4)}) + (
243
+ Offered(6, 0, "oep.fixture.logic", _roles({k: wired for k in range(4)}) + (
244
244
  catalog.u32(MAX_CLOCK_HZ, 2_000_000), catalog.u32(MIN_CLOCK_HZ, 400_000), catalog.u8(IMPLEMENTATION, 1))
245
245
  + _capture_decl(["one_shot"], 8, [8], 65536, 1, 480)),
246
- Offered(7, 5, "oep.fixture.i2c-target", _roles({1: wired, 2: wired}) + (
246
+ Offered(7, 0, "oep.fixture.i2c-target", _roles({1: wired, 2: wired}) + (
247
247
  catalog.u16(MAX_LENGTH, 16), catalog.u32(MAX_CLOCK_HZ, 100_000), catalog.u8(IMPLEMENTATION, 2))),
248
248
  # Two fixed pin sets (an example of channel_group; GPIO23 is the DUT's NRST on this jig).
249
- Offered(8, 6, "oep.fixture.spi-target", (
249
+ Offered(8, 0, "oep.fixture.spi-target", (
250
250
  catalog.channel_group(1, [(1, 18), (2, 19), (3, 5), (4, 4)]),
251
251
  catalog.channel_group(2, [(1, 14), (2, 13), (3, 27), (4, 26)]),
252
252
  catalog.u16(MAX_LENGTH, 32), catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
253
- _config(9, 7, slots_max=1, modes=0b011, storage=1024),
253
+ _config(9, 0, slots_max=1, modes=0b011, storage=1024),
254
254
  ])
255
255
 
256
256
 
@@ -264,17 +264,17 @@ def p4_bench() -> FakeProbe:
264
264
  {2: "A SWDIO", 3: "A SWCLK", 4: "B SWDIO", 5: "B SWCLK", 6: "C SWDIO", 7: "C SWCLK"},
265
265
  _transports([(TRANSPORT["usb_serial_jtag"], 0xFF), (TRANSPORT["vendor_bulk"], 0),
266
266
  (TRANSPORT["hid"], 1), (TRANSPORT["usb_cdc"], 2)]) + (catalog.u8(CORE_OEP_PID, 1),)),
267
- Offered(1, 1, "oep.wire.rvswd", (
267
+ Offered(1, 0, "oep.wire.rvswd", (
268
268
  catalog.channel_group(1, [(1, 2), (2, 3)]), catalog.channel_group(2, [(1, 4), (2, 5)]),
269
269
  catalog.channel_group(3, [(1, 6), (2, 7)]), catalog.u32(MAX_CLOCK_HZ, 5_000_000),
270
270
  catalog.u8(IMPLEMENTATION, 1), catalog.u8(MAX_CONNECTIONS, 2))),
271
- Offered(2, 1, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
271
+ Offered(2, 0, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
272
272
  catalog.u16(MAX_LENGTH, 1000))),
273
- Offered(3, 1, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
274
- Offered(4, 2, "oep.fixture.gpio", _roles({1: pins})),
275
- Offered(5, 3, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
273
+ Offered(3, 0, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
274
+ Offered(4, 0, "oep.fixture.gpio", _roles({1: pins})),
275
+ Offered(5, 0, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
276
276
  catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
277
- _config(6, 4, slots_max=4),
277
+ _config(6, 0, slots_max=4),
278
278
  ])
279
279
 
280
280
 
@@ -287,13 +287,13 @@ def rp2350_pins() -> FakeProbe:
287
287
  return FakeProbe("rp2350-pins", 1024, [
288
288
  _core("3.0.0", "rp2350", "e66138935f2b1f2c", 30, reserved, "",
289
289
  {}, _transports([(TRANSPORT["usb_cdc"], 0)])),
290
- Offered(1, 1, "oep.wire.rvswd", _roles({1: pins, 2: pins, 3: pins}) + (
290
+ Offered(1, 0, "oep.wire.rvswd", _roles({1: pins, 2: pins, 3: pins}) + (
291
291
  catalog.u32(MAX_CLOCK_HZ, 5_000_000), catalog.u8(IMPLEMENTATION, 1), catalog.u8(MAX_CONNECTIONS, 1))),
292
- Offered(2, 1, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
292
+ Offered(2, 0, "oep.target.riscv-dm", (catalog.u32(FEATURES, 0b1111), catalog.u8(IMPLEMENTATION, 1),
293
293
  catalog.u16(MAX_LENGTH, 1000))),
294
- Offered(3, 1, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
295
- Offered(4, 2, "oep.fixture.gpio", _roles({1: pins})),
296
- Offered(5, 3, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
294
+ Offered(3, 0, "oep.target.console", (catalog.tlv(MECHANISMS, bytes([0, 1, 2])),)),
295
+ Offered(4, 0, "oep.fixture.gpio", _roles({1: pins})),
296
+ Offered(5, 0, "oep.fixture.uart", _roles({1: pins, 2: pins}) + (
297
297
  catalog.u32(MAX_CLOCK_HZ, 3_000_000), catalog.u8(IMPLEMENTATION, 2))),
298
298
  ])
299
299
 
oep_client/fake_serve.py CHANGED
@@ -83,7 +83,7 @@ def build(a: argparse.Namespace) -> endpoint.Endpoint:
83
83
  0, 0, mech, len(raw)) + raw + b"\x00" # no speed ceiling, rests high, no lock
84
84
  items.append(bytes([_ITEM["slot"], len(value)]) + value)
85
85
  if a.bind:
86
- streams = b"".join(struct.pack("<BH", reg.PROBE_CONFIG.enum["bind_stream"]["slot_console"], n)
86
+ streams = b"".join(struct.pack("<BBH", 3, reg.PROBE_CONFIG.enum["bind_stream"]["slot_console"], n)
87
87
  for n in range(len(a.slot)))
88
88
  value = struct.pack("<BBBB", a.port_index, _MODES[a.bind.replace("-", "_")], 0, len(a.slot)) + streams
89
89
  items.append(bytes([_ITEM["bind"], len(value)]) + value)
oep_client/link.py CHANGED
@@ -446,7 +446,7 @@ def open_host(target: str, timeout: float = 3.0):
446
446
  lk.transport = "tcp"
447
447
  elif target == "usb" or target.startswith("usb:"):
448
448
  parts = target.split(":")[1:]
449
- if len(parts) == 1 and len(parts[0]) != 4: # usb:UNIT_ID (a VID is 4 hex digits)
449
+ if len(parts) == 1: # usb:UNIT_ID (any length: a VID comes with its PID)
450
450
  vid, pid = find_usb(parts[0])
451
451
  return open_usb_host(vid, pid, parts[0], timeout)
452
452
  vid = int(parts[0], 16) if parts else USB_VID
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.20
3
+ Version: 0.0.21
4
4
  Summary: Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a fake probe
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
@@ -64,7 +64,7 @@ oep-client-python X.Y.Z (until the v1 freeze every release may break the wire; t
64
64
  | `config` | `oep.probe.config` (slots, binds, plan / label / idle items, get / set / save / erase, the live slot and bind state) |
65
65
  | `capture` | `oep.fixture.logic` (revision 1, oep-spec oep-if-capture). Every segment read goes to the `Host.on_capture` callbacks as a `CaptureRecord` (the hook for run recorders; no wireskein dependency) |
66
66
  | `decode` | decoding capture channels (I2C) |
67
- | `registry` | generated from oep-spec's number table (never edited; copied again from oep-spec) |
67
+ | `registry` | generated from oep-spec's number table (never edited; copied again from oep-spec). The public way to reach an interface by name is `registry.INTERFACES[name]` (`.revision`, `.op`, `.tlv`, `.enum`, e.g. `INTERFACES["oep.fixture.uart"].enum["role"]`); the module-level names (`FIXTURE_UART`, ...) are the same objects |
68
68
  | `arm` | `oep.wire.swd`, `oep.target.arm-adi`, MEM-AP, halting and calling functions on a Cortex-M |
69
69
  | `ch32_flash` | writing a CH32 (a RAM loader, page by page) |
70
70
  | `rp2350` | flash and reboot through the RP2350 boot ROM |
@@ -1,26 +1,26 @@
1
- oep_client/__init__.py,sha256=wds6ooM5lVV1iSvZzuFcKbd_Rbjs_HeyKpF2ASUlBrQ,164
2
- oep_client/__main__.py,sha256=tAQXHlLD5cI51DGMnYFjWWDigz0FwkVZuu11s5G4zMs,14870
1
+ oep_client/__init__.py,sha256=Ts_inL0QV6FhYT78nwAgEgJPheMPiy1vqJ0M3KFb4uk,164
2
+ oep_client/__main__.py,sha256=IGiU-2d8ZC_F9TmewpPUln5oKMsp_yu_CKx5JL3z_UE,15018
3
3
  oep_client/arm.py,sha256=JLyUhLSPcmsk73schZcaJYoOKuHzrvnU8kPmfrEvVuo,12331
4
4
  oep_client/capture.py,sha256=bM9H6uqFB1-BuGciIj-_knuFspnNkJP6v5poPnkAAgU,25906
5
5
  oep_client/catalog.py,sha256=VaCFQDlIxtEFEecQ5Hhfu2166Cy5m6tfzMCu7GBismk,6625
6
6
  oep_client/ch32_flash.py,sha256=GxlpZY-o7pOjT6Yod9Gk0EflNtVKT_w_fXwkXBq5zrM,12641
7
7
  oep_client/cobs.py,sha256=hqddQI_X7rsBvBvcP_MBE3bXPyB13-Azjqp_9JfdQ1g,2288
8
- oep_client/config.py,sha256=BdNrLOeLFu5brRecUWb6iII94KU9n2SaiE6kooCiOiY,10601
8
+ oep_client/config.py,sha256=DSXLXTQJ_LDhDaOjaNubGswwndd8Nd27nVUXe5bOKyM,10876
9
9
  oep_client/console.py,sha256=FPgFYkSyQZZz8Wd_G6NcRYhHp3qSlxzZMxMB-uMzz0Y,7104
10
10
  oep_client/core.py,sha256=Cyyaknjipkg6tS76dZe5GMqjmOoQjlfeP0WFtMHkJNs,10403
11
11
  oep_client/decode.py,sha256=6pTFVBT0MLAKedZLVKyd5yT8hjrRw4fdDjnoDiE9XRs,2380
12
12
  oep_client/dump.py,sha256=GAnmu2abuDmGmbWcbbEfC3EUuPp5Hady9vQVNcQ-724,6743
13
- oep_client/endpoint.py,sha256=RHwQndxx0lZDDBMR2Hx9eHztC-ofZd7o71zseDgaudM,93072
14
- oep_client/fake.py,sha256=HSgUPUNHpd1Fu-Emv1TujcB85iuKD0YM7tRpY-0ML48,18009
13
+ oep_client/endpoint.py,sha256=YJPfkViIHJn7DvPtV1_ZEyRKyprJ9DI_4pOib17XnEw,93520
14
+ oep_client/fake.py,sha256=EZecMbfj09Ae2kMJK3jcn48reB22a_Z17ti21GR9uKY,18009
15
15
  oep_client/fake_capture.py,sha256=NzpFTycE-6CwcWSmZPZBC_KS1015QszJ8HG_CHGkios,22883
16
16
  oep_client/fake_serial.py,sha256=nXpbBuPl9sAh5BdoWSsa5EDYvPC7VLOvaBYrslGlniA,4659
17
- oep_client/fake_serve.py,sha256=xyBQTfIxgH4z0sB6FfcpecwJKau_JEEoOI5EesXZoX0,15131
17
+ oep_client/fake_serve.py,sha256=f1fROFT80MIhrewQsgNXWBwqsA_ygbadzmuvrURa9tc,15135
18
18
  oep_client/fixture.py,sha256=4Z7hc-j3T1xN-ue1wrbvLGscW0QBrPZ3ertI-kcrZZo,10499
19
19
  oep_client/frames.py,sha256=xjgjnXmXUqNJZ5m0h91r4Cy48WoVK1mEMW4gRg-mlMI,3991
20
20
  oep_client/hid_stream.py,sha256=99Dsm4Io1keukuETG_UNqjBGiVYZZeb__Pv4ytaKg9k,10695
21
21
  oep_client/host.py,sha256=uw3Ub1k3N2KZoOsWtTfV3P4akKlYEtf0irNcybj4k-0,17024
22
22
  oep_client/interfaces.py,sha256=mxY3XrjSQ4DUe7HAHcccFNPENWdckSh2_0xhGa00qho,5343
23
- oep_client/link.py,sha256=udSBmg-Wnjl08UOswHJJWeOp5X5H8nb0fXLyVdnvDnM,21611
23
+ oep_client/link.py,sha256=KiVWids4K5Nqr4_facoIJRDzQ_6H9u9-wmlFADeFCcQ,21626
24
24
  oep_client/message.py,sha256=8bQcIL1dO161cuyWF7vPUfr5cb0FFSImebYlpu7EVNs,10438
25
25
  oep_client/names.py,sha256=ztCZFWs__aR-a5G14TnJP-Q4YfLhbyrzvOVOMJuG93k,3653
26
26
  oep_client/registry.py,sha256=I8lpy2txzg_lDXNI1wPW2k8zgKtMi6OEo40Ej3RFWvo,11994
@@ -28,8 +28,8 @@ oep_client/riscv.py,sha256=rRMw-aoO-r27GtJqPmT2Ap1ysOd7cWi4f3_zOJfhX2I,23127
28
28
  oep_client/rp2350.py,sha256=7OMyj270k3AY1e3-ljicPwOjf9jOlokbT6QNkA0b0yY,4227
29
29
  oep_client/uiapduino.py,sha256=kDB8C9GvIPBw94PaCKMzVWNtoQDu_axrz_n_6zbYJGU,6082
30
30
  oep_client/usb_stream.py,sha256=6yS7OrXOMKnTeCt7HCdC-eH1gQuKQ0OSjX2pQOdTmVw,10586
31
- oep_client_python-0.0.20.dist-info/METADATA,sha256=6Fhd58e6G36S-CrnJNoaN4CuSpI61IY04yTcpslCcUI,8813
32
- oep_client_python-0.0.20.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
33
- oep_client_python-0.0.20.dist-info/entry_points.txt,sha256=h6_8QX89Ww1ogALEGG5g4kspT3IOV6O51lwKqf5BWco,49
34
- oep_client_python-0.0.20.dist-info/licenses/LICENSE,sha256=ntlalztb3L1OaNAxmQdHlubu5fVhjMc9oRZi3PeQhXg,1076
35
- oep_client_python-0.0.20.dist-info/RECORD,,
31
+ oep_client_python-0.0.21.dist-info/METADATA,sha256=xtXz1YFDhTFnZDJqOMJ90HMbskYs_8hESh-P4m7p1go,9047
32
+ oep_client_python-0.0.21.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
33
+ oep_client_python-0.0.21.dist-info/entry_points.txt,sha256=h6_8QX89Ww1ogALEGG5g4kspT3IOV6O51lwKqf5BWco,49
34
+ oep_client_python-0.0.21.dist-info/licenses/LICENSE,sha256=ntlalztb3L1OaNAxmQdHlubu5fVhjMc9oRZi3PeQhXg,1076
35
+ oep_client_python-0.0.21.dist-info/RECORD,,