from __future__ import annotations
import sys
from spvirit import codec
from spvirit.lowlevel import Channel, Packet
def describe(pkt: Packet) -> str:
return (
f"cmd={pkt.command_name!r:12}"
f" flags=0x{pkt.flags:02x}"
f" len={pkt.payload_length:<6}"
f" app={pkt.is_application} ctrl={pkt.is_control} srv={pkt.is_server}"
)
def main() -> None:
if len(sys.argv) < 2:
print(__doc__)
sys.exit(1)
pv_name = sys.argv[1]
server_addr = sys.argv[2] if len(sys.argv) > 2 else "127.0.0.1:5075"
ch = Channel.connect(pv_name, server_addr, timeout=3.0)
result = ch.get()
print(f"get() -> {codec.format_value(result.value)}\n")
pkt = Packet.__call__ if False else None decoded = codec.decode_packet(result.raw_pva)
print(f"Captured GET frame: command={decoded['command_name']} "
f"payload_length={decoded['payload_length']}")
print("\nIssuing a second get and reading frames with read_until ...")
def match_any_application(p: Packet) -> bool:
print(f" saw {describe(p)}")
return bool(p.is_application)
ch2 = Channel.connect(pv_name, server_addr, timeout=2.0)
try:
_ = ch2.introspect()
try:
first_app = ch2.read_until(match_any_application, timeout=0.5,
max_frames=16)
print(f"\nread_until matched: {describe(first_app)}")
details = first_app.details()
print(f"details keys: {sorted(details.keys())}")
except Exception as e: print(f"read_until: no further frames arrived ({e})")
finally:
ch2.close()
ch.close()
if __name__ == "__main__":
main()