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)