Files
pqAutomationApp/UniTAP/dev/device.py

155 lines
4.7 KiB
Python
Raw Normal View History

2026-04-16 16:51:05 +08:00
import copy
import weakref
from typing import TypeVar, Type, List
from .dev_5xx_roles import UCD500
from .dev_4xx_roles import UCD400, UCD422, UCD424
from .dev_3xx_roles import UCD240, UCD340, UCD323, UCD301
from .modules import *
from UniTAP.libs.lib_tsi.tsi_io import DeviceIO
from UniTAP.utils import tsi_logging as logging
RoleType = TypeVar("RoleType",
UCD500.DPSourceUSBCSink,
UCD500.DPSourceDPSink,
UCD500.USBCSourceUSBCSink,
UCD500.USBCSourceDPSink,
UCD424.USBCSourceUSBCSink,
UCD422.HDMISourceHDMISink,
UCD400.DPSourceDPSink,
UCD340.USBCSink,
UCD340.USBCSource,
UCD323.DPSink,
UCD323.DPSource,
UCD323.HDMISink,
UCD323.HDMISource,
UCD301.DPSink,
UCD301.HDMISink,
UCD240.USBCSink,
UCD240.USBCSource)
MODEL_TO_CLASS = {
"UCD-500": UCD500,
"UCD-424": UCD424,
"UCD-422": UCD422,
"UCD-400": UCD400,
"UCD-340": UCD340,
"UCD-323": UCD323,
"UCD-301": UCD301,
"UCD-240": UCD240
}
class NotExistingRoleSelected(Exception):
"""
Redefinition of base exception.
Define error of 'not existing role selected'.
"""
pass
class DeviceRoleIsAlreadySelected(Exception):
"""
Redefinition of base exception.
Define error of 'device role already selected'.
"""
pass
class TSIDevice:
"""
Class `TSIDevice` ... Allows:
- Select role of the device `select_role`.
- Get and redefine OPF (Operator feedback dialog) handler `opf_handler`.
"""
def __init__(self, io: DeviceIO, name: str, serial_number: str, roles: List[RoleType]):
self.__io = io
self.__io_proxy = weakref.proxy(self.__io)
self.__memory_manager = MemoryManager(self.__io_proxy)
self.__capturer = Capturer(self.__io_proxy)
self.__opf_handler = OperatorFeedbackHandler(self.__io_proxy)
self.__terminal = Terminal(self.__io_proxy)
self.__name = name
self.__serial_number = serial_number
self.__role_list = roles
logging.info(f"[UniTAP] TSIDevice.init: {self}")
def __del__(self):
del self.__io
logging.info(f"[UniTAP] TSIDevice.del: {self}")
def __str__(self):
return f"{self.__name} [{self.__serial_number}]"
def __define_internal_handler(self, role, role_type):
if role_type in [UCD500.DPSourceUSBCSink, UCD500.DPSourceDPSink, UCD500.USBCSourceUSBCSink,
UCD500.USBCSourceDPSink, UCD424.USBCSourceUSBCSink, UCD400.DPSourceDPSink]:
self.opf_handler._set_roles(role.dptx, role.dprx)
elif role_type in [UCD422.HDMISourceHDMISink]:
self.opf_handler._set_roles(role.hdtx, role.hdrx)
def select_role(self, role_type: Type[RoleType]) -> RoleType:
"""
Function allows selecting role of the chosen device.
For example: `UniTAP.dev.UCD500.DPSourceDPSink` - will be opened UCD-500 in role DisplayPort Source and Sink.
Args:
role_type (RoleType) - one of the possible roles.
Returns:
object of `RoleType` type. Selected role.
"""
# TODO: Remove this limitation. Caused by TSI lib problem.
if self.__io.get_role() is not None:
raise DeviceRoleIsAlreadySelected(f"Device role is already selected.")
if role_type not in self.__role_list:
raise NotExistingRoleSelected(f"Role: {role_type} is not available on this device.")
self.__io.select_role(self.__role_list.index(role_type))
self.__io.set_role(role_type(self.__io_proxy,
weakref.proxy(self.__memory_manager),
weakref.proxy(self.__capturer)))
self.__define_internal_handler(self.__io.get_role(), role_type)
return self.__io.get_role()
@property
def available_roles(self) -> list:
"""
Returns available list of roles.
Returns:
object of list type.
"""
return copy.deepcopy(self.__role_list)
@property
def opf_handler(self):
"""
Returns current OPF handler.
Returns:
object of handler type.
"""
return self.__opf_handler.handler
@opf_handler.setter
def opf_handler(self, value):
"""
Set new OPF handler.
Args:
value - new OPF handler
"""
self.__opf_handler.handler = value
@property
def _terminal(self) -> Terminal:
return self.__terminal