Source code for jaeger.commands.status
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @Author: José Sánchez-Gallego (gallegoj@uw.edu)
# @Date: 2018-08-27
# @Filename: status.py
# @License: BSD 3-clause (http://www.opensource.org/licenses/BSD-3-Clause)
import numpy
from jaeger.commands import Command, CommandID
from jaeger.utils import bytes_to_int, int_to_bytes, motor_steps_to_angle
__ALL__ = ['GetID', 'GetStatus', 'GetCurrent', 'GetActualPosition']
[docs]class GetID(Command):
"""Commands the positioners to reply with their positioner id."""
command_id = CommandID.GET_ID
broadcastable = True
timeout = 1
safe = True
[docs] def get_ids(self):
"""Returns a list of positioners that replied back."""
return [reply.positioner_id for reply in self.replies]
[docs]class GetStatus(Command):
"""Gets the status bits for the positioner."""
command_id = CommandID.GET_STATUS
broadcastable = True
safe = True
[docs] def get_positioner_status(self):
"""Returns the positioner status flag for each reply."""
return [bytes_to_int(reply.data) for reply in self.replies]
[docs]class GetActualPosition(Command):
"""Gets the current position of the alpha and beta arms."""
command_id = CommandID.GET_ACTUAL_POSITION
broadcastable = False
safe = True
[docs] def get_positions(self):
"""Returns the positions of alpha and beta in degrees.
Raises
------
ValueError
If no reply has been received or the data cannot be parsed.
"""
if len(self.replies) == 0:
raise ValueError('no positioners have replied to this command.')
data = self.replies[0].data
beta = bytes_to_int(data[4:], dtype='i4')
alpha = bytes_to_int(data[0:4], dtype='i4')
return numpy.array(motor_steps_to_angle(alpha, beta))
[docs] @staticmethod
def encode(alpha, beta):
"""Returns the position as a bytearray in positioner units."""
alpha_motor, beta_motor = motor_steps_to_angle(alpha, beta, inverse=True)
data = int_to_bytes(int(alpha_motor), 'i4') + int_to_bytes(int(beta_motor), 'i4')
return data
class GetCurrent(Command):
"""Gets the current of the alpha and beta motors."""
command_id = CommandID.GET_CURRENT
broadcastable = False
safe = True
def get_current(self):
"""Returns the current of alpha and beta.
Raises
------
ValueError
If no reply has been received or the data cannot be parsed.
"""
if len(self.replies) == 0:
raise ValueError('no positioners have replied to this command.')
data = self.replies[0].data
beta = bytes_to_int(data[4:], dtype='i4')
alpha = bytes_to_int(data[0:4], dtype='i4')
return numpy.array([alpha, beta])