Files
btd700linux/tools/check_hardware.py
T

66 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""Opt-in reversible control test. Never resets or updates the dongle."""
import argparse
import sys
import time
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from btd700.controller import Controller
from btd700.protocol import Command as C, encode
from btd700.transport import Hidraw, discover
parser = argparse.ArgumentParser(description='Steuerfunktionen testen und Originalwerte wiederherstellen; unterbricht kurz Audio.')
parser.add_argument('--run', action='store_true', required=True)
args = parser.parse_args()
devices = discover()
assert len(devices) == 1, 'Exactly one BTD 700 required'
with Hidraw(devices[0]) as transport:
c = Controller(transport)
original = c.snapshot()
original_name = transport.request(C.GET_NAME).rstrip(b'\0')
original_key = transport.request(C.GET_KEY).rstrip(b'\0')
original_info = transport.request(C.GET_BROADCAST)
# Refuse to mutate unless all saved values can be restored by this driver.
encode(C.SET_KEY, original_key)
encode(C.SET_NAME, original_name)
encode(C.SET_BROADCAST, original_info)
encode(C.SET_MODE, bytes((original.mode, original.transport)))
print('Original:', original.mode, original.transport, original.codec, original.quality, flush=True)
try:
c.set_mode(0)
print('PASS: Standard mode readback', flush=True)
s = c.snapshot()
chosen = next((value for value in (1, 2, 4, 8, 16, 32) if s.codecs & value), None)
if chosen:
c.set_codec(chosen)
print('PASS: codec readback', chosen, flush=True)
c.set_mode(2)
print('PASS: Auracast mode readback', flush=True)
c.set_broadcast(name='BTD700 Linux', public=not bool(original_info[0]), quality=(original_info[1]+1)%3)
print('PASS: broadcast name, visibility and quality readback', flush=True)
if len(original_key) <= 16 and all(32 <= b <= 126 for b in original_key):
c.set_broadcast(password='LinuxTest2026', encrypted=True)
assert transport.request(C.GET_KEY).rstrip(b'\0') == b'LinuxTest2026'
print('PASS: password and encryption readback (secret omitted)', flush=True)
finally:
transport.request(C.SET_KEY, original_key)
transport.request(C.SET_NAME, original_name)
transport.request(C.SET_BROADCAST, original_info)
transport.request(C.SET_MODE, bytes((0, original.transport)))
deadline = time.monotonic()+10
while time.monotonic() < deadline:
s = c.snapshot()
if s.state >= 2:
break
time.sleep(.25)
if s.state >= 2 and s.codecs & original.codec:
c.set_codec(original.codec)
transport.request(C.SET_MODE, bytes((original.mode, original.transport)))
c._verify(C.GET_MODE, bytes((original.mode, original.transport)), exact=False)
assert transport.request(C.GET_NAME).rstrip(b'\0') == original_name
assert transport.request(C.GET_KEY).rstrip(b'\0') == original_key
assert transport.request(C.GET_BROADCAST) == original_info
final = c.snapshot()
print('RESTORED: mode, transport, Auracast name, key, visibility, quality, encryption', flush=True)
print('Final:', final.mode, final.transport, final.codec, final.quality, flush=True)