Files
pqAutomationApp/UniTAP/dev/modules/opf/handler.py

67 lines
2.5 KiB
Python
Raw Normal View History

2026-04-16 16:51:05 +08:00
import platform
import warnings
from UniTAP.libs.lib_tsi.tsi_types import TSI_OPF_CALLBACK_STRUCT, TSI_OPF_RETURN_CODE_ABORT
from UniTAP.libs.lib_tsi.tsi_io import DeviceIO
from UniTAP.utils import tsi_logging as logging
from .handlers import OpfHandlerBase, OpfHandlerDefault
if platform.system() == 'Windows':
from ctypes import c_int, POINTER, c_void_p, WINFUNCTYPE
OPF_CALLBACK_TYPE = WINFUNCTYPE(c_int, POINTER(TSI_OPF_CALLBACK_STRUCT), c_void_p)
else:
from ctypes import c_int, POINTER, c_void_p, CFUNCTYPE
OPF_CALLBACK_TYPE = CFUNCTYPE(c_int, POINTER(TSI_OPF_CALLBACK_STRUCT), c_void_p)
class OperatorFeedbackHandler:
"""
Class `OperatorFeedbackHandler` helps to do required actions during DUT tests. Contains object of `OpfHandlerBase`,
that can be overridden.
- `handler` - set and get OPF Handler. `OpfHandlerBase` does OPF number 19 and 103,
`OpfHandlerInternal` does all OPF, `OpfHandlerDefault` does overridden OPF by user.
"""
def __init__(self, device_io: DeviceIO):
global OPF_CALLBACK_TYPE
self.__io = device_io
self.__tsi_callback = OPF_CALLBACK_TYPE(self.__get_callback())
self.__io.set_opf_callback(self.__tsi_callback)
self.__handler = OpfHandlerDefault()
def __get_callback(self):
def ofp_impl(_struct: POINTER(TSI_OPF_CALLBACK_STRUCT), context_ptr: c_void_p):
opf_struct: TSI_OPF_CALLBACK_STRUCT = _struct.contents
logging.debug(f"Received OPF dialog with ID: {opf_struct.id()}, Session: {opf_struct.session_id()}.")
try:
return self.handler.handle(opf_struct.id(),
opf_struct.write_opf_result,
opf_struct.title(),
opf_struct.request1(),
opf_struct.request2(),
opf_struct.parameters())
except BaseException as e:
warnings.warn(f"OPF Dialog {opf_struct.id()} was aborted due an exception. Exception: {e}")
return opf_struct.write_opf_result(TSI_OPF_RETURN_CODE_ABORT)
return ofp_impl
@property
def handler(self) -> OpfHandlerBase:
"""
Return current OPF handler. Can be overriden in `set` method.
Returns:
object of `OpfHandlerBase` type
"""
return self.__handler
@handler.setter
def handler(self, value):
self.__handler = value