Update diagnostics/os_diagnostics.py

This commit is contained in:
2026-03-11 21:56:37 +00:00
parent 94bc1f7b14
commit 3b35fa548c

View File

@@ -1,5 +1,29 @@
from pybricks.parameters import Port
from uerrno import EAGAIN, EBUSY, ECANCELED, EINVAL, EIO, ENODEV, EOPNOTSUPP, EPERM, ETIMEDOUT
from pybricks.iodevices import UARTDevice as _UARTDevice
from pybricks.tools import wait
class FakeUART:
def __init__(self, port, baudrate, timeout):
self.timeout = timeout
print("Warning: No physical UART detected. Using simulator.")
def read(self, length=1):
if self.timeout is not None:
wait(self.timeout)
raise OSError(ETIMEDOUT)
else:
while True:
wait(1000)
def write(self, data):
pass
def UARTDevice(port, baudrate=9600, timeout=None):
try:
return _UARTDevice(port, baudrate, timeout)
except OSError:
return FakeUART(port, baudrate, timeout)
class OSDiagnostics:
def __init__(self, hub, motorclass):
self.motorclass = motorclass
@@ -23,6 +47,21 @@ class OSDiagnostics:
else:
print(f"Another error occurred with code: {ex.errno}.\nCompleted Test 6/9: ENODEV - FAILED")
self.failedtests["ENODEV"] = ex.errno
def testetimedout(self):
uart = UARTDevice(Port.A, baudrate=9600, timeout=1000) # 1000ms timeout
# Test ETIMEDOUT
try:
data = uart.read(10) # FakeUART will wait `timeout` ms, then raise OSError(ETIMEDOUT)
except OSError as ex:
if ex.errno == ETIMEDOUT:
print("Timed out with synthetic UART device. ETIMEDOUT can be thrown and caught.\nCompleted Test 9/9: ETIMEDOUT - SUCCESSFUL")
self.successfultests += 1
elif ex.errno == EIO:
print("An unspecified error occurred (EIO).\nCompleted Test 9/9: ETIMEDOUT - FAILED")
self.failedtests["ETIMEDOUT"] = "EIO - Unspecified Error"
else:
print(f"Another error occurred with code: {ex.errno}.\nCompleted Test 9/9: ETIMEDOUT - FAILED")
self.failedtests["ETIMEDOUT"] = ex.errno
def print_results(self):
for key, value in self.failedtests():
print(f"{key}: {value}")
print(f"{key}: {value}")