set unit together with datatype

Change-Id: I412471880e71792160ee56a79375dc62dd4aaafc
This commit is contained in:
zolliker 2021-10-06 09:07:09 +02:00
parent 21dfcbd290
commit 09056ea87e
2 changed files with 29 additions and 30 deletions

View File

@ -48,20 +48,20 @@ def float2hex(value, digits):
class DPM3(HasIodev, Drivable): class DPM3(HasIodev, Drivable):
OFFSET = 0x8f OFFSET = 0x8f
SCALE = 0x8c SCALE = 0x8c
MAGNITUDE = {'1': 1, '2': 10, '3': 100, '4': 1e3, '5': 1e4, '6': 1e5, MAGNITUDE = {'1': 1, '2': 10, '3': 100, '4': 1e3, '5': 1e4, '6': 1e5,
'9':-1, 'A':-10, 'B':-100, 'C':-1e3, 'D':-1e4, 'E':-1e5} '9':-1, 'A':-10, 'B':-100, 'C':-1e3, 'D':-1e4, 'E':-1e5}
iodevClass = DPM3IO iodevClass = DPM3IO
motor = Attached() motor = Attached()
digits = Parameter('number of digits for value', IntRange(0, 5), initwrite=True, readonly=False) digits = Parameter('number of digits for value', IntRange(0, 5), initwrite=True, readonly=False)
value = Parameter(unit='N') value = Parameter(datatype=FloatRange(unit='N'))
target = Parameter(unit='N') target = Parameter(datatype=FloatRange(unit='N'))
step = Parameter('maximum motor step', FloatRange(unit='deg'), default=5, readonly=False) step = Parameter('maximum motor step', FloatRange(unit='deg'), default=5, readonly=False)
offset = Parameter('', FloatRange(-1e5, 1e5), readonly=False, poll=True) offset = Parameter('', FloatRange(-1e5, 1e5), readonly=False, poll=True)
#Note: we have tro treat the units properly. #Note: we have tro treat the units properly.
""" We got an output of 150 for 10N. The maximal force we want to deal with is 100N, """ We got an output of 150 for 10N. The maximal force we want to deal with is 100N,
thus a maximl output of 1500. 10=150/f thus a maximl output of 1500. 10=150/f
@ -69,7 +69,7 @@ class DPM3(HasIodev, Drivable):
scale_factor = Parameter('', FloatRange(-1e5, 1e5, unit='input_units/N'), readonly=False, poll=True) scale_factor = Parameter('', FloatRange(-1e5, 1e5, unit='input_units/N'), readonly=False, poll=True)
_target = None _target = None
fast_pollfactor = 0.01 fast_pollfactor = 0.01
def query(self, adr, value=None): def query(self, adr, value=None):
if value is not None: if value is not None:
if adr == self.SCALE: if adr == self.SCALE:
@ -109,11 +109,11 @@ class DPM3(HasIodev, Drivable):
self.write_scale_factor(self.scale_factor) self.write_scale_factor(self.scale_factor)
self.write_offset(self.offset) self.write_offset(self.offset)
return Done return Done
def read_digits(self): def read_digits(self):
back_value = self._iodev.communicate('*1G135') back_value = self._iodev.communicate('*1G135')
return int(back_value,16) - 1 return int(back_value,16) - 1
def read_value(self): def read_value(self):
value = float(self._iodev.communicate('*1B1')) value = float(self._iodev.communicate('*1B1'))
mot = self._motor mot = self._motor
@ -135,10 +135,9 @@ class DPM3(HasIodev, Drivable):
self.stop() self.stop()
self.status = self.Status.IDLE, 'target reached' self.status = self.Status.IDLE, 'target reached'
return value return value
def write_target(self, target): def write_target(self, target):
self._target = target self._target = target
self._started = True
if target - self.value > 0: if target - self.value > 0:
self._direction = 1 self._direction = 1
else: else:
@ -158,7 +157,7 @@ class DPM3(HasIodev, Drivable):
def read_offset(self): def read_offset(self):
reply = self.query(self.OFFSET) reply = self.query(self.OFFSET)
return reply return reply
def write_offset(self, value): def write_offset(self, value):
return self.query(self.OFFSET, value) return self.query(self.OFFSET, value)
@ -169,20 +168,20 @@ class DPM3(HasIodev, Drivable):
def write_scale_factor(self, value): def write_scale_factor(self, value):
reply = self.query(self.SCALE, value * 10 ** self.digits) reply = self.query(self.SCALE, value * 10 ** self.digits)
return float(reply) / 10 ** self.digits return float(reply) / 10 ** self.digits

View File

@ -27,7 +27,7 @@ from os.path import basename, exists, join
import numpy as np import numpy as np
from scipy.interpolate import splev, splrep # pylint: disable=import-error from scipy.interpolate import splev, splrep # pylint: disable=import-error
from secop.core import Attached, BoolType, Parameter, Readable, StringType from secop.core import Attached, BoolType, Parameter, Readable, StringType, FloatRange
def linear(x): def linear(x):
@ -174,7 +174,7 @@ class Sensor(Readable):
calib = Parameter('calibration name', datatype=StringType(), readonly=False) calib = Parameter('calibration name', datatype=StringType(), readonly=False)
abs = Parameter('True: take abs(raw) before calib', datatype=BoolType(), readonly=False, default=True) abs = Parameter('True: take abs(raw) before calib', datatype=BoolType(), readonly=False, default=True)
value = Parameter(unit='K') value = Parameter(datatype=FloatRange(unit='K'))
pollinterval = Parameter(export=False) pollinterval = Parameter(export=False)
status = Parameter(default=(Readable.Status.ERROR, 'unintialized')) status = Parameter(default=(Readable.Status.ERROR, 'unintialized'))