diff --git a/devices/dilsc.py b/devices/dilsc.py new file mode 100644 index 0000000..29e6b0b --- /dev/null +++ b/devices/dilsc.py @@ -0,0 +1,67 @@ +""" DilSc prototype + +""" + +from slic.core.adjustable import Adjustable + +from slic.core.device import Device, SimpleDevice + +from frappy.client import SecopClient +from frappy import states +from frappy.datatypes import StatusType + + +class DilSc(Device): + def __init__(self, **kwargs): + + self.name = 'DilSc' + ID = self.name + super().__init__(ID, **kwargs) + + self.dilsc = SecopClient('dilsc.psi.ch:5000') + self.dilsc.connect() + + self.x = MagnetCoil("Magnet_X", self.dilsc, 'x', limit_low=-0.6, limit_high=0.6) + self.y = MagnetCoil("Magnet_Y", self.dilsc, 'y', limit_low=-0.6, limit_high=0.6) + self.z = MagnetCoil("Magnet_Z", self.dilsc, 'z', limit_low=-5.2, limit_high=5.2) + + + +class MagnetCoil(Adjustable): + + def __init__(self, name, dilsc_connection, direction, limit_low=-0.0001, limit_high=0.0001): + # What's with name or ID? + + super().__init__(name, limit_low=-0.0001, limit_high=0.0001) + + self.direction = direction.lower() + + if self.direction not in ["x", "y", "z"]: + raise ValueError("Direction must be either x, y or z.") + + self.dilsc = dilsc_connection + + if not self.dilsc.online: + raise ConnectionError('No connection to dilsc.') + + + def get_current_value(self): + if self.dilsc.online: + return self.dilsc.getParameter(f'mf{self.direction}', 'value',) + else: + raise ConnectionError('No connection to dilsc.') + + + + def set_target_value(self, value): + if self.dilsc.online: + self.dilsc.setParameter(f'mf{self.direction}', 'target', value) + else: + raise ConnectionError('No connection to dilsc.') + + + def is_moving(self): + response = self.dilsc.getParameter(f'mf{self.direction}','status', trycache=False) + return response[0][0] > StatusType.PREPARED + + \ No newline at end of file