Source code for mxcubecore.HardwareObjects.LNLS.EPICSMotor
"""
EPICS implementation of AbstractMotor.
Example of xml file:
<object class="LNLS.EPICSMotor">
<channel type="epics" name="epicsActuator_val">SOL:S:m1.VAL</channel>
<channel type="epics" name="epicsActuator_rbv" polling="500">SOL:S:m1.RBV</channel>
<channel type="epics" name="epicsMotor_rlv">SOL:S:m1.RLV</channel>
<channel type="epics" name="epicsMotor_dmov" polling="500">SOL:S:m1.DMOV</channel>
<channel type="epics" name="epicsMotor_stop">SOL:S:m1.STOP</channel>
<channel type="epics" name="epicsMotor_velo">SOL:S:m1.VELO</channel>
<channel type="epics" name="epicsMotor_llm">SOL:S:m1.DLLM</channel>
<channel type="epics" name="epicsMotor_hlm">SOL:S:m1.DHLM</channel>
<channel type="epics" name="epicsMotor_egu">SOL:S:m1.EGU</channel>
<username>Omega</username>
<motor_name>Omega</motor_name>
<unit>1e-3</unit>
<GUIstep>90</GUIstep>
</object>
"""
import logging
import time
import gevent
from mxcubecore.HardwareObjects.abstract.AbstractMotor import AbstractMotor
from mxcubecore.HardwareObjects.LNLS.EPICSActuator import EPICSActuator
[docs]class EPICSMotor(EPICSActuator, AbstractMotor):
"""EPICS Motor class"""
MOTOR_DMOV = 'epicsMotor_dmov'
MOTOR_STOP = 'epicsMotor_stop'
MOTOR_RLV = 'epicsMotor_rlv'
MOTOR_VELO = 'epicsMotor_velo'
MOTOR_HLM = 'epicsMotor_hlm'
MOTOR_LLM = 'epicsMotor_llm'
MOTOR_EGU = 'epicsMotor_egu'
def __init__(self, name):
super().__init__(name)
self._wrap_range = None
[docs] def init(self):
""" Initialization method """
super().init()
self.get_limits()
self.get_velocity()
self.__watch_task = gevent.spawn(self._watch)
self.update_state(self.STATES.READY)
def _watch(self):
""" Watch motor current value and update it on the UI."""
while True:
time.sleep(0.25)
self.update_value()
def _wait_actuator(self):
"""Override EPICSActuator method."""
self.update_specific_state(self.SPECIFIC_STATES.MOVING)
current_value = self.get_value()
while (not self.done_movement()):
time.sleep(0.25)
self.update_specific_state(None)
self.update_state(self.STATES.READY)
[docs] def abort(self):
"""Override EPICSActuator method."""
self.set_channel_value(self.MOTOR_STOP, 1)
super().abort()
[docs] def get_limits(self):
"""Override AbstractActuator method."""
try:
low_limit = float(self.get_channel_value(self.MOTOR_LLM))
high_limit = float(self.get_channel_value(self.MOTOR_HLM))
self._nominal_limits = (low_limit, high_limit)
except BaseException:
self._nominal_limits = (None, None)
if self._nominal_limits in [(0, 0), (float('-inf'), float('inf'))]:
# Treat infinite limits
self._nominal_limits = (None, None)
logging.getLogger("HWR").info('Motor %s limits: %s' % (self.motor_name, self._nominal_limits))
return self._nominal_limits
[docs] def get_velocity(self):
"""Override AbstractMotor method."""
self._velocity = self.get_channel_value(self.MOTOR_VELO)
return self._velocity
[docs] def set_velocity(self, value):
"""Override AbstractMotor method."""
self.__velocity = self.set_channel_value(self.MOTOR_VELO, value)
[docs] def done_movement(self):
""" Return whether motor finished movement or not."""
dmov = self.get_channel_value(self.MOTOR_DMOV)
return bool(dmov)