Files
pynamics/diagnostics/os_diagnostics.py

67 lines
3.1 KiB
Python

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
self.successfultests = 0
self.failedtests = {}
def testenodev(self):
try:
# Try to initialize a motor on an empty port (Port.A)
print("Starting Test 6/9: ENODEV - Device Not Found Error")
input("Make sure Port A doesn't have anything plugged in, then press Enter.")
my_motor = self.motorclass(Port.A)
print("OS detected a motor when there was nothing. You may have allowed missing motors. This is useful for debugging, but not recommended for production as it can cause issues with device control.")
except OSError as ex:
# If an OSError was raised, check the specific error code
if ex.errno == ENODEV:
print("There is no motor on this port. ENODEV can be thrown and caught.\nCompleted Test 6/9: ENODEV - SUCCESSFUL")
self.successfultests += 1
elif ex.errno == EIO:
print("An unspecified error occurred (EIO).\nCompleted Test 6/9: ENODEV - FAILED")
self.failedtests["ENODEV"] = "EIO - Unspecified Error"
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}")