diff --git a/cfg/attocube_cfg.py b/cfg/attocube_cfg.py index a1764dc..e703cb9 100644 --- a/cfg/attocube_cfg.py +++ b/cfg/attocube_cfg.py @@ -7,9 +7,10 @@ Mod('r', 'frappy_psi.attocube.Axis', 'ANRv220-F3-02882', axis = 1, - unit = 'deg', + value = Param(unit='deg'), tolerance = 0.01, - target_limits = (0, 360), + target_min = 0, + target_max = 360 # gear = 1.2, ) diff --git a/frappy_psi/attocube.py b/frappy_psi/attocube.py index 62ba423..ee0957e 100644 --- a/frappy_psi/attocube.py +++ b/frappy_psi/attocube.py @@ -19,7 +19,8 @@ import sys import time -from frappy.core import Drivable, Parameter, Command, Property, ERROR, WARN, BUSY, IDLE, Done, nopoll, TupleOf +from frappy.core import Drivable, Parameter, Command, Property, \ + ERROR, WARN, BUSY, IDLE, Done, nopoll, Limit # from frappy.features import HasSimpleOffset from frappy.datatypes import IntRange, FloatRange, StringType, BoolType from frappy.errors import ConfigError, BadValueError @@ -30,50 +31,18 @@ from PyANC350v4 import Positioner DIRECTION_NAME = {1: 'forward', -1: 'backward'} -class FreezeStatus: - """freeze status for some time - - hardware quite often does not treat status correctly: on a target change it - may take some time to return the 'busy' status correctly. - - in classes with this mixin, within :meth:`write_target` call - - self.freeze_status(0.5, BUSY, 'changed target') - - a wrapper around read_status will take care that the status will be the given value, - for at least the given delay. This does NOT cover the case when self.status is set - directly from an other method. - """ - __freeze_status_until = 0 - - def __init_subclass__(cls): - def wrapped(self, inner=cls.read_status): - if time.time() < self.__freeze_status_until: - return Done - return inner(self) - - wrapped.poll = True - cls.read_status = wrapped - super().__init_subclass__() - - def freeze_status(self, delay, code=BUSY, text='changed target'): - """freezze status to the given value for the given delay""" - self.__freeze_status_until = time.time() + delay - self.status = code, text - - -class Axis(FreezeStatus, Drivable): +class Axis(Drivable): axis = Property('axis number', IntRange(0, 2), 0) value = Parameter('axis position', FloatRange(unit='deg')) frequency = Parameter('frequency', FloatRange(1, unit='Hz'), readonly=False) amplitude = Parameter('amplitude', FloatRange(0, unit='V'), readonly=False) - gear = Parameter('gear factor', FloatRange(), readonly=False, default=1) + gear = Parameter('gear factor', FloatRange(), readonly=False, value=1) tolerance = Parameter('positioning tolerance', FloatRange(0, unit='$'), readonly=False, default=0.01) output = Parameter('enable output', BoolType(), readonly=False) info = Parameter('axis info', StringType()) statusbits = Parameter('status bits', StringType()) - target_limits = Parameter('target limits', TupleOf(FloatRange(), FloatRange()), readonly=False) - + target_min = Limit() + target_max = Limit() _hw = Positioner() _scale = 1 # scale for custom units @@ -85,16 +54,7 @@ class Axis(FreezeStatus, Drivable): _history = None _check_sensor = False _try_count = 0 - - def __init__(self, name, logger, opts, srv): - unit = opts.pop('unit', 'deg') - # opts['value.unit'] = unit - try: - # self._scale = self.SCALES[unit] * opts.get('gear', 1) - self._scale = self.SCALES['deg'] * opts.get('gear', 1) - except KeyError as e: - raise ConfigError('unsupported unit: %s' % unit) - super().__init__(name, logger, opts, srv) + __freeze_until = 0 def write_gear(self, value): self._scale = self.SCALES[self.parameters['value'].datatype.unit] * self.gear @@ -144,7 +104,15 @@ class Axis(FreezeStatus, Drivable): self._hw.setAxisOutput(self.axis, enable=value, autoDisable=0) return value + def freeze_status(self, delay, code=BUSY, text='changed target'): + """freeze status to the given value for the given delay""" + self.__freeze_until = time.time() + delay + self.status = code, text + def read_status(self): + if time.time() < self.__freeze_until: + return self.status + self.__freeze_until = 0 statusbits = self._hw.getAxisStatus(self.axis) sensor, self.output, moving, attarget, eot_fwd, eot_bwd, sensor_error = statusbits self.statusbits = ''.join((k for k, v in zip('SOMTFBE', statusbits) if v)) @@ -214,7 +182,7 @@ class Axis(FreezeStatus, Drivable): self.log.warn('%r', e) self._history = [self.value] self._idle_status = IDLE, '' - self.freeze_status(1, BUSY, 'changed target') + self.freeze_status(1) self.setFastPoll(True, 1) return value