oep-client-python 0.0.48__tar.gz → 0.0.50__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.
Files changed (727) hide show
  1. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/CHANGELOG.md +28 -0
  2. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/PKG-INFO +1 -1
  3. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/pyproject.toml +1 -1
  4. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/__init__.py +1 -1
  5. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/acquire.py +2 -2
  6. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_capture.py +140 -20
  7. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_acquire.py +9 -0
  8. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_formats.py +24 -6
  9. oep_client_python-0.0.50/tests/test_virtual_bench_fast_samples.py +64 -0
  10. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/.gitignore +0 -0
  11. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/LICENSE +0 -0
  12. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/README.ja.md +0 -0
  13. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/README.md +0 -0
  14. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/README.ja.md +0 -0
  15. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/allocator-conformance.ja.md +0 -0
  16. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/analog-conformance.ja.md +0 -0
  17. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/analog-payload-conformance.ja.md +0 -0
  18. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/arm-adi-conformance.ja.md +0 -0
  19. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/attach-conformance.ja.md +0 -0
  20. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/block-conformance.ja.md +0 -0
  21. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-group-conformance.ja.md +0 -0
  22. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-group-geometry-conformance.ja.md +0 -0
  23. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-metadata-conformance.ja.md +0 -0
  24. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-serial-conformance.ja.md +0 -0
  25. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-timeline-conformance.ja.md +0 -0
  26. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
  27. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/clock-conformance.ja.md +0 -0
  28. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-conformance.ja.md +0 -0
  29. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-execution-conformance.ja.md +0 -0
  30. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-fallback-conformance.ja.md +0 -0
  31. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-paging-conformance.ja.md +0 -0
  32. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-power-loss-conformance.ja.md +0 -0
  33. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/config-storage-conformance.ja.md +0 -0
  34. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/conformance-checks.ja.md +0 -0
  35. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/conformance-spec-compatibility.ja.md +0 -0
  36. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/core-fixed-fields-review.ja.md +0 -0
  37. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/core-smoke-conformance.ja.md +0 -0
  38. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/corr-conformance.ja.md +0 -0
  39. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/cut-conformance.ja.md +0 -0
  40. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/data-conformance.ja.md +0 -0
  41. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/debug-conformance.ja.md +0 -0
  42. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/dependency-conformance.ja.md +0 -0
  43. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/discovery-conformance.ja.md +0 -0
  44. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/dmseq-conformance.ja.md +0 -0
  45. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/dmseq-target-conformance.ja.md +0 -0
  46. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/execution-order-conformance.ja.md +0 -0
  47. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/exhausted-conformance.ja.md +0 -0
  48. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/fixture-metadata-conformance.ja.md +0 -0
  49. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/gpio-conformance.ja.md +0 -0
  50. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/gpio-lifecycle-conformance.ja.md +0 -0
  51. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/hardware-configuration.ja.md +0 -0
  52. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/hardware-quickstart.ja.md +0 -0
  53. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/hardware-schema.ja.md +0 -0
  54. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-core-shapes-conformance.ja.md +0 -0
  55. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-deadline-conformance.ja.md +0 -0
  56. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-notification-conformance.ja.md +0 -0
  57. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-request-conformance.ja.md +0 -0
  58. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-resend-conformance.ja.md +0 -0
  59. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-tlv-conformance.ja.md +0 -0
  60. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-value-conformance.ja.md +0 -0
  61. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/host-wait-conformance.ja.md +0 -0
  62. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/i2c-conformance.ja.md +0 -0
  63. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/interface-conformance.ja.md +0 -0
  64. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/interface-smoke-conformance.ja.md +0 -0
  65. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/lease-conformance.ja.md +0 -0
  66. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/link-routes-conformance.ja.md +0 -0
  67. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/link-transfer-conformance.ja.md +0 -0
  68. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/logic-conformance.ja.md +0 -0
  69. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/mailbox-conformance.ja.md +0 -0
  70. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/notification-output-sample.ja.md +0 -0
  71. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/notification-retention-conformance.ja.md +0 -0
  72. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/notification-sequence-conformance.ja.md +0 -0
  73. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/oep-declaration-conformance.ja.md +0 -0
  74. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/oep-example-smoke-conformance.ja.md +0 -0
  75. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/outcome-conformance.ja.md +0 -0
  76. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/pin-constraints-conformance.ja.md +0 -0
  77. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/pipeline-conformance.ja.md +0 -0
  78. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/port-speed-conformance.ja.md +0 -0
  79. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/probe-input-conformance.ja.md +0 -0
  80. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/recovery-conformance.ja.md +0 -0
  81. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/recovery-races-conformance.ja.md +0 -0
  82. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/refusal-order-conformance.ja.md +0 -0
  83. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/registered-ops-conformance.ja.md +0 -0
  84. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/replay-pressure-conformance.ja.md +0 -0
  85. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/reset-conformance.ja.md +0 -0
  86. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/resource-conformance.ja.md +0 -0
  87. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/response-race-conformance.ja.md +0 -0
  88. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/restart-conformance.ja.md +0 -0
  89. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/retention-conformance.ja.md +0 -0
  90. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/retention-lifecycle-conformance.ja.md +0 -0
  91. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/retry-conformance.ja.md +0 -0
  92. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/route-conformance.ja.md +0 -0
  93. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/run-conformance.ja.md +0 -0
  94. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/scan-conformance.ja.md +0 -0
  95. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/scan-options-conformance.ja.md +0 -0
  96. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/selected-metadata-conformance.ja.md +0 -0
  97. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/session-loss-conformance.ja.md +0 -0
  98. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/session-smoke-conformance.ja.md +0 -0
  99. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/spec-follow-notes.ja.md +0 -0
  100. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/spi-conformance.ja.md +0 -0
  101. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/step-conformance.ja.md +0 -0
  102. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/stream-conformance.ja.md +0 -0
  103. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/subscription-conformance.ja.md +0 -0
  104. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/tcp-recovery-conformance.ja.md +0 -0
  105. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/testing-consumers.ja.md +0 -0
  106. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/testing-policy.ja.md +0 -0
  107. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/tlv-request-conformance.ja.md +0 -0
  108. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/README.ja.md +0 -0
  109. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/capture.json +0 -0
  110. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/common.json +0 -0
  111. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/console.json +0 -0
  112. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/core.json +0 -0
  113. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/debug.json +0 -0
  114. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/fixture.json +0 -0
  115. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/link.json +0 -0
  116. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/plan.json +0 -0
  117. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/restart.json +0 -0
  118. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/trace/transports.json +0 -0
  119. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/uart-conformance.ja.md +0 -0
  120. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/uart-stream-conformance.ja.md +0 -0
  121. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/usb-conformance.ja.md +0 -0
  122. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/wire-options-conformance.ja.md +0 -0
  123. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/docs/writer-lease-conformance.ja.md +0 -0
  124. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/__main__.py +0 -0
  125. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/arm.py +0 -0
  126. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/capture.py +0 -0
  127. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/capture_blocks.py +0 -0
  128. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/catalog.py +0 -0
  129. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/ch32_flash.py +0 -0
  130. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/cobs.py +0 -0
  131. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/__init__.py +0 -0
  132. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/allocator.py +0 -0
  133. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/allocator_model.py +0 -0
  134. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/allocator_sample.py +0 -0
  135. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/analog.py +0 -0
  136. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/analog_model.py +0 -0
  137. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/analog_payload.py +0 -0
  138. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/analog_sample.py +0 -0
  139. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/arm_adi.py +0 -0
  140. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/arm_adi_blocks.py +0 -0
  141. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/arm_adi_model.py +0 -0
  142. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/arm_adi_sample.py +0 -0
  143. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/attach.py +0 -0
  144. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/attach_model.py +0 -0
  145. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/attach_sample.py +0 -0
  146. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/block_model.py +0 -0
  147. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/block_sample.py +0 -0
  148. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/blocks.py +0 -0
  149. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_group.py +0 -0
  150. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_group_geometry.py +0 -0
  151. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_group_geometry_model.py +0 -0
  152. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_group_model.py +0 -0
  153. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_group_sample.py +0 -0
  154. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_metadata.py +0 -0
  155. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_metadata_model.py +0 -0
  156. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_serial.py +0 -0
  157. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_serial_sample.py +0 -0
  158. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_timeline.py +0 -0
  159. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_timeline_lifecycle.py +0 -0
  160. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_timeline_model.py +0 -0
  161. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/capture_timeline_sample.py +0 -0
  162. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/clock.py +0 -0
  163. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/clock_model.py +0 -0
  164. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/clock_sample.py +0 -0
  165. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/core_fixed_fields.py +0 -0
  166. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/core_smoke.py +0 -0
  167. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/corr.py +0 -0
  168. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/cut.py +0 -0
  169. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/cut_model.py +0 -0
  170. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/cut_sample.py +0 -0
  171. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/data.py +0 -0
  172. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/data_model.py +0 -0
  173. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/data_sample.py +0 -0
  174. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/debug.py +0 -0
  175. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/debug_model.py +0 -0
  176. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/debug_sample.py +0 -0
  177. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/declaration_model.py +0 -0
  178. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dependencies.py +0 -0
  179. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dependency_model.py +0 -0
  180. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dependency_sample.py +0 -0
  181. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/discovery.py +0 -0
  182. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq.py +0 -0
  183. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq_model.py +0 -0
  184. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq_sample.py +0 -0
  185. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq_target.py +0 -0
  186. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq_target_model.py +0 -0
  187. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/dmseq_target_sample.py +0 -0
  188. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/execution_order.py +0 -0
  189. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/execution_order_sample.py +0 -0
  190. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/exhausted.py +0 -0
  191. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/exhausted_sample.py +0 -0
  192. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/fixture_metadata.py +0 -0
  193. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/fixture_metadata_model.py +0 -0
  194. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/force_hw.py +0 -0
  195. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio.py +0 -0
  196. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio_lifecycle.py +0 -0
  197. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio_lifecycle_model.py +0 -0
  198. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio_lifecycle_sample.py +0 -0
  199. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio_model.py +0 -0
  200. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/gpio_sample.py +0 -0
  201. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_core.py +0 -0
  202. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_core_sample.py +0 -0
  203. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_deadline.py +0 -0
  204. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_deadline_sample.py +0 -0
  205. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_notifications.py +0 -0
  206. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_notifications_sample.py +0 -0
  207. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_request_sample.py +0 -0
  208. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_requests.py +0 -0
  209. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_resend.py +0 -0
  210. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_resend_sample.py +0 -0
  211. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_tlv.py +0 -0
  212. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_tlv_sample.py +0 -0
  213. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_values.py +0 -0
  214. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_values_sample.py +0 -0
  215. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_wait.py +0 -0
  216. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/host_wait_sample.py +0 -0
  217. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/i2c.py +0 -0
  218. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/i2c_model.py +0 -0
  219. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/i2c_sample.py +0 -0
  220. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/interface_smoke.py +0 -0
  221. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/interfaces.py +0 -0
  222. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/lease.py +0 -0
  223. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/lease_sample.py +0 -0
  224. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_routes.py +0 -0
  225. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_routes_model.py +0 -0
  226. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_routes_sample.py +0 -0
  227. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_transfer_model.py +0 -0
  228. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_transfer_sample.py +0 -0
  229. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/link_transfers.py +0 -0
  230. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/logic.py +0 -0
  231. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/logic_model.py +0 -0
  232. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/logic_sample.py +0 -0
  233. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/mailbox.py +0 -0
  234. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/mailbox_model.py +0 -0
  235. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/mailbox_sample.py +0 -0
  236. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notification_model.py +0 -0
  237. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notification_retention.py +0 -0
  238. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notification_retention_sample.py +0 -0
  239. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notification_sequence.py +0 -0
  240. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notification_sequence_sample.py +0 -0
  241. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/notify_hw.py +0 -0
  242. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/oep_declaration_model.py +0 -0
  243. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/oep_declarations.py +0 -0
  244. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/oep_smoke.py +0 -0
  245. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/outcome_model.py +0 -0
  246. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/outcome_sample.py +0 -0
  247. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/outcomes.py +0 -0
  248. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/pipeline.py +0 -0
  249. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/pipeline_model.py +0 -0
  250. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/pipeline_sample.py +0 -0
  251. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed.py +0 -0
  252. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_execution.py +0 -0
  253. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_execution_model.py +0 -0
  254. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_execution_sample.py +0 -0
  255. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_lifecycle.py +0 -0
  256. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_model.py +0 -0
  257. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/port_speed_sample.py +0 -0
  258. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/probe_input.py +0 -0
  259. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/probe_input_sample.py +0 -0
  260. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/recovery.py +0 -0
  261. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/recovery_race_sample.py +0 -0
  262. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/recovery_races.py +0 -0
  263. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/recovery_sample.py +0 -0
  264. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/refusal_order.py +0 -0
  265. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/refusal_order_sample.py +0 -0
  266. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/registered_ops.py +0 -0
  267. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/registered_ops_model.py +0 -0
  268. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/release_hw.py +0 -0
  269. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/replay_pressure.py +0 -0
  270. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/reset.py +0 -0
  271. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/reset_model.py +0 -0
  272. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/reset_sample.py +0 -0
  273. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/resource_model.py +0 -0
  274. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/resource_sample.py +0 -0
  275. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/resources.py +0 -0
  276. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/response_race.py +0 -0
  277. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/response_race_sample.py +0 -0
  278. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/restart.py +0 -0
  279. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/restart_model.py +0 -0
  280. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/restart_sample.py +0 -0
  281. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retention.py +0 -0
  282. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retention_lifecycle.py +0 -0
  283. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retention_lifecycle_sample.py +0 -0
  284. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retention_model.py +0 -0
  285. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retention_sample.py +0 -0
  286. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retry.py +0 -0
  287. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retry_model.py +0 -0
  288. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/retry_sample.py +0 -0
  289. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/route_model.py +0 -0
  290. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/route_sample.py +0 -0
  291. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/routes.py +0 -0
  292. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/run.py +0 -0
  293. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/run_model.py +0 -0
  294. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/run_sample.py +0 -0
  295. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan.py +0 -0
  296. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan_model.py +0 -0
  297. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan_options.py +0 -0
  298. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan_options_model.py +0 -0
  299. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan_options_sample.py +0 -0
  300. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/scan_sample.py +0 -0
  301. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/selected_metadata.py +0 -0
  302. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/selected_metadata_model.py +0 -0
  303. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/serial.py +0 -0
  304. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/session_loss.py +0 -0
  305. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/session_loss_sample.py +0 -0
  306. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/session_smoke.py +0 -0
  307. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/spi.py +0 -0
  308. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/spi_model.py +0 -0
  309. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/spi_sample.py +0 -0
  310. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/step.py +0 -0
  311. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/step_model.py +0 -0
  312. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/step_sample.py +0 -0
  313. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/stream.py +0 -0
  314. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/stream_model.py +0 -0
  315. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/stream_sample.py +0 -0
  316. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/subscription_sample.py +0 -0
  317. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/subscriptions.py +0 -0
  318. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tcp.py +0 -0
  319. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tcp_peers.py +0 -0
  320. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tcp_recovery.py +0 -0
  321. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tcp_recovery_sample.py +0 -0
  322. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tlv_request_model.py +0 -0
  323. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/tlv_requests.py +0 -0
  324. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/uart.py +0 -0
  325. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/uart_model.py +0 -0
  326. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/uart_sample.py +0 -0
  327. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/uart_stream.py +0 -0
  328. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/uart_stream_sample.py +0 -0
  329. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/usb.py +0 -0
  330. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/usb_cases.py +0 -0
  331. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/usb_hw.py +0 -0
  332. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/usb_model.py +0 -0
  333. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/wire_options.py +0 -0
  334. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/wire_options_model.py +0 -0
  335. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/wire_options_sample.py +0 -0
  336. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/writer_lease.py +0 -0
  337. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/writer_lease_model.py +0 -0
  338. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/conformance/writer_lease_sample.py +0 -0
  339. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/console.py +0 -0
  340. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/core.py +0 -0
  341. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/decode.py +0 -0
  342. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/discovery.py +0 -0
  343. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/dump.py +0 -0
  344. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/endpoint.py +0 -0
  345. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/fixture.py +0 -0
  346. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/frames.py +0 -0
  347. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/hardware.py +0 -0
  348. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/hid_stream.py +0 -0
  349. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/host.py +0 -0
  350. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/interfaces.py +0 -0
  351. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/kept_session.py +0 -0
  352. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/link.py +0 -0
  353. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/linktest.py +0 -0
  354. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/memo.py +0 -0
  355. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/message.py +0 -0
  356. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/names.py +0 -0
  357. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/pins.py +0 -0
  358. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/probe_log.py +0 -0
  359. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/pytest_conformance.py +0 -0
  360. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/registry.py +0 -0
  361. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/riscv.py +0 -0
  362. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/rp2350.py +0 -0
  363. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/settings.py +0 -0
  364. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/speed_record.py +0 -0
  365. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/stimulus.py +0 -0
  366. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/targets.py +0 -0
  367. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/uiapduino.py +0 -0
  368. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/usb_stream.py +0 -0
  369. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench.py +0 -0
  370. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_mdns.py +0 -0
  371. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_serial.py +0 -0
  372. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_serve.py +0 -0
  373. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_trigger.py +0 -0
  374. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_bench_usb.py +0 -0
  375. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_core.py +0 -0
  376. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_fixture_drive.py +0 -0
  377. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/src/oep_client/virtual_names.py +0 -0
  378. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/conftest.py +0 -0
  379. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/equipment/.env.example +0 -0
  380. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/equipment/test_core_contract.py +0 -0
  381. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/equipment/test_preflight.py +0 -0
  382. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/fixtures/hardware.virtual.toml +0 -0
  383. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/.env.example +0 -0
  384. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/.env.virtual.example +0 -0
  385. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/README.ja.md +0 -0
  386. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/README.md +0 -0
  387. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/__init__.py +0 -0
  388. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/boards.py +0 -0
  389. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/conftest.py +0 -0
  390. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/firmware.py +0 -0
  391. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/flash.py +0 -0
  392. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/hardware.example.toml +0 -0
  393. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/hardware.resolved.example.toml +0 -0
  394. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/record.py +0 -0
  395. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/.gitignore +0 -0
  396. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
  397. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
  398. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
  399. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
  400. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
  401. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
  402. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
  403. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
  404. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
  405. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
  406. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
  407. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
  408. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
  409. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
  410. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
  411. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
  412. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
  413. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +0 -0
  414. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +0 -0
  415. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+1ad47c7-0.0.39-20261027T182907.json +0 -0
  416. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+2c0c41f-0.0.39-20261027T174907.json +0 -0
  417. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+9317805-0.0.39-20261027T191153.json +0 -0
  418. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+a75fd45-0.0.39-20261027T205055.json +0 -0
  419. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201038.json +0 -0
  420. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201057.json +0 -0
  421. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201058.json +0 -0
  422. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201059.json +0 -0
  423. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896__crash_at_2106_s_-0.0.39-20261027T204608.json +0 -0
  424. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T190815.json +0 -0
  425. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T191854.json +0 -0
  426. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181116.json +0 -0
  427. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181812.json +0 -0
  428. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T182903.json +0 -0
  429. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+62463f2-0.0.39-20261029T145541.json +0 -0
  430. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+9317805-0.0.39-20261027T191150.json +0 -0
  431. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+a75fd45-0.0.39-20261028T190803.json +0 -0
  432. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T191727.json +0 -0
  433. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T204611.json +0 -0
  434. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191811.json +0 -0
  435. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191849.json +0 -0
  436. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190820.json +0 -0
  437. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190903.json +0 -0
  438. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/e8f60ae84e28-unknown-0.0.44-20261104T190857.json +0 -0
  439. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
  440. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
  441. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
  442. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
  443. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
  444. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
  445. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +0 -0
  446. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
  447. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +0 -0
  448. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +0 -0
  449. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+2c0c41f-0.0.39-20261027T174933.json +0 -0
  450. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+9317805-0.0.39-20261027T191154.json +0 -0
  451. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+b7fbdf9-0.0.39-20261027T204617.json +0 -0
  452. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+bb371fb-0.0.39-20261028T191816.json +0 -0
  453. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
  454. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
  455. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
  456. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
  457. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
  458. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
  459. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
  460. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
  461. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +0 -0
  462. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +0 -0
  463. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220856.json +0 -0
  464. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220901.json +0 -0
  465. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220915.json +0 -0
  466. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
  467. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +0 -0
  468. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.39-20261028T190818.json +0 -0
  469. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
  470. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
  471. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e31108-0.0.44+34c0b0b-0.0.44-20261104T190941.json +0 -0
  472. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
  473. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
  474. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
  475. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
  476. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
  477. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
  478. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
  479. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
  480. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
  481. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
  482. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
  483. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
  484. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
  485. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +0 -0
  486. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +0 -0
  487. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +0 -0
  488. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T180716.json +0 -0
  489. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T182855.json +0 -0
  490. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T183107.json +0 -0
  491. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f-0.0.39-20261027T174908.json +0 -0
  492. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175743.json +0 -0
  493. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175815.json +0 -0
  494. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_33_s_-0.0.39-20261027T175634.json +0 -0
  495. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_431_s_-0.0.39-20261027T175709.json +0 -0
  496. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+62463f2-0.0.39-20261029T145536.json +0 -0
  497. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+7445bee-0.0.39-20261027T155413.json +0 -0
  498. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+9317805-0.0.39-20261027T191146.json +0 -0
  499. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+b7fbdf9-0.0.39-20261027T191724.json +0 -0
  500. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191806.json +0 -0
  501. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191843.json +0 -0
  502. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+d4d323c-0.0.39-20261028T190809.json +0 -0
  503. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
  504. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155301.json +0 -0
  505. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155340.json +0 -0
  506. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/test_harness.py +0 -0
  507. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/hw/test_probe.py +0 -0
  508. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/spec/DOCS_SHA256 +0 -0
  509. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/spec/oep-v1.toml +0 -0
  510. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/spec_names.py +0 -0
  511. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_address.py +0 -0
  512. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_capabilities.py +0 -0
  513. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_capture.py +0 -0
  514. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_capture_blocks.py +0 -0
  515. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_capture_generation_rules.py +0 -0
  516. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_capture_rules.py +0 -0
  517. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_cobs.py +0 -0
  518. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance.py +0 -0
  519. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_allocator.py +0 -0
  520. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_analog.py +0 -0
  521. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_analog_payload.py +0 -0
  522. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_arm_adi.py +0 -0
  523. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_arm_adi_blocks.py +0 -0
  524. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_attach.py +0 -0
  525. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_blocks.py +0 -0
  526. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_group.py +0 -0
  527. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_group_geometry.py +0 -0
  528. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_metadata.py +0 -0
  529. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_serial.py +0 -0
  530. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_timeline.py +0 -0
  531. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
  532. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_clock.py +0 -0
  533. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_core_fixed_fields.py +0 -0
  534. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_core_smoke.py +0 -0
  535. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_corr.py +0 -0
  536. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_cut.py +0 -0
  537. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_data.py +0 -0
  538. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_debug.py +0 -0
  539. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_dependencies.py +0 -0
  540. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_discovery.py +0 -0
  541. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_dmseq.py +0 -0
  542. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_dmseq_target.py +0 -0
  543. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_execution_order.py +0 -0
  544. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_exhausted.py +0 -0
  545. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_fixture_metadata.py +0 -0
  546. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_force_hw.py +0 -0
  547. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_gpio.py +0 -0
  548. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_gpio_lifecycle.py +0 -0
  549. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_core.py +0 -0
  550. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_critical_calls.py +0 -0
  551. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_deadline.py +0 -0
  552. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_notifications.py +0 -0
  553. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_requests.py +0 -0
  554. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_resend.py +0 -0
  555. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_tlv.py +0 -0
  556. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_values.py +0 -0
  557. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_host_wait.py +0 -0
  558. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_i2c.py +0 -0
  559. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_interface_smoke.py +0 -0
  560. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_interfaces.py +0 -0
  561. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_lease.py +0 -0
  562. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_link_routes.py +0 -0
  563. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_link_transfers.py +0 -0
  564. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_logic.py +0 -0
  565. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_mailbox.py +0 -0
  566. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_notification_output.py +0 -0
  567. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_notification_retention.py +0 -0
  568. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_notification_sequence.py +0 -0
  569. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_oep_declarations.py +0 -0
  570. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_oep_smoke.py +0 -0
  571. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_outcomes.py +0 -0
  572. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_pipeline.py +0 -0
  573. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_port_speed.py +0 -0
  574. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_port_speed_execution.py +0 -0
  575. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_port_speed_lifecycle.py +0 -0
  576. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_probe_input.py +0 -0
  577. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_reconnect.py +0 -0
  578. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_recovery.py +0 -0
  579. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_recovery_races.py +0 -0
  580. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_refusal_order.py +0 -0
  581. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_registered_ops.py +0 -0
  582. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_replay_pressure.py +0 -0
  583. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_replay_records_optional.py +0 -0
  584. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_reset.py +0 -0
  585. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_resources.py +0 -0
  586. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_response_race.py +0 -0
  587. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_restart.py +0 -0
  588. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_retention.py +0 -0
  589. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_retention_lifecycle.py +0 -0
  590. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_retry.py +0 -0
  591. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_reviewed_pins.py +0 -0
  592. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_routes.py +0 -0
  593. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_run.py +0 -0
  594. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_scan.py +0 -0
  595. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_scan_options.py +0 -0
  596. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_selected_metadata.py +0 -0
  597. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_serial.py +0 -0
  598. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_session_loss.py +0 -0
  599. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_session_smoke.py +0 -0
  600. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_spec_guard.py +0 -0
  601. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_spi.py +0 -0
  602. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_step.py +0 -0
  603. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_stream.py +0 -0
  604. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_subscriptions.py +0 -0
  605. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_tcp.py +0 -0
  606. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_tcp_peers.py +0 -0
  607. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_tcp_recovery.py +0 -0
  608. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_tlv_requests.py +0 -0
  609. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_uart.py +0 -0
  610. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_uart_stream.py +0 -0
  611. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_usb.py +0 -0
  612. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_wire_options.py +0 -0
  613. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_conformance_writer_lease.py +0 -0
  614. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_console_queue_and_reset_settle.py +0 -0
  615. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_core_rules.py +0 -0
  616. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_debug_attach.py +0 -0
  617. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_debug_rules.py +0 -0
  618. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_describe_unset_idle_rules.py +0 -0
  619. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_exact_payload_rules.py +0 -0
  620. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_extension_patterns.py +0 -0
  621. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_fixture_controllers.py +0 -0
  622. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_fixture_link_settings_rules.py +0 -0
  623. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_fixture_out.py +0 -0
  624. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_fixture_targets.py +0 -0
  625. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_flash_console.py +0 -0
  626. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_gpio_drive_and_serve_options.py +0 -0
  627. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_hardware.py +0 -0
  628. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_hid_stream.py +0 -0
  629. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_host_boot_lifecycle.py +0 -0
  630. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_host_recovery_rules.py +0 -0
  631. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_host_rules_bounds_options.py +0 -0
  632. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_host_rules_waits_lines.py +0 -0
  633. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_host_wait_bound.py +0 -0
  634. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_interfaces.py +0 -0
  635. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_link_drop.py +0 -0
  636. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_link_host.py +0 -0
  637. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_link_serial.py +0 -0
  638. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_linktest.py +0 -0
  639. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_literals.py +0 -0
  640. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_memo.py +0 -0
  641. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_minimal_ops.py +0 -0
  642. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_no_resume.py +0 -0
  643. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_open_extensions.py +0 -0
  644. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_passthrough.py +0 -0
  645. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_pins.py +0 -0
  646. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_plan.py +0 -0
  647. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_port_speed.py +0 -0
  648. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_probe_log.py +0 -0
  649. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_request_tails.py +0 -0
  650. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_request_validation_rules.py +0 -0
  651. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_restart.py +0 -0
  652. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_resubscribe_after_reopen.py +0 -0
  653. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_rvswd_rest.py +0 -0
  654. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_session.py +0 -0
  655. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_settings.py +0 -0
  656. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_spec_sections.py +0 -0
  657. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_spec_vectors.py +0 -0
  658. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_state_resource_rules.py +0 -0
  659. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_stimulus.py +0 -0
  660. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_target_parts.py +0 -0
  661. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_tcp_discovery.py +0 -0
  662. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_tlv_reader_rules.py +0 -0
  663. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_capture.py +0 -0
  664. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_common.py +0 -0
  665. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_console.py +0 -0
  666. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_core.py +0 -0
  667. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_core_names.py +0 -0
  668. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_debug.py +0 -0
  669. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_fixture.py +0 -0
  670. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_fixture_drive.py +0 -0
  671. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_link.py +0 -0
  672. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_plan.py +0 -0
  673. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_restart.py +0 -0
  674. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_trace_transports.py +0 -0
  675. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_transport_session_rules.py +0 -0
  676. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_usb_identity.py +0 -0
  677. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_usb_stream.py +0 -0
  678. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_analog_roles.py +0 -0
  679. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_announce.py +0 -0
  680. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture.py +0 -0
  681. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
  682. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_channel_time.py +0 -0
  683. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_format_2.py +0 -0
  684. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
  685. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_lifetime.py +0 -0
  686. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_notifications.py +0 -0
  687. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
  688. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_options.py +0 -0
  689. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
  690. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_query.py +0 -0
  691. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_rates.py +0 -0
  692. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_requests.py +0 -0
  693. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
  694. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
  695. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
  696. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_trigger_source_more.py +0 -0
  697. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_capture_waiting.py +0 -0
  698. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_pin_constraints.py +0 -0
  699. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_rules_core.py +0 -0
  700. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_rules_ops_lines.py +0 -0
  701. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_serve_reboot.py +0 -0
  702. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
  703. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_spec.py +0 -0
  704. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_bench_targets.py +0 -0
  705. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_core.py +0 -0
  706. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_virtual_core_bool.py +0 -0
  707. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/test_wire_hold.py +0 -0
  708. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/SPEC_COMMIT +0 -0
  709. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/SPEC_SHA256 +0 -0
  710. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/capture_formats.json +0 -0
  711. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/checks.json +0 -0
  712. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/cobs.json +0 -0
  713. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/confirm.json +0 -0
  714. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/core_extensions.json +0 -0
  715. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/core_lifecycle.json +0 -0
  716. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/core_policy.json +0 -0
  717. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/discovery.json +0 -0
  718. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/headers.json +0 -0
  719. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/interface_boundaries.json +0 -0
  720. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/interface_profiles.json +0 -0
  721. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/logic_layout.json +0 -0
  722. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/ops.json +0 -0
  723. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/ops_encoding.json +0 -0
  724. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/refusals.json +0 -0
  725. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/sessions.json +0 -0
  726. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/tests/vectors/settings_file.json +0 -0
  727. {oep_client_python-0.0.48 → oep_client_python-0.0.50}/udev/70-oep-probe.rules +0 -0
@@ -2,6 +2,34 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.0.50
6
+ - (EN) No user-facing changes recorded.
7
+ - (JA) ユーザー向け変更の記録はありません。
8
+
9
+ ## 0.0.49
10
+ - (EN) Changed (virtual bench): a stream follows the probe's clock as a real probe's does. Logic samples are made at once
11
+ 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
12
+ sample only where a track needs it (the glitch filter, the external clock, analog, a test's own value()). The samples
13
+ the clock has taken and the bench has not made yet count as held in its stream buffer: a tick makes a bounded number
14
+ and catches up over ticks; stop makes every sample up to the stop; behind by more than the stream buffer holds, the
15
+ track stops in error as a probe whose buffer overflowed (state 6, error storage). Before, on a busy host the stream ran
16
+ late and ended before the stop: a heading placed by the probe's clock fell past its end (4 cores with 8 busy
17
+ 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).
18
+ - (JA) 変更(仮想ベンチ): stream は、実機と同じくプローブの時計に従う。ロジックの標本は numpy でまとめて作る(2 本・
19
+ 1 MS/s の 1 秒分が、format 0 で 4.6 s から 0.04 s、format 1 で約 0.2〜0.3 s)。1 標本ずつ作るのは、そうしか作れない track
20
+ だけ(グリッチフィルタ、外部クロック、アナログ、試験が差し替えた value())。時計が取ったのにまだ作っていない標本は、
21
+ ストリーム用のバッファに持っている分とみなす。tick は上限つきで作り、何回かで追いつく。stop は止めた時刻までの標本を
22
+ 全部作る。遅れがストリーム用のバッファを超えたら、バッファのあふれた実機と同じく track を error で止める(state 6、
23
+ error storage)。これまでは、混んだ host で stream が遅れたまま止めた時刻より前で終わり、プローブの時計で置いた見出しが
24
+ その後になった(4 コアに 8 本の空回り、during=steps で 2 本・1 MS/s: 8 回中 8 回、0.5〜1.1 s。直した後は 8 回中 0 回、
25
+ 欠損なし)。
26
+ - (EN) Fixed (0.0.48): a format 1 stream put together on disk failed with a KeyError (a segment's position): the loop
27
+ joining a segment's lines bit by bit reused the name of the loop over the segments, so the next segment taken was the
28
+ wrong one. A format 1 stream on disk is tested now.
29
+ - (JA) 修正(0.0.48): ディスクで組み立てる format 1 の stream が KeyError(区画の位置)で落ちていた。区画の線を 1 bit ずつ
30
+ つなぐループが、区画を回すループと同じ変数名を使っていて、次に取る区画を取り違えていた。ディスクで組み立てる format 1 の
31
+ stream の試験を足した。
32
+
5
33
  ## 0.0.48
6
34
  - (EN) Fixed: a stream's segments join bit by bit, so a stream is one part unless data was lost. A segment whose
7
35
  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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.48
3
+ Version: 0.0.50
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.48"
7
+ version = "0.0.50"
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"
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.48"
5
+ __version__ = "0.0.50"
@@ -1660,9 +1660,9 @@ class _Spool:
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 j, (col, f, ev) in enumerate(zip(cols, self.cur["files"], self.cur["events"])):
1663
+ for c, (col, f, ev) in enumerate(zip(cols, self.cur["files"], self.cur["events"])):
1664
1664
  if isinstance(col, bytes): # joined bit by bit: a segment need not end on a whole byte
1665
- self.cur["carry"][j] = _write_bits(f, self.cur["carry"][j], col, samples)
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])
@@ -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
- BLOCKS_A_TICK = 1 << 14 # streaming: the most samples one tick makes - Python makes far below a fast rate,
86
- # and catching up on all the time passed fell further behind every tick until the
87
- # bench answered nothing (wireskein: format 1 at 2 MHz x 4 lines; format 0 at 1 MHz
88
- # x 2 lines, stop answered after 12.8 s): it makes what it can and the stream runs
89
- # late instead
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
- return uart
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
- per_byte = 1 if self.analog else 8 // math.gcd(self.width, 8) # whole bytes only (§2.2)
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 + BLOCKS_A_TICK)
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)
@@ -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 test_format_0_streaming_makes_a_tick_at_most_and_stop_answers():
301
- """Streaming format 0: a tick makes at most BLOCKS_A_TICK samples, so a bench far behind a fast rate still answers
302
- (the stream runs late) - catching up on all the time passed at once answered stop after 12.8 s (wireskein: 1 MHz x
303
- 2 lines)."""
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 == vbc.BLOCKS_A_TICK
313
+ assert cap.produced == cap.a_tick() < 2_000_000
314
314
  lc.stop()
315
- assert cap.produced <= 4 * vbc.BLOCKS_A_TICK < 2_000_000 # a tick or a few (the requests tick too), not 2 s
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