oep-client-python 0.0.1__py3-none-any.whl → 0.0.2__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.
Files changed (38) hide show
  1. oep_client/__init__.py +2 -2
  2. oep_client/{v1/__main__.py → __main__.py} +4 -4
  3. oep_client/{v1/fake_serve.py → fake_serve.py} +54 -12
  4. {oep_client_python-0.0.1.dist-info → oep_client_python-0.0.2.dist-info}/METADATA +7 -7
  5. oep_client_python-0.0.2.dist-info/RECORD +35 -0
  6. oep_client_python-0.0.2.dist-info/entry_points.txt +2 -0
  7. oep_client/v1/__init__.py +0 -1
  8. oep_client_python-0.0.1.dist-info/RECORD +0 -36
  9. oep_client_python-0.0.1.dist-info/entry_points.txt +0 -2
  10. /oep_client/{v1/arm.py → arm.py} +0 -0
  11. /oep_client/{v1/capture.py → capture.py} +0 -0
  12. /oep_client/{v1/catalog.py → catalog.py} +0 -0
  13. /oep_client/{v1/ch32_flash.py → ch32_flash.py} +0 -0
  14. /oep_client/{v1/cobs.py → cobs.py} +0 -0
  15. /oep_client/{v1/console.py → console.py} +0 -0
  16. /oep_client/{v1/core.py → core.py} +0 -0
  17. /oep_client/{v1/decode.py → decode.py} +0 -0
  18. /oep_client/{v1/dump.py → dump.py} +0 -0
  19. /oep_client/{v1/endpoint.py → endpoint.py} +0 -0
  20. /oep_client/{v1/esp32_targets.py → esp32_targets.py} +0 -0
  21. /oep_client/{v1/fake.py → fake.py} +0 -0
  22. /oep_client/{v1/fake_serial.py → fake_serial.py} +0 -0
  23. /oep_client/{v1/fixture.py → fixture.py} +0 -0
  24. /oep_client/{v1/frames.py → frames.py} +0 -0
  25. /oep_client/{v1/hid_stream.py → hid_stream.py} +0 -0
  26. /oep_client/{v1/host.py → host.py} +0 -0
  27. /oep_client/{v1/interfaces.py → interfaces.py} +0 -0
  28. /oep_client/{v1/link.py → link.py} +0 -0
  29. /oep_client/{v1/message.py → message.py} +0 -0
  30. /oep_client/{v1/names.py → names.py} +0 -0
  31. /oep_client/{v1/registry.py → registry.py} +0 -0
  32. /oep_client/{v1/riscv.py → riscv.py} +0 -0
  33. /oep_client/{v1/rp2350.py → rp2350.py} +0 -0
  34. /oep_client/{v1/target.py → target.py} +0 -0
  35. /oep_client/{v1/uiapduino.py → uiapduino.py} +0 -0
  36. /oep_client/{v1/usb_stream.py → usb_stream.py} +0 -0
  37. {oep_client_python-0.0.1.dist-info → oep_client_python-0.0.2.dist-info}/WHEEL +0 -0
  38. {oep_client_python-0.0.1.dist-info → oep_client_python-0.0.2.dist-info}/licenses/LICENSE +0 -0
oep_client/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
- """Open Embedded Probe (OEP) host client. `oep_client.v1` speaks the v1 protocol (oep-spec docs/oep-core.ja.md)."""
1
+ """Open Embedded Probe (OEP) host client. `oep_client` speaks the v1 protocol (oep-spec docs/oep-core.ja.md)."""
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.1"
5
+ __version__ = "0.0.2"
@@ -1,9 +1,9 @@
1
1
  """Draft OEP capability discovery by name, on an in-process fake or a v1 draft probe.
2
2
 
3
- uv run python -m oep_client.v1 dump --port /run/board-identify/by-id/<probe>
4
- uv run python -m oep_client.v1 dump --fake p4-x035
5
- uv run python -m oep_client.v1 dump --fake esp32-v003 --prefix oep.fixture
6
- uv run python -m oep_client.v1 dump --fake p4-x035 --prefix oep.target --json
3
+ uv run python -m oep_client dump --port /run/board-identify/by-id/<probe>
4
+ uv run python -m oep_client dump --fake p4-x035
5
+ uv run python -m oep_client dump --fake esp32-v003 --prefix oep.fixture
6
+ uv run python -m oep_client dump --fake p4-x035 --prefix oep.target --json
7
7
  """
8
8
 
9
9
  from __future__ import annotations
@@ -1,6 +1,6 @@
1
1
  """Serve a fake probe (`endpoint.Endpoint`) on a pty or a TCP port, for other programs' tests.
2
2
 
3
- python -m oep_client.v1.fake_serve [--pty | --tcp PORT] [options]
3
+ python -m oep_client.fake_serve [--pty | --tcp PORT] [options]
4
4
 
5
5
  --pty (the default) opens a pseudo terminal that is the probe's serial port (oep-core §3.4): COBS frames
6
6
  0x00 <COBS> 0x00 and the raw bytes of the port's bind on one line. The host opens the printed path itself (and
@@ -25,6 +25,9 @@ Options:
25
25
  --bind MODE bind the serial port to every --slot: last-reset, manual or mixed
26
26
  --target-id HEX the target_id every target's attach reports (wch_dmi_7f)
27
27
  --absent N the N-th pin pair of the first wire has no target (repeatable)
28
+ --uart-plan the first oep.fixture.uart gets its RX / TX plan at boot, as if saved (the jig's "DUT TX" /
29
+ "DUT RX" labels when the profile has them, else the first free channels); configure then works
30
+ --uart-rx TEXT what arrives on that UART's RX every --every ms once it is configured (%d = a counter)
28
31
  --run-hook SPEC what riscv-dm run does on every target: SPEC is module:function or path/file.py:function,
29
32
  called as function(target, pc, regs) -> (stopped, dpc, elapsed_us). `target` is the
30
33
  endpoint.FakeTarget (mem = word address -> value, regs = regno -> value, halted, dpc), so a
@@ -45,7 +48,7 @@ import sys
45
48
  import time
46
49
  import tty
47
50
 
48
- from . import endpoint, fake, fake_serial, registry as reg
51
+ from . import catalog, endpoint, fake, fake_serial, registry as reg
49
52
 
50
53
  _ITEM = reg.PROBE_CONFIG.tlv["item"]
51
54
  _MODES = reg.PROBE_CONFIG.enum["bind_mode"]
@@ -82,11 +85,40 @@ def build(a: argparse.Namespace) -> endpoint.Endpoint:
82
85
  for n in range(len(a.slot)))
83
86
  value = struct.pack("<BBBB", a.port_index, _MODES[a.bind.replace("-", "_")], 0, len(a.slot)) + streams
84
87
  items.append(bytes([_ITEM["bind"], len(value)]) + value)
88
+ if a.uart_plan:
89
+ fn = uart_fn(ep)
90
+ rx, tx = _uart_channels(ep, fn)
91
+ for role, ch in ((1, rx), (2, tx)):
92
+ items.append(bytes([_ITEM["plan"], 5]) + struct.pack("<HBH", fn, role, ch))
85
93
  if items:
86
94
  ep.load_config(items, saved=True)
87
95
  return ep
88
96
 
89
97
 
98
+ def uart_fn(ep: endpoint.Endpoint) -> int:
99
+ fn = ep.fns.get("oep.fixture.uart")
100
+ if fn is None:
101
+ raise SystemExit("this profile offers no oep.fixture.uart")
102
+ return fn
103
+
104
+
105
+ def _uart_channels(ep: endpoint.Endpoint, fn: int) -> tuple[int, int]:
106
+ """RX, TX for the UART's plan: the jig's DUT TX (probe RX) / DUT RX (probe TX) labels, else the first two free."""
107
+ labels = {name: ch for ch, name in ep.static_labels.items()}
108
+ if "DUT TX" in labels and "DUT RX" in labels:
109
+ return labels["DUT TX"], labels["DUT RX"]
110
+ allowed = []
111
+ for t in ep.static[fn]:
112
+ if t[0] == catalog.ROLE_CHANNELS and t[2] == 1:
113
+ base = struct.unpack_from("<H", t, 3)[0]
114
+ allowed = catalog.bitmap_to_channels(base, t[5:2 + t[1]])
115
+ taken = {p for s in ep.slots.values() for p in s.pair} | {a[2] for a in ep.plan}
116
+ free = [ch for ch in allowed if ch not in taken]
117
+ if len(free) < 2:
118
+ raise SystemExit("no two free channels for the UART's plan")
119
+ return free[0], free[1]
120
+
121
+
90
122
  def _load_hook(spec: str):
91
123
  where, _, name = spec.rpartition(":")
92
124
  if not where or not name:
@@ -118,20 +150,28 @@ def _filter(a: argparse.Namespace):
118
150
  return answer
119
151
 
120
152
 
153
+ def _text(fmt: str, count: int) -> bytes:
154
+ text = fmt.replace("%d", str(count)) if "%d" in fmt else fmt
155
+ return text.encode().decode("unicode_escape").encode("latin-1")
156
+
157
+
121
158
  class Console:
122
- def __init__(self, ep: endpoint.Endpoint, fmt: str | None, every_ms: int):
123
- self.ep, self.fmt, self.every = ep, fmt, every_ms
159
+ """Every `every_ms`: the targets write `fmt` to their consoles, and `uart_rx` arrives on the UART's RX (fn
160
+ `uart`) while it runs (configured)."""
161
+
162
+ def __init__(self, ep: endpoint.Endpoint, fmt: str | None, every_ms: int, uart_rx: str | None = None,
163
+ uart: int | None = None):
164
+ self.ep, self.fmt, self.every, self.uart_rx, self.uart = ep, fmt, every_ms, uart_rx, uart
124
165
  self.next_ms, self.count = 0, 0
125
166
 
126
167
  def tick(self) -> None:
127
- if not self.fmt or self.ep.now() < self.next_ms:
168
+ if not (self.fmt or self.uart_rx) or self.ep.now() < self.next_ms:
128
169
  return
129
170
  self.next_ms = self.ep.now() + self.every
130
- for i, tg in enumerate(self.ep.targets.values()):
131
- text = self.fmt.replace("{t}", str(i))
132
- if "%d" in text:
133
- text = text.replace("%d", str(self.count))
134
- self.ep.target_says(text.encode().decode("unicode_escape").encode("latin-1"), tg)
171
+ for i, tg in enumerate(self.ep.targets.values()) if self.fmt else ():
172
+ self.ep.target_says(_text(self.fmt.replace("{t}", str(i)), self.count), tg)
173
+ if self.uart_rx and self.uart in self.ep.uarts:
174
+ self.ep.uart_rx(self.uart, _text(self.uart_rx, self.count))
135
175
  self.count += 1
136
176
 
137
177
 
@@ -257,7 +297,7 @@ def _serve_conn(a, ep, console, conn, watch_stdin) -> bool:
257
297
 
258
298
 
259
299
  def main(argv: list[str] | None = None) -> None:
260
- ap = argparse.ArgumentParser(prog="python -m oep_client.v1.fake_serve", description=__doc__.split("\n\n")[0])
300
+ ap = argparse.ArgumentParser(prog="python -m oep_client.fake_serve", description=__doc__.split("\n\n")[0])
261
301
  where = ap.add_mutually_exclusive_group()
262
302
  where.add_argument("--pty", action="store_true")
263
303
  where.add_argument("--tcp", type=int, metavar="PORT")
@@ -273,6 +313,8 @@ def main(argv: list[str] | None = None) -> None:
273
313
  ap.add_argument("--bind", choices=["last-reset", "manual", "mixed"])
274
314
  ap.add_argument("--target-id")
275
315
  ap.add_argument("--absent", type=int, action="append", default=[])
316
+ ap.add_argument("--uart-plan", action="store_true")
317
+ ap.add_argument("--uart-rx")
276
318
  ap.add_argument("--run-hook")
277
319
  ap.add_argument("--once", action="store_true")
278
320
  a = ap.parse_args(argv)
@@ -285,7 +327,7 @@ def main(argv: list[str] | None = None) -> None:
285
327
  probe_ep = endpoint.Endpoint(profile(), lambda: 0)
286
328
  a.port_index = min(probe_ep.serial_ports) if probe_ep.serial_ports else 0
287
329
  ep = build(a)
288
- console = Console(ep, a.console, _ms(a.every))
330
+ console = Console(ep, a.console, _ms(a.every), a.uart_rx, uart_fn(ep) if a.uart_rx else None)
289
331
  try:
290
332
  if a.tcp is None:
291
333
  serve_pty(a, ep, console)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.1
3
+ Version: 0.0.2
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
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
  # OEP Python client
24
24
 
25
25
  Open Embedded Probe の host 側。v1(oep-spec の `docs/oep-core.ja.md` と `docs/oep-if-*.ja.md`、固める候補の形)を話す。番号は oep-spec の
26
- `generated/oep-v1/oep_v1_registry.py` をそのまま写した `oep_client.v1.registry` から取る。破壊的変更を前提とする
26
+ `generated/oep-v1/oep_v1_registry.py` をそのまま写した `oep_client.registry` から取る。破壊的変更を前提とする
27
27
  実験段階で、互換 API は約束しない。OEP を初めて読む人は oep-spec の `docs/review-guide.ja.md`(どこに何が書いてあるか)から。
28
28
 
29
29
  target の知識は host にある、という OEP の分担に従う。probe は線と DMI / DP・AP の転送しか知らず、CH32 の flash
@@ -34,14 +34,14 @@ pip install oep-client-python # PyPI (import oep_client); a checkout: pip in
34
34
  uv run pytest # in a checkout
35
35
  ```
36
36
 
37
- `import oep_client.v1` だけで使える(`sys.path` に `src/` を足す使い方は不要になった)。番号の表は `tools/sync_registry.sh` で
37
+ `import oep_client` だけで使える(`sys.path` に `src/` を足す使い方は不要になった)。番号の表は `tools/sync_registry.sh` で
38
38
  oep-spec から写す。PyPI の `oep-client` は別のプロジェクトなので、配布名は `oep-client-python`。
39
39
 
40
40
  リリースは GitHub Actions の Release(workflow_dispatch、version = X.Y.Z か X.Y.ZbN): `tools/prepare_release.py` が
41
41
  pyproject.toml と `oep_client.__version__` を書き換え、CHANGELOG.md の Unreleased をその版にし、試験と build の後に commit と tag、
42
42
  GitHub Release、PyPI(Trusted Publishing)へ出す。変更は CHANGELOG.md の Unreleased に (EN) / (JA) で書き足しておく。
43
43
 
44
- ## モジュール(`oep_client.v1`)
44
+ ## モジュール(`oep_client`)
45
45
 
46
46
  | モジュール | 中身 |
47
47
  |---|---|
@@ -66,7 +66,7 @@ GitHub Release、PyPI(Trusted Publishing)へ出す。変更は CHANGELOG.md
66
66
  ## 使い方の例
67
67
 
68
68
  ```python
69
- from oep_client.v1 import core, link, riscv, ch32_flash
69
+ from oep_client import core, link, riscv, ch32_flash
70
70
 
71
71
  hst = link.open_host("/run/board-identify/by-id/esp32-series-30eda0e31108") # pipelining つき
72
72
  # a serial port (always COBS), "tcp://127.0.0.1:PORT" (a broker), "usb" / "usb:303a:0002[:SERIAL]" (vendor, then HID)
@@ -81,7 +81,7 @@ wire.detach(conn)
81
81
  hst.end()
82
82
  ```
83
83
 
84
- 能力の一覧は `uv run python -m oep_client.v1 dump --port <probe>`(`--fake p4-x035` でハードウェアなし)。
84
+ 能力の一覧は `uv run python -m oep_client dump --port <probe>`(`--fake p4-x035` でハードウェアなし)。
85
85
  実機での一通りの確認は ArduinoCore-CH32 の `tests/manual/oep_smoke/`(`oep_smoke.py`、`oep_probe_checks.py`)。
86
86
 
87
87
  ## 偽の probe(動く spec)
@@ -94,7 +94,7 @@ hst.end()
94
94
  外のプログラムの試験には `fake_serve` を子プロセスで使う:
95
95
 
96
96
  ```sh
97
- uv run python -m oep_client.v1.fake_serve --pty --profile p4-bench --slot x035 --bind last-reset \
97
+ uv run python -m oep_client.fake_serve --pty --profile p4-bench --slot x035 --bind last-reset \
98
98
  --console 'uptime %d\r\n' --every 100
99
99
  # 最初の行: PTY /dev/pts/N(--tcp 0 なら PORT n)。stdin を閉じると終わる
100
100
  ```
@@ -0,0 +1,35 @@
1
+ oep_client/__init__.py,sha256=HPhV-26_OX0St4P3ftYE7PmaaGRAKN8qRUJvNMjHElc,163
2
+ oep_client/__main__.py,sha256=5pyY1hn03-bWMuMuo9iMf_KkyAeYc7EEn5KVNYLGTa4,1735
3
+ oep_client/arm.py,sha256=JLyUhLSPcmsk73schZcaJYoOKuHzrvnU8kPmfrEvVuo,12331
4
+ oep_client/capture.py,sha256=RZgDnWqr8Aqy49U7PqQpnKIQEL18djVuDJFydxrmv-c,17996
5
+ oep_client/catalog.py,sha256=EqAQnSgHFxGbCO2GQ_Ee-uheJKbBBUUpL1-0qHfNMXU,6574
6
+ oep_client/ch32_flash.py,sha256=Fc-6jEj15cQtMSKmfC5dmDetMXJ8hAdAuJ9d9odwrsA,12651
7
+ oep_client/cobs.py,sha256=hqddQI_X7rsBvBvcP_MBE3bXPyB13-Azjqp_9JfdQ1g,2288
8
+ oep_client/console.py,sha256=YYcuc9Qxe3kihla8wynYbDaLVr7wBLEvswrM-cMK3Tk,6859
9
+ oep_client/core.py,sha256=z0-mplQVLOmPyXj1lHc-U7HYl3Gd6o-b5YJhpQTvqKU,8789
10
+ oep_client/decode.py,sha256=M-bRARrA2qGZLoJn0BdXeTb4WjL_2Hb2nk_g1IGXIw4,2382
11
+ oep_client/dump.py,sha256=GAnmu2abuDmGmbWcbbEfC3EUuPp5Hady9vQVNcQ-724,6743
12
+ oep_client/endpoint.py,sha256=ay767evyw0QgM6oXOUcl94b_wxTHtXHxsc8sAUMi6u0,72014
13
+ oep_client/esp32_targets.py,sha256=b8tNH-nb2KC-XgNfWg5l3TO0cyhZOF-gJajaVxNVSGQ,4988
14
+ oep_client/fake.py,sha256=UzpB-A42Ma2QqJj0l-JmwCJkMn6DPVHHN77fcemT59U,13104
15
+ oep_client/fake_serial.py,sha256=6fhtrit9kWix-D83yYfUKFLHJ11pEiMDrlKNeJKvCfU,4314
16
+ oep_client/fake_serve.py,sha256=dIuYxhlAixSb8_OQ4b4UXTkWqW5Tpf_F9uuqMNWn0F4,14612
17
+ oep_client/fixture.py,sha256=653hCD-Iz0Lfs8dT4Hdg3QyubbbOGs1_xjq_3nb8foU,5564
18
+ oep_client/frames.py,sha256=xjgjnXmXUqNJZ5m0h91r4Cy48WoVK1mEMW4gRg-mlMI,3991
19
+ oep_client/hid_stream.py,sha256=99Dsm4Io1keukuETG_UNqjBGiVYZZeb__Pv4ytaKg9k,10695
20
+ oep_client/host.py,sha256=Y5oqE-pw5Ja9cG1dzdy8svIEgR4Kqhki0wuyrpP_xH8,15563
21
+ oep_client/interfaces.py,sha256=P4ehrIj4j-9eg4NjaVdV15pawI2vOqucJwVklSdR-As,5472
22
+ oep_client/link.py,sha256=J9VtBWfTgNoIgUQuj8SsH9hHesQM2uEN545IoxKVS8E,19406
23
+ oep_client/message.py,sha256=MEM1UT6KFM7AsT56jvBLt_FJK_6SJ7O_nGAiipW0_zo,9912
24
+ oep_client/names.py,sha256=ztCZFWs__aR-a5G14TnJP-Q4YfLhbyrzvOVOMJuG93k,3653
25
+ oep_client/registry.py,sha256=nRM-sQiAMs1OzuSZIajdsBfdFckYo3OfwgmcLkHzxqw,9867
26
+ oep_client/riscv.py,sha256=E0_C-4mBsrp9FUoZpMiqSH9e8sC8Q4EO5HRjFKE6_pc,21392
27
+ oep_client/rp2350.py,sha256=7OMyj270k3AY1e3-ljicPwOjf9jOlokbT6QNkA0b0yY,4227
28
+ oep_client/target.py,sha256=R8BvYfFfYNhZF0MysJkNb8b69YgBlmeGXNX8ReZIe5k,1068
29
+ oep_client/uiapduino.py,sha256=IEPG3LbZPksi8g3wmAf6T0CRWSfYKW1_qrH_GBVQdxY,6090
30
+ oep_client/usb_stream.py,sha256=1nvuRNLQkpp8054eG-JutBKh9y0F_8PHGDAfG0ZSbaY,8819
31
+ oep_client_python-0.0.2.dist-info/METADATA,sha256=-b91PthTivaMG_-Cyy-XdhMlPl1gDIx6cjVb4aMu4cs,7294
32
+ oep_client_python-0.0.2.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
33
+ oep_client_python-0.0.2.dist-info/entry_points.txt,sha256=h6_8QX89Ww1ogALEGG5g4kspT3IOV6O51lwKqf5BWco,49
34
+ oep_client_python-0.0.2.dist-info/licenses/LICENSE,sha256=ntlalztb3L1OaNAxmQdHlubu5fVhjMc9oRZi3PeQhXg,1076
35
+ oep_client_python-0.0.2.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ oep = oep_client.__main__:main
oep_client/v1/__init__.py DELETED
@@ -1 +0,0 @@
1
- """Draft: capability discovery by name (oep-spec capability-*.ja.md). No hardware yet."""
@@ -1,36 +0,0 @@
1
- oep_client/__init__.py,sha256=f5QEx-7qtfSSRnMCtAflZ2y0GvfX6lXa_AVjdc4SQfg,166
2
- oep_client/v1/__init__.py,sha256=Aghb5g5wouqnDIUFv9S4dkimnzs5YZcWx9gzgxi7GPM,90
3
- oep_client/v1/__main__.py,sha256=CytzDl1qI-sqXPS5ZqtvV07Riz2agQ7uK-Hlwmyz8fw,1747
4
- oep_client/v1/arm.py,sha256=JLyUhLSPcmsk73schZcaJYoOKuHzrvnU8kPmfrEvVuo,12331
5
- oep_client/v1/capture.py,sha256=RZgDnWqr8Aqy49U7PqQpnKIQEL18djVuDJFydxrmv-c,17996
6
- oep_client/v1/catalog.py,sha256=EqAQnSgHFxGbCO2GQ_Ee-uheJKbBBUUpL1-0qHfNMXU,6574
7
- oep_client/v1/ch32_flash.py,sha256=Fc-6jEj15cQtMSKmfC5dmDetMXJ8hAdAuJ9d9odwrsA,12651
8
- oep_client/v1/cobs.py,sha256=hqddQI_X7rsBvBvcP_MBE3bXPyB13-Azjqp_9JfdQ1g,2288
9
- oep_client/v1/console.py,sha256=YYcuc9Qxe3kihla8wynYbDaLVr7wBLEvswrM-cMK3Tk,6859
10
- oep_client/v1/core.py,sha256=z0-mplQVLOmPyXj1lHc-U7HYl3Gd6o-b5YJhpQTvqKU,8789
11
- oep_client/v1/decode.py,sha256=M-bRARrA2qGZLoJn0BdXeTb4WjL_2Hb2nk_g1IGXIw4,2382
12
- oep_client/v1/dump.py,sha256=GAnmu2abuDmGmbWcbbEfC3EUuPp5Hady9vQVNcQ-724,6743
13
- oep_client/v1/endpoint.py,sha256=ay767evyw0QgM6oXOUcl94b_wxTHtXHxsc8sAUMi6u0,72014
14
- oep_client/v1/esp32_targets.py,sha256=b8tNH-nb2KC-XgNfWg5l3TO0cyhZOF-gJajaVxNVSGQ,4988
15
- oep_client/v1/fake.py,sha256=UzpB-A42Ma2QqJj0l-JmwCJkMn6DPVHHN77fcemT59U,13104
16
- oep_client/v1/fake_serial.py,sha256=6fhtrit9kWix-D83yYfUKFLHJ11pEiMDrlKNeJKvCfU,4314
17
- oep_client/v1/fake_serve.py,sha256=B93k_fV0j0KpO8Qtyx8dQfffxn2EeRsURsdX_ScKEP0,12423
18
- oep_client/v1/fixture.py,sha256=653hCD-Iz0Lfs8dT4Hdg3QyubbbOGs1_xjq_3nb8foU,5564
19
- oep_client/v1/frames.py,sha256=xjgjnXmXUqNJZ5m0h91r4Cy48WoVK1mEMW4gRg-mlMI,3991
20
- oep_client/v1/hid_stream.py,sha256=99Dsm4Io1keukuETG_UNqjBGiVYZZeb__Pv4ytaKg9k,10695
21
- oep_client/v1/host.py,sha256=Y5oqE-pw5Ja9cG1dzdy8svIEgR4Kqhki0wuyrpP_xH8,15563
22
- oep_client/v1/interfaces.py,sha256=P4ehrIj4j-9eg4NjaVdV15pawI2vOqucJwVklSdR-As,5472
23
- oep_client/v1/link.py,sha256=J9VtBWfTgNoIgUQuj8SsH9hHesQM2uEN545IoxKVS8E,19406
24
- oep_client/v1/message.py,sha256=MEM1UT6KFM7AsT56jvBLt_FJK_6SJ7O_nGAiipW0_zo,9912
25
- oep_client/v1/names.py,sha256=ztCZFWs__aR-a5G14TnJP-Q4YfLhbyrzvOVOMJuG93k,3653
26
- oep_client/v1/registry.py,sha256=nRM-sQiAMs1OzuSZIajdsBfdFckYo3OfwgmcLkHzxqw,9867
27
- oep_client/v1/riscv.py,sha256=E0_C-4mBsrp9FUoZpMiqSH9e8sC8Q4EO5HRjFKE6_pc,21392
28
- oep_client/v1/rp2350.py,sha256=7OMyj270k3AY1e3-ljicPwOjf9jOlokbT6QNkA0b0yY,4227
29
- oep_client/v1/target.py,sha256=R8BvYfFfYNhZF0MysJkNb8b69YgBlmeGXNX8ReZIe5k,1068
30
- oep_client/v1/uiapduino.py,sha256=IEPG3LbZPksi8g3wmAf6T0CRWSfYKW1_qrH_GBVQdxY,6090
31
- oep_client/v1/usb_stream.py,sha256=1nvuRNLQkpp8054eG-JutBKh9y0F_8PHGDAfG0ZSbaY,8819
32
- oep_client_python-0.0.1.dist-info/METADATA,sha256=PdTZlP4XrPcU_zZZZYofEqST_flj7AeoXHWF9iC06LQ,7312
33
- oep_client_python-0.0.1.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
34
- oep_client_python-0.0.1.dist-info/entry_points.txt,sha256=F9_WK-5S92fBuWSeCR0GXzmA5OXY6y0xvYpHseqY2R8,52
35
- oep_client_python-0.0.1.dist-info/licenses/LICENSE,sha256=ntlalztb3L1OaNAxmQdHlubu5fVhjMc9oRZi3PeQhXg,1076
36
- oep_client_python-0.0.1.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- oep = oep_client.v1.__main__:main
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes