From 72c3dc95aa60ad4e2b883e292bd00eaf6aa7efd5 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Sat, 18 Jul 2020 16:45:49 +0200 Subject: [PATCH] added PVEnumAdjustable for PVs with several states --- slic/core/adjustable/__init__.py | 1 + slic/core/adjustable/pvenumadjustable.py | 46 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 slic/core/adjustable/pvenumadjustable.py diff --git a/slic/core/adjustable/__init__.py b/slic/core/adjustable/__init__.py index 1047598b..94a844c3 100644 --- a/slic/core/adjustable/__init__.py +++ b/slic/core/adjustable/__init__.py @@ -3,5 +3,6 @@ from .adjustable import Adjustable from .dummyadjustable import DummyAdjustable from .genericadjustable import GenericAdjustable from .pvadjustable import PVAdjustable +from .pvenumadjustable import PVEnumAdjustable diff --git a/slic/core/adjustable/pvenumadjustable.py b/slic/core/adjustable/pvenumadjustable.py new file mode 100644 index 00000000..574acbbc --- /dev/null +++ b/slic/core/adjustable/pvenumadjustable.py @@ -0,0 +1,46 @@ +from epics import PV +from slic.core.task import Task +from slic.utils.printing import printable_dict +from .adjustable import Adjustable + + +class PVEnumAdjustable(Adjustable): + + def __init__(self, pvname, name=None): + name = name or pvname + super().__init__(name) + + self.pv = PV(pvname) + self.states = Enum(self.pv.enum_strs) + + + def get_current_value(self, as_number=False): + as_string = not as_number + return self.pv.get(as_string=as_string) + + def set_target_value(self, value, hold=False): + value = self.states.get(value) + change = lambda: self.pv.put(value, wait=True, use_complete=True) + self.current_task = task = Task(change, hold=hold) + return task + + def is_moving(self): + return not self.pv.put_complete + + + +class Enum: + + def __init__(self, seq): + self.data = {s:n for n, s in enumerate(seq)} + + def get(self, value): + if value not in self.data.values(): + value = self.data[value] + return value + + def __repr__(self): + return printable_dict(self.data) + + +