67 lines
3.1 KiB
Python
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}") |