From 28994476e5cfe7322fb540b8de087b2ef6ef4a4e Mon Sep 17 00:00:00 2001 From: lemke_h Date: Wed, 6 May 2020 18:03:47 +0200 Subject: [PATCH] make spec convention wait for Changers to finish/ raise errors always, started work on elog functionality at the same time --- eco/bernina/config.py | 2 +- eco/devices_general/adjustable.py | 110 ++++++++++++++++++------------ 2 files changed, 69 insertions(+), 43 deletions(-) diff --git a/eco/bernina/config.py b/eco/bernina/config.py index 8a94cf2..e991f79 100755 --- a/eco/bernina/config.py +++ b/eco/bernina/config.py @@ -45,7 +45,7 @@ components = [ "args": ["https://elog-gfa.psi.ch/Bernina"], "kwargs": { "user": "gac-bernina", - "screenshot_directory": "/sf/bernina/config/screenshots", + "screenshot_directory": "/tmp", }, }, { diff --git a/eco/devices_general/adjustable.py b/eco/devices_general/adjustable.py index fe385b5..82332a6 100644 --- a/eco/devices_general/adjustable.py +++ b/eco/devices_general/adjustable.py @@ -40,52 +40,59 @@ def default_representation(Obj): def spec_convenience(Adj): # spec-inspired convenience methods - 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) + Adj.wm = wm + if hasattr(Adj, "update_change"): + def umv(self, *args, **kwargs): + self.update_change(*args, **kwargs) + + def umvr(self, *args, **kwargs): + self.update_change_relative(*args, **kwargs) + Adj.mv = umv + Adj.mvr = umvr + Adj.umv = umv + Adj.umvr = umvr + else: + def mv(self, value): + try: + self._currentChange = self.set_target_value(value) + self._currentChange.wait() + except KeyboardInterrupt: + self._currentChange.stop() + return self._currentChange + + 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, "get_moveDone") and (self.get_moveDone == 1): + startvalue = self.get_current_value(readback=True, *args, **kwargs) + else: + startvalue = self.get_current_value(*args, **kwargs) + try: + self._currentChange = self.set_target_value(value + startvalue, *args, **kwargs) + self._currentChange.wait() + except KeyboardInterrupt: + self._currentChange.stop() + return self._currentChange + Adj.mv = mv + Adj.mvr = mvr - 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, "get_moveDone") and (self.get_moveDone == 1): - 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 + return self.mv(value) else: - return self.get_current_value() + return self.wm() - 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 @@ -141,6 +148,9 @@ class ValueInRange: def update_changes(Adj): def get_position_str(start, end, value): + start = float(start) + value = float(value) + end = float(end) s = ValueInRange(start, end, bar_width=30, unit="", fmt="1.5g").get_str(value) return ( colorama.Style.BRIGHT @@ -151,25 +161,40 @@ def update_changes(Adj): + 2 * "\t" ) - def update_change(self, value): + def update_change(self, value, elog=None): start = self.get_current_value() print( - f"Changing {self.name} from {start:1.5g} by {value-start:1.5g} to {value:1.5g}\n" + f"Changing {self.name} from {start:1.5g} by {value-start:1.5g} to {value:1.5g}" ) print(get_position_str(start, value, start), end="\r") try: + if hasattr(self,"add_value_callback"): + def cbfoo(**kwargs): + print(get_position_str(start, value, kwargs["value"]), end="\r") - def cbfoo(**kwargs): - print(get_position_str(start, value, kwargs["value"]), end="\r") - - cb_id = self.add_value_callback(cbfoo) + cb_id = self.add_value_callback(cbfoo) self._currentChange = self.set_target_value(value) self._currentChange.wait() except KeyboardInterrupt: self._currentChange.stop() print(f"\nAborted change at (~) {self.get_current_value():1.5g}") finally: - self.clear_value_callback(cb_id) + if hasattr(self,"add_value_callback"): + self.clear_value_callback(cb_id) + if elog: + if not hasattr(self,'elog'): + raise Exception("No elog defined!") + + elog_str = f"Changing {self.name} from {start:1.5g} by {value-start:1.5g} to {value:1.5g}" + elog_title = f"Adjusting {self.name}" + if type(elog) is str: + elog = {'message':elog} + elif type(elog) is dict: + pass + else: + elog={} + self.elog.post(**elog) + return self._currentChange def update_change_relative(self, value, *args, **kwargs): @@ -196,6 +221,7 @@ def update_changes(Adj): @spec_convenience +@update_changes class DummyAdjustable: def __init__(self, name="no_adjustable"): self.name = name