diff --git a/secop/features.py b/secop/features.py index ef27224..9cfb4d8 100644 --- a/secop/features.py +++ b/secop/features.py @@ -38,19 +38,8 @@ class HasOffset(Feature): implementation to be done in the subclass """ - offset = PersistentParam('offset (physical value + offset = HW value)', - FloatRange(unit='deg'), readonly=False, default=0) - - def write_offset(self, value): - self.offset = value - if isinstance(self, HasLimits): - self.read_limits() - if isinstance(self, Readable): - self.read_value() - if isinstance(self, Drivable): - self.read_target() - self.saveParameters() - return Done + offset = Parameter('offset (physical value + offset = HW value)', + FloatRange(unit='$'), readonly=False, default=0) class HasLimits(Feature): @@ -61,52 +50,17 @@ class HasLimits(Feature): for a drivable, abslimits is roughly the same as the target datatype limits, except for the offset """ - abslimits = Property('abs limits (raw values)', default=(-9e99, 9e99), extname='abslimits', export=True, - datatype=TupleOf(FloatRange(unit='deg'), FloatRange(unit='deg'))) - limits = PersistentParam('user limits', readonly=False, default=(-9e99, 9e99), - datatype=TupleOf(FloatRange(unit='deg'), FloatRange(unit='deg'))) - _limits = None - - def apply_offset(self, sign, *values): - if isinstance(self, HasOffset): - return tuple(v + sign * self.offset for v in values) - return values + target_limits = Parameter('user limits for target', readonly=False, default=(-9e99, 9e99), + datatype=TupleOf(FloatRange(unit='$'), FloatRange(unit='$'))) def earlyInit(self): super().earlyInit() - # make limits valid - _limits = self.apply_offset(1, *self.limits) - self._limits = tuple(clamp(self.abslimits[0], v, self.abslimits[1]) for v in _limits) - self.read_limits() - - def checkProperties(self): - pname = 'target' if isinstance(self, Drivable) else 'value' - dt = self.parameters[pname].datatype - min_, max_ = self.abslimits - t_min, t_max = self.apply_offset(1, dt.min, dt.max) - if t_min > max_ or t_max < min_: - raise ConfigError('abslimits not within %s range' % pname) - self.abslimits = clamp(t_min, min_, t_max), clamp(t_min, max_, t_max) - self.parameters['limits'].default = self.abslimits - super().checkProperties() - - def read_limits(self): - return self.apply_offset(-1, *self._limits) - - def write_limits(self, value): - min_, max_ = self.apply_offset(-1, *self.abslimits) - if not min_ <= value[0] <= value[1] <= max_: - if value[0] > value[1]: - raise BadValueError('invalid interval: %r' % value) - print(self.parameters['limits'], value) - raise BadValueError('limits not within abs limits [%g, %g]' % (min_, max_)) - self.limits = value - self.saveParameters() - return Done + dt = self.parameters['target'].datatype + self.target_limits = dt.min, dt.max def check_limits(self, value): """check if value is valid""" - min_, max_ = self.limits + min_, max_ = self.target_limits if not min_ <= value <= max_: raise BadValueError('limits violation: %g outside [%g, %g]' % (value, min_, max_))