From 536e2cfb66fbd2f463d17df4964b7cbaa83e56e6 Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Wed, 15 Jul 2020 19:33:32 +0200 Subject: [PATCH] turned default_representation and spec_convenience decorators into mixins --- slic/core/adjustable/convenience.py | 63 ++++++++++++++++++++++ slic/devices/general/adjustable.py | 83 ++--------------------------- slic/devices/general/motors_new.py | 5 +- 3 files changed, 68 insertions(+), 83 deletions(-) create mode 100644 slic/core/adjustable/convenience.py diff --git a/slic/core/adjustable/convenience.py b/slic/core/adjustable/convenience.py new file mode 100644 index 00000000..4e82d765 --- /dev/null +++ b/slic/core/adjustable/convenience.py @@ -0,0 +1,63 @@ +import colorama + + +class SpecConvenience: + + def mv(self, value): + self._currentChange = self.set_target_value(value) + return self._currentChange + + def wm(self, *args, **kwargs): + return self.get_current_value(*args, **kwargs) + + def mvr(self, value, *args, **kwargs): + if ( + hasattr(self, "_currentChange") + and self._currentChange + and not (self._currentChange.status() == "done") + ): + startvalue = self._currentChange.target + elif hasattr(self, "is_moving") and not self.is_moving(): + startvalue = self.get_current_value(readback=True, *args, **kwargs) + else: + startvalue = self.get_current_value(*args, **kwargs) + self._currentChange = self.set_target_value(value + startvalue, *args, **kwargs) + return self._currentChange + + def wait(self): + self._currentChange.wait() + + def __call__(self, value=None): + if not value is None: + self._currentChange = self.set_target_value(value) + return self._currentChange + else: + return self.get_current_value() + + #TODO: if hasattr(Adj, "update_change"): + def umv(self, *args, **kwargs): + self.update_change(*args, **kwargs) + + #TODO: if hasattr(Adj, "update_change_relative"): + def umvr(self, *args, **kwargs): + self.update_change_relative(*args, **kwargs) + + + +class DefaultRepresentation: + + def _get_name(self): + if self.alias: + return self.alias.get_full_name() + elif self.name: + return self.name + else: + return self.Id + + def __repr__(self): + s = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')+': ' + s += f"{colorama.Style.BRIGHT}{self._get_name()}{colorama.Style.RESET_ALL} at {colorama.Style.BRIGHT}{self.get_current_value():g}{colorama.Style.RESET_ALL}" + return s + + + diff --git a/slic/devices/general/adjustable.py b/slic/devices/general/adjustable.py index 72d6e220..1d76f749 100644 --- a/slic/devices/general/adjustable.py +++ b/slic/devices/general/adjustable.py @@ -5,80 +5,7 @@ from enum import IntEnum, auto import colorama import time import datetime - - - -def default_representation(Obj): - - def get_name(Obj): - if Obj.alias: - return Obj.alias.get_full_name() - elif Obj.name: - return Obj.name - else: - return Obj.Id - - def get_repr(Obj): - s = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')+': ' - s += f"{colorama.Style.BRIGHT}{Obj._get_name()}{colorama.Style.RESET_ALL} at {colorama.Style.BRIGHT}{Obj.get_current_value():g}{colorama.Style.RESET_ALL}" - return s - - Obj._get_name = get_name - Obj.__repr__ = get_repr - return Obj - - - -def spec_convenience(Adj): - - def mv(self, value): - self._currentChange = self.set_target_value(value) - return self._currentChange - - def wm(self, *args, **kwargs): - return self.get_current_value(*args, **kwargs) - - def mvr(self, value, *args, **kwargs): - if ( - hasattr(self, "_currentChange") - and self._currentChange - and not (self._currentChange.status() == "done") - ): - startvalue = self._currentChange.target - elif hasattr(self, "is_moving") and not self.is_moving(): - startvalue = self.get_current_value(readback=True, *args, **kwargs) - else: - startvalue = self.get_current_value(*args, **kwargs) - self._currentChange = self.set_target_value(value + startvalue, *args, **kwargs) - return self._currentChange - - def wait(self): - self._currentChange.wait() - - def call(self, value=None): - if not value is None: - self._currentChange = self.set_target_value(value) - return self._currentChange - else: - return self.get_current_value() - - def umv(self, *args, **kwargs): - self.update_change(*args, **kwargs) - - def umvr(self, *args, **kwargs): - self.update_change_relative(*args, **kwargs) - - Adj.mv = mv - Adj.wm = wm - Adj.mvr = mvr - Adj.wait = wait - Adj.__call__ = call - if hasattr(Adj, "update_change"): - Adj.umv = umv - Adj.umvr = umvr - - return Adj - +from .convenience import SpecConvenience, DefaultRepresentation class PvRecord: @@ -162,9 +89,7 @@ class PvRecord: -#@default_representation -@spec_convenience -class PvEnum: +class PvEnum(SpecConvenience): def __init__(self, pvname, name=None): self.Id = pvname @@ -214,9 +139,7 @@ class PvEnum: -@default_representation -@spec_convenience -class AdjustableVirtual: +class AdjustableVirtual(SpecConvenience, DefaultRepresentation): def __init__( self, diff --git a/slic/devices/general/motors_new.py b/slic/devices/general/motors_new.py index 1a16f7f6..a1febd26 100755 --- a/slic/devices/general/motors_new.py +++ b/slic/devices/general/motors_new.py @@ -4,7 +4,7 @@ import subprocess from epics import PV from slic.core.task import Task from slic.utils.eco_components.aliases import Alias -from .adjustable import spec_convenience +from slic.core.adjustable.convenience import SpecConvenience from .motors_new_helper import update_changes, ValueInRange, AdjustableError import colorama @@ -35,9 +35,8 @@ def _keywordChecker(kw_key_list_tups): assert tkey in tlist, "Keyword %s should be one of %s" % (tkw, tlist) -@spec_convenience @update_changes -class MotorRecord: +class MotorRecord(SpecConvenience): def __init__( self, pvname,