75 lines
1.7 KiB
Python
75 lines
1.7 KiB
Python
from time import sleep
|
|
from types import SimpleNamespace
|
|
|
|
from slic.utils import typename
|
|
from slic.core.task import Task
|
|
|
|
|
|
import epics
|
|
|
|
class PV(epics.PV):
|
|
|
|
def put(self, *args, wait=True, **kwargs):
|
|
super().put(*args, wait=wait, **kwargs)
|
|
|
|
|
|
|
|
class Attenuator:
|
|
|
|
def __init__(self, name, n_motors=6):
|
|
if not name.endswith(":"):
|
|
name += ":"
|
|
self.name = name
|
|
self.pvs = SimpleNamespace(
|
|
energy = PV(name + "ENERGY"),
|
|
transmission = PV(name + "TRANS_SP"),
|
|
motors_done_moving = [PV(name + "MOTOR_{}.DMOV".format(i+1)) for i in range(n_motors)]
|
|
)
|
|
|
|
|
|
def get_current_value(self):
|
|
return self.get_transmission()
|
|
|
|
def set_target_value(self, value):
|
|
def changer():
|
|
self.set_transmission(value)
|
|
return Task(changer)
|
|
|
|
|
|
def set_transmission(self, value):
|
|
self.pvs.transmission.put(value)
|
|
self.wait_for_motors()
|
|
|
|
def get_transmission(self):
|
|
return self.pvs.transmission.get()
|
|
|
|
transmission = property(get_transmission, set_transmission)
|
|
|
|
|
|
def set_energy(self, value):
|
|
self.pvs.energy.put(value)
|
|
|
|
def get_energy(self):
|
|
return self.pvs.energy.get()
|
|
|
|
energy = property(get_energy, set_energy)
|
|
|
|
|
|
def motors_are_moving(self):
|
|
is_moving = lambda dmov: not bool(dmov.get())
|
|
return any(is_moving(dmov) for dmov in self.pvs.motors_done_moving)
|
|
|
|
def wait_for_motors(self):
|
|
while self.motors_are_moving():
|
|
sleep(0.01)
|
|
|
|
|
|
def __repr__(self):
|
|
tn = typename(self)
|
|
trans = self.get_transmission() * 100
|
|
energ = self.get_energy()
|
|
return "{}(\"{}\") at {}% transmission for {} eV".format(tn, self.name, trans, energ)
|
|
|
|
|
|
|