import ctypes
from typing import TYPE_CHECKING, Optional
from .cnp_api import cnp_class, cnp_constants
from .cnp_api.cnp_constants import ASAP3_INVALID_MODULE_HDL
from .cnp_api.cnp_prototype import CANapeDll
from .config import RC
if TYPE_CHECKING:
from .module import Module
[docs]
class Script:
def __init__(
self,
dll: CANapeDll,
asap3_handle: cnp_class.TAsap3Hdl, # type: ignore[valid-type]
script_handle: cnp_class.TScriptHdl,
) -> None:
"""The :class:`~pycanape.script.Script` class is not meant to be instantiated
by the user. Instead, :class:`~pycanape.script.Script` instances are returned by
:meth:`~pycanape.module.Module.execute_script_ex`.
:param asap3_handle:
:param script_handle:
"""
self._dll = dll
self.asap3_handle = asap3_handle
self.script_handle = script_handle
[docs]
def get_script_state(self) -> cnp_constants.TScriptStatus:
"""Returns the state of a script.
:return:
current state of the script
"""
scrstate = cnp_class.enum_type()
max_size = ctypes.c_ulong(0)
self._dll.Asap3GetScriptState(
self.asap3_handle,
self.script_handle,
ctypes.byref(scrstate),
None,
ctypes.byref(max_size),
)
return cnp_constants.TScriptStatus(scrstate.value)
[docs]
def start_script(
self,
*,
command_line: Optional[str] = None,
current_device: Optional["Module"] = None,
) -> None:
"""Starts the script.
:param command_line:
Set a commandline for the script.
:param current_device:
Set a module as current_device.
"""
module_handle = (
current_device.module_handle
if current_device
else cnp_class.TModulHdl(ASAP3_INVALID_MODULE_HDL)
)
_command_line = command_line.encode(RC["ENCODING"]) if command_line else None
self._dll.Asap3StartScript(
self.asap3_handle,
self.script_handle,
_command_line,
module_handle,
)
[docs]
def stop_script(self) -> None:
"""Stop the script."""
self._dll.Asap3StopScript(
self.asap3_handle,
self.script_handle,
)
[docs]
def release_script(self) -> None:
"""Removes a declared script from the Tasklist.
To receive the result you must use the 'SetScriptResult' in
your CASL script."""
self._dll.Asap3ReleaseScript(
self.asap3_handle,
self.script_handle,
)
[docs]
def get_script_result_value(self) -> float:
"""Returns the exitcode of a script.
:return:
result value of the script
"""
val = ctypes.c_double()
self._dll.Asap3GetScriptResultValue(
self.asap3_handle,
self.script_handle,
ctypes.byref(val),
)
return val.value
[docs]
def get_script_result_string(self) -> str:
"""Returns a script result.
:return:
result string of the script
"""
length = ctypes.c_ulong()
self._dll.Asap3GetScriptResultString(
self.asap3_handle,
self.script_handle,
None,
ctypes.byref(length),
)
buffer = ctypes.create_string_buffer(length.value)
self._dll.Asap3GetScriptResultString(
self.asap3_handle,
self.script_handle,
buffer,
ctypes.byref(length),
)
return buffer.value.decode(RC["ENCODING"])