Source code for pydevmgr_elt.devices.drot

from pydevmgr_elt.devices.drot.stat import DrotStat as Stat, MODE
from pydevmgr_elt.devices.drot.cfg  import DrotCfg as Cfg
from pydevmgr_elt.devices.drot.rpcs import DrotRpcs as Rpcs

from pydevmgr_elt.base import EltDevice
from pydevmgr_elt.devices.motor import Motor
from pydevmgr_core import record_class
from pydevmgr_core.nodes import Opposite
from typing import Optional


Base = Motor


class DrotCtrlConfig(Base.Config.CtrlConfig):
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Data Structure (on top of CtrlConfig)
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    pass
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
class DrotConfig(Base.Config):
    CtrlConfig = DrotCtrlConfig
    
    Cfg = Cfg.Config
    Stat = Stat.Config
    Rpcs = Rpcs.Config
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Data Structure (redefine the ctrl_config)
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    type: str = "Drot"
    ctrl_config : CtrlConfig= CtrlConfig()
    
    cfg: Cfg = Cfg()
    stat: Stat = Stat()
    rpcs: Rpcs = Rpcs()
    
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




[docs]@record_class class Drot(Base): """ ELt Standard Drot device """ Config = DrotConfig Cfg = Cfg Stat = Stat Rpcs = Rpcs MODE = MODE class Data(Base.Data): Cfg = Cfg.Data Stat = Stat.Data Rpcs = Rpcs.Data cfg: Cfg = Cfg() stat: Stat = Stat() rpcs: Rpcs = Rpcs()
[docs] def init(self): # fix a feature unsude the FB_MA, the RPC_Init return silently zero even if the # device is not in the right state # TODO remove the patch when this is fixed from ESO side if self.stat.substate.get() != self.SUBSTATE.NOTOP_NOTREADY: raise RuntimeError("Should be in NOTOP_NOTREADY state") self.rpcs.rpcInit.rcall() return self.stat.is_ready
def stop_track(self) -> None: self.rpcs.rpcStopTrack.rcall() return Opposite(node=self.stat.is_tracking)
[docs] def start_track(self, mode, angle=0.0) -> Base.Node: """ Start drot tracking Args: mode (int, str): tracking mode. Int constant defined in Drot.MODE.SKY, Drot.MODE.ELEV str 'SKY' or 'ELEV' is also accepted angle (float): paSky or paPupil depending of the mode Returns: is_tracking: the :class:`NodeAlias` .stat.is_tracking to check if the device is in tracking """ self.rpcs.rpcStartTrack.rcall(mode, angle) return self.stat.is_tracking
[docs] def move_angle(self, angle=0.0) -> Base.Node: """ Move drot to angle in STAT mode Args: angle (float, optional): target angle default = 0.0 Returns: is_standstill: the :class:`NodeAlias` .stat.is_standstill to check if the device is in standstill. (e.i. movement finished) Example: :: wait( drot.move_angle( 34.3 ) ) """ self.rpcs.rpcMoveAngle.rcall(angle) return self.stat.is_standstill
# Other functions are in Motor if __name__ == "__main__": Drot()