Files
cristallina/devices/dilsc.py
2024-03-14 18:43:17 +01:00

67 lines
1.9 KiB
Python

""" 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