"""
Ophyd support for the EPICS synApps luascript record
EXAMPLES::
import apstools.synApps
scripts = apstools.synApps.UserScriptsDevice("xxx:", name="scripts")
scripts.reset()
.. autosummary::
~UserScriptsDevice
~LuascriptRecord
~LuascriptRecordNumberInput
~LuascriptRecordStringInput
:see: https://epics-lua.readthedocs.io/en/latest/luascriptRecord.html
"""
from collections import OrderedDict
from ophyd import Component as Cpt
from ophyd import Device
from ophyd import DynamicDeviceComponent as DDC
from ophyd import EpicsSignal
from ophyd import FormattedComponent as FC
from .. import utils as APS_utils
from ._common import EpicsRecordDeviceCommonAll
INPUT_LETTERS_LIST = "A B C D E F G H I J".split()
class _LuascriptRecordInputBase(Device):
"""
(internal): base class for one input of a LuascriptRecord
"""
# Components must be defined in subclass
# read_attrs = [
# "input_value",
# ]
# hints = {"fields": read_attrs}
def __init__(self, prefix, letter, **kwargs):
self._ch = letter
super().__init__(prefix, **kwargs)
def reset(self):
"""set all fields to default values"""
raise NotImplementedError("Must define reset() method in subclass.")
def _inputs(input_list):
defn = OrderedDict()
for nsym in input_list:
defn[nsym] = (LuascriptRecordNumberInput, "", {"letter": nsym})
ssym = nsym + nsym
defn[ssym] = (LuascriptRecordStringInput, "", {"letter": ssym})
return defn
[docs]class LuascriptRecord(EpicsRecordDeviceCommonAll):
"""
EPICS synApps luascript record: used as ``$(P):userScript$(N)``
.. index:: Ophyd Device; synApps LuascriptRecord
.. autosummary::
~reset
"""
precision = Cpt(EpicsSignal, ".PREC", kind="config")
number_value = Cpt(EpicsSignal, ".VAL", kind="hinted")
string_value = Cpt(EpicsSignal, ".SVAL", kind="hinted", string=True)
code = Cpt(EpicsSignal, ".CODE", kind="config", string=True)
output_link = Cpt(EpicsSignal, ".OUT", kind="config")
reload_script = Cpt(EpicsSignal, ".RELO", kind="omitted", put_complete=True)
output_execute_option = Cpt(EpicsSignal, ".OOPT", kind="config")
error_message = Cpt(EpicsSignal, ".ERR", kind="config", string=True)
read_attrs = APS_utils.itemizer("inputs.%s", INPUT_LETTERS_LIST)
hints = {"fields": read_attrs}
inputs = DDC(_inputs(INPUT_LETTERS_LIST))
[docs] def reset(self):
"""set all fields to default values"""
pvname = self.description.pvname.split(".")[0]
self.description.put(pvname)
self.scanning_rate.put("Passive")
self.code.put("")
self.precision.put("5")
self.output_link.put("")
self.number_value.put(0)
self.string_value.put("")
new_read_attrs = []
for letter in self.inputs.read_attrs:
if "." not in letter:
input = getattr(self.inputs, letter)
if isinstance(input, (LuascriptRecordNumberInput, LuascriptRecordStringInput)):
new_read_attrs.append(f"inputs.{letter}")
input.reset()
self.read_attrs = new_read_attrs
self.hints = {"fields": new_read_attrs}
self.read_attrs.append("number_value")
self.read_attrs.append("string_value")
[docs]class UserScriptsDevice(Device):
"""
EPICS synApps XXX IOC setup of user lua scripts: ``$(P):userScript$(N)``
.. index:: Ophyd Device; synApps UserScriptsDevice
.. autosummary::
~reset
"""
enable = Cpt(EpicsSignal, "userScriptEnable", kind="config")
script0 = Cpt(LuascriptRecord, "userScript0")
script1 = Cpt(LuascriptRecord, "userScript1")
script2 = Cpt(LuascriptRecord, "userScript2")
script3 = Cpt(LuascriptRecord, "userScript3")
script4 = Cpt(LuascriptRecord, "userScript4")
script5 = Cpt(LuascriptRecord, "userScript5")
script6 = Cpt(LuascriptRecord, "userScript6")
script7 = Cpt(LuascriptRecord, "userScript7")
script8 = Cpt(LuascriptRecord, "userScript8")
script9 = Cpt(LuascriptRecord, "userScript9")
[docs] def reset(self): # lgtm [py/similar-function]
"""set all fields to default values"""
enable = self.enable.get()
self.enable.put("Enable")
self.script0.reset()
self.script1.reset()
self.script2.reset()
self.script3.reset()
self.script4.reset()
self.script5.reset()
self.script6.reset()
self.script7.reset()
self.script8.reset()
self.script9.reset()
self.enable.put(enable)
self.read_attrs = [f"script{c}" for c in range(10)]
# -----------------------------------------------------------------------------
# :author: Pete R. Jemian
# :email: jemian@anl.gov
# :copyright: (c) 2017-2024, UChicago Argonne, LLC
#
# Distributed under the terms of the Argonne National Laboratory Open Source License.
#
# The full license is in the file LICENSE.txt, distributed with this software.
# -----------------------------------------------------------------------------