oep-client-python 0.0.37__tar.gz → 0.0.39__tar.gz
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_python-0.0.37 → oep_client_python-0.0.39}/CHANGELOG.md +15 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/PKG-INFO +12 -11
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/README.ja.md +12 -12
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/README.md +11 -10
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/pyproject.toml +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/__init__.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/__main__.py +10 -10
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/core.py +0 -17
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/endpoint.py +60 -33
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/pins.py +21 -7
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/registry.py +3 -3
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/settings.py +61 -54
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench.py +11 -12
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/record.py +3 -3
- oep_client_python-0.0.39/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +549 -0
- oep_client_python-0.0.39/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +176 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +655 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +685 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +167 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +914 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +423 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220856.json +276 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220901.json +276 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220915.json +235 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +121 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +451 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +186 -0
- oep_client_python-0.0.39/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +186 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/test_harness.py +3 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/test_probe.py +5 -5
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/spec/oep-v1.toml +4 -8
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_console_queue_and_reset_settle.py +3 -2
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_gpio_drive_and_serve_options.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_host_rules_2026_10_02.py +7 -7
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_passthrough.py +2 -2
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_pins.py +7 -7
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_restart.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_rvswd_rest.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_settings.py +71 -35
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_spec_vectors.py +6 -6
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_core.py +8 -8
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_core_names.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_rules_2026_10_02.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_rules_2026_10_06.py +2 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_serve_reboot.py +1 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_wire_hold.py +1 -1
- oep_client_python-0.0.39/tests/vectors/SPEC_COMMIT +1 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/SPEC_SHA256 +4 -4
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/ops.json +34 -12
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/settings_file.json +22 -8
- oep_client_python-0.0.37/tests/vectors/SPEC_COMMIT +0 -1
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/.gitignore +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/LICENSE +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/README.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/allocator-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/analog-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/analog-payload-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/arm-adi-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/attach-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/block-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-group-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-group-geometry-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-serial-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-timeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/clock-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-execution-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-fallback-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-paging-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-power-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/config-storage-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/conformance-checks.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/conformance-spec-compatibility.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/core-fixed-fields-review.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/core-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/corr-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/cut-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/data-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/debug-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/dependency-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/discovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/dmseq-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/dmseq-target-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/execution-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/exhausted-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/fixture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/gpio-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/gpio-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/hardware-configuration.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/hardware-quickstart.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/hardware-schema.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-core-shapes-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-deadline-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-notification-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-resend-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-tlv-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-value-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/host-wait-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/i2c-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/interface-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/interface-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/link-routes-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/link-transfer-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/logic-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/mailbox-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/notification-output-sample.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/notification-retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/notification-sequence-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/oep-declaration-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/oep-example-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/outcome-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/pin-constraints-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/pipeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/port-speed-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/probe-input-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/recovery-races-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/refusal-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/registered-ops-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/replay-pressure-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/reset-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/resource-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/response-race-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/restart-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/retention-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/retry-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/route-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/run-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/scan-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/scan-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/selected-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/session-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/session-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/spec-a09fa45-sections.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/spec-follow-notes.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/spi-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/stage9-rule-trace.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/step-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/subscription-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/tcp-recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/testing-consumers.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/testing-policy.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/tlv-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/README.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/common.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/console.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/core.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/debug.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/fixture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/link.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/plan.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/restart.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/common.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/console.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/core.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/debug.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/fixture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/link.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/plan.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/probe-config.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/restart.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/sample-audit.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review/transports.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/common.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/console.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/core.0.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/core.1-6.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/core.7-13.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/debug.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/fixture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/link.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/plan.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/probe-config.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/restart.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review2/transports.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/core-a.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/core-b.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/debug-a.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/debug-b.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review3/rest.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/core-rest.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/core-sessions.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/debug.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/fixture-console.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review4/small.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/capture.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/core-a.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/core-b.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/debug-targets.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/debug-wires.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review5/small.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/capture-console.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/core-early.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/core-late.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/debug-a.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/debug-b.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review6/rest.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/exact-payload.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/host-recovery.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/optional-as-required.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/request-validation.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/state-and-resources.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review7/tlv-readers.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review8/core-1.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review8/core-2.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/review8/debug.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/trace/transports.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/uart-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/uart-stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/usb-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/wire-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/docs/writer-lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/arm.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/capture_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/catalog.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/ch32_flash.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/cobs.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_allocator.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_allocator_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_analog.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_analog_payload.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_analog_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_arm_adi.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_arm_adi_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_attach.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_attach_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_block_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_group.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_group_geometry.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_group_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_serial_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_timeline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_capture_timeline_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_clock.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_clock_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_core_fixed_fields.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_core_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_corr.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_cut.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_cut_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_data.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_data_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_debug.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_debug_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dependencies.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dependency_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_discovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dmseq.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dmseq_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dmseq_target.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_dmseq_target_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_execution_order.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_execution_order_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_exhausted.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_exhausted_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_fixture_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_gpio.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_gpio_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_gpio_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_core.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_core_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_deadline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_deadline_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_notifications.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_notifications_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_request_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_requests.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_resend.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_resend_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_tlv.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_tlv_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_values.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_values_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_wait.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_host_wait_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_i2c.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_i2c_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_interface_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_interfaces.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_lease.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_lease_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_link_routes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_link_routes_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_link_transfer_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_link_transfers.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_logic.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_logic_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_mailbox.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_mailbox_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_notification_retention.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_notification_retention_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_notification_sequence.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_notification_sequence_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_oep_declarations.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_oep_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_outcome_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_outcomes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_pipeline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_pipeline_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_port_speed.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_port_speed_execution.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_port_speed_execution_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_port_speed_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_probe_input.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_probe_input_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_recovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_recovery_race_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_recovery_races.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_recovery_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_refusal_order.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_refusal_order_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_registered_ops.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_replay_pressure.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_reset.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_reset_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_resource_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_resources.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_response_race.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_response_race_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_restart.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_restart_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retention.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retention_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retention_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retention_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retry.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_retry_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_route_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_routes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_run.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_run_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_scan.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_scan_options.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_scan_options_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_scan_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_selected_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_session_loss.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_session_loss_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_session_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_spi.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_spi_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_step.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_step_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_stream_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_subscription_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_subscriptions.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_tcp.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_tcp_peers.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_tcp_recovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_tcp_recovery_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_tlv_requests.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_uart.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_uart_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_uart_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_uart_stream_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_usb.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_usb_cases.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_usb_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_wire_options.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_wire_options_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_writer_lease.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/conformance_writer_lease_sample.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/console.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/decode.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/discovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/dump.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/fixture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/frames.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/hardware.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/hid_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/host.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/interfaces.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/kept_session.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/link.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/linktest.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/message.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/names.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/pytest_conformance.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/riscv.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/rp2350.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/speed_record.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/targets.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/uiapduino.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/usb_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_allocator_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_analog_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_arm_adi_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_attach_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_mdns.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_serve.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_trigger.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_bench_usb.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_block_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_capture_group_geometry_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_capture_group_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_capture_metadata_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_capture_timeline_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_clock_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_core.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_cut_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_data_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_debug_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_declaration_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_dependency_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_dmseq_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_dmseq_target_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_fixture_metadata_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_gpio_lifecycle_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_gpio_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_i2c_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_link_routes_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_link_transfer_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_logic_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_mailbox_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_names.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_notification_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_oep_declaration_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_outcome_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_pipeline_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_port_speed_execution_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_port_speed_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_registered_ops_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_reset_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_resource_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_restart_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_retention_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_retry_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_route_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_run_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_scan_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_scan_options_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_selected_metadata_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_spi_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_step_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_stream_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_tlv_request_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_uart_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_wire_options_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/src/oep_client/virtual_writer_lease_model.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/conftest.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/equipment/.env.example +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/equipment/test_core_contract.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/equipment/test_preflight.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/fixtures/hardware.virtual.toml +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/.env.example +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/.env.virtual.example +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/README.ja.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/README.md +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/__init__.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/boards.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/conftest.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/firmware.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/flash.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/hardware.example.toml +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/hardware.resolved.example.toml +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/.gitignore +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/spec_names.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_capabilities.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_capture_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_cobs.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_allocator.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_analog.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_analog_payload.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_arm_adi.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_attach.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_blocks.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_group.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_group_geometry.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_timeline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_clock.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_core_fixed_fields.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_core_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_corr.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_cut.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_data.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_debug.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_dependencies.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_discovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_dmseq.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_dmseq_target.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_execution_order.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_exhausted.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_fixture_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_gpio.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_core.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_critical_calls.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_deadline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_notifications.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_requests.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_resend.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_tlv.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_values.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_host_wait.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_i2c.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_interface_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_interfaces.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_lease.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_link_routes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_link_transfers.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_logic.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_mailbox.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_notification_output.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_notification_retention.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_notification_sequence.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_oep_declarations.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_oep_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_outcomes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_pipeline.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_port_speed.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_port_speed_execution.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_probe_input.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_reconnect.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_recovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_recovery_races.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_refusal_order.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_registered_ops.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_replay_pressure.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_replay_records_optional.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_reset.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_resources.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_response_race.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_restart.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_retention.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_retention_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_retry.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_routes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_run.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_scan.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_scan_options.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_selected_metadata.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_session_loss.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_session_smoke.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_spec_guard.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_spi.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_step.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_subscriptions.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_tcp.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_tcp_peers.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_tcp_recovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_tlv_requests.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_uart.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_uart_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_usb.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_wire_options.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_conformance_writer_lease.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_debug_attach.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_extension_patterns.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_fixture_targets.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_flash_console.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_hardware.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_hid_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_host_boot_lifecycle.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_host_rules_2026_10_06.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_host_wait_bound.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_interfaces.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_link_drop.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_link_host.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_link_serial.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_linktest.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_literals.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_minimal_ops.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_no_resume.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_plan.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_port_speed.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_request_tails.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_resubscribe_after_reopen.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review4_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review4_debug.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review4_small.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_core_a.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_core_b.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_debug_targets.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_debug_wires.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review5_small.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_capture_console.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_core_early.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_core_late.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_debug_a.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_debug_b.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review6_rest.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review7_exact_payload.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review7_host_recovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review7_request_validation.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review7_state_resources.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review7_tlv_readers.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review8_core_1.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review8_core_2.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_review8_debug.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_session.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_spec_283e5b5.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_spec_2c6d18d.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_spec_3cc50c8.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_spec_sections.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_target_parts.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_tcp_discovery.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_common.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_console.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_debug.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_fixture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_link.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_plan.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_restart.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_trace_transports.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_usb_identity.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_usb_stream.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_analog_roles.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_announce.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_channel_time.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_formats.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_lifetime.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_notifications.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_query.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_rates.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_requests.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_capture_waiting.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_pin_constraints.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_spec.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_bench_targets.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_core.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/test_virtual_core_bool.py +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/capture_formats.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/checks.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/cobs.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/confirm.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/core_extensions.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/core_lifecycle.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/core_policy.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/discovery.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/headers.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/interface_boundaries.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/interface_profiles.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/logic_layout.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/ops_encoding.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/refusals.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/tests/vectors/sessions.json +0 -0
- {oep_client_python-0.0.37 → oep_client_python-0.0.39}/udev/70-oep-probe.rules +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.0.39
|
|
6
|
+
- (EN) No user-facing changes recorded.
|
|
7
|
+
- (JA) ユーザー向け変更の記録はありません。
|
|
8
|
+
|
|
9
|
+
## 0.0.38
|
|
10
|
+
- (JA) 名前と初期値(oep-spec cc82b5e)に合わせた:
|
|
11
|
+
- 設定の値は出どころを持たない。get の値は fn number key len data で、`Value.origin` と `show()` の 4 つ目を無くした。書き出しは全部の値、
|
|
12
|
+
入れ直しは unset を先に、全部の値と比べる。`unset_all` は全部の値を消す。`changeable()`(set / unset があるか。初期値だけの probe は get だけ)。
|
|
13
|
+
- 口と線(host ガイド §5.3): label `S.N` が口 S の線 N(S は英字で始まる英字・数字・`-` の 16 文字まで、N は英字・数字・`-`・`_`)。
|
|
14
|
+
大小文字を区別せずに比べ、書いたとおりに見せる。裸の `nrst` は口の線にならない。`find_line(source, name, port=None)`(口を省くと名付けられた
|
|
15
|
+
口が 1 つのときだけ)、`ports_named`、`port_line`。`core.firmware_labels` / `probe_labels` は無くした(固定の label が無いため)。
|
|
16
|
+
- `oep pins` は `<口>.nrst` / `<口>.power_hi` を勧める(口は `--name`、無ければ probe にある 1 つの口)。
|
|
17
|
+
- 仮想ベンチ: 出どころを無くし、profile の label は初期値(保存の無い起動で入る。`x035.swdio`、`v003.swio` などの `S.N` の形)。label は
|
|
18
|
+
大小文字を区別せずに一意(重なる set は unavailable cause 5、保存に 2 つあれば channel の小さい方)。`with_settings(changeable=False)` で get だけ。
|
|
19
|
+
|
|
5
20
|
## 0.0.37
|
|
6
21
|
- (JA) 設定を core(oep-spec core §13、9fc6ad9 / c4fbd6e)に合わせた。`oep_client.config`(`oep.probe.config`)を無くし、
|
|
7
22
|
`oep_client.settings` を足した:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: oep-client-python
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.39
|
|
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
|
|
@@ -84,7 +84,7 @@ names starting with `_`, may change. Check probe/client compatibility using the
|
|
|
84
84
|
| `pins` | `oep pins`: classify the channels, hold-low search, scan, identify, confirm the reset line, suggest the connection profile and the labels (`PinFinder`) |
|
|
85
85
|
| `console` | `oep.target.console` (position streams: read answers carry their length; marks carry `time_ns`, the common kinds lost / clear / host and the console's reset 0x40 / restart 0x41; the lock-free `streams()` list of stream, connection and mechanism; `open(conn, mechanism)` always makes a new stream (u32) on the connection - a second on a connection with a live one is unavailable cause 6 -; a stream is the session's - close, its connection's release and the session's end release it with its buffer, and its number answers no_resource after that; a write goes into the stream's send queue - its size is the probe's own, not declared -, accepted = min(count, its free space), 0 only when full; an SDI stream's write is unsupported; marks, clear, mark and write are optional) and `ConsoleIO`, read as bytes and written in chunks of at most one frame, on from each answer's accepted (`stall_s`: TimeoutError when nothing is taken for that long) |
|
|
86
86
|
| `fixture` | `oep.fixture.gpio` (`set([(ch, mode)])` applied in order in one request, `read(channels)` the levels; the output strength is the probe's own - there is no drive selection) / `uart` (its stream is the plan's; nothing is received until `configure(baud, fmt)`; `status()` = `UartStatus(baud, format)` in force, baud 0 and format 0 while not configured; a configure the probe could not bring up raises `Failed` and leaves it not configured) / `i2c-target` (one form: `configure(address)` - the target made anew -, every controller write with data one frame for `read_rx`, reads answered from `preload_tx(data)` slots or 0xFF, `status()` = `I2cStatus(state, queued, rx_frames, tx_slots, errors)`, `stretch` when the ops offer it, `internal_pullups`: whether it enables pull-ups of its own; the reserved addresses 0x00-0x07 / 0x78-0x7F refused before sending) / `spi-target` (no reset: configure again; `cs_setup_ns`: how long after CS the first bit is sure; `oep dump` shows it) |
|
|
87
|
-
| `settings` | the core's settings (oep-spec core §13): fn 0's get / set / unset / save / state / network. `Settings(hst)`: `catalog()` = the names of this boot (each fn's category `core` / `name/instance`, items, choices, channel / route / netif names), `show()` = every value as (category, flat name, value,
|
|
87
|
+
| `settings` | the core's settings (oep-spec core §13): fn 0's get / set / unset / save / state / network. `Settings(hst)`: `catalog()` = the names of this boot (each fn's category `core` / `name/instance`, items, choices, channel / route / netif names), `show()` = every value as (category, flat name, value) (no origin: the firmware's initial values are values like any other, core §13.4), `changeable()` (set / unset offered), `set_named(category, {flat: value})` / `unset_named` / `unset_all`, raw `set` / `unset` by (fn, number, key), `save()`, `state()`, `network()`; `export()` / `plan_import(doc)` / `apply_import(plan)` = the settings file (oep-spec docs/oep-settings-file.ja.md; secrets never read); `find_line(source, "nrst", port=None)` = host guide §5.3's line lookup: port S's line N is the label `S.N` (ignoring ASCII case; without a port the one port named), `ports_named(labels)` the ports as written |
|
|
88
88
|
| `capture` | `oep.fixture.logic` / `analog` / `capture-group` (revision 1, oep-spec oep-if-capture). configure's TLVs follow core §2.3: a value the probe cannot honour is refused unsupported with the tag as sent (the table's TLVs go without the critical bit); the answer holds the actual values, its samples among them (analog: a scale for every role, a skew left out read as 0). Every `start()` returns a new generation (`LogicCapture.generation`, never re-used within a boot: past 0xFFFFFFFF a start is refused until a reboot) that read and release name - `read_segment(segment)` passes the segment's own - and every event carries (`events()` drops an earlier start's); streaming data frames carry their generation and their segment (segment_info, never crossing a segment: `Received.segments`); `status()` returns a `Status`. A capture-group binds configured tracks with an immediate trigger, all in one mode, and starts them at once (`CaptureGroup.start` -> the group's start_ns; the group's and each track's generation). Every segment read goes to the `Host.on_capture` callbacks as a `CaptureRecord` (the hook for run recorders; no wireskein dependency) |
|
|
89
89
|
| `decode` | decoding capture channels (I2C) |
|
|
90
90
|
| `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 |
|
|
@@ -135,12 +135,12 @@ A probe's CDC ports (`/dev/ttyACM*`) need no rule beyond the usual `dialout` gro
|
|
|
135
135
|
|
|
136
136
|
```sh
|
|
137
137
|
oep dump --port <probe> # what the probe offers (--virtual p4-x035: no hardware)
|
|
138
|
-
oep settings show <probe> # every value
|
|
138
|
+
oep settings show <probe> # every value, and the storage state
|
|
139
139
|
oep settings items <probe> # what each owner declares (names, forms, choices)
|
|
140
|
-
oep settings set <probe> core channel.GPIO23.label=nrst channel.GPIO20.idle=pull-up [--save]
|
|
140
|
+
oep settings set <probe> core channel.GPIO23.label=v003.nrst channel.GPIO20.idle=pull-up [--save]
|
|
141
141
|
oep settings unset <probe> core channel.GPIO20.idle [--save] # or --all (then --save empties the storage)
|
|
142
142
|
oep settings save <probe> # kept over a restart
|
|
143
|
-
oep settings export <probe> jig.oep-settings.json #
|
|
143
|
+
oep settings export <probe> jig.oep-settings.json # every value by name (secrets as present only)
|
|
144
144
|
oep settings import <probe> jig.oep-settings.json [--save] # shows the changes, asks, then sets / unsets
|
|
145
145
|
oep speed <probe> [921600,500000] [--verify] [--flows out:2] # port_speed: raise a UART bridge (default 500000), print the report (below)
|
|
146
146
|
oep pins <probe> --power 5 --wire swio # where the target is wired: debug pins, reset line, labels (below)
|
|
@@ -223,8 +223,8 @@ option-byte reader for the reset line, max_speed / idle_clock).
|
|
|
223
223
|
NRST exists (read only, never written); then resume.
|
|
224
224
|
5. **reset**: attach under reset through each candidate - the real line stops the hart at the reset vector.
|
|
225
225
|
6. **labels**: the connection profile the host keeps (wire, pins, line settings: the probe keeps no wiring) and the
|
|
226
|
-
labels
|
|
227
|
-
checked with `
|
|
226
|
+
labels `<port>.nrst` / `<port>.power_hi` (the port: `--name`, else the one port the probe's labels name; neither:
|
|
227
|
+
a note asks for `--name`), checked with `settings.find_line` against the probe's settings (a note when another channel already carries the name:
|
|
228
228
|
the line would not be found); `--save` writes the labels (set + save). Nothing is written without `--save`.
|
|
229
229
|
|
|
230
230
|
Safety: a driven or active channel is never driven, scanned or held; the power channel is touched only with `--power`;
|
|
@@ -236,7 +236,7 @@ pulls; its "pulled-up" row (channel 4, the reset line's weak pull-up) is left ou
|
|
|
236
236
|
alone that channel reads floating:
|
|
237
237
|
|
|
238
238
|
```
|
|
239
|
-
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio
|
|
239
|
+
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio --name v003
|
|
240
240
|
power: channel 5 low 300 ms (target off: read), then high 400 ms before the reads
|
|
241
241
|
classify: 52 channels, 16 reads each under pull-up, pull-down
|
|
242
242
|
floating 0-3,6,9-20,26-34,36-50,52-54
|
|
@@ -252,8 +252,8 @@ attach swio 19: target_id 00310510 (WCH DMI 0x7F) -> ch32v00x, halted at dpc 0x1
|
|
|
252
252
|
option bytes (read only): RST_MODE 10 (USER 0xf7): NRST on PD7, 12 ms ignore window
|
|
253
253
|
attach under reset through 4 (held 20 ms): dpc 0x0 -> the reset line
|
|
254
254
|
profile: wire swio, pins 19 (the host's to keep: the probe keeps no wiring)
|
|
255
|
-
label: oep settings set ... core channel.GPIO4.label=nrst (not written)
|
|
256
|
-
label: oep settings set ... core channel.GPIO5.label=power_hi (not written)
|
|
255
|
+
label: oep settings set ... core channel.GPIO4.label=v003.nrst (not written)
|
|
256
|
+
label: oep settings set ... core channel.GPIO5.label=v003.power_hi (not written)
|
|
257
257
|
idle: oep settings set ... core channel.GPIO5.idle=high (keeps the target powered while no plan holds channel 5; not written by this tool)
|
|
258
258
|
released every plan (channel 5 is back to its idle state: the target is powered only while something drives it)
|
|
259
259
|
done in 7.3 s
|
|
@@ -398,7 +398,8 @@ lines outside through `gpio_world`); uart receives nothing until configured, sta
|
|
|
398
398
|
(a write with data one frame, cut at max_length; reads from preload_tx slots, else 0xFF); spi-target without reset.
|
|
399
399
|
Capture: configure's TLVs follow core §2.3 alone; a bound track's start / configure is unavailable cause 4, a bind short
|
|
400
400
|
of resources cause 2 with the fn; a read at or past the write position answers write_pos and len 0. The settings (core §13): each fn's items from its
|
|
401
|
-
describe, values
|
|
401
|
+
describe, values without origin (the profile's initial values in on a boot without a save; labels unique but for ASCII
|
|
402
|
+
case, a probe of get alone with `changeable=False`); a value of another length
|
|
402
403
|
malformed; the generation counts the changes of a boot from 1; state is storage_state, saved_generation, reason; at boot
|
|
403
404
|
the saved values (by category and item name) are checked one by one, disable first, and what fails is left out (partial). port_speed: baud / step / verify_ms on the UART bridge the request came in on, within
|
|
404
405
|
port_speed_tolerance_pct, phases 0-3 read by port_state; the virtual bench goes back after verify_ms, after
|
|
@@ -52,7 +52,7 @@ GitHub Release、PyPI(Trusted Publishing)へ出す。変更は CHANGELOG.md
|
|
|
52
52
|
| `pins` | `oep pins`: channel の分類、low に保つ探索、scan、識別、リセットの線の確かめ、接続プロファイルと label の提案(`PinFinder`) |
|
|
53
53
|
| `console` | `oep.target.console`(位置つきのストリーム: read の応答は長さを持ち、マークは `time_ns` と、共通の kind の lost / clear / host、コンソールの reset 0x40 / restart 0x41 を持つ。ロック不要の `streams()` は stream、connection、mechanism の並び。`open(conn, mechanism)` はいつもその connection に新しいストリーム(u32)を作る - 生きているストリームのある connection への 2 つ目は unavailable cause 6 -。ストリームはセッションのもので、close、connection の解放、セッションの終わりでバッファごと解放され、その番号はその後 no_resource。write はストリームの送りの列に入る - 列の大きさは probe が決め、宣言しない -。accepted = count と列の空きの小さい方で、0 は列が満ちたときだけ。SDI のストリームへの write は unsupported。marks、clear、mark、write は任意)と、バイト列として読み、多くても 1 フレームずつ、応答の accepted の続きから書く `ConsoleIO`(`stall_s`: その間何も受けなければ TimeoutError) |
|
|
54
54
|
| `fixture` | `oep.fixture.gpio`(`set([(ch, mode)])` は 1 つの要求で順に当て、`read(channels)` は level を返す。出力の強さは probe 自身のもので、選ぶ手段は無い)/ `uart`(ストリームは plan が作る。`configure(baud, fmt)` までは何も受けない。`status()` = いま効いている `UartStatus(baud, format)` で、configure していなければ baud 0、format 0。probe が立ち上げられなかった configure は `Failed` を上げ、configure していない状態に戻る)/ `i2c-target`(1 つの形: `configure(address)` - target を作り直す -、データのある controller の書き込み 1 回が `read_rx` の 1 フレーム、読み出しには `preload_tx(data)` の置き場か 0xFF で答える、`status()` = `I2cStatus(state, queued, rx_frames, tx_slots, errors)`、ops にあれば `stretch`、`internal_pullups`: 自分の pull-up を入れるか。予約のアドレス 0x00〜0x07 / 0x78〜0x7F は送る前に断る)/ `spi-target`(reset は無く、configure し直す。`cs_setup_ns`: CS の後、最初のビットが確かになるまでの時間。`oep dump` が出す) |
|
|
55
|
-
| `settings` | core の設定(oep-spec core §13): fn 0 の get / set / unset / save / state / network。`Settings(hst)`: `catalog()` = その起動の名前(各 fn のカテゴリ `core` / `name/instance`、項目、選択肢、channel・経路・netif の名前)、`show()` =
|
|
55
|
+
| `settings` | core の設定(oep-spec core §13): fn 0 の get / set / unset / save / state / network。`Settings(hst)`: `catalog()` = その起動の名前(各 fn のカテゴリ `core` / `name/instance`、項目、選択肢、channel・経路・netif の名前)、`show()` = 全部の値を(カテゴリ、平らな名前、値)で(出どころは無い。firmware の初期値もほかの値と同じ、core §13.4)、`changeable()`(set / unset があるか)、`set_named(category, {平らな名前: 値})` / `unset_named` / `unset_all`、番号での `set` / `unset`、`save()`、`state()`、`network()`。`export()` / `plan_import(doc)` / `apply_import(plan)` = 設定のファイル(oep-spec docs/oep-settings-file.ja.md。secret は読まない)。`find_line(source, "nrst", port=None)` = host ガイド §5.3 の線の探し方(口 S の線 N は label `S.N`、ASCII の大小文字を区別しない。口を省くと名付けられた口が 1 つのときだけそれ)、`ports_named(labels)` は口の名前を書いたとおりに |
|
|
56
56
|
| `capture` | `oep.fixture.logic` / `analog` / `capture-group`(revision 1、oep-spec の oep-if-capture)。configure の TLV は core §2.3 に従う: probe が守れない値は送ったままの tag で unsupported で断られる(表の TLV は critical を付けずに送る)。応答が実際の値で、samples もそれが正しい(アナログ: scale は役割ごとに必ずあり、省かれた skew は 0 と読む)。`start()` はそのたびに新しい世代を返す(`LogicCapture.generation`。同じ起動の間は使い回さず、0xFFFFFFFF の後の start は再起動まで断られる)。read と release はその世代を付け(`read_segment(segment)` は区画自身の世代を付ける)、どの出来事も世代を持つ(`events()` は前の start のものを捨てる)。ストリーミングのデータフレームは世代と自分の区画を持ち、区画をまたがない(segment_info、`Received.segments`)。`status()` は `Status` を返す。capture-group は configure 済みで即時のトリガの、同じ mode のトラックを束ね、一度に始める(`CaptureGroup.start` -> group の start_ns。group と各トラックの世代)。読んだ区画は `Host.on_capture` の callback に `CaptureRecord` で渡る(記録の受け口。wireskein には依存しない) |
|
|
57
57
|
| `decode` | キャプチャのチャネルの復号(I2C) |
|
|
58
58
|
| `registry` | oep-spec の番号の表から生成したモジュール(編集しない。oep-spec から写し直す)。名前からインターフェースの番号を引く公開の入口は `registry.INTERFACES[name]`(`.revision`、`.op`、`.tlv`、`.enum`。例 `INTERFACES["oep.fixture.uart"].enum["role"]`)。`FIXTURE_UART` などのモジュールの名前は同じもの |
|
|
@@ -102,12 +102,12 @@ probe の CDC の口(`/dev/ttyACM*`)は、いつもの `dialout` グルー
|
|
|
102
102
|
|
|
103
103
|
```sh
|
|
104
104
|
oep dump --port <probe> # 能力の一覧(--virtual p4-x035 でハードウェアなし)
|
|
105
|
-
oep settings show <probe> #
|
|
105
|
+
oep settings show <probe> # 全部の値と、保存の状態
|
|
106
106
|
oep settings items <probe> # 各持ち主が宣言する項目(名前、形、選択肢)
|
|
107
|
-
oep settings set <probe> core channel.GPIO23.label=nrst channel.GPIO20.idle=pull-up [--save]
|
|
107
|
+
oep settings set <probe> core channel.GPIO23.label=v003.nrst channel.GPIO20.idle=pull-up [--save]
|
|
108
108
|
oep settings unset <probe> core channel.GPIO20.idle [--save] # --all なら全部(その後の --save で保存も空に)
|
|
109
109
|
oep settings save <probe> # 再起動の後も残す
|
|
110
|
-
oep settings export <probe> jig.oep-settings.json #
|
|
110
|
+
oep settings export <probe> jig.oep-settings.json # 全部の値を名前で書き出す(secret はあることだけ)
|
|
111
111
|
oep settings import <probe> jig.oep-settings.json [--save] # 変わる所を見せ、確かめてから set / unset
|
|
112
112
|
oep speed <probe> [921600,500000] [--verify] [--flows out:2] # port_speed: UART bridge を速くし(既定 500000)、結果を出す(下)
|
|
113
113
|
oep pins <probe> --power 5 --wire swio # target のつながり方: debug のピン、リセットの線、label(下)
|
|
@@ -183,9 +183,9 @@ TCP で OEP を運ぶ probe は DNS-SD で見つける(ネットワークの
|
|
|
183
183
|
4. **identify**: 答えた線に attach(halt)し、target_id で系統を見る。CH32V00x は option bytes で NRST の有無を見る(読むだけ、
|
|
184
184
|
書かない)。その後 resume。
|
|
185
185
|
5. **reset**: 候補ごとにリセットをかけながら attach する。本物の線なら hart はリセットのベクタで止まる。
|
|
186
|
-
6. **labels**: host が持つ接続プロファイル(線、ピン、線の設定。probe は配線を持たない)と、label
|
|
187
|
-
|
|
188
|
-
対して `
|
|
186
|
+
6. **labels**: host が持つ接続プロファイル(線、ピン、線の設定。probe は配線を持たない)と、label `<口>.nrst` / `<口>.power_hi`
|
|
187
|
+
(口は `--name`、無ければ probe の label が名付ける口が 1 つのときその口。どちらも無ければ note で `--name` を求める)を勧める。label は probe の設定に
|
|
188
|
+
対して `settings.find_line` で確かめる(別の channel がもうその名前を持っていれば、線が見つからなくなるので note で言う)。
|
|
189
189
|
`--save` で label を書く(set + save)。`--save` が無ければ何も書かない。
|
|
190
190
|
|
|
191
191
|
安全: driven / active の channel は駆動も scan も保持もしない。電源の channel は `--power` のときだけ触る。low に保つのは
|
|
@@ -196,7 +196,7 @@ ESP32-P4 と CH32V003(電源は GPIO5)、2026-10-02。2026-10-07 の変更
|
|
|
196
196
|
"pulled-up" の行(channel 4、リセットの線の弱い pull-up)はここでは除いた - pull-up と pull-down だけなら floating と読める:
|
|
197
197
|
|
|
198
198
|
```
|
|
199
|
-
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio
|
|
199
|
+
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio --name v003
|
|
200
200
|
power: channel 5 low 300 ms (target off: read), then high 400 ms before the reads
|
|
201
201
|
classify: 52 channels, 16 reads each under pull-up, pull-down
|
|
202
202
|
floating 0-3,6,9-20,26-34,36-50,52-54
|
|
@@ -212,8 +212,8 @@ attach swio 19: target_id 00310510 (WCH DMI 0x7F) -> ch32v00x, halted at dpc 0x1
|
|
|
212
212
|
option bytes (read only): RST_MODE 10 (USER 0xf7): NRST on PD7, 12 ms ignore window
|
|
213
213
|
attach under reset through 4 (held 20 ms): dpc 0x0 -> the reset line
|
|
214
214
|
profile: wire swio, pins 19 (the host's to keep: the probe keeps no wiring)
|
|
215
|
-
label: oep settings set ... core channel.GPIO4.label=nrst (not written)
|
|
216
|
-
label: oep settings set ... core channel.GPIO5.label=power_hi (not written)
|
|
215
|
+
label: oep settings set ... core channel.GPIO4.label=v003.nrst (not written)
|
|
216
|
+
label: oep settings set ... core channel.GPIO5.label=v003.power_hi (not written)
|
|
217
217
|
idle: oep settings set ... core channel.GPIO5.idle=high (keeps the target powered while no plan holds channel 5; not written by this tool)
|
|
218
218
|
released every plan (channel 5 is back to its idle state: the target is powered only while something drives it)
|
|
219
219
|
done in 7.3 s
|
|
@@ -334,8 +334,8 @@ restart 0x41。DMDATA / dmseq のストリームの送りの列は poll ごと
|
|
|
334
334
|
(外の線は `gpio_world`)。uart は configure するまで何も受けず、status は baud と format。i2c-target は 1 つの形(データのある書き込み
|
|
335
335
|
1 回が 1 フレームで max_length で切る。読み出しは preload_tx の置き場から、無ければ 0xFF)。spi-target に reset は無い。capture:
|
|
336
336
|
configure の TLV は core §2.3 だけに従う。bind されたトラックの start / configure は unavailable cause 4、資源の足りない bind は cause 2 と
|
|
337
|
-
fn。書き込み位置以降の read は write_pos と len 0 を答える。設定(core §13): 各 fn の項目は describe
|
|
338
|
-
|
|
337
|
+
fn。書き込み位置以降の read は write_pos と len 0 を答える。設定(core §13): 各 fn の項目は describe から、値は出どころを持たない(profile の初期値は保存の無い起動で入る。label は
|
|
338
|
+
ASCII の大小文字を区別せずに一意。`changeable=False` で get だけの probe)。長さが形と違う値は malformed。generation は起動から 1 で数える変更の回数。state は storage_state、saved_generation、reason。
|
|
339
339
|
起動時は保存した値(カテゴリと項目の名前で)を 1 つずつ確かめ、disable を先に当て、当てられないものは外す(部分適用)。port_speed: 要求が来た UART bridge の口への
|
|
340
340
|
baud / step / verify_ms で、port_speed_tolerance_pct の内、phase 0〜3 は port_state で読める。仮想ベンチが戻るのは verify_ms の後、正常な
|
|
341
341
|
フレームの無い port_speed_idle_ms の後、セッションの終わり - 壊れたフレームでは戻らない。
|
|
@@ -59,7 +59,7 @@ names starting with `_`, may change. Check probe/client compatibility using the
|
|
|
59
59
|
| `pins` | `oep pins`: classify the channels, hold-low search, scan, identify, confirm the reset line, suggest the connection profile and the labels (`PinFinder`) |
|
|
60
60
|
| `console` | `oep.target.console` (position streams: read answers carry their length; marks carry `time_ns`, the common kinds lost / clear / host and the console's reset 0x40 / restart 0x41; the lock-free `streams()` list of stream, connection and mechanism; `open(conn, mechanism)` always makes a new stream (u32) on the connection - a second on a connection with a live one is unavailable cause 6 -; a stream is the session's - close, its connection's release and the session's end release it with its buffer, and its number answers no_resource after that; a write goes into the stream's send queue - its size is the probe's own, not declared -, accepted = min(count, its free space), 0 only when full; an SDI stream's write is unsupported; marks, clear, mark and write are optional) and `ConsoleIO`, read as bytes and written in chunks of at most one frame, on from each answer's accepted (`stall_s`: TimeoutError when nothing is taken for that long) |
|
|
61
61
|
| `fixture` | `oep.fixture.gpio` (`set([(ch, mode)])` applied in order in one request, `read(channels)` the levels; the output strength is the probe's own - there is no drive selection) / `uart` (its stream is the plan's; nothing is received until `configure(baud, fmt)`; `status()` = `UartStatus(baud, format)` in force, baud 0 and format 0 while not configured; a configure the probe could not bring up raises `Failed` and leaves it not configured) / `i2c-target` (one form: `configure(address)` - the target made anew -, every controller write with data one frame for `read_rx`, reads answered from `preload_tx(data)` slots or 0xFF, `status()` = `I2cStatus(state, queued, rx_frames, tx_slots, errors)`, `stretch` when the ops offer it, `internal_pullups`: whether it enables pull-ups of its own; the reserved addresses 0x00-0x07 / 0x78-0x7F refused before sending) / `spi-target` (no reset: configure again; `cs_setup_ns`: how long after CS the first bit is sure; `oep dump` shows it) |
|
|
62
|
-
| `settings` | the core's settings (oep-spec core §13): fn 0's get / set / unset / save / state / network. `Settings(hst)`: `catalog()` = the names of this boot (each fn's category `core` / `name/instance`, items, choices, channel / route / netif names), `show()` = every value as (category, flat name, value,
|
|
62
|
+
| `settings` | the core's settings (oep-spec core §13): fn 0's get / set / unset / save / state / network. `Settings(hst)`: `catalog()` = the names of this boot (each fn's category `core` / `name/instance`, items, choices, channel / route / netif names), `show()` = every value as (category, flat name, value) (no origin: the firmware's initial values are values like any other, core §13.4), `changeable()` (set / unset offered), `set_named(category, {flat: value})` / `unset_named` / `unset_all`, raw `set` / `unset` by (fn, number, key), `save()`, `state()`, `network()`; `export()` / `plan_import(doc)` / `apply_import(plan)` = the settings file (oep-spec docs/oep-settings-file.ja.md; secrets never read); `find_line(source, "nrst", port=None)` = host guide §5.3's line lookup: port S's line N is the label `S.N` (ignoring ASCII case; without a port the one port named), `ports_named(labels)` the ports as written |
|
|
63
63
|
| `capture` | `oep.fixture.logic` / `analog` / `capture-group` (revision 1, oep-spec oep-if-capture). configure's TLVs follow core §2.3: a value the probe cannot honour is refused unsupported with the tag as sent (the table's TLVs go without the critical bit); the answer holds the actual values, its samples among them (analog: a scale for every role, a skew left out read as 0). Every `start()` returns a new generation (`LogicCapture.generation`, never re-used within a boot: past 0xFFFFFFFF a start is refused until a reboot) that read and release name - `read_segment(segment)` passes the segment's own - and every event carries (`events()` drops an earlier start's); streaming data frames carry their generation and their segment (segment_info, never crossing a segment: `Received.segments`); `status()` returns a `Status`. A capture-group binds configured tracks with an immediate trigger, all in one mode, and starts them at once (`CaptureGroup.start` -> the group's start_ns; the group's and each track's generation). Every segment read goes to the `Host.on_capture` callbacks as a `CaptureRecord` (the hook for run recorders; no wireskein dependency) |
|
|
64
64
|
| `decode` | decoding capture channels (I2C) |
|
|
65
65
|
| `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 |
|
|
@@ -110,12 +110,12 @@ A probe's CDC ports (`/dev/ttyACM*`) need no rule beyond the usual `dialout` gro
|
|
|
110
110
|
|
|
111
111
|
```sh
|
|
112
112
|
oep dump --port <probe> # what the probe offers (--virtual p4-x035: no hardware)
|
|
113
|
-
oep settings show <probe> # every value
|
|
113
|
+
oep settings show <probe> # every value, and the storage state
|
|
114
114
|
oep settings items <probe> # what each owner declares (names, forms, choices)
|
|
115
|
-
oep settings set <probe> core channel.GPIO23.label=nrst channel.GPIO20.idle=pull-up [--save]
|
|
115
|
+
oep settings set <probe> core channel.GPIO23.label=v003.nrst channel.GPIO20.idle=pull-up [--save]
|
|
116
116
|
oep settings unset <probe> core channel.GPIO20.idle [--save] # or --all (then --save empties the storage)
|
|
117
117
|
oep settings save <probe> # kept over a restart
|
|
118
|
-
oep settings export <probe> jig.oep-settings.json #
|
|
118
|
+
oep settings export <probe> jig.oep-settings.json # every value by name (secrets as present only)
|
|
119
119
|
oep settings import <probe> jig.oep-settings.json [--save] # shows the changes, asks, then sets / unsets
|
|
120
120
|
oep speed <probe> [921600,500000] [--verify] [--flows out:2] # port_speed: raise a UART bridge (default 500000), print the report (below)
|
|
121
121
|
oep pins <probe> --power 5 --wire swio # where the target is wired: debug pins, reset line, labels (below)
|
|
@@ -198,8 +198,8 @@ option-byte reader for the reset line, max_speed / idle_clock).
|
|
|
198
198
|
NRST exists (read only, never written); then resume.
|
|
199
199
|
5. **reset**: attach under reset through each candidate - the real line stops the hart at the reset vector.
|
|
200
200
|
6. **labels**: the connection profile the host keeps (wire, pins, line settings: the probe keeps no wiring) and the
|
|
201
|
-
labels
|
|
202
|
-
checked with `
|
|
201
|
+
labels `<port>.nrst` / `<port>.power_hi` (the port: `--name`, else the one port the probe's labels name; neither:
|
|
202
|
+
a note asks for `--name`), checked with `settings.find_line` against the probe's settings (a note when another channel already carries the name:
|
|
203
203
|
the line would not be found); `--save` writes the labels (set + save). Nothing is written without `--save`.
|
|
204
204
|
|
|
205
205
|
Safety: a driven or active channel is never driven, scanned or held; the power channel is touched only with `--power`;
|
|
@@ -211,7 +211,7 @@ pulls; its "pulled-up" row (channel 4, the reset line's weak pull-up) is left ou
|
|
|
211
211
|
alone that channel reads floating:
|
|
212
212
|
|
|
213
213
|
```
|
|
214
|
-
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio
|
|
214
|
+
$ oep pins /run/board-identify/by-id/esp32-series-30eda0ea068b --power 5 --wire swio --name v003
|
|
215
215
|
power: channel 5 low 300 ms (target off: read), then high 400 ms before the reads
|
|
216
216
|
classify: 52 channels, 16 reads each under pull-up, pull-down
|
|
217
217
|
floating 0-3,6,9-20,26-34,36-50,52-54
|
|
@@ -227,8 +227,8 @@ attach swio 19: target_id 00310510 (WCH DMI 0x7F) -> ch32v00x, halted at dpc 0x1
|
|
|
227
227
|
option bytes (read only): RST_MODE 10 (USER 0xf7): NRST on PD7, 12 ms ignore window
|
|
228
228
|
attach under reset through 4 (held 20 ms): dpc 0x0 -> the reset line
|
|
229
229
|
profile: wire swio, pins 19 (the host's to keep: the probe keeps no wiring)
|
|
230
|
-
label: oep settings set ... core channel.GPIO4.label=nrst (not written)
|
|
231
|
-
label: oep settings set ... core channel.GPIO5.label=power_hi (not written)
|
|
230
|
+
label: oep settings set ... core channel.GPIO4.label=v003.nrst (not written)
|
|
231
|
+
label: oep settings set ... core channel.GPIO5.label=v003.power_hi (not written)
|
|
232
232
|
idle: oep settings set ... core channel.GPIO5.idle=high (keeps the target powered while no plan holds channel 5; not written by this tool)
|
|
233
233
|
released every plan (channel 5 is back to its idle state: the target is powered only while something drives it)
|
|
234
234
|
done in 7.3 s
|
|
@@ -373,7 +373,8 @@ lines outside through `gpio_world`); uart receives nothing until configured, sta
|
|
|
373
373
|
(a write with data one frame, cut at max_length; reads from preload_tx slots, else 0xFF); spi-target without reset.
|
|
374
374
|
Capture: configure's TLVs follow core §2.3 alone; a bound track's start / configure is unavailable cause 4, a bind short
|
|
375
375
|
of resources cause 2 with the fn; a read at or past the write position answers write_pos and len 0. The settings (core §13): each fn's items from its
|
|
376
|
-
describe, values
|
|
376
|
+
describe, values without origin (the profile's initial values in on a boot without a save; labels unique but for ASCII
|
|
377
|
+
case, a probe of get alone with `changeable=False`); a value of another length
|
|
377
378
|
malformed; the generation counts the changes of a boot from 1; state is storage_state, saved_generation, reason; at boot
|
|
378
379
|
the saved values (by category and item name) are checked one by one, disable first, and what fails is left out (partial). port_speed: baud / step / verify_ms on the UART bridge the request came in on, within
|
|
379
380
|
port_speed_tolerance_pct, phases 0-3 read by port_state; the virtual bench goes back after verify_ms, after
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "oep-client-python"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.39"
|
|
8
8
|
description = "Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""The oep command: what a probe offers (dump) and its settings (settings, core §13).
|
|
2
2
|
|
|
3
3
|
oep dump --port /run/board-identify/by-id/<probe> oep dump --virtual p4-x035 --prefix oep.target --json
|
|
4
|
-
oep settings show <probe> (every value
|
|
4
|
+
oep settings show <probe> (every value, the storage state; lock-free)
|
|
5
5
|
oep settings items <probe> (what each owner declares: names, forms, choices)
|
|
6
|
-
oep settings set <probe> core channel.GPIO23.label=nrst channel.GPIO20.idle=pull-up [--save]
|
|
6
|
+
oep settings set <probe> core channel.GPIO23.label=v003.nrst channel.GPIO20.idle=pull-up [--save]
|
|
7
7
|
oep settings unset <probe> core channel.GPIO20.idle oep settings unset --all <probe> --save (empties the storage)
|
|
8
8
|
oep settings save <probe> oep settings state <probe> oep settings network <probe>
|
|
9
9
|
oep settings export <probe> jig.oep-settings.json oep settings import <probe> jig.oep-settings.json [--save]
|
|
@@ -336,18 +336,18 @@ def _settings_parser(sub) -> None:
|
|
|
336
336
|
c = sub.add_parser("settings", help="the probe's settings (core §13): show, set / unset by name, save, export / "
|
|
337
337
|
"import a settings file, the network")
|
|
338
338
|
cs = c.add_subparsers(dest="action", required=True)
|
|
339
|
-
show = cs.add_parser("show", help="every value (category, name, value
|
|
339
|
+
show = cs.add_parser("show", help="every value (category, name, value) and the storage state (lock-free)")
|
|
340
340
|
show.add_argument("probe")
|
|
341
341
|
show.add_argument("--json", action="store_true")
|
|
342
342
|
items = cs.add_parser("items", help="what the probe declares: each category's items, forms and choices")
|
|
343
343
|
items.add_argument("probe")
|
|
344
344
|
items.add_argument("--json", action="store_true")
|
|
345
|
-
st = cs.add_parser("set", help="values by name in one category: NAME=VALUE ... (core channel.GPIO2.label=nrst)")
|
|
345
|
+
st = cs.add_parser("set", help="values by name in one category: NAME=VALUE ... (core channel.GPIO2.label=v003.nrst)")
|
|
346
346
|
st.add_argument("probe")
|
|
347
347
|
st.add_argument("category", help="core, or an interface's name/instance (oep.fixture.uart/0)")
|
|
348
348
|
st.add_argument("values", nargs="+", metavar="NAME=VALUE")
|
|
349
349
|
st.add_argument("--save", action="store_true")
|
|
350
|
-
un = cs.add_parser("unset", help="values by name
|
|
350
|
+
un = cs.add_parser("unset", help="remove values by name (the item has none after)")
|
|
351
351
|
un.add_argument("probe")
|
|
352
352
|
un.add_argument("category", nargs="?")
|
|
353
353
|
un.add_argument("names", nargs="*")
|
|
@@ -360,10 +360,10 @@ def _settings_parser(sub) -> None:
|
|
|
360
360
|
net = cs.add_parser("network", help="the network now: the TCP port, each netif's state and address (lock-free)")
|
|
361
361
|
net.add_argument("probe")
|
|
362
362
|
net.add_argument("--json", action="store_true")
|
|
363
|
-
ex = cs.add_parser("export", help="write
|
|
363
|
+
ex = cs.add_parser("export", help="write every value to a settings file (JSON; a secret as present only)")
|
|
364
364
|
ex.add_argument("probe")
|
|
365
365
|
ex.add_argument("file", help="the file to write, - for stdout")
|
|
366
|
-
im = cs.add_parser("import", help="make the probe's
|
|
366
|
+
im = cs.add_parser("import", help="make the probe's values a settings file's (shows what changes first)")
|
|
367
367
|
im.add_argument("probe")
|
|
368
368
|
im.add_argument("file")
|
|
369
369
|
im.add_argument("--yes", action="store_true", help="apply without asking")
|
|
@@ -520,16 +520,16 @@ def _show(st, as_json: bool) -> int:
|
|
|
520
520
|
state = st.state() if st.offers("state") else None
|
|
521
521
|
if as_json:
|
|
522
522
|
print(json.dumps({"generation": gen, "state": vars(state) if state else None,
|
|
523
|
-
"values": [dict(category=c, name=n, value=v
|
|
523
|
+
"values": [dict(category=c, name=n, value=v) for c, n, v in rows]}, indent=2))
|
|
524
524
|
return 0
|
|
525
525
|
if state is not None:
|
|
526
526
|
why = f" ({state.reason})" if state.reason else ""
|
|
527
527
|
print(f"storage: {state.storage}{why}, saved generation {state.saved_generation}; now {gen}")
|
|
528
528
|
else:
|
|
529
529
|
print(f"no storage; generation {gen}")
|
|
530
|
-
for c, n, v
|
|
530
|
+
for c, n, v in rows:
|
|
531
531
|
shown = "(secret)" if isinstance(v, dict) else json.dumps(v)
|
|
532
|
-
print(f" {c} {n} = {shown}"
|
|
532
|
+
print(f" {c} {n} = {shown}")
|
|
533
533
|
return 0
|
|
534
534
|
|
|
535
535
|
|
|
@@ -170,23 +170,6 @@ def require(hst: h.Host, fn: int, op: int) -> None:
|
|
|
170
170
|
raise not_offered(fn, op)
|
|
171
171
|
|
|
172
172
|
|
|
173
|
-
def firmware_labels(hst: h.Host) -> list[tuple[int, str]]:
|
|
174
|
-
"""The labels the firmware fixes (channel.{}.label of origin fixed, core §13.4) as (channel, text), in get's order.
|
|
175
|
-
A probe without the settings: none."""
|
|
176
|
-
from . import settings
|
|
177
|
-
if not offers(hst, 0, settings.OP["get"]):
|
|
178
|
-
return []
|
|
179
|
-
st = settings.Settings(hst)
|
|
180
|
-
cat = st.catalog()
|
|
181
|
-
return [(v.key, m.shown(v.data)) for v in st.get()[1] if v.fn == 0 and v.origin == "fixed"
|
|
182
|
-
and (cat.item(0, v.number) or settings.Item(0, 0, "", "", "", 0, 0, 0)).name == settings.LABEL]
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def probe_labels(hst: h.Host) -> dict[str, int]:
|
|
186
|
-
"""The firmware's fixed channel labels: {"NRST": 23, ...}."""
|
|
187
|
-
return {text: ch for ch, text in firmware_labels(hst)}
|
|
188
|
-
|
|
189
|
-
|
|
190
173
|
def max_op_ms(hst: h.Host) -> int:
|
|
191
174
|
"""The longest one request may take on this probe (fn 0's describe max_op_ms, core §7.5): the ceiling of run's
|
|
192
175
|
timeout_ms, a dmi list's waits, an attach's hold_ms, and the argument time of attach, scan and riscv-dm's reset
|
|
@@ -77,7 +77,8 @@ define (oep-spec a09fa45):
|
|
|
77
77
|
oep.fixture.spi-target (§4: configure, arm, read_rx, status; errors at most 1 a transfer; `spi_transfer`),
|
|
78
78
|
oep.fixture.logic / analog / capture-group (`virtual_bench_capture`)
|
|
79
79
|
- the settings (core §13), fn 0's get / set / unset / save / state / network: each fn's items from its describe, the
|
|
80
|
-
|
|
80
|
+
values by (fn, item, key) with no origin, the initial values put in on a boot without a save (`initial`, core §13.4),
|
|
81
|
+
the labels unique but for ASCII case (§13.8); a set checked whole (forms
|
|
81
82
|
malformed, what this probe cannot take unsupported with the value's item index, the whole against what runs); the
|
|
82
83
|
generation counts the changes of one boot from 1; the save by category and item name, applied at boot one value at a
|
|
83
84
|
time (disable first, then idle): what fails is left out (partial, reason 2); a disabled channel is refused everywhere
|
|
@@ -118,7 +119,7 @@ READ_FROM = reg.COMMON.enum["read_from"] # position, oldest, no
|
|
|
118
119
|
STEP_LEFT = _RV.tlv["step_answer"]["step_left"] # step's answer: the hart could not be halted again (§4.2)
|
|
119
120
|
# the settings (core §13): fn 0's ops, the items' forms, key kinds and origins, the core's and the wires' choices
|
|
120
121
|
_SET_OP = reg.CORE.op
|
|
121
|
-
FORM, KEY_KIND
|
|
122
|
+
FORM, KEY_KIND = reg.CORE.enum["setting_form"], reg.CORE.enum["setting_key_kind"]
|
|
122
123
|
SETTING_SECRET = reg.CORE.enum["setting_flag"]["secret"]
|
|
123
124
|
ITEM_TLV = reg.CORE.tlv["unsupported_payload"]["item"]
|
|
124
125
|
IDLE_MODE = reg.CORE.enum["channel_idle"]
|
|
@@ -736,10 +737,10 @@ class Endpoint:
|
|
|
736
737
|
# i2c-target internal pull-ups (fixture §3): features bit2, else none
|
|
737
738
|
self.i2c_pullups = {fn: bool(self.target_decl[fn][1] & I2C_FEATURES["internal_pullups"])
|
|
738
739
|
for fn, name in self.names.items() if name == _I2C.name}
|
|
739
|
-
# the settings (core §13): each fn's items (its describe), the firmware's values (
|
|
740
|
+
# the settings (core §13): each fn's items (its describe), the firmware's initial values (§13.4), the netifs
|
|
740
741
|
self.setting_items = {fn: setting_items(decl) for fn, decl in self.decl.items() if setting_items(decl)}
|
|
741
|
-
self.
|
|
742
|
-
(fn, name, key):
|
|
742
|
+
self.initial: dict[tuple[int, str, int], bytes] = {
|
|
743
|
+
(fn, name, key): bytes(d) for fn, name, key, d in self.inner.get(0, {}).get("initial_values", ())}
|
|
743
744
|
# the network (transports §7): the netifs, a named list (numbers from 1); around the bench: Wi-Fi access points
|
|
744
745
|
# (ssid -> passphrase), the Ethernet cable, what DHCP gives; every drop and reconnect of a netif (a value in use changed)
|
|
745
746
|
self.netif_names = [v.decode() for tag, v in self.decl.get(0, ()) if tag == virtual_bench.NETIF]
|
|
@@ -858,8 +859,10 @@ class Endpoint:
|
|
|
858
859
|
self.speed_frame_busy = False # TEST HOOK: a frame on the raised port is not finished yet
|
|
859
860
|
if self.saved is not None:
|
|
860
861
|
self._apply_saved() # disable before idle (core §13.7)
|
|
861
|
-
|
|
862
|
-
|
|
862
|
+
else:
|
|
863
|
+
if self.saved_unreadable:
|
|
864
|
+
self.storage_state, self.storage_reason = 2, 1 # nothing applied: state 2, reason 1 at the next boot (§3)
|
|
865
|
+
self._initial_values() # no save to use: the initial values (core §13.4)
|
|
863
866
|
self._park(self._boot_channels()) # every free pin's idle state before the first answer (core §8)
|
|
864
867
|
|
|
865
868
|
def _own(self, fn: int, tag: int, fmt: str, default: int) -> int:
|
|
@@ -3263,8 +3266,8 @@ class Endpoint:
|
|
|
3263
3266
|
return (tx + bytes(n))[:n]
|
|
3264
3267
|
|
|
3265
3268
|
# ---- the settings (core §13) ----------------------------------------------------------------------
|
|
3266
|
-
# The items each fn's describe declares (setting, setting_choice); the
|
|
3267
|
-
# the
|
|
3269
|
+
# The items each fn's describe declares (setting, setting_choice); the values as (fn, item, key) -> data (no origin,
|
|
3270
|
+
# §13.4: the initial values go in on a boot without a save); fn 0's ops get / set / unset / save / state / network.
|
|
3268
3271
|
def _items(self, fn: int) -> list[SettingItem]:
|
|
3269
3272
|
return self.setting_items.get(fn, [])
|
|
3270
3273
|
|
|
@@ -3273,18 +3276,43 @@ class Endpoint:
|
|
|
3273
3276
|
return next((k for k, it in enumerate(self._items(fn), 1) if it.name == name), 0)
|
|
3274
3277
|
|
|
3275
3278
|
def _value(self, fn: int, name: str, key: int) -> bytes | None:
|
|
3276
|
-
"""The value now of an item
|
|
3277
|
-
|
|
3278
|
-
if v is None and (fn, name, key) in self.firm:
|
|
3279
|
-
v = self.firm[(fn, name, key)][1]
|
|
3280
|
-
return v
|
|
3279
|
+
"""The value now of an item."""
|
|
3280
|
+
return self.config.get((fn, name, key))
|
|
3281
3281
|
|
|
3282
3282
|
def _values_of(self, name: str, fn: int | None = None, config: dict | None = None) -> dict[tuple[int, int], bytes]:
|
|
3283
|
-
"""Every value of item `name` (of fn `fn`, else of any fn): (fn, key) -> data
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3283
|
+
"""Every value of item `name` (of fn `fn`, else of any fn): (fn, key) -> data."""
|
|
3284
|
+
return {(f, k): v for (f, n, k), v in (self.config if config is None else config).items() if n == name and fn in (None, f)}
|
|
3285
|
+
|
|
3286
|
+
@staticmethod
|
|
3287
|
+
def _fold(d: bytes) -> bytes:
|
|
3288
|
+
return d.translate(bytes.maketrans(b"ABCDEFGHIJKLMNOPQRSTUVWXYZ", b"abcdefghijklmnopqrstuvwxyz"))
|
|
3289
|
+
|
|
3290
|
+
def _label_clash(self, config: dict) -> int | None:
|
|
3291
|
+
"""The later channel of two whose labels are equal but for ASCII case (core §13.8), else None."""
|
|
3292
|
+
seen: dict[bytes, int] = {}
|
|
3293
|
+
for (_, ch), d in sorted(self._values_of("channel.{}.label", 0, config).items()):
|
|
3294
|
+
if self._fold(d) in seen:
|
|
3295
|
+
return ch
|
|
3296
|
+
seen[self._fold(d)] = ch
|
|
3297
|
+
return None
|
|
3298
|
+
|
|
3299
|
+
def _initial_values(self) -> None:
|
|
3300
|
+
"""A boot without a save (core §13.4): the initial values, checked as a set's; ones that do not pass (the
|
|
3301
|
+
firmware's mistake) stay out."""
|
|
3302
|
+
values = {}
|
|
3303
|
+
for (fn, name, key), d in self.initial.items():
|
|
3304
|
+
number = self._item_number(fn, name)
|
|
3305
|
+
if not number:
|
|
3306
|
+
continue
|
|
3307
|
+
it = self._items(fn)[number - 1]
|
|
3308
|
+
try:
|
|
3309
|
+
self._value_form(it, key, fn, d)
|
|
3310
|
+
except Reject:
|
|
3311
|
+
continue
|
|
3312
|
+
if not self._value_refused(fn, it, key, d):
|
|
3313
|
+
values[(fn, name, key)] = d
|
|
3314
|
+
if self._label_clash(values) is None:
|
|
3315
|
+
self.config = values
|
|
3288
3316
|
|
|
3289
3317
|
def _key_ok(self, fn: int, it: SettingItem, key: int) -> bool:
|
|
3290
3318
|
kind = it.key_kind
|
|
@@ -3325,12 +3353,10 @@ class Endpoint:
|
|
|
3325
3353
|
raise Reject(m.MALFORMED)
|
|
3326
3354
|
|
|
3327
3355
|
def _value_refused(self, fn: int, it: SettingItem, key: int, d: bytes) -> bool:
|
|
3328
|
-
"""Whether this probe cannot take the value (unsupported, core §13.3): a key it has no value for, a
|
|
3329
|
-
|
|
3356
|
+
"""Whether this probe cannot take the value (unsupported, core §13.3): a key it has no value for, a choice it does
|
|
3357
|
+
not declare, a channel or fn it does not have, and what the item's owner refuses."""
|
|
3330
3358
|
if not self._key_ok(fn, it, key):
|
|
3331
3359
|
return True
|
|
3332
|
-
if (fn, it.name, key) in self.firm and self.firm[(fn, it.name, key)][0] == ORIGIN["fixed"]:
|
|
3333
|
-
return True
|
|
3334
3360
|
if not d:
|
|
3335
3361
|
return False # a secret kept
|
|
3336
3362
|
if it.form == FORM["enum"] and d[0] not in it.choices:
|
|
@@ -3390,14 +3416,9 @@ class Endpoint:
|
|
|
3390
3416
|
rows = []
|
|
3391
3417
|
for fn in sorted(self.setting_items):
|
|
3392
3418
|
for number, it in enumerate(self._items(fn), 1):
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
user = self.config.get((fn, it.name, k))
|
|
3397
|
-
origin, d = (ORIGIN["user"], user) if user is not None else self.firm[(fn, it.name, k)]
|
|
3398
|
-
if it.flags & SETTING_SECRET:
|
|
3399
|
-
d = b"" # a secret is never read (§13.5)
|
|
3400
|
-
rows.append(struct.pack("<HBHBH", fn, number, k, origin, len(d)) + d)
|
|
3419
|
+
for k in sorted(k for (f, n, k) in self.config if f == fn and n == it.name):
|
|
3420
|
+
d = b"" if it.flags & SETTING_SECRET else self.config[(fn, it.name, k)] # a secret is never read
|
|
3421
|
+
rows.append(struct.pack("<HBHH", fn, number, k, len(d)) + d) # fn number key len data
|
|
3401
3422
|
budget = self.probe.max_frame - m.RESULT_HEADER - 6
|
|
3402
3423
|
out, sent = b"", 0
|
|
3403
3424
|
for row in rows[first:]:
|
|
@@ -3432,7 +3453,7 @@ class Endpoint:
|
|
|
3432
3453
|
values = self._resolve(self._read_values(t, t.take("B"), False))
|
|
3433
3454
|
t.tail()
|
|
3434
3455
|
for i, (fn, it, key, _) in enumerate(values):
|
|
3435
|
-
if it is None
|
|
3456
|
+
if it is None:
|
|
3436
3457
|
raise self._unsupported_item(i)
|
|
3437
3458
|
new = dict(self.config)
|
|
3438
3459
|
for fn, it, key, _ in values:
|
|
@@ -3553,6 +3574,9 @@ class Endpoint:
|
|
|
3553
3574
|
return
|
|
3554
3575
|
if self.generation == 0xFFFFFFFF:
|
|
3555
3576
|
raise unavailable("limit") # no generation left before a restart (§13.5)
|
|
3577
|
+
clash = self._label_clash(new)
|
|
3578
|
+
if clash is not None:
|
|
3579
|
+
raise unavailable("held_by_settings", clash) # two labels equal but for case (§13.8)
|
|
3556
3580
|
disabled = {k for (f, k), v in self._values_of("channel.{}.disable", 0, new).items() if v == b"\x01"}
|
|
3557
3581
|
idles = self._values_of("channel.{}.idle", 0, new)
|
|
3558
3582
|
outputs = (IDLE_MODE["low"], IDLE_MODE["high"])
|
|
@@ -3604,7 +3628,8 @@ class Endpoint:
|
|
|
3604
3628
|
|
|
3605
3629
|
def _apply_saved(self) -> None:
|
|
3606
3630
|
"""At boot (core §13.7): every saved value, by name, checked by itself against this firmware - disable first,
|
|
3607
|
-
then idle (a channel with both keeps the disable), then the rest;
|
|
3631
|
+
then idle (a channel with both keeps the disable), then the rest; of two labels equal but for case the lower
|
|
3632
|
+
channel's; one it cannot take (a category or item it does
|
|
3608
3633
|
not have, a form or value it refuses) is left out and the rest applied (storage_state 3 partial, reason 2)."""
|
|
3609
3634
|
def rank(kv):
|
|
3610
3635
|
(ident, name, key), _ = kv
|
|
@@ -3626,6 +3651,8 @@ class Endpoint:
|
|
|
3626
3651
|
ok = False
|
|
3627
3652
|
if ok and name == "channel.{}.idle" and applied.get((0, "channel.{}.disable", key)) == b"\x01":
|
|
3628
3653
|
ok = False # disable wins over idle on one channel
|
|
3654
|
+
if ok and name == "channel.{}.label" and self._label_clash({**applied, (fn, name, key): d}) is not None:
|
|
3655
|
+
ok = False # labels in key order: the lower channel's stays
|
|
3629
3656
|
if ok:
|
|
3630
3657
|
applied[(fn, name, key)] = d
|
|
3631
3658
|
bad |= not ok
|