oep-client-python 0.0.47__tar.gz → 0.0.49__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.47 → oep_client_python-0.0.49}/CHANGELOG.md +34 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/PKG-INFO +1 -1
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/pyproject.toml +1 -1
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/__init__.py +1 -1
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/acquire.py +42 -11
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_capture.py +140 -20
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_acquire.py +49 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_formats.py +24 -6
- oep_client_python-0.0.49/tests/test_virtual_bench_fast_samples.py +64 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/.gitignore +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/LICENSE +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/README.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/README.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/README.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/allocator-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/analog-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/analog-payload-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/arm-adi-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/attach-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/block-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-group-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-group-geometry-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-serial-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-timeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/clock-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-execution-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-fallback-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-paging-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-power-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-storage-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/conformance-checks.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/conformance-spec-compatibility.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/core-fixed-fields-review.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/core-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/corr-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/cut-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/data-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/debug-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dependency-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/discovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dmseq-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dmseq-target-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/execution-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/exhausted-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/fixture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/gpio-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/gpio-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-configuration.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-quickstart.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-schema.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-core-shapes-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-deadline-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-notification-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-resend-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-tlv-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-value-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-wait-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/i2c-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/interface-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/interface-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/link-routes-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/link-transfer-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/logic-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/mailbox-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-output-sample.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-sequence-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/oep-declaration-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/oep-example-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/outcome-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/pin-constraints-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/pipeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/port-speed-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/probe-input-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/recovery-races-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/refusal-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/registered-ops-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/replay-pressure-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/reset-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/resource-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/response-race-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/restart-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retention-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retry-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/route-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/run-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/scan-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/scan-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/selected-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/session-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/session-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/spec-follow-notes.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/spi-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/step-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/subscription-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/tcp-recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/testing-consumers.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/testing-policy.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/tlv-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/README.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/capture.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/common.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/console.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/core.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/debug.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/fixture.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/link.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/plan.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/restart.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/transports.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/uart-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/uart-stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/usb-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/wire-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/writer-lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/__main__.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/arm.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/capture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/capture_blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/catalog.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/ch32_flash.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/cobs.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/__init__.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_payload.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/block_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/block_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_geometry.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_geometry_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_metadata_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_serial_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/core_fixed_fields.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/core_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/corr.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/declaration_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependencies.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependency_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependency_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/discovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/execution_order.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/execution_order_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/exhausted.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/exhausted_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/fixture_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/fixture_metadata_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/force_hw.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_core_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_deadline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_deadline_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_notifications.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_notifications_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_request_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_requests.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_resend.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_resend_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_tlv.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_tlv_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_values.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_values_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_wait.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_wait_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/interface_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/interfaces.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/lease.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/lease_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfer_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfer_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfers.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_retention.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_retention_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_sequence.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_sequence_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notify_hw.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_declaration_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_declarations.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcome_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcome_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcomes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/probe_input.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/probe_input_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_race_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_races.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/refusal_order.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/refusal_order_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/registered_ops.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/registered_ops_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/release_hw.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/replay_pressure.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resource_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resource_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resources.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/response_race.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/response_race_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/route_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/route_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/routes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/selected_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/selected_metadata_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_loss.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_loss_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/subscription_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/subscriptions.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_peers.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_recovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_recovery_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tlv_request_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tlv_requests.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_stream_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_cases.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_hw.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease_model.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease_sample.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/console.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/decode.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/discovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/dump.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/endpoint.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/fixture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/frames.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/hardware.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/hid_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/host.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/interfaces.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/kept_session.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/link.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/linktest.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/memo.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/message.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/names.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/pins.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/probe_log.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/pytest_conformance.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/registry.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/riscv.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/rp2350.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/settings.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/speed_record.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/stimulus.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/targets.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/uiapduino.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/usb_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_mdns.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_serve.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_trigger.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_usb.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_fixture_drive.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_names.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/conftest.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/.env.example +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/test_core_contract.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/test_preflight.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/fixtures/hardware.virtual.toml +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/.env.example +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/.env.virtual.example +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/README.ja.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/README.md +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/__init__.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/boards.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/conftest.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/firmware.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/flash.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/hardware.example.toml +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/hardware.resolved.example.toml +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/record.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/.gitignore +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+1ad47c7-0.0.39-20261027T182907.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+2c0c41f-0.0.39-20261027T174907.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+9317805-0.0.39-20261027T191153.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+a75fd45-0.0.39-20261027T205055.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201038.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201057.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201058.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201059.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896__crash_at_2106_s_-0.0.39-20261027T204608.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T190815.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T191854.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181116.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181812.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T182903.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+62463f2-0.0.39-20261029T145541.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+9317805-0.0.39-20261027T191150.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+a75fd45-0.0.39-20261028T190803.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T191727.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T204611.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191811.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191849.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190820.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190903.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-unknown-0.0.44-20261104T190857.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+2c0c41f-0.0.39-20261027T174933.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+9317805-0.0.39-20261027T191154.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+b7fbdf9-0.0.39-20261027T204617.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+bb371fb-0.0.39-20261028T191816.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220856.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220901.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220915.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.39-20261028T190818.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.44+34c0b0b-0.0.44-20261104T190941.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T180716.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T182855.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T183107.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f-0.0.39-20261027T174908.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175743.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175815.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_33_s_-0.0.39-20261027T175634.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_431_s_-0.0.39-20261027T175709.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+62463f2-0.0.39-20261029T145536.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+7445bee-0.0.39-20261027T155413.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+9317805-0.0.39-20261027T191146.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+b7fbdf9-0.0.39-20261027T191724.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191806.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191843.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+d4d323c-0.0.39-20261028T190809.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155301.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155340.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/test_harness.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/test_probe.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec/DOCS_SHA256 +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec/oep-v1.toml +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec_names.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_address.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capabilities.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_generation_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_cobs.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_allocator.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_analog.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_analog_payload.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_arm_adi.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_attach.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_blocks.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_group.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_group_geometry.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_timeline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_clock.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_core_fixed_fields.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_core_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_corr.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_cut.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_data.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_debug.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dependencies.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_discovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dmseq.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dmseq_target.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_execution_order.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_exhausted.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_fixture_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_force_hw.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_gpio.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_critical_calls.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_deadline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_notifications.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_requests.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_resend.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_tlv.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_values.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_wait.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_i2c.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_interface_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_interfaces.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_lease.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_link_routes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_link_transfers.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_logic.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_mailbox.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_output.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_retention.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_sequence.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_oep_declarations.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_oep_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_outcomes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_pipeline.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed_execution.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_probe_input.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reconnect.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_recovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_recovery_races.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_refusal_order.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_registered_ops.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_replay_pressure.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_replay_records_optional.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reset.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_resources.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_response_race.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_restart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retention.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retention_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retry.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reviewed_pins.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_routes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_run.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_scan.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_scan_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_selected_metadata.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_session_loss.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_session_smoke.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_spec_guard.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_spi.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_step.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_subscriptions.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp_peers.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp_recovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tlv_requests.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_uart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_uart_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_usb.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_wire_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_writer_lease.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_console_queue_and_reset_settle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_core_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_debug_attach.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_debug_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_describe_unset_idle_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_exact_payload_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_extension_patterns.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_controllers.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_link_settings_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_out.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_targets.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_flash_console.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_gpio_drive_and_serve_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_hardware.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_hid_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_boot_lifecycle.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_recovery_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_rules_bounds_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_rules_waits_lines.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_wait_bound.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_interfaces.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_drop.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_host.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_serial.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_linktest.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_literals.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_memo.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_minimal_ops.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_no_resume.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_open_extensions.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_passthrough.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_pins.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_plan.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_port_speed.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_probe_log.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_request_tails.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_request_validation_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_restart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_resubscribe_after_reopen.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_rvswd_rest.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_session.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_settings.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_spec_sections.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_spec_vectors.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_state_resource_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_stimulus.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_target_parts.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_tcp_discovery.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_tlv_reader_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_capture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_common.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_console.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_core_names.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_debug.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_fixture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_fixture_drive.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_link.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_plan.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_restart.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_transports.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_transport_session_rules.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_usb_identity.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_usb_stream.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_analog_roles.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_announce.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_channel_time.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_format_2.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_lifetime.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_notifications.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_options.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_query.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_rates.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_requests.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_source_more.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_waiting.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_pin_constraints.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_rules_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_rules_ops_lines.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_serve_reboot.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_spec.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_targets.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_core.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_core_bool.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_wire_hold.py +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/SPEC_COMMIT +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/SPEC_SHA256 +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/capture_formats.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/checks.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/cobs.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/confirm.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_extensions.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_lifecycle.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_policy.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/discovery.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/headers.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/interface_boundaries.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/interface_profiles.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/logic_layout.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/ops.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/ops_encoding.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/refusals.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/sessions.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/settings_file.json +0 -0
- {oep_client_python-0.0.47 → oep_client_python-0.0.49}/udev/70-oep-probe.rules +0 -0
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.0.49
|
|
6
|
+
- (EN) Changed (virtual bench): a stream follows the probe's clock as a real probe's does. Logic samples are made at once
|
|
7
|
+
with numpy (a second of 1 MS/s on 2 lines: format 0 0.04 s instead of 4.6 s, format 1 about 0.2 to 0.3 s), sample by
|
|
8
|
+
sample only where a track needs it (the glitch filter, the external clock, analog, a test's own value()). The samples
|
|
9
|
+
the clock has taken and the bench has not made yet count as held in its stream buffer: a tick makes a bounded number
|
|
10
|
+
and catches up over ticks; stop makes every sample up to the stop; behind by more than the stream buffer holds, the
|
|
11
|
+
track stops in error as a probe whose buffer overflowed (state 6, error storage). Before, on a busy host the stream ran
|
|
12
|
+
late and ended before the stop: a heading placed by the probe's clock fell past its end (4 cores with 8 busy
|
|
13
|
+
processes, during=steps at 1 MS/s on 2 lines: 8 of 8 by 0.5 to 1.1 s; now 0 of 8, none lost).
|
|
14
|
+
- (JA) 変更(仮想ベンチ): stream は、実機と同じくプローブの時計に従う。ロジックの標本は numpy でまとめて作る(2 本・
|
|
15
|
+
1 MS/s の 1 秒分が、format 0 で 4.6 s から 0.04 s、format 1 で約 0.2〜0.3 s)。1 標本ずつ作るのは、そうしか作れない track
|
|
16
|
+
だけ(グリッチフィルタ、外部クロック、アナログ、試験が差し替えた value())。時計が取ったのにまだ作っていない標本は、
|
|
17
|
+
ストリーム用のバッファに持っている分とみなす。tick は上限つきで作り、何回かで追いつく。stop は止めた時刻までの標本を
|
|
18
|
+
全部作る。遅れがストリーム用のバッファを超えたら、バッファのあふれた実機と同じく track を error で止める(state 6、
|
|
19
|
+
error storage)。これまでは、混んだ host で stream が遅れたまま止めた時刻より前で終わり、プローブの時計で置いた見出しが
|
|
20
|
+
その後になった(4 コアに 8 本の空回り、during=steps で 2 本・1 MS/s: 8 回中 8 回、0.5〜1.1 s。直した後は 8 回中 0 回、
|
|
21
|
+
欠損なし)。
|
|
22
|
+
- (EN) Fixed (0.0.48): a format 1 stream put together on disk failed with a KeyError (a segment's position): the loop
|
|
23
|
+
joining a segment's lines bit by bit reused the name of the loop over the segments, so the next segment taken was the
|
|
24
|
+
wrong one. A format 1 stream on disk is tested now.
|
|
25
|
+
- (JA) 修正(0.0.48): ディスクで組み立てる format 1 の stream が KeyError(区画の位置)で落ちていた。区画の線を 1 bit ずつ
|
|
26
|
+
つなぐループが、区画を回すループと同じ変数名を使っていて、次に取る区画を取り違えていた。ディスクで組み立てる format 1 の
|
|
27
|
+
stream の試験を足した。
|
|
28
|
+
|
|
29
|
+
## 0.0.48
|
|
30
|
+
- (EN) Fixed: a stream's segments join bit by bit, so a stream is one part unless data was lost. A segment whose
|
|
31
|
+
samples did not fill whole bytes of each line (the ESP32-P4's 65332 samples of 2 lines at 5 and 10 MS/s) started a new
|
|
32
|
+
part every time: 300 to 550 parts, none lost. A format 1 segment whose samples are not a multiple of every D still
|
|
33
|
+
starts a new part (its ticks restart, capture §1.3).
|
|
34
|
+
- (JA) 修正: stream の区画を 1 bit ずつつなぐ。欠損がなければ、stream は 1 つの部分になる。線ごとに標本がバイトの切れ目で
|
|
35
|
+
終わらない区画(ESP32-P4 の 2 本の線の 65332 標本、5 MS/s と 10 MS/s)では、そのたびに新しい部分を始めていて、欠損なしで
|
|
36
|
+
300〜550 の部分に分かれていた。format 1 で標本数がどの D の倍数でもない区画は、今までどおり新しい部分を始める
|
|
37
|
+
(その刻みが始め直しになるため、capture §1.3)。
|
|
38
|
+
|
|
5
39
|
## 0.0.47
|
|
6
40
|
- (EN) Added: `acquire.Request(during=steps)` for a stream in place of `seconds`: it streams until `steps(wait)`
|
|
7
41
|
returns, `wait(seconds)` collecting while it waits, so a script marks sections and sends ops or console commands on
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: oep-client-python
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.49
|
|
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
|
|
@@ -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.49"
|
|
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"
|
|
@@ -1655,14 +1655,14 @@ class _Spool:
|
|
|
1655
1655
|
p, nxt = ready[k][0], ready[j][1]
|
|
1656
1656
|
x = self.segs[p]
|
|
1657
1657
|
samples = sum(self.segs.pop(q).samples for q, _ in ready[k:j + 1])
|
|
1658
|
-
if self.cur is not None and
|
|
1658
|
+
if self.cur is not None and any(self.cur["samples"] % d for d in self.ds):
|
|
1659
1659
|
self._close(follows=True) # a grid restart (format 1) is not a loss: the next part follows on
|
|
1660
1660
|
self._open(p, x)
|
|
1661
1661
|
data = bytes(self.pending[p - self.at:nxt - self.at])
|
|
1662
1662
|
cols = _segment_columns(self.cap, data, samples, len(self.names), self.cfg)
|
|
1663
|
-
for col, f, ev in zip(cols, self.cur["files"], self.cur["events"]):
|
|
1664
|
-
if isinstance(col, bytes):
|
|
1665
|
-
|
|
1663
|
+
for c, (col, f, ev) in enumerate(zip(cols, self.cur["files"], self.cur["events"])):
|
|
1664
|
+
if isinstance(col, bytes): # joined bit by bit: a segment need not end on a whole byte
|
|
1665
|
+
self.cur["carry"][c] = _write_bits(f, self.cur["carry"][c], col, samples)
|
|
1666
1666
|
else:
|
|
1667
1667
|
ev[0].append(col[0] + self.cur["samples"] // col[4])
|
|
1668
1668
|
ev[1].append(col[1])
|
|
@@ -1693,7 +1693,7 @@ class _Spool:
|
|
|
1693
1693
|
k = len(self.parts)
|
|
1694
1694
|
files = [open(os.path.join(self.dir, f"p{k}-{j}.bits"), "wb") for j in range(len(self.names))]
|
|
1695
1695
|
self.cur = {"tick0": tick0, "meta": _seg_meta(seg) if seg is not None else {}, "samples": 0, "files": files,
|
|
1696
|
-
"events": [[[], [], [], None] for _ in self.names]}
|
|
1696
|
+
"events": [[[], [], [], None] for _ in self.names], "carry": [None] * len(self.names)}
|
|
1697
1697
|
self._follows = False
|
|
1698
1698
|
|
|
1699
1699
|
_last_samples, _last_end, _follows = 0, None, False
|
|
@@ -1705,6 +1705,7 @@ class _Spool:
|
|
|
1705
1705
|
cur, n = self.cur, self.cur["samples"]
|
|
1706
1706
|
chans = []
|
|
1707
1707
|
for role, (name, ch, f, ev) in enumerate(zip(self.names, self.ids, cur["files"], cur["events"])):
|
|
1708
|
+
_flush_bits(f, cur["carry"][role])
|
|
1708
1709
|
f.close()
|
|
1709
1710
|
d = self.cfg.event_d.get(role) if self.blocks else None
|
|
1710
1711
|
if d is not None:
|
|
@@ -1791,7 +1792,7 @@ def _stream_parts(cap, cfg, got, names, ids, req: Request) -> tuple[list, list]:
|
|
|
1791
1792
|
chans = from_interleaved(data, names, cfg.width, cfg.positions, samples)
|
|
1792
1793
|
else:
|
|
1793
1794
|
chans = _from_blocks(cap, data, names, samples, cfg)
|
|
1794
|
-
restart = acc is not None and
|
|
1795
|
+
restart = acc is not None and any(acc_samples % d for d in ds)
|
|
1795
1796
|
if acc is None or restart: # a grid restart (format 1) is not a loss: the next part follows on
|
|
1796
1797
|
if acc is not None:
|
|
1797
1798
|
parts.append(_part(_built(acc, acc_samples, ids), acc_meta, tick0))
|
|
@@ -1865,10 +1866,41 @@ def _samples_at_once(run, names, ids, cfg, samples: int) -> list:
|
|
|
1865
1866
|
for name, ch, bits in zip(names, ids, packed)]
|
|
1866
1867
|
|
|
1867
1868
|
|
|
1869
|
+
def _write_bits(f, carry, col: bytes, samples: int):
|
|
1870
|
+
"""Append `samples` bits of `col` (sample i at bit i % 8 of byte i // 8) to file `f` after the `carry` bits not
|
|
1871
|
+
yet written (None: none): whole bytes go to the file, the bits left over (fewer than 8) come back as the carry."""
|
|
1872
|
+
if carry is None and samples % 8 == 0:
|
|
1873
|
+
f.write(col[:samples // 8])
|
|
1874
|
+
return None
|
|
1875
|
+
import numpy as np
|
|
1876
|
+
bits = np.unpackbits(np.frombuffer(col, np.uint8, (samples + 7) // 8), bitorder="little")[:samples]
|
|
1877
|
+
if carry is not None:
|
|
1878
|
+
bits = np.concatenate([carry, bits])
|
|
1879
|
+
whole = len(bits) // 8 * 8
|
|
1880
|
+
f.write(np.packbits(bits[:whole], bitorder="little").tobytes())
|
|
1881
|
+
return bits[whole:] if whole < len(bits) else None
|
|
1882
|
+
|
|
1883
|
+
|
|
1884
|
+
def _flush_bits(f, carry) -> None:
|
|
1885
|
+
"""The last carry of _write_bits: its bits in one byte, the rest 0."""
|
|
1886
|
+
if carry is not None and len(carry):
|
|
1887
|
+
import numpy as np
|
|
1888
|
+
f.write(np.packbits(carry, bitorder="little").tobytes())
|
|
1889
|
+
|
|
1890
|
+
|
|
1891
|
+
def _join_bits(pieces) -> bytes:
|
|
1892
|
+
"""Pieces (bits, n) joined bit by bit: n need not be a multiple of 8."""
|
|
1893
|
+
if all(n % 8 == 0 for _, n in pieces[:-1]):
|
|
1894
|
+
return b"".join(b[:(n + 7) // 8] for b, n in pieces)
|
|
1895
|
+
import numpy as np
|
|
1896
|
+
return np.packbits(np.concatenate([np.unpackbits(np.frombuffer(b, np.uint8, (n + 7) // 8), bitorder="little")[:n]
|
|
1897
|
+
for b, n in pieces]), bitorder="little").tobytes()
|
|
1898
|
+
|
|
1899
|
+
|
|
1868
1900
|
class _Acc:
|
|
1869
|
-
"""One channel of a part being joined from its segments (bits:
|
|
1870
|
-
|
|
1871
|
-
|
|
1901
|
+
"""One channel of a part being joined from its segments (bits: joined bit by bit; events: quanta offset by the
|
|
1902
|
+
samples so far, a multiple of D). A segment that follows on carries the level before it as its start (§1.3), so
|
|
1903
|
+
its changes join the part's as they are."""
|
|
1872
1904
|
def __init__(self, c):
|
|
1873
1905
|
self.first, self.pieces = c, []
|
|
1874
1906
|
self.start = getattr(c, "start_level", None)
|
|
@@ -1894,8 +1926,7 @@ def _built(acc: list, samples: int, ids) -> list:
|
|
|
1894
1926
|
ct += c_
|
|
1895
1927
|
out.append(changes(c.name, ks, lv, ct, -(-samples // c.step), c.step, 0, a.start, pin=ch))
|
|
1896
1928
|
else:
|
|
1897
|
-
out.append(Bits(c.name,
|
|
1898
|
-
{"pin": ch}))
|
|
1929
|
+
out.append(Bits(c.name, _join_bits(a.pieces)[:(samples + 7) // 8], samples, 1, 0, {"pin": ch}))
|
|
1899
1930
|
return out
|
|
1900
1931
|
|
|
1901
1932
|
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_capture.py
RENAMED
|
@@ -82,11 +82,11 @@ BITS = 12 # the analog value's b (layout)
|
|
|
82
82
|
BLOCK_TOP = 4096 # its own: the longest block L it makes (§1.3)
|
|
83
83
|
STREAM_BUFFER_BYTES = 1 << 20 # its own: what a stream holds unsent, said in the answer (stream_buffer, §3.3)
|
|
84
84
|
UNKNOWN_END = 1 << 62 # streaming format 1: a segment dropped whole whose end is not taken yet
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
85
|
+
FAST_A_TICK = 1 << 17 # streaming: the most one tick makes when numpy makes them at once (a_tick)
|
|
86
|
+
BLOCKS_A_TICK = 1 << 14 # streaming: the most samples one tick makes sample by sample - catching up on all
|
|
87
|
+
# the time passed at once fell further behind every tick until the bench answered
|
|
88
|
+
# nothing (wireskein: format 1 at 2 MHz x 4 lines; format 0 at 1 MHz x 2 lines,
|
|
89
|
+
# stop answered after 12.8 s): it catches up over ticks (held_most)
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
TIMEBASE_HZ = 100_000_000 # its own: format 3's delta tick (the answer's timebase, §3.8)
|
|
@@ -206,6 +206,38 @@ def logic_block(raw: list[list[int]], events: list[list[int]], ds: list[int], be
|
|
|
206
206
|
return fallback + start + struct.pack("<I", len(ev)) + body + b"".join(ev)
|
|
207
207
|
|
|
208
208
|
|
|
209
|
+
def logic_block_np(np, raw: list, events: list, ds: list[int], before: list[int], L: int) -> bytes:
|
|
210
|
+
"""logic_block with each channel's levels a numpy array: the same bytes, made at once."""
|
|
211
|
+
r = len((raw + events)[0])
|
|
212
|
+
E = len(events)
|
|
213
|
+
fb, ev = [], []
|
|
214
|
+
for e, lv in enumerate(events):
|
|
215
|
+
d = ds[e]
|
|
216
|
+
q = -(-r // d)
|
|
217
|
+
prev = np.concatenate([np.array([before[e]], np.uint8), lv[:-1]])
|
|
218
|
+
changed = np.zeros(q * d, np.int64)
|
|
219
|
+
changed[:r] = lv != prev
|
|
220
|
+
counts = changed.reshape(q, d).sum(axis=1)
|
|
221
|
+
last = lv[np.minimum((np.arange(q) + 1) * d, r) - 1].astype(np.int64)
|
|
222
|
+
t = np.nonzero(counts)[0]
|
|
223
|
+
rec = np.zeros(len(t), dtype=[("t", "<u2"), ("e", "u1"), ("v", "u1")])
|
|
224
|
+
rec["t"], rec["e"], rec["v"] = t, e, (last[t] << 7) | np.minimum(counts[t], 127)
|
|
225
|
+
if len(t) * 4 > L // 8:
|
|
226
|
+
fb.append(e)
|
|
227
|
+
else:
|
|
228
|
+
ev.append(rec.tobytes())
|
|
229
|
+
nb = (E + 7) // 8
|
|
230
|
+
fallback = sum(1 << e for e in fb).to_bytes(nb, "little")
|
|
231
|
+
start = sum(before[e] << e for e in range(E)).to_bytes(nb, "little")
|
|
232
|
+
cols = raw + [events[e] for e in fb]
|
|
233
|
+
body = b""
|
|
234
|
+
if cols:
|
|
235
|
+
bits = np.stack(cols, axis=1).astype(np.uint8)
|
|
236
|
+
body = np.packbits(bits.reshape(-1), bitorder="little").tobytes()
|
|
237
|
+
n_ev = sum(len(x) // 4 for x in ev)
|
|
238
|
+
return fallback + start + struct.pack("<I", n_ev) + body + b"".join(ev)
|
|
239
|
+
|
|
240
|
+
|
|
209
241
|
def analog_part(values: list[int], kind: int, d: int, b: int) -> bytes:
|
|
210
242
|
"""One channel's part of a format 2 block (§1.4): packed the r values of b bits; else for every interval of d
|
|
211
243
|
(the last one partial) min and max (b bits each) and / or the sum (b + ceil(log2 d) bits), in that order - bits by
|
|
@@ -230,6 +262,15 @@ def analog_part(values: list[int], kind: int, d: int, b: int) -> bytes:
|
|
|
230
262
|
return acc.to_bytes((at + 7) // 8, "little")
|
|
231
263
|
|
|
232
264
|
|
|
265
|
+
class _wave:
|
|
266
|
+
"""A logic wave: wave(i, rate) for one sample, wave.many(np, samples, rate) for an array of them (numpy)."""
|
|
267
|
+
def __init__(self, one, many):
|
|
268
|
+
self.one, self.many = one, many
|
|
269
|
+
|
|
270
|
+
def __call__(self, i, rate):
|
|
271
|
+
return self.one(i, rate)
|
|
272
|
+
|
|
273
|
+
|
|
233
274
|
def logic_wave(spec: str):
|
|
234
275
|
"""A logic channel's waveform instead of the counter's bit: `counter`; `quiet[:LEVEL]` (never changes, default
|
|
235
276
|
high); `square:PERIOD` (samples); `uart:BAUD[:TEXT]` - 8N1 characters of TEXT (default "OEP\\n") one after another
|
|
@@ -239,10 +280,10 @@ def logic_wave(spec: str):
|
|
|
239
280
|
return None
|
|
240
281
|
if kind == "quiet":
|
|
241
282
|
level = int(args[0]) if args else 1
|
|
242
|
-
return lambda i, rate: level
|
|
283
|
+
return _wave(lambda i, rate: level, lambda np, i, rate: np.full(len(i), level, np.uint8))
|
|
243
284
|
if kind == "square":
|
|
244
285
|
half = max(1, int(args[0]) // 2)
|
|
245
|
-
return lambda i, rate: (i // half) & 1
|
|
286
|
+
return _wave(lambda i, rate: (i // half) & 1, lambda np, i, rate: ((i // half) & 1).astype(np.uint8))
|
|
246
287
|
if kind == "uart":
|
|
247
288
|
baud = int(args[0])
|
|
248
289
|
text = (args[1] if len(args) > 1 else "OEP\n").encode()
|
|
@@ -255,7 +296,14 @@ def logic_wave(spec: str):
|
|
|
255
296
|
if at <= 8:
|
|
256
297
|
return text[char % len(text)] >> (at - 1) & 1 # LSB first
|
|
257
298
|
return 1 # stop, idle
|
|
258
|
-
|
|
299
|
+
|
|
300
|
+
def many(np, i, rate): # the same, for an array of samples
|
|
301
|
+
r = Fraction(rate) # the track's rate is exact: so is the bit time
|
|
302
|
+
bit = (i * (baud * r.denominator)) // r.numerator
|
|
303
|
+
char, at = np.divmod(bit, 20)
|
|
304
|
+
data = (np.frombuffer(text, np.uint8)[char % len(text)] >> np.clip(at - 1, 0, 7)) & 1
|
|
305
|
+
return np.where(at == 0, 0, np.where(at <= 8, data, 1)).astype(np.uint8)
|
|
306
|
+
return _wave(uart, many)
|
|
259
307
|
raise ValueError(f"logic wave {spec!r}: counter, quiet[:LEVEL], square:PERIOD or uart:BAUD[:TEXT]")
|
|
260
308
|
|
|
261
309
|
|
|
@@ -702,8 +750,39 @@ class VirtualCapture:
|
|
|
702
750
|
slot = "H" if self.width == 2 * self.channels else "I"
|
|
703
751
|
return b"".join(struct.pack(f"<{self.channels}{slot}", *(self.value(k, first + i) for k in self.analog_roles))
|
|
704
752
|
for i in range(n))
|
|
753
|
+
levels = self._levels(first, n)
|
|
754
|
+
if levels is not None: # numpy: the samples at once
|
|
755
|
+
import numpy as np
|
|
756
|
+
bits = np.zeros((n, self.width), np.uint8)
|
|
757
|
+
bits[:, :] = np.stack(levels[:self.width], axis=1)
|
|
758
|
+
return np.packbits(bits.reshape(-1), bitorder="little").tobytes()
|
|
705
759
|
return pack_samples([sum(self.value(k, first + i) << k for k in range(self.width)) for i in range(n)], self.width)
|
|
706
760
|
|
|
761
|
+
def _levels(self, first: int, n: int):
|
|
762
|
+
"""Logic channels 0 .. max(width, channels) - 1 at samples first .. first + n - 1 as numpy arrays, as value() gives them; None
|
|
763
|
+
where only value() can (numpy missing, the glitch filter, the external clock, a wave without its array form, a
|
|
764
|
+
value() a test put on the track).
|
|
765
|
+
Python made a sample a microsecond or more: a bench behind 1 MS/s on a busy host."""
|
|
766
|
+
ns = max(self.glitch_ns.values(), default=0)
|
|
767
|
+
if self.analog or self.clock is not None or n <= 0 or (ns and -(-ns * self.rate // 1_000_000_000) > 1) or \
|
|
768
|
+
"value" in vars(self): # a test's own value(): only it says
|
|
769
|
+
return None
|
|
770
|
+
try:
|
|
771
|
+
import numpy as np
|
|
772
|
+
except ImportError:
|
|
773
|
+
return None
|
|
774
|
+
i = np.arange(first, first + n, dtype=np.int64)
|
|
775
|
+
out = []
|
|
776
|
+
for k in range(max(self.width, self.channels)): # format 1: the channels, its w apart (0 or less)
|
|
777
|
+
wave = self.waves.get(self.logic_roles[k]) if k < len(self.logic_roles) else None
|
|
778
|
+
if wave is None:
|
|
779
|
+
out.append(((i >> k) & 1).astype(np.uint8))
|
|
780
|
+
elif isinstance(wave, _wave):
|
|
781
|
+
out.append(wave.many(np, i, self.rate))
|
|
782
|
+
else:
|
|
783
|
+
return None
|
|
784
|
+
return out
|
|
785
|
+
|
|
707
786
|
def _blocks(self, first: int, n: int, contiguous: bool, segment_start: bool = True) -> bytes:
|
|
708
787
|
"""A format 1 segment (§1.3): blocks of L from its sample 0; start_level the sample before when it is
|
|
709
788
|
contiguous in the generation, else the block's first. Format 2: _analog_blocks; format 3: _timed."""
|
|
@@ -715,10 +794,18 @@ class VirtualCapture:
|
|
|
715
794
|
raw = [k for k in roles if self.carriages.get(k, (CARRIAGE["raw"], 1))[0] == CARRIAGE["raw"]]
|
|
716
795
|
ev = [k for k in roles if k not in raw]
|
|
717
796
|
ds = [self.carriages[k][1] for k in ev]
|
|
797
|
+
levels = self._levels(first, n) # numpy: the samples and the blocks at once
|
|
718
798
|
out = bytearray()
|
|
719
799
|
for b in range(0, n, self.block):
|
|
720
800
|
r = min(self.block, n - b)
|
|
721
801
|
at = first + b
|
|
802
|
+
if levels is not None:
|
|
803
|
+
before = [int(levels[k][b - 1]) if b else (self.value(k, at - 1) if contiguous else int(levels[k][0]))
|
|
804
|
+
for k in ev]
|
|
805
|
+
import numpy as np
|
|
806
|
+
out += logic_block_np(np, [levels[k][b:b + r] for k in raw], [levels[k][b:b + r] for k in ev], ds,
|
|
807
|
+
before, self.block)
|
|
808
|
+
continue
|
|
722
809
|
before = [self.value(k, at - 1) if (b or contiguous) else self.value(k, at) for k in ev]
|
|
723
810
|
out += logic_block([[self.value(k, at + i) for i in range(r)] for k in raw],
|
|
724
811
|
[[self.value(k, at + i) for i in range(r)] for k in ev], ds, before, self.block)
|
|
@@ -1018,22 +1105,43 @@ class VirtualCapture:
|
|
|
1018
1105
|
if len(self.segs) >= self.segments_max:
|
|
1019
1106
|
self.state = STATE["paused"]
|
|
1020
1107
|
break
|
|
1108
|
+
elif self.mode == MODE["streaming"] and due - self.produced > self.held_most():
|
|
1109
|
+
events += self.overflow() # behind by more than its stream holds (below)
|
|
1021
1110
|
elif self.mode == MODE["streaming"] and self.format in PIECES:
|
|
1022
1111
|
self._stream_blocks(due, whole=True)
|
|
1023
1112
|
elif self.mode == MODE["streaming"]:
|
|
1024
|
-
|
|
1025
|
-
n = min((due - self.produced) // per_byte * per_byte, BLOCKS_A_TICK)
|
|
1026
|
-
if n > 0:
|
|
1027
|
-
self.data += self._pack(self.produced, n)
|
|
1028
|
-
self.produced += n
|
|
1029
|
-
taken = self.produced - self.capture_begin
|
|
1030
|
-
first = self.first_segment_samples or self.samples
|
|
1031
|
-
complete = 0 if taken < first else 1 + (taken - first) // self.samples
|
|
1032
|
-
self.serial_done = complete & 0xFFFFFFFF
|
|
1033
|
-
done_samples = 0 if not complete else first + (complete - 1) * self.samples
|
|
1034
|
-
self.stream_committed_bytes = self.bytes_of(done_samples)
|
|
1113
|
+
self._stream_samples(due)
|
|
1035
1114
|
return events
|
|
1036
1115
|
|
|
1116
|
+
# Streaming follows the clock as a probe's does: sample i is the one taken at t0 + i / rate, and the samples the
|
|
1117
|
+
# clock has taken that the bench has not made yet are as a probe's samples held unsent in its stream buffer. A tick
|
|
1118
|
+
# makes a bounded number (the bench keeps answering), so it may be behind for a while and catch up; stop makes every
|
|
1119
|
+
# sample up to the stop (a probe sends all it holds); behind by more than the stream buffer holds, the track stops
|
|
1120
|
+
# in error as a probe whose buffer overflowed (state 6, error storage) - never a stream that silently ran late
|
|
1121
|
+
# (a section placed by the probe's clock past the stream's end, wireskein on a busy host).
|
|
1122
|
+
def held_most(self) -> int:
|
|
1123
|
+
"""The samples its stream buffer holds (stream_buffer, §3.3), at format 0's bytes a sample."""
|
|
1124
|
+
return STREAM_BUFFER_BYTES // max(1, self.width) if self.analog else STREAM_BUFFER_BYTES * 8 // max(1, self.width)
|
|
1125
|
+
|
|
1126
|
+
def a_tick(self) -> int:
|
|
1127
|
+
"""The most samples one tick makes: more when numpy makes them at once (a sample a microsecond or more in
|
|
1128
|
+
Python, about a hundredth of that at once)."""
|
|
1129
|
+
return FAST_A_TICK if self._levels(self.produced, 1) is not None else BLOCKS_A_TICK
|
|
1130
|
+
|
|
1131
|
+
def _stream_samples(self, due: int, most: int | None = None) -> None:
|
|
1132
|
+
"""Format 0 streaming: the samples up to `due`, at most `most` (a_tick() by default), whole bytes only."""
|
|
1133
|
+
per_byte = 1 if self.analog else 8 // math.gcd(self.width, 8) # whole bytes only (§2.2)
|
|
1134
|
+
n = min((due - self.produced) // per_byte * per_byte, self.a_tick() if most is None else most)
|
|
1135
|
+
if n > 0:
|
|
1136
|
+
self.data += self._pack(self.produced, n)
|
|
1137
|
+
self.produced += n
|
|
1138
|
+
taken = self.produced - self.capture_begin
|
|
1139
|
+
first = self.first_segment_samples or self.samples
|
|
1140
|
+
complete = 0 if taken < first else 1 + (taken - first) // self.samples
|
|
1141
|
+
self.serial_done = complete & 0xFFFFFFFF
|
|
1142
|
+
done_samples = 0 if not complete else first + (complete - 1) * self.samples
|
|
1143
|
+
self.stream_committed_bytes = self.bytes_of(done_samples)
|
|
1144
|
+
|
|
1037
1145
|
def _stream_geometry(self, rel: int) -> tuple[int, int, int]:
|
|
1038
1146
|
"""Streaming: the segment holding sample `rel` (from the retained start) -> (its number, first sample, size)."""
|
|
1039
1147
|
first = self.first_segment_samples or self.samples
|
|
@@ -1046,7 +1154,7 @@ class VirtualCapture:
|
|
|
1046
1154
|
"""Format 1 streaming: the blocks the clock has taken - each whole (a block counts its events first, §1.3), at
|
|
1047
1155
|
most BLOCKS_A_TICK samples a call; `whole` False at stop: the block being taken ends there, short."""
|
|
1048
1156
|
if whole:
|
|
1049
|
-
due = min(due, self.produced +
|
|
1157
|
+
due = min(due, self.produced + self.a_tick())
|
|
1050
1158
|
else: # stop: only the block begun, not all the time behind
|
|
1051
1159
|
rel = self.produced - self.capture_begin
|
|
1052
1160
|
_, at, size = self._stream_geometry(rel)
|
|
@@ -1104,6 +1212,18 @@ class VirtualCapture:
|
|
|
1104
1212
|
index = self.first_trigger_index if self.first_trigger_index < partial else NONE
|
|
1105
1213
|
segment = self._segment(partial, index, flags=FLAG["short"])
|
|
1106
1214
|
events.append(bytes([EVENT["segment"]]) + segment.pack())
|
|
1215
|
+
if self.state == STATE["capturing"] and self.mode == MODE["streaming"] and now_ms is not None:
|
|
1216
|
+
due = self.kept(int((now_ms - self.started_ms) * self.rate / 1000)) # every sample up to the stop: the
|
|
1217
|
+
if due - self.produced > self.held_most(): # stream holds them (tick's rules, above)
|
|
1218
|
+
return events + self.overflow()
|
|
1219
|
+
while self.state == STATE["capturing"]:
|
|
1220
|
+
before = self.produced
|
|
1221
|
+
if self.format in PIECES:
|
|
1222
|
+
self._stream_blocks(due, whole=True)
|
|
1223
|
+
else:
|
|
1224
|
+
self._stream_samples(due, most=due)
|
|
1225
|
+
if self.produced == before:
|
|
1226
|
+
break
|
|
1107
1227
|
if self.state == STATE["capturing"] and self.mode == MODE["streaming"] and self.format in PIECES:
|
|
1108
1228
|
if now_ms is not None: # the taken samples, a short last block
|
|
1109
1229
|
self._stream_blocks(self.kept(int((now_ms - self.started_ms) * self.rate / 1000)), whole=False)
|
|
@@ -115,6 +115,15 @@ def test_during_is_for_a_stream_in_place_of_seconds():
|
|
|
115
115
|
acquire.Request([("A", "GPIO10")], 1_000_000, 100, during=lambda wait: None, **kw)
|
|
116
116
|
|
|
117
117
|
|
|
118
|
+
def test_a_format_1_stream_on_disk(probe, tmp_path):
|
|
119
|
+
"""Streamed in format 1, raw and changes lines, put together on disk as it comes: every segment joined in order."""
|
|
120
|
+
for resolution in ({"B": 1}, {"A": 4, "B": 1}):
|
|
121
|
+
req = acquire.Request([("A", "GPIO10"), ("B", "GPIO11")], 1_000_000, 0, mode="stream", seconds=0.3,
|
|
122
|
+
resolution=resolution, spool_dir=str(tmp_path))
|
|
123
|
+
res = acquire.capture_at(probe(), req)
|
|
124
|
+
assert res.complete and len(res.parts) == 1, resolution
|
|
125
|
+
|
|
126
|
+
|
|
118
127
|
def test_format_1_lines_as_their_changes(probe):
|
|
119
128
|
req = acquire.Request([("A", "GPIO10"), ("B", "GPIO11")], 20_000_000, 1000, resolution={"B": 1})
|
|
120
129
|
res = acquire.capture_at(probe(), req)
|
|
@@ -165,3 +174,43 @@ def test_lines_are_named_by_channel_name_or_label(probe):
|
|
|
165
174
|
acquire.capture_at(probe(), acquire.Request([("A", "10")], 20_000_000, 100)) # a number is not a name
|
|
166
175
|
with pytest.raises(ValueError, match="no channel carries that label"):
|
|
167
176
|
acquire.capture_at(probe(), acquire.Request([("A", "x035.nrst")], 20_000_000, 100))
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_stream_segments_join_bit_by_bit(tmp_path):
|
|
180
|
+
"""A stream's segments need not end on a whole byte of each line (2 lines in 2-bit samples, 65332 samples a
|
|
181
|
+
segment on the P4): they join into one part, bit by bit - parts are cut only where data was lost."""
|
|
182
|
+
import random
|
|
183
|
+
import types
|
|
184
|
+
from oep_client.capture import SegmentInfo
|
|
185
|
+
rnd = random.Random(1)
|
|
186
|
+
n_seg, per = 3, 12 # 12 samples: 3 bytes of the stream, 1.5 bytes a line
|
|
187
|
+
a = [rnd.randrange(2) for _ in range(n_seg * per)]
|
|
188
|
+
b = [rnd.randrange(2) for _ in range(n_seg * per)]
|
|
189
|
+
data = bytearray()
|
|
190
|
+
for i in range(0, len(a), 4): # sample i: bits 2i (A) and 2i + 1 (B) of the stream
|
|
191
|
+
v = 0
|
|
192
|
+
for j in range(4):
|
|
193
|
+
v |= (a[i + j] | b[i + j] << 1) << (2 * j)
|
|
194
|
+
data.append(v)
|
|
195
|
+
segs = {k * 3: SegmentInfo(k * 3, per, 1_000_000 + k * per * 200, 50) for k in range(n_seg)}
|
|
196
|
+
got = types.SimpleNamespace(data=data, segments=segs, gaps=[], start=0)
|
|
197
|
+
cfg = types.SimpleNamespace(rate=5_000_000, width=2, positions=None, event_d={})
|
|
198
|
+
req = acquire.Request([("A", "x"), ("B", "y")], 5_000_000, 0, mode="stream", seconds=1)
|
|
199
|
+
parts, lost = acquire._stream_parts(None, cfg, got, ["A", "B"], [10, 11], req)
|
|
200
|
+
assert not lost and len(parts) == 1
|
|
201
|
+
got_a, got_b = (list(levels(c)) for c in parts[0].channels)
|
|
202
|
+
assert got_a == a and got_b == b
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def test_bits_written_across_bytes(tmp_path):
|
|
206
|
+
import io
|
|
207
|
+
rnd = __import__("random").Random(2)
|
|
208
|
+
want, f, carry = [], io.BytesIO(), None
|
|
209
|
+
for n in (5, 12, 3, 16, 7):
|
|
210
|
+
bits = [rnd.randrange(2) for _ in range(n)]
|
|
211
|
+
want += bits
|
|
212
|
+
col = bytes(sum(bits[i + j] << j for j in range(min(8, n - i))) for i in range(0, n, 8))
|
|
213
|
+
carry = acquire._write_bits(f, carry, col, n)
|
|
214
|
+
acquire._flush_bits(f, carry)
|
|
215
|
+
out = np.unpackbits(np.frombuffer(f.getvalue(), np.uint8), bitorder="little")[: len(want)]
|
|
216
|
+
assert list(out) == want and len(f.getvalue()) == (len(want) + 7) // 8
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_formats.py
RENAMED
|
@@ -297,10 +297,10 @@ def test_streaming_answer_says_its_stream_buffer():
|
|
|
297
297
|
assert lc.configure(rate=10_000_000, samples=100).stream_buffer is None # one-shot: not said
|
|
298
298
|
|
|
299
299
|
|
|
300
|
-
def
|
|
301
|
-
"""Streaming format 0: a tick makes
|
|
302
|
-
|
|
303
|
-
|
|
300
|
+
def test_format_0_streaming_catches_up_over_ticks_and_stop_makes_every_sample():
|
|
301
|
+
"""Streaming format 0: a tick makes a bounded number of samples (a_tick), so a bench behind a fast rate still
|
|
302
|
+
answers and catches up over ticks; stop makes every sample up to the stop (a probe sends what its stream buffer
|
|
303
|
+
holds) - before, the stream ran late and ended before the stop (wireskein: a section past its end on a busy host)."""
|
|
304
304
|
from oep_client import virtual_bench_capture as vbc
|
|
305
305
|
ep, hst, lc, clock = bench()
|
|
306
306
|
planned(hst, lc, 2)
|
|
@@ -310,12 +310,30 @@ def test_format_0_streaming_makes_a_tick_at_most_and_stop_answers():
|
|
|
310
310
|
cap = ep.captures[lc.fn]
|
|
311
311
|
clock.t += 2_000 # 2 s (within the lease): two million samples due
|
|
312
312
|
cap.tick(clock.t)
|
|
313
|
-
assert cap.produced ==
|
|
313
|
+
assert cap.produced == cap.a_tick() < 2_000_000
|
|
314
314
|
lc.stop()
|
|
315
|
-
assert cap.produced
|
|
315
|
+
assert cap.produced == 2_000_000 # all of them, at the stop
|
|
316
316
|
assert lc.status().state == c.STATE["configured"]
|
|
317
317
|
|
|
318
318
|
|
|
319
|
+
def test_streaming_behind_more_than_its_buffer_stops_in_error(monkeypatch):
|
|
320
|
+
"""Behind by more than its stream buffer holds, the track stops in error as a probe whose buffer overflowed: never a
|
|
321
|
+
stream that silently ran late."""
|
|
322
|
+
from oep_client import virtual_bench_capture as vbc
|
|
323
|
+
monkeypatch.setattr(vbc, "STREAM_BUFFER_BYTES", 1 << 12) # 16384 samples of 2 lines: 16 ms at 1 MS/s
|
|
324
|
+
ep, hst, lc, clock = bench()
|
|
325
|
+
planned(hst, lc, 2)
|
|
326
|
+
lc.configure(rate=1_000_000, mode=c.STREAMING)
|
|
327
|
+
lc.subscribe(16384, 20)
|
|
328
|
+
lc.start()
|
|
329
|
+
cap = ep.captures[lc.fn]
|
|
330
|
+
assert cap.held_most() == 16384
|
|
331
|
+
clock.t += 30 # more than the buffer's time, in one go
|
|
332
|
+
cap.tick(clock.t)
|
|
333
|
+
st = lc.status()
|
|
334
|
+
assert st.state == c.STATE["error"]
|
|
335
|
+
|
|
336
|
+
|
|
319
337
|
def test_format_1_with_every_channel_events_has_w_and_c_0():
|
|
320
338
|
ep, hst, lc, clock = bench()
|
|
321
339
|
roles = planned(hst, lc, 3)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""The virtual bench's logic samples made at once with numpy are the ones value() gives, sample by sample: the counter,
|
|
2
|
+
the logic waves, every w, any first sample and length; and a second of 1 MS/s on 2 lines takes well under a second."""
|
|
3
|
+
|
|
4
|
+
import random
|
|
5
|
+
import time
|
|
6
|
+
from fractions import Fraction
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
from oep_client import virtual_bench_capture as vbc
|
|
11
|
+
|
|
12
|
+
pytest.importorskip("numpy")
|
|
13
|
+
|
|
14
|
+
WAVES = ["quiet", "quiet:0", "square:6", "square:7", "uart:115200", "uart:9600:Hi", "uart:1000000:OEP\n"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def track(width, channels, rate, waves):
|
|
18
|
+
cap = vbc.VirtualCapture({0, 3}, {width}, 1, 1 << 30)
|
|
19
|
+
cap.width, cap.channels, cap.rate, cap.format = width, channels, Fraction(rate), vbc.FORMAT["raw"] \
|
|
20
|
+
if "raw" in vbc.FORMAT else 0
|
|
21
|
+
cap.logic_roles = tuple(range(channels))
|
|
22
|
+
cap.waves = {k: vbc.logic_wave(w) for k, w in waves.items()}
|
|
23
|
+
return cap
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def slow(cap, first, n):
|
|
27
|
+
return vbc.pack_samples([sum(cap.value(k, first + i) << k for k in range(cap.width)) for i in range(n)], cap.width)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_at_once_is_value_sample_by_sample():
|
|
31
|
+
rnd = random.Random(5)
|
|
32
|
+
for _ in range(200):
|
|
33
|
+
width = rnd.choice([1, 2, 3, 4, 5, 8, 12, 16])
|
|
34
|
+
channels = rnd.randint(1, width)
|
|
35
|
+
rate = rnd.choice([1_000_000, 3_000_000, Fraction(80_000_000, 3), 48_000])
|
|
36
|
+
waves = {k: rnd.choice(WAVES) for k in range(channels) if rnd.random() < 0.6}
|
|
37
|
+
cap = track(width, channels, rate, waves)
|
|
38
|
+
first, n = rnd.randrange(0, 1 << 24), rnd.randint(1, 300)
|
|
39
|
+
assert cap._levels(first, n) is not None
|
|
40
|
+
assert cap._pack(first, n) == slow(cap, first, n), (width, channels, rate, waves, first, n)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_a_second_of_1_ms_s_on_2_lines_is_fast():
|
|
44
|
+
cap = track(2, 2, 1_000_000, {1: "uart:115200"})
|
|
45
|
+
t = time.perf_counter()
|
|
46
|
+
for at in range(0, 1_000_000, vbc.BLOCKS_A_TICK):
|
|
47
|
+
cap._pack(at, vbc.BLOCKS_A_TICK)
|
|
48
|
+
assert time.perf_counter() - t < 0.5
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_format_1_blocks_at_once_are_the_same():
|
|
52
|
+
rnd = random.Random(6)
|
|
53
|
+
for _ in range(150):
|
|
54
|
+
channels = rnd.randint(1, 4)
|
|
55
|
+
cap = track(8, channels, 1_000_000, {k: rnd.choice(WAVES) for k in range(channels) if rnd.random() < 0.6})
|
|
56
|
+
cap.block = rnd.choice([64, 256])
|
|
57
|
+
cap.carriages = {k: (vbc.CARRIAGE["events"], rnd.choice([1, 4])) for k in range(channels) if rnd.random() < 0.5}
|
|
58
|
+
first, n = rnd.randrange(1, 1 << 20), rnd.randint(1, 700)
|
|
59
|
+
contiguous = rnd.random() < 0.5
|
|
60
|
+
fast = cap._blocks(first, n, contiguous=contiguous)
|
|
61
|
+
levels = cap._levels
|
|
62
|
+
cap._levels = lambda first, n: None
|
|
63
|
+
assert fast == cap._blocks(first, n, contiguous=contiguous)
|
|
64
|
+
cap._levels = levels
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-group-geometry-conformance.ja.md
RENAMED
|
File without changes
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-metadata-conformance.ja.md
RENAMED
|
File without changes
|
|
File without changes
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-timeline-conformance.ja.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-execution-conformance.ja.md
RENAMED
|
File without changes
|
{oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-fallback-conformance.ja.md
RENAMED
|
File without changes
|